diff --git a/.gitignore b/.gitignore index b9ea15ad05c..1d1a2580b52 100644 --- a/.gitignore +++ b/.gitignore @@ -80,6 +80,7 @@ automation/services/watchdog/check_libp2p/check_libp2p *.terraform.lock.hcl *gcloud-keyfile.json* _opam +opam_switches target ./release @@ -103,3 +104,7 @@ Pipfile.lock # coverage report files *.coverage _coverage/ + +# directory removed in this branch, but still existing in berkeley, +# may appear as an untracked file occasionally +/src/external diff --git a/.gitmodules b/.gitmodules index 889306f90bd..04f0cfdf2c4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,19 +1,9 @@ [submodule "src/lib/snarky"] path = src/lib/snarky url = https://github.com/o1-labs/snarky -[submodule "src/external/ppx_optcomp"] - path = src/external/ppx_optcomp - url = https://github.com/MinaProtocol/ppx_optcomp [submodule "src/lib/crypto/proof-systems"] path = src/lib/crypto/proof-systems url = https://github.com/o1-labs/proof-systems.git -[submodule "src/external/prometheus"] - path = src/external/prometheus - url = https://github.com/MinaProtocol/prometheus.git - branch = master -[submodule "src/external/c-reference-signer"] - path = src/external/c-reference-signer - url = https://github.com/MinaProtocol/c-reference-signer.git [submodule "src/lib/crypto/kimchi_bindings/stubs/kimchi-stubs-vendors"] path = src/lib/crypto/kimchi_bindings/stubs/kimchi-stubs-vendors url = https://github.com/MinaProtocol/kimchi-stubs-vendors.git diff --git a/CODEOWNERS b/CODEOWNERS index 0090ea38c43..2cd3907c975 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -11,8 +11,6 @@ /README.md @MinaProtocol/product-eng-reviewers /README-dev.md @MinaProtocol/protocol-eng-reviewers -/src/external/ @bkase @psteckler @mrmr1993 - /src/app/archive @MinaProtocol/protocol-eng-reviewers /src/app/cli/src/mina.ml @MinaProtocol/protocol-eng-reviewers /src/app/cli/src/init @MinaProtocol/protocol-eng-reviewers diff --git a/Makefile b/Makefile index 1fe6a61dada..7fc681d4c91 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,14 @@ ifeq ($(DUNE_PROFILE),) DUNE_PROFILE := dev endif +ifeq ($(OPAMSWITCH)$(IN_NIX_SHELL)$(CI)$(BUILDKITE),) +# Sometimes opam replaces these env variables in shell with +# an explicit mention of a particular switch (dereferenced from the value) +OPAM_SWITCH_PREFIX := $(PWD)/_opam +OCAML_TOPLEVEL_PATH := $(OPAM_SWITCH_PREFIX)/lib/toplevel +PATH := $(OPAM_SWITCH_PREFIX)/bin:$(PATH) +endif + # Temp directory TMPDIR ?= /tmp @@ -43,28 +51,27 @@ clean: @rm -rf src/$(COVERAGE_DIR) @rm -rf src/app/libp2p_helper/result src/libp2p_ipc/libp2p_ipc.capnp.go +switch: + ./scripts/update-opam-switch.sh + # enforces the OCaml version being used -ocaml_version: +ocaml_version: switch @if ! ocamlopt -config | grep "version:" | grep $(OCAML_VERSION); then echo "incorrect OCaml version, expected version $(OCAML_VERSION)" ; exit 1; fi # enforce machine word size -ocaml_word_size: +ocaml_word_size: switch @if ! ocamlopt -config | grep "word_size:" | grep $(WORD_SIZE); then echo "invalid machine word size, expected $(WORD_SIZE)" ; exit 1; fi # Checks that the current opam switch contains the packages from opam.export at the same version. # This check is disabled in the pure nix environment (that does not use opam). -check_opam_switch: +check_opam_switch: switch ifneq ($(DISABLE_CHECK_OPAM_SWITCH), true) - ifeq (, $(shell which check_opam_switch)) - $(warning The check_opam_switch binary was not found in the PATH.) - $(error The current opam switch should likely be updated by running: "opam switch import opam.export") - else - check_opam_switch opam.export - endif + @which check_opam_switch 2>/dev/null >/dev/null || ( echo "The check_opam_switch binary was not found in the PATH, try: opam switch import opam.export" >&2 && exit 1 ) + @check_opam_switch opam.export endif -ocaml_checks: ocaml_version ocaml_word_size check_opam_switch +ocaml_checks: switch ocaml_version ocaml_word_size check_opam_switch libp2p_helper: ifeq (, $(MINA_LIBP2P_HELPER_PATH)) @@ -82,12 +89,12 @@ check: ocaml_checks libp2p_helper build: ocaml_checks reformat-diff libp2p_helper $(info Starting Build) - (ulimit -s 65532 || true) && (ulimit -n 10240 || true) && env MINA_COMMIT_SHA1=$(GITLONGHASH) dune build src/app/logproc/logproc.exe src/app/cli/src/mina.exe --profile=$(DUNE_PROFILE) + (ulimit -s 65532 || true) && (ulimit -n 10240 || true) && env MINA_COMMIT_SHA1=$(GITLONGHASH) dune build src/app/logproc/logproc.exe src/app/cli/src/mina.exe src/app/generate_keypair/generate_keypair.exe src/app/validate_keypair/validate_keypair.exe src/app/runtime_genesis_ledger/runtime_genesis_ledger.exe --profile=$(DUNE_PROFILE) $(info Build complete) -build_all_sigs: ocaml_checks reformat-diff libp2p_helper +build_all_sigs: ocaml_checks reformat-diff libp2p_helper build $(info Starting Build) - (ulimit -s 65532 || true) && (ulimit -n 10240 || true) && env MINA_COMMIT_SHA1=$(GITLONGHASH) dune build src/app/logproc/logproc.exe src/app/cli/src/mina.exe src/app/cli/src/mina_testnet_signatures.exe src/app/cli/src/mina_mainnet_signatures.exe --profile=$(DUNE_PROFILE) + (ulimit -s 65532 || true) && (ulimit -n 10240 || true) && env MINA_COMMIT_SHA1=$(GITLONGHASH) dune build src/app/cli/src/mina_testnet_signatures.exe src/app/cli/src/mina_mainnet_signatures.exe --profile=$(DUNE_PROFILE) $(info Build complete) build_archive: ocaml_checks reformat-diff @@ -95,9 +102,9 @@ build_archive: ocaml_checks reformat-diff (ulimit -s 65532 || true) && (ulimit -n 10240 || true) && dune build src/app/archive/archive.exe --profile=$(DUNE_PROFILE) $(info Build complete) -build_archive_all_sigs: ocaml_checks reformat-diff +build_archive_utils: ocaml_checks reformat-diff $(info Starting Build) - (ulimit -s 65532 || true) && (ulimit -n 10240 || true) && dune build src/app/archive/archive.exe src/app/archive/archive_testnet_signatures.exe src/app/archive/archive_mainnet_signatures.exe --profile=$(DUNE_PROFILE) + (ulimit -s 65532 || true) && (ulimit -n 10240 || true) && dune build src/app/archive/archive.exe src/app/replayer/replayer.exe src/app/archive_blocks/archive_blocks.exe src/app/extract_blocks/extract_blocks.exe src/app/missing_blocks_auditor/missing_blocks_auditor.exe --profile=$(DUNE_PROFILE) $(info Build complete) build_rosetta: ocaml_checks @@ -201,14 +208,7 @@ publish-macos: @./scripts/publish-macos.sh deb: - ./scripts/rebuild-deb.sh - ./scripts/archive/build-release-archives.sh - @mkdir -p /tmp/artifacts - @cp _build/mina*.deb /tmp/artifacts/. - -deb_optimized: - ./scripts/rebuild-deb.sh "optimized" - ./scripts/archive/build-release-archives.sh + ./scripts/debian/builder.sh @mkdir -p /tmp/artifacts @cp _build/mina*.deb /tmp/artifacts/. @@ -222,14 +222,12 @@ build_or_download_pv_keys: ocaml_checks (ulimit -s 65532 || true) && (ulimit -n 10240 || true) && env MINA_COMMIT_SHA1=$(GITLONGHASH) dune exec --profile=$(DUNE_PROFILE) src/lib/snark_keys/gen_keys/gen_keys.exe -- --generate-keys-only $(info Keys built) -publish_debs: - @./buildkite/scripts/publish-deb.sh - genesiskeys: @mkdir -p /tmp/artifacts @cp _build/default/src/lib/key_gen/sample_keypairs.ml /tmp/artifacts/. @cp _build/default/src/lib/key_gen/sample_keypairs.json /tmp/artifacts/. + ############################################## ## Genesis ledger in OCaml from running daemon @@ -304,4 +302,4 @@ ml-docs: ocaml_checks # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html # HACK: cat Makefile | egrep '^\w.*' | sed 's/:/ /' | awk '{print $1}' | grep -v myprocs | sort | xargs -.PHONY: all build check-format clean deb dev mina-docker reformat doc_diagrams ml-docs macos-setup macos-setup-download setup-opam libp2p_helper dhall_types replayer missing_blocks_auditor extract_blocks archive_blocks ocaml_version ocaml_word_size ocaml_checks +.PHONY: all build check-format clean deb dev mina-docker reformat doc_diagrams ml-docs macos-setup macos-setup-download setup-opam libp2p_helper dhall_types replayer missing_blocks_auditor extract_blocks archive_blocks ocaml_version ocaml_word_size ocaml_checks switch diff --git a/README-ci-failures.md b/README-ci-failures.md index cfd8f4bc81d..6e4f678c8b9 100644 --- a/README-ci-failures.md +++ b/README-ci-failures.md @@ -29,8 +29,8 @@ details and links to the failures. ## CI environment mismatch The CI runs its jobs in multiple Docker images. The images that it is using are -specified in `buildkite/src/Constants/COntainerImages.dhall`: the CI uses all -Debian images prefixed by `minaToolchainBuster`. +specified in `buildkite/src/Constants/ContainerImages.dhall`: the CI uses all +Debian images prefixed by `minaToolchainBullseye`. These images are generated by the CI itself, in particular based on the content of the `dockerfiles` directory and the `opam.export` file (which describes versions of @@ -46,7 +46,7 @@ In this case, you should: [Google Cloud](https://console.cloud.google.com/gcr/images/o1labs-192920/global/mina-toolchain) where they have been automatically uploaded. Look for your branch name and commit hash in the second column. You should find several images suffixed - with `-buster`, `-bullseye`, `-stretch` and `-focal` (Debian versions). + with `-bullseye` and `-focal` (Debian versions). 3. For each such image, retrieve its full name and hash by hovering its link and clicking the `Copy full image name` tooltip that appears (or retrieve it on the image's page). diff --git a/README-dev.md b/README-dev.md index 2fec130e83b..9e0478ae2aa 100644 --- a/README-dev.md +++ b/README-dev.md @@ -70,7 +70,8 @@ You can build Mina using Docker. Using Docker works in any dev environment. See ``` 1. Install [rustup](https://rustup.rs/). -2. Create your switch with deps `opam switch import --switch mina opam.export` +2. Add o1-opam-repository with `opam repository add --yes --all --set-default o1-labs https://github.com/o1-labs/opam-repository.git` +3. Create your switch with deps `opam switch import --switch mina opam.export` M1- and M2- operating systems experience issues because Homebrew does not link include files automatically. @@ -98,13 +99,13 @@ You can build Mina using Docker. Using Docker works in any dev environment. See - Note:If you get conf-openssl install errors, try running `export PKG_CONFIG_PATH=$(brew --prefix openssl@1.1)/lib/pkgconfig` and try `opam switch import opam.export` again. - If prompted, run `opam user-setup install` to enable opam-user-setup support for Merlin. -3. Pin dependencies that override opam versions: +4. Pin dependencies that override opam versions: ```sh scripts/pin-external-packages.sh ``` -7. Install the correct version of golang: +5. Install the correct version of golang: - `goenv init` - To make sure the right `goenv` is used, update your shell env script with: @@ -118,17 +119,17 @@ You can build Mina using Docker. Using Docker works in any dev environment. See - `goenv global 1.18.10` - Check that the `go version` returns the right version, otherwise you see the message `compile:version "go1.18.10" does not match go tool version "go1.20.2"`. If so, run `brew remove go` or get the matching version. -9. Invoke `make build`. +6. Invoke `make build`. If you get errors about `libp2p` and `capnp`, try with `brew install capnp`. -9. For better IDE support, install the OCaml-LSP language server for OCaml: +7. For better IDE support, install the OCaml-LSP language server for OCaml: ```sh opam install ocaml-lsp-server ``` -10. Set up your IDE. See [Customizing your dev environment for autocomplete/merlin](https://github.com/MinaProtocol/mina/blob/develop/README-dev.md#customizing-your-dev-environment-for-autocompletemerlin). +8. Set up your IDE. See [Customizing your dev environment for autocomplete/merlin](https://github.com/MinaProtocol/mina/blob/develop/README-dev.md#customizing-your-dev-environment-for-autocompletemerlin). ### Developer Setup (Linux) @@ -139,6 +140,7 @@ Mina has a variety of opam and system dependencies. To get all of the required opam dependencies, run: ```sh +opam repository add --yes --all --set-default o1-labs https://github.com/o1-labs/opam-repository.git opam switch import opam.export ``` @@ -250,6 +252,47 @@ dune exec src/app/cli/src/mina.exe -- -help The command line help is the place to learn about other options to the Mina CLI and how to connect to an existing network, such as Mainnet. +## Building debian package locally + +Debian package can be build locally by using below commands: + + +1. Build binaries +``` +make build +``` +2. Build debian for mina-devet (example for ubuntu 18.04): +``` +./scripts/debian/build.sh daemon_devnet +``` + +## Building docker locally + +Prerequisites: + +- debian package previously built +- aptly app + +Steps: + +1. Start local debian repository +``` +./scripts/debian/aptly.sh start -b -c focal -d _build/ -m unstable -l -p 8081 +``` + +IMPORTANT: debians should be placed in _build folder + +2. Build docker: +``` +./scripts/docker/build.sh --service mina-daemon -v 3.0.0-dkijania-local-debian-build-a099fc7 --network devnet --deb-codename focal --deb-version 3.0.0-dkijania-local-debian-build-a099fc7 +``` + +Where: + +`-v` - base docker tag +`--deb-codename` - input debian codename (buster,bullseye etc.) +`--deb-version` - version of debian which docker will host + ## Using the Makefile The Makefile contains placeholder targets for all the common tasks that need to be done and automatically knows how to use Docker. diff --git a/automation/terraform/modules/services/daemon/README.md b/automation/terraform/modules/services/daemon/README.md index 8fd214c5b48..b55f6a78e18 100644 --- a/automation/terraform/modules/services/daemon/README.md +++ b/automation/terraform/modules/services/daemon/README.md @@ -41,17 +41,31 @@ The manual commands to release each container are the following: ### Mina-Daemon Container *(From the root of the `MinaProtocol/mina` repository)* -`./scripts/release-docker.sh -s mina-daemon -v .. --extra-args "--build-arg deb_version= --build-arg deb_release="` +`./scripts/docker/build.sh -s mina-daemon -v .. --deb_version= --deb_release="` + +and + +`./scripts/docker/release.sh -s mina-daemon -v .. - --deb_version= --deb_release="` + Example: -`./scripts/release-docker.sh -s mina-daemon -v 0.0.10-beta4 --extra-args "--build-arg deb_version=0.0.10-beta4-fff3b856 --build-arg deb_release=alpha` +`./scripts/docker/build.sh -s mina-daemon -v 0.0.10-beta4 --deb_version=0.0.10-beta4-fff3b856 --deb_release=alpha` + +`./scripts/docker/release.sh -s mina-daemon -v 0.0.10-beta4 --deb_version=0.0.10-beta4-fff3b856 --deb_release=alpha` The `--extra-args` argument is for passing additional parameters directly to the `docker build` command. It is used here to pass the required Dockerfile variable `'deb_version` but can also be used to override Dockerfile variables with default values like so `--build-arg deb_repo=release` ### daemon Container -*(From the root of the `MinaProtocol/mina/automation` folder in the mina repository)* -`./scripts/release-docker.sh -s daemon -v .. --extra-args "--build-arg base_image_tag= "` +*(From the root of the `MinaProtocol/mina` repository)* +`./scripts/docker/build.sh -s mina-daemon -v .. --deb_version= --deb_release="` + +and + +`./scripts/docker/release.sh -s mina-daemon -v .. - --deb_version= --deb_release="` + Example: -`./scripts/release-docker.sh -s daemon -v 0.0.10-beta4 --extra-args "--build-arg base_image_tag=0.0.10-beta4"` +`./scripts/docker/build.sh -s mina-daemon -v 0.0.10-beta4 --deb_version=0.0.10-beta4-fff3b856 --deb_release=alpha` + +`./scripts/docker/release.sh -s mina-daemon -v 0.0.10-beta4 --deb_version=0.0.10-beta4-fff3b856 --deb_release=alpha` diff --git a/automation/terraform/modules/services/faucet/README.md b/automation/terraform/modules/services/faucet/README.md index c34de574bae..f0dae0b88e0 100644 --- a/automation/terraform/modules/services/faucet/README.md +++ b/automation/terraform/modules/services/faucet/README.md @@ -63,14 +63,17 @@ The manual commands to release each container are the following: ### Mina-Daemon Container *(From the root of the `MinaProtocol/mina` repository)* +`./scripts/docker/build.sh -s mina-daemon -v .. --deb_version= --deb_release="` -`./scripts/release-docker.sh -s mina-daemon -v .. --extra-args "--build-arg deb_version="` +and -### daemon Container +`./scripts/docker/release.sh -s mina-daemon -v .. - --deb_version= --deb_release="` -*(From the root of the `MinaProtocol/mina/automation` repository)* -`./scripts/release-docker.sh -s daemon -v .. --extra-args "--build-arg base_image_tag="` +Example: +`./scripts/docker/build.sh -s mina-daemon -v 0.0.10-beta4 --deb_version=0.0.10-beta4-fff3b856 --deb_release=alpha` + +`./scripts/docker/release.sh -s mina-daemon -v 0.0.10-beta4 --deb_version=0.0.10-beta4-fff3b856 --deb_release=alpha` The `--extra-args` argument is for passing additional parameters directly to the `docker build` command. It is used here to pass the required Dockerfile variable `base_image_tag` but can also be used to override Dockerfile variables with default values like so `--build-arg deb_repo=release` @@ -80,5 +83,10 @@ The Faucet Dockerfile lives in the `MinaProtocol/mina` repository [here](https:/ *(From the root of the `MinaProtocol/mina` repository)* -`./scripts/release-docker.sh -s bot -v ..` +``` +./scripts/docker/build.sh -s bot -v .. +./scripts/docker/release.sh -s bot -v .. +``` + + diff --git a/automation/terraform/modules/services/graphql-proxy/README.md b/automation/terraform/modules/services/graphql-proxy/README.md index a8d85fc6571..61ff6177c0b 100644 --- a/automation/terraform/modules/services/graphql-proxy/README.md +++ b/automation/terraform/modules/services/graphql-proxy/README.md @@ -54,13 +54,18 @@ The manual commands to release each container are the following: *(From the root of the `MinaProtocol/mina` repository)* -`./scripts/release-docker.sh -s mina-daemon -v .. --extra-args "--build-arg deb_version="` +`./scripts/docker/release.sh -s mina-daemon -v .. --deb_version="` + +and + +`./scripts/docker/release.sh -s mina-daemon -v .. - --deb_version= --deb_release="` + ### daemon Container *(From the root of the `MinaProtocol/mina/automation` repository)* -`./scripts/release-docker.sh -s daemon -v .. --extra-args "--build-arg base_image_tag="` +`./scripts/docker/release.sh -s daemon -v .. ` The `--extra-args` argument is for passing additional parameters directly to the `docker build` command. It is used here to pass the required Dockerfile variable `base_image_tag` but can also be used to override Dockerfile variables with default values like so `--build-arg deb_repo=release` @@ -70,4 +75,4 @@ The Faucet Dockerfile lives in the `MinaProtocol/mina` repository [here](https:/ *(From the root of the `MinaProtocol/mina` repository)* -`./scripts/release-docker.sh -s graphql-public-proxy -v ..` +`./scripts/docker/release.sh -s graphql-public-proxy -v ..` diff --git a/automation/terraform/modules/testnet-alerts/alerts.tf b/automation/terraform/modules/testnet-alerts/alerts.tf deleted file mode 100644 index 391d711d41d..00000000000 --- a/automation/terraform/modules/testnet-alerts/alerts.tf +++ /dev/null @@ -1,115 +0,0 @@ -# TODO: enable general loading and rendering of alert templates with custom input VARs - -data "template_file" "testnet_alerts" { - template = file("${path.module}/templates/testnet-alert-rules.yml.tpl") - vars = { - rule_namespace = var.rule_namespace - rule_filter = var.rule_filter - alert_timeframe = var.alert_timeframe - alert_evaluation_duration = var.alert_duration - berkeley_testnet = var.berkeley_testnet - synced_status_filter = var.synced_status_filter - } -} - -data "template_file" "testnet_alert_receivers" { - template = file("${path.module}/templates/testnet-alert-receivers.yml.tpl") - vars = { - pagerduty_service_key = data.aws_secretsmanager_secret_version.pagerduty_testnet_primary_key.secret_string - pagerduty_alert_filter = var.pagerduty_alert_filter - - discord_alert_webhook = data.aws_secretsmanager_secret_version.discord_testnet_alerts_webhook.secret_string - slack_alert_webhook = data.aws_secretsmanager_secret_version.slack_testnet_alerts_webhook.secret_string - } -} - -# Setup - -resource "local_file" "alert_rules_config" { - content = data.template_file.testnet_alerts.rendered - filename = "${path.cwd}/alert_rules.yml" -} - -resource "null_resource" "download_cortextool" { - provisioner "local-exec" { - working_dir = path.cwd - command = "which cortextool || (curl --fail --show-error --location --output ${local.cortextool_install_dir} ${local.cortextool_download_url} && chmod a+x ${local.cortextool_install_dir})" - } -} - -# Lint alerting config - -resource "null_resource" "alert_rules_lint" { - provisioner "local-exec" { - working_dir = path.cwd - command = "cortextool rules lint --rule-files alert_rules.yml" - } - - depends_on = [local_file.alert_rules_config, null_resource.download_cortextool] -} - -resource "null_resource" "alert_rules_check" { - provisioner "local-exec" { - command = "cortextool rules check --rule-files alert_rules.yml" - } - - depends_on = [local_file.alert_rules_config, null_resource.download_cortextool] -} - -resource "docker_container" "verify_alert_receivers" { - name = "cortex_verify_receivers" - image = local.cortex_image - command = [ - "alerts", - "verify", - "--address=${jsondecode(data.aws_secretsmanager_secret_version.alertmanager_api_auth.secret_string)["auth_url"]}", - "--id=${jsondecode(data.aws_secretsmanager_secret_version.alertmanager_api_auth.secret_string)["id"]}", - "--key=${jsondecode(data.aws_secretsmanager_secret_version.alertmanager_api_auth.secret_string)["password"]}" - ] - - rm = true -} - -# Deploy alert updates - -resource "docker_container" "sync_alert_rules" { - name = "cortex_rules_sync" - image = local.cortex_image - command = [ - "rules", - "sync", - "--rule-files=/config/rules.yml", - "--address=${jsondecode(data.aws_secretsmanager_secret_version.prometheus_api_auth.secret_string)["auth_url"]}", - "--id=${jsondecode(data.aws_secretsmanager_secret_version.prometheus_api_auth.secret_string)["id"]}", - "--key=${jsondecode(data.aws_secretsmanager_secret_version.prometheus_api_auth.secret_string)["password"]}" - ] - - upload { - content = data.template_file.testnet_alerts.rendered - file = "/config/rules.yml" - } - - rm = true - depends_on = [null_resource.alert_rules_lint, null_resource.alert_rules_check] -} - -resource "docker_container" "update_alert_receivers" { - name = "cortex_receivers_update" - image = local.cortex_image - command = [ - "alertmanager", - "load", - "/config/receivers.yml", - "--address=${jsondecode(data.aws_secretsmanager_secret_version.alertmanager_api_auth.secret_string)["auth_url"]}", - "--id=${jsondecode(data.aws_secretsmanager_secret_version.alertmanager_api_auth.secret_string)["id"]}", - "--key=${jsondecode(data.aws_secretsmanager_secret_version.alertmanager_api_auth.secret_string)["password"]}" - ] - - upload { - content = data.template_file.testnet_alert_receivers.rendered - file = "/config/receivers.yml" - } - - rm = true - depends_on = [docker_container.verify_alert_receivers] -} diff --git a/automation/terraform/modules/testnet-alerts/inputs.tf b/automation/terraform/modules/testnet-alerts/inputs.tf deleted file mode 100644 index 1e068652277..00000000000 --- a/automation/terraform/modules/testnet-alerts/inputs.tf +++ /dev/null @@ -1,50 +0,0 @@ -terraform { - required_providers { - docker = { - source = "kreuzwerker/docker" - version = "2.11.0" - } - } -} - -provider "aws" { - region = "us-west-2" -} - -variable "rule_namespace" { - type = string - description = "Grafanacloud namespace for grouping rule sets" - default = "testnet-alerts" -} - -variable "rule_filter" { - type = string - description = "Filter to apply to monitoring search space for managing the scope of alert rule checks" -} - -variable "berkeley_testnet" { - type = string - description = "Filter that selects out berkeley network" - default = "testnet=\"berkeley\"" -} - -variable "synced_status_filter" { - type = string - description = "Filter that only applies to berkeley network with syncStatus labels" - default = "syncStatus=\"SYNCED\"" -} - -variable "alert_timeframe" { - type = string - description = "Range of time to inspect for alert rule violations" -} - -variable "alert_duration" { - type = string - description = "Duration an alert is evaluated as in violation prior to becoming active " -} - -variable "pagerduty_alert_filter" { - type = string - description = "Filter to apply to alert rule violation space for managing which trigger PagerDuty notifications" -} diff --git a/automation/terraform/modules/testnet-alerts/locals.tf b/automation/terraform/modules/testnet-alerts/locals.tf deleted file mode 100644 index 03000b50bde..00000000000 --- a/automation/terraform/modules/testnet-alerts/locals.tf +++ /dev/null @@ -1,5 +0,0 @@ -locals { - cortex_image = "grafana/cortextool:latest" - cortextool_download_url = "https://github.com/grafana/cortex-tools/releases/download/v0.7.2/cortextool_0.7.2_linux_x86_64" - cortextool_install_dir = "~/.local/bin/cortextool" -} diff --git a/automation/terraform/modules/testnet-alerts/outputs.tf b/automation/terraform/modules/testnet-alerts/outputs.tf deleted file mode 100644 index 68ebf6533e8..00000000000 --- a/automation/terraform/modules/testnet-alerts/outputs.tf +++ /dev/null @@ -1,8 +0,0 @@ -output "rendered_alerts_config" { - value = data.template_file.testnet_alerts.rendered -} - -output "rendered_receivers_config" { - value = data.template_file.testnet_alert_receivers.rendered - sensitive = true -} diff --git a/automation/terraform/modules/testnet-alerts/secrets.tf b/automation/terraform/modules/testnet-alerts/secrets.tf deleted file mode 100644 index 655e3f9f00a..00000000000 --- a/automation/terraform/modules/testnet-alerts/secrets.tf +++ /dev/null @@ -1,48 +0,0 @@ -# Prometheus -data "aws_secretsmanager_secret" "prometheus_api_auth_metadata" { - name = "mina-services/prometheus/api_auth" -} - -data "aws_secretsmanager_secret_version" "prometheus_api_auth" { - secret_id = data.aws_secretsmanager_secret.prometheus_api_auth_metadata.id -} - -# Alertmanager - -data "aws_secretsmanager_secret" "alertmanager_api_auth_metadata" { - name = "mina-services/alertmanager/api_auth" -} - -data "aws_secretsmanager_secret_version" "alertmanager_api_auth" { - secret_id = data.aws_secretsmanager_secret.alertmanager_api_auth_metadata.id -} - -# Pagerduty - -data "aws_secretsmanager_secret" "pagerduty_testnet_primary_key_metadata" { - name = "pagerduty/testnet/key/primary" -} - -data "aws_secretsmanager_secret_version" "pagerduty_testnet_primary_key" { - secret_id = data.aws_secretsmanager_secret.pagerduty_testnet_primary_key_metadata.id -} - -# Discord - -data "aws_secretsmanager_secret" "discord_testnet_alerts_webhook_metadata" { - name = "discord/testnet/alerts/webhook" -} - -data "aws_secretsmanager_secret_version" "discord_testnet_alerts_webhook" { - secret_id = data.aws_secretsmanager_secret.discord_testnet_alerts_webhook_metadata.id -} - -# Slack - -data "aws_secretsmanager_secret" "slack_testnet_alerts_webhook_metadata" { - name = "slack/testnet/alerts/webhook" -} - -data "aws_secretsmanager_secret_version" "slack_testnet_alerts_webhook" { - secret_id = data.aws_secretsmanager_secret.slack_testnet_alerts_webhook_metadata.id -} \ No newline at end of file diff --git a/automation/terraform/modules/testnet-alerts/templates/testnet-alert-receivers.yml.tpl b/automation/terraform/modules/testnet-alerts/templates/testnet-alert-receivers.yml.tpl deleted file mode 100644 index 75d19d7affa..00000000000 --- a/automation/terraform/modules/testnet-alerts/templates/testnet-alert-receivers.yml.tpl +++ /dev/null @@ -1,37 +0,0 @@ -# $: pagerduty_service_key - service integration key to trigger PagerDuty pages -# $: pagerduty_alert_filter - regular expression indicating set of testnets to monitor/alert via PagerDuty -# $: slack_alert_webhook - Slack integration webhook for sending mainnet and devnet warnings and for all non-(mainnet|devnet) alerting - -global: {} -receivers: - - name: pagerduty-testnet-primary - pagerduty_configs: - - service_key: ${pagerduty_service_key} - - name: slack-alert-default - slack_configs: - - api_url: ${slack_alert_webhook} - channel: '#testnet-warnings' - send_resolved: true - text: >- - {{ if eq .Status "firing" }}All active alerts:{{ end }} - - {{ range .Alerts -}} - *Alert:* {{ .Labels.alertname }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }} - *Description:* {{ .Annotations.description }} - *Runbook:* {{ if .Annotations.runbook }} `{{ .Annotations.runbook }}` {{ end }} - - {{ end }} - -route: - receiver: slack-alert-default - group_by: - - testnet - routes: - - receiver: pagerduty-testnet-primary - match_re: - testnet: ^(${pagerduty_alert_filter})$ - severity: critical - - receiver: slack-alert-default - match_re: - testnet: ^(${pagerduty_alert_filter})$ - severity: warning diff --git a/automation/terraform/modules/testnet-alerts/templates/testnet-alert-rules.yml.tpl b/automation/terraform/modules/testnet-alerts/templates/testnet-alert-rules.yml.tpl deleted file mode 100644 index 357d948b9b4..00000000000 --- a/automation/terraform/modules/testnet-alerts/templates/testnet-alert-rules.yml.tpl +++ /dev/null @@ -1,798 +0,0 @@ -# $: rule_namespace - Grafanacloud rules config namespace for grouping rules (see: https://grafana.com/docs/grafana-cloud/alerts/grafana-cloud-alerting/namespaces-and-groups/) -# $: rule_filter - filter for subset of testnets to include in rule alert search space -# $: alert_timeframe - range of time to inspect for alert rule violations -# $: alert_evaluation_duration - duration an alert is evaluated as in violation prior to becoming active - -namespace: ${rule_namespace} -groups: -- name: Critical Alerts - rules: - - alert: WatchdogClusterCrashes - expr: max by (testnet) (max_over_time(Coda_watchdog_cluster_crashes ${rule_filter} [${alert_timeframe}])) > 0.5 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} cluster nodes have crashed" - description: "{{ $value }} Cluster nodes have crashed on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/WatchdogClusterCrashes-1741e31b59ef4467a3bd19158418c4d8" - - - alert: MultipleNodeRestarted - expr: count by (testnet) (Coda_Runtime_process_uptime_ms_total ${rule_filter} < 600000) > 2 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "At least 3 nodes on {{ $labels.testnet }} restarted" - description: "{{ $value }} nodes on {{ $labels.testnet }} restarted" - runbook: "https://www.notion.so/minaprotocol/MultipleNodeRestarted-360bc1ed48a24dfca4bcbae1e29d0584" - - - alert: HighDisconnectedBlocksPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_no_common_ancestor ${rule_filter} [${alert_timeframe}])) > 3 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has more than 3 blocks that have been produced on a remote side chains in the last hour" - description: "{{ $value }} blocks have been produced that share no common ancestor with our transition frontier on network {{ $labels.test }} in the last hour." - runbook: "https://www.notion.so/minaprotocol/HighDisconnectedBlocksPerHour-14da6dc40386439799eb2a573d077ecb" - - - alert: HighOldBlocksPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_worse_than_root ${rule_filter} [${alert_timeframe}])) > 5 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has more than 5 blocks that are not selected over the root of our transition frontier in the last hour" - description: "{{ $value }} blocks have been produced that are not selected over the root of our transition frontier in the last hour" - runbook: "https://www.notion.so/minaprotocol/HighOldBlocksPerHour-134ba51aef4d482bb065ce7a02dd8fb7" - - - alert: HighInvalidProofPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_invalid_proof ${rule_filter} [${alert_timeframe}])) > 3 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has more than 3 blocks that contains an invalid blockchain snark proof in last hour" - description: "{{ $value }} blocks have been produced that contains an invalid blockchain snark proof in last hour" - runbook: "https://www.notion.so/minaprotocol/HighInvalidProofPerHour-8ff715ccf9564b6e8a27b5a9dc65ef77" - - - alert: WatchdogNoNewLogs - expr: max by (testnet) (Coda_watchdog_pods_with_no_new_logs) > 0 - for: 12m - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has pods which have not logged in an hour" - description: "There are no new logs in the last hour for {{ $value }} pods on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/WatchdogNoNewLogs-7ffb7a74bad542c78961abddd9004489" - - - alert: SeedListDown - expr: min by (testnet) (min_over_time(Coda_watchdog_seeds_reachable ${rule_filter} [${alert_timeframe}])) == 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} seed list is down (no seeds are reachable)" - description: "Seed list is down on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/SeedListDown-d8d4e14609884c63a7086309336f3462" - - - alert: BlockStorageBucketNoNewBlocks - expr: min by (testnet) (min_over_time(Coda_watchdog_recent_google_bucket_blocks ${rule_filter} [${alert_timeframe}])) >= 30*60 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has no new blocks posted to the google block storage bucket recently" - description: "{{ $value }} new blocks posted to the google storage bucket for {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/BlockStorageBucketNoNewBlock-80ddaf0fa7944fb4a9c5a4ffb4bbd6e2" - - - alert: ProverErrors - expr: max by (testnet) (max_over_time(Coda_watchdog_prover_errors_total ${rule_filter} [${alert_timeframe}])) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has observed a prover error" - description: "{{ $value }} Prover errors on network {{ $labels.testnet }}." - - - alert: NodesNotSynced - expr: min by (testnet) (Coda_watchdog_nodes_synced ${rule_filter}) <= .5 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has <= 50% of nodes synced" - description: "Nodes sync rate of {{ $value }} is <= 50% on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Nodes-not-synced-34e4d4eeaeaf47e381de660bab9ce7b7" - - - alert: NodesOutOfSync - expr: min by (testnet) (avg_over_time(Coda_watchdog_nodes_synced_near_best_tip ${rule_filter} [${alert_timeframe}])) < .6 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has < 60% of nodes that are synced on the same best tip" - description: "< 60% of nodes that are synced are on the same best tip for network {{ $labels.testnet }} with rate of {{ $value }}." - runbook: "https://www.notion.so/minaprotocol/Nodes-out-of-sync-0f29c739e47c42e4adabe62a2a0316bd" - - - alert: O1NodesOutOfSync - expr: min by (testnet) (increase(Coda_Transition_frontier_max_blocklength_observed ${rule_filter} [${alert_timeframe}])) < 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "One or more {{ $labels.testnet }} nodes are stuck at an old block height (Observed block height did not increase in the last hour)" - description: "{{ $value }} blocks have been validated on network {{ $labels.testnet }} in the last hour (according to some node)." - runbook: "https://www.notion.so/minaprotocol/Nodes-out-of-sync-0f29c739e47c42e4adabe62a2a0316bd" - - - alert: LowPeerCount - expr: min by (testnet) (Coda_Network_peers ${rule_filter}) < 3 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} avg. peer count is critically low" - description: "Critically low peer count of {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LowPeerCount-3a66ae1ca6fd44b585eca37f9206d429" - - - alert: CriticallyLowMinWindowDensity - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_min_window_density ${rule_filter}) <= 13 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} min density is critically low" - description: "Critically low min density of {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LowMinWindowDensity-Runbook-7908635be4754b44a862d9bec8edc239" - - - alert: LowFillRate - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_slot_fill_rate ${rule_filter}) < 0.75 * 0.6 - for: 1h - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} slot fill rate is critically low" - description: "Lower fill rate of {{ $value }} than expected on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LowFillRate-36efb1cd9b5d461db6976bc1938fab9e" - - - alert: NoTransactionsInSeveralBlocks - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_empty_blocks_at_best_tip ${rule_filter}) >= 5 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has >= 5 blocks without transactions at the tip" - description: "{{ $value }} blocks without transactions on tip of network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/No-Transactions-In-Several-Blocks-55ca13df38dd4c3491e11d8ea8020c08" - - - alert: NoCoinbaseInBlocks - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_best_tip_coinbase ${rule_filter}) < 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has blocks without coinbases" - description: "{{ $value }} Blocks without coinbases on tip of network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/NoCoinbaseInBlocks-aacbc2a4f9334d0db2de20c2f77ac34f" - - - alert: LongFork - expr: max by (testnet) (Coda_Transition_frontier_longest_fork ${rule_filter}) >= 16 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has a fork of length at least 16" - description: "Fork of length {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LongFork-e65e5ad7437f4f4dbac201abbf9ace81" - - - alert: OldBestTip - expr: min by (testnet) ((time() - 1717545600) - Coda_Transition_frontier_best_tip_slot_time_sec ${rule_filter}) >= 15 * 180 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }}: all nodes have best tips older than 15 slots" - description: "All nodes have best tips older than 15 slots (45 minutes) on network {{ $labels.testnet }}. Best tip: {{ $value }}" - runbook: "https://www.notion.so/minaprotocol/OldBestTip-8afa955101b642bd8356edfd0b03b640" - - - alert: NoNewSnarks - expr: min by (testnet) ((time() - 1717545600) - Coda_Snark_work_useful_snark_work_received_time_sec ${rule_filter}) >= 2 * 180 and max by (testnet) (Coda_Snark_work_pending_snark_work ${rule_filter}) != 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }}: no new SNARK work seen for 2 slots." - description: "No node has received SNARK work in the last 2 slots (6 minutes) on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/NoNewSnarks-f86d27c81af54954b2fb61378bff9d4d" - - - alert: NoNewTransactions - expr: min by (testnet) ((time() - 1717545600) - Coda_Transaction_pool_useful_transactions_received_time_sec ${rule_filter}) >= 2 * 180 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }}: no new transactions seen for 2 slots." - description: "No node has received transactions in their transaction pool in the last 2 slots (6 minutes) on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/NoNewTransactions-27dbeafab8ea4d659ee6f748acb2fd6c" - - - alert: HighUnparentedBlockCount - expr: max by (testnet) (Coda_Archive_unparented_blocks ${rule_filter}) > 30 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has a critically high unparented block count" - description: "{{ $value }} Unparented block count is critically high on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" - - - alert: HighMissingBlockCount - expr: max by (testnet) (Coda_Archive_missing_blocks ${rule_filter}) > 30 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has a critically high missing block count" - description: "{{ $value }} Missing block count is critically high on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" - - - alert: FewBlocksPerHour - expr: quantile by (testnet) (0.5, increase(Coda_Transition_frontier_max_blocklength_observed ${rule_filter} [30m])) < 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "One or more {{ $labels.testnet }} nodes are stuck at an old block height (Observed block height did not increase in the last 30m)" - description: "{{ $value }} blocks have been validated on network {{ $labels.testnet }} in the last hour (according to some node)." - runbook: "https://www.notion.so/minaprotocol/FewBlocksPerHour-47a6356f093242d988b0d9527ce23478" - -- name: Warnings - rules: - - alert: HighBlockGossipLatency - expr: max by (testnet) (max_over_time(Coda_Block_latency_gossip_time ${rule_filter} [${alert_timeframe}])) > 200 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} block gossip latency is high" - description: "High block gossip latency of {{ $value }}(ms) within {{ $labels.testnet }} network." - runbook: "https://www.notion.so/minaprotocol/HighBlockGossipLatency-2096501c7cf34032b44e903ec1a4d79c" - - - alert: SomewhatOldBestTip - expr: count by (testnet) (((time() - 1717545600) - Coda_Transition_frontier_best_tip_slot_time_sec ${rule_filter}) >= 8 * 180) > 1 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }}: at least 2 nodes have best tips older than 8 slots" - description: "At least 2 nodes have best tips older than 8 slots (24 minutes) on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/SomewhatOldBestTip-bb1509582bdd4908bcda656eebf421b5" - - - alert: MediumFork - expr: max by (testnet) (Coda_Transition_frontier_longest_fork ${rule_filter}) >= 8 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has a fork of length at least 8" - description: "Fork of length {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/MediumFork-0a530813af2e40c491cdf01b3a2b2304" - - - alert: NoTransactionsInAtLeastOneBlock - expr: max by (testnet) (Coda_Transition_frontier_empty_blocks_at_best_tip ${rule_filter}) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has at least 1 block without transactions at the tip" - description: "{{ $value }} Blocks without transactions on tip of network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/NoTransactionsInAtLeastOneBlock-049250ff7ae84de990233c7b6d35f763" - - - alert: LowMinWindowDensity - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_min_window_density ${rule_filter}) <= 35 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} min density is low" - description: "Low min density on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LowMinWindowDensity-Runbook-7908635be4754b44a862d9bec8edc239" - - - alert: SeedListDegraded - expr: min by (testnet) (Coda_watchdog_seeds_reachable ${rule_filter}) <= 0.5 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} seed list is degraded (less than 50% reachable)" - description: "Seed list is degraded at {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/SeedListDown-d8d4e14609884c63a7086309336f3462" - - - alert: LowDisconnectedBlocksPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_no_common_ancestor ${rule_filter} [${alert_timeframe}])) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has at least 1 blocks that have been produced on a remote side chains in the last hour" - description: "{{ $value }} blocks have been produced that share no common ancestor with our transition frontier on network {{ $labels.test }} in the last hour." - runbook: "https://www.notion.so/minaprotocol/LowDisconnectedBlocksPerHour-32bd49852fbb499090106fe63a504859" - - - alert: LowOldBlocksPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_worse_than_root ${rule_filter} [${alert_timeframe}])) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has at least 1 blocks that are not selected over the root of our transition frontier in the last hour" - description: "{{ $value }} blocks have been produced that are not selected over the root of our transition frontier in the last hour" - runbook: "https://www.notion.so/minaprotocol/LowOldBlocksPerHour-1cc2e92b8ca944869d810f7afd7c2d78" - - - alert: LowInvalidProofPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_invalid_proof ${rule_filter} [${alert_timeframe}])) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has at least 1 blocks that contains an invalid blockchain snark proof in last hour" - description: "{{ $value }} blocks have been produced that contains an invalid blockchain snark proof in last hour" - runbook: "https://www.notion.so/minaprotocol/LowInvalidProofPerHour-b6e88b9ae84f47169e7f86017ab9e340" - - - alert: LowPostgresBlockHeightGrowth - expr: min by (testnet) (increase(Coda_Archive_max_block_height ${rule_filter} [${alert_timeframe}])) < 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} rate of archival of network blocks in Postgres DB is lower than expected" - description: "The rate of {{ $value }} new blocks observed by archive postgres instances is low on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" - - - alert: NodeRestarted - expr: count by (testnet) (Coda_Runtime_process_uptime_ms_total ${rule_filter} < 360000) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "At least one of the nodes on {{ $labels.testnet }} restarted" - description: "{{ $value }} nodes on {{ $labels.testnet }} restarted" - runbook: "https://www.notion.so/minaprotocol/NodeRestarted-99a1cf710ff14aa6930a9f12ad5813a5" - - - alert: UnparentedBlocksObserved - expr: max by (testnet) (Coda_Archive_unparented_blocks ${rule_filter}) > 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "Unparented blocks observed on {{ $labels.testnet }}" - description: "{{ $value }} Unparented block(s) observed on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" - - - alert: MissingBlocksObserved - expr: max by (testnet) (Coda_Archive_missing_blocks ${rule_filter}) > 0 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "Missing blocks observed on {{ $labels.testnet }}" - description: "{{ $value }} Missing block(s) observed on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" - -- name: Berkeley alerts - rules: - - alert: WatchdogClusterCrashes - expr: max by (testnet) (max_over_time(Coda_watchdog_cluster_crashes {${berkeley_testnet}} [${alert_timeframe}])) > 0.5 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} cluster nodes have crashed" - description: "{{ $value }} Cluster nodes have crashed on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/WatchdogClusterCrashes-1741e31b59ef4467a3bd19158418c4d8" - - - alert: MultipleNodeRestarted - expr: count by (testnet) (Coda_Runtime_process_uptime_ms_total {${berkeley_testnet}} < 600000) > 2 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "At least 3 nodes on {{ $labels.testnet }} restarted" - description: "{{ $value }} nodes on {{ $labels.testnet }} restarted" - runbook: "https://www.notion.so/minaprotocol/MultipleNodeRestarted-360bc1ed48a24dfca4bcbae1e29d0584" - - - alert: HighDisconnectedBlocksPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_no_common_ancestor {${berkeley_testnet},${synced_status_filter}} [${alert_timeframe}])) > 3 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has more than 3 blocks that have been produced on a remote side chains in the last hour" - description: "{{ $value }} blocks have been produced that share no common ancestor with our transition frontier on network {{ $labels.test }} in the last hour." - runbook: "https://www.notion.so/minaprotocol/HighDisconnectedBlocksPerHour-14da6dc40386439799eb2a573d077ecb" - - - alert: HighOldBlocksPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_worse_than_root {${berkeley_testnet},${synced_status_filter}} [${alert_timeframe}])) > 5 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has more than 5 blocks that are not selected over the root of our transition frontier in the last hour" - description: "{{ $value }} blocks have been produced that are not selected over the root of our transition frontier in the last hour" - runbook: "https://www.notion.so/minaprotocol/HighOldBlocksPerHour-134ba51aef4d482bb065ce7a02dd8fb7" - - - alert: HighInvalidProofPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_invalid_proof {${berkeley_testnet}} [${alert_timeframe}])) > 3 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has more than 3 blocks that contains an invalid blockchain snark proof in last hour" - description: "{{ $value }} blocks have been produced that contains an invalid blockchain snark proof in last hour" - runbook: "https://www.notion.so/minaprotocol/HighInvalidProofPerHour-8ff715ccf9564b6e8a27b5a9dc65ef77" - - - alert: WatchdogNoNewLogs - expr: max by (testnet) (Coda_watchdog_pods_with_no_new_logs {${berkeley_testnet}}) > 0 - for: 12m - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has pods which have not logged in an hour" - description: "There are no new logs in the last hour for {{ $value }} pods on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/WatchdogNoNewLogs-7ffb7a74bad542c78961abddd9004489" - - - alert: SeedListDown - expr: min by (testnet) (min_over_time(Coda_watchdog_seeds_reachable {${berkeley_testnet}} [${alert_timeframe}])) == 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} seed list is down (no seeds are reachable)" - description: "Seed list is down on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/SeedListDown-d8d4e14609884c63a7086309336f3462" - - - alert: BlockStorageBucketNoNewBlocks - expr: min by (testnet) (min_over_time(Coda_watchdog_recent_google_bucket_blocks {${berkeley_testnet}} [${alert_timeframe}])) >= 30*60 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has no new blocks posted to the google block storage bucket recently" - description: "{{ $value }} new blocks posted to the google storage bucket for {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/BlockStorageBucketNoNewBlock-80ddaf0fa7944fb4a9c5a4ffb4bbd6e2" - - - alert: ProverErrors - expr: max by (testnet) (max_over_time(Coda_watchdog_prover_errors_total {${berkeley_testnet}} [${alert_timeframe}])) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has observed a prover error" - description: "{{ $value }} Prover errors on network {{ $labels.testnet }}." - - - alert: NodesNotSynced - expr: min by (testnet) (Coda_watchdog_nodes_synced {${berkeley_testnet}}) <= .5 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has <= 50% of nodes synced" - description: "Nodes sync rate of {{ $value }} is <= 50% on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Nodes-not-synced-34e4d4eeaeaf47e381de660bab9ce7b7" - - - alert: NodesOutOfSync - expr: min by (testnet) (avg_over_time(Coda_watchdog_nodes_synced_near_best_tip {${berkeley_testnet}} [${alert_timeframe}])) < .6 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has < 60% of nodes that are synced on the same best tip" - description: "< 60% of nodes that are synced are on the same best tip for network {{ $labels.testnet }} with rate of {{ $value }}." - runbook: "https://www.notion.so/minaprotocol/Nodes-out-of-sync-0f29c739e47c42e4adabe62a2a0316bd" - - - alert: O1NodesOutOfSync - expr: min by (testnet) (increase(Coda_Transition_frontier_max_blocklength_observed {${berkeley_testnet}} [${alert_timeframe}])) < 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "One or more {{ $labels.testnet }} nodes are stuck at an old block height (Observed block height did not increase in the last hour)" - description: "{{ $value }} blocks have been validated on network {{ $labels.testnet }} in the last hour (according to some node)." - runbook: "https://www.notion.so/minaprotocol/Nodes-out-of-sync-0f29c739e47c42e4adabe62a2a0316bd" - - - alert: LowPeerCount - expr: min by (testnet) (Coda_Network_peers {${berkeley_testnet},${synced_status_filter}} ) < 3 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} avg. peer count is critically low" - description: "Critically low peer count of {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LowPeerCount-3a66ae1ca6fd44b585eca37f9206d429" - - - alert: CriticallyLowMinWindowDensity - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_min_window_density {${berkeley_testnet},${synced_status_filter}} ) <= 35 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} min density is critically low" - description: "Critically low min density of {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LowMinWindowDensity-Runbook-7908635be4754b44a862d9bec8edc239" - - - alert: LowFillRate - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_slot_fill_rate {${berkeley_testnet},${synced_status_filter}} ) < 0.75 * 0.6 - for: 1h - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} slot fill rate is critically low" - description: "Lower fill rate of {{ $value }} than expected on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LowFillRate-36efb1cd9b5d461db6976bc1938fab9e" - - - alert: NoTransactionsInSeveralBlocks - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_empty_blocks_at_best_tip {${berkeley_testnet},${synced_status_filter}} ) >= 5 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has >= 5 blocks without transactions at the tip" - description: "{{ $value }} blocks without transactions on tip of network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/No-Transactions-In-Several-Blocks-55ca13df38dd4c3491e11d8ea8020c08" - - - alert: NoCoinbaseInBlocks - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_best_tip_coinbase {${berkeley_testnet},${synced_status_filter}} ) < 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has blocks without coinbases" - description: "{{ $value }} Blocks without coinbases on tip of network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/NoCoinbaseInBlocks-aacbc2a4f9334d0db2de20c2f77ac34f" - - - alert: LongFork - expr: max by (testnet) (Coda_Transition_frontier_longest_fork {${berkeley_testnet},${synced_status_filter}} ) >= 16 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has a fork of length at least 16" - description: "Fork of length {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LongFork-e65e5ad7437f4f4dbac201abbf9ace81" - - - alert: OldBestTip - expr: min by (testnet) ((time() - 1717545600) - Coda_Transition_frontier_best_tip_slot_time_sec {${berkeley_testnet},${synced_status_filter}} ) >= 15 * 180 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }}: all nodes have best tips older than 15 slots" - description: "All nodes have best tips older than 15 slots (45 minutes) on network {{ $labels.testnet }}. Best tip: {{ $value }}" - runbook: "https://www.notion.so/minaprotocol/OldBestTip-8afa955101b642bd8356edfd0b03b640" - - - alert: NoNewSnarks - expr: min by (testnet) ((time() - 1717545600) - Coda_Snark_work_useful_snark_work_received_time_sec {${berkeley_testnet},${synced_status_filter}} ) >= 2 * 180 and max by (testnet) (Coda_Snark_work_pending_snark_work {${berkeley_testnet},${synced_status_filter}} ) != 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }}: no new SNARK work seen for 2 slots." - description: "No node has received SNARK work in the last 2 slots (6 minutes) on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/NoNewSnarks-f86d27c81af54954b2fb61378bff9d4d" - - - alert: NoNewTransactions - expr: min by (testnet) ((time() - 1717545600) - Coda_Transaction_pool_useful_transactions_received_time_sec {${berkeley_testnet},${synced_status_filter}} ) >= 2 * 180 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }}: no new transactions seen for 2 slots." - description: "No node has received transactions in their transaction pool in the last 2 slots (6 minutes) on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/NoNewTransactions-27dbeafab8ea4d659ee6f748acb2fd6c" - - - alert: FewBlocksPerHour - expr: quantile by (testnet) (0.5, increase(Coda_Transition_frontier_max_blocklength_observed {${berkeley_testnet},${synced_status_filter}} [30m])) < 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "One or more {{ $labels.testnet }} nodes are stuck at an old block height (Observed block height did not increase in the last 30m)" - description: "{{ $value }} blocks have been validated on network {{ $labels.testnet }} in the last hour (according to some node)." - runbook: "https://www.notion.so/minaprotocol/FewBlocksPerHour-47a6356f093242d988b0d9527ce23478" - - - alert: StuckInBootstrap - expr: max by (testnet) (increase(Coda_Runtime_process_uptime_ms_total{${berkeley_testnet},syncStatus = "BOOTSTRAP"}[2h])) >= 6000000 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "One or more {{ $labels.testnet }} nodes are stuck at bootstrap for more than 100 mins within the recent 2 hours" - - - alert: StuckInCatchup - expr: max by (testnet) (increase(Coda_Runtime_process_uptime_ms_total{${berkeley_testnet},syncStatus = "CATCHUP"}[2h])) >= 6000000 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "One or more {{ $labels.testnet }} nodes are stuck at catchup for more than 100 mins within the recent 2 hours" - - - alert: HighBlockGossipLatency - expr: max by (testnet) (max_over_time(Coda_Block_latency_gossip_time {${berkeley_testnet},${synced_status_filter}} [${alert_timeframe}])) > 200 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} block gossip latency is high" - description: "High block gossip latency of {{ $value }}(ms) within {{ $labels.testnet }} network." - runbook: "https://www.notion.so/minaprotocol/HighBlockGossipLatency-2096501c7cf34032b44e903ec1a4d79c" - - - alert: SomewhatOldBestTip - expr: count by (testnet) (((time() - 1717545600) - Coda_Transition_frontier_best_tip_slot_time_sec {${berkeley_testnet},${synced_status_filter}} ) >= 8 * 180) > 1 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }}: at least 2 nodes have best tips older than 8 slots" - description: "At least 2 nodes have best tips older than 8 slots (24 minutes) on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/SomewhatOldBestTip-bb1509582bdd4908bcda656eebf421b5" - - - alert: MediumFork - expr: max by (testnet) (Coda_Transition_frontier_longest_fork {${berkeley_testnet},${synced_status_filter}} ) >= 8 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has a fork of length at least 8" - description: "Fork of length {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/MediumFork-0a530813af2e40c491cdf01b3a2b2304" - - - alert: NoTransactionsInAtLeastOneBlock - expr: max by (testnet) (Coda_Transition_frontier_empty_blocks_at_best_tip {${berkeley_testnet},${synced_status_filter}} ) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has at least 1 block without transactions at the tip" - description: "{{ $value }} Blocks without transactions on tip of network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/NoTransactionsInAtLeastOneBlock-049250ff7ae84de990233c7b6d35f763" - - - alert: LowMinWindowDensity - expr: quantile by (testnet) (0.5, Coda_Transition_frontier_min_window_density {${berkeley_testnet},${synced_status_filter}} ) <= 60 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} min density is low" - description: "Low min density on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/LowMinWindowDensity-Runbook-7908635be4754b44a862d9bec8edc239" - - - alert: SeedListDegraded - expr: min by (testnet) (Coda_watchdog_seeds_reachable {${berkeley_testnet}}) <= 0.5 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} seed list is degraded (less than 50% reachable)" - description: "Seed list is degraded at {{ $value }} on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/SeedListDown-d8d4e14609884c63a7086309336f3462" - - - alert: LowDisconnectedBlocksPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_no_common_ancestor {${berkeley_testnet},${synced_status_filter}} [${alert_timeframe}])) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has at least 1 blocks that have been produced on a remote side chains in the last hour" - description: "{{ $value }} blocks have been produced that share no common ancestor with our transition frontier on network {{ $labels.test }} in the last hour." - runbook: "https://www.notion.so/minaprotocol/LowDisconnectedBlocksPerHour-32bd49852fbb499090106fe63a504859" - - - alert: LowOldBlocksPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_worse_than_root {${berkeley_testnet},${synced_status_filter}} [${alert_timeframe}])) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has at least 1 blocks that are not selected over the root of our transition frontier in the last hour" - description: "{{ $value }} blocks have been produced that are not selected over the root of our transition frontier in the last hour" - runbook: "https://www.notion.so/minaprotocol/LowOldBlocksPerHour-1cc2e92b8ca944869d810f7afd7c2d78" - - - alert: LowInvalidProofPerHour - expr: max by (testnet) (increase(Coda_Rejected_blocks_invalid_proof {${berkeley_testnet}} [${alert_timeframe}])) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} has at least 1 blocks that contains an invalid blockchain snark proof in last hour" - description: "{{ $value }} blocks have been produced that contains an invalid blockchain snark proof in last hour" - runbook: "https://www.notion.so/minaprotocol/LowInvalidProofPerHour-b6e88b9ae84f47169e7f86017ab9e340" - - - alert: NodeRestarted - expr: count by (testnet) (Coda_Runtime_process_uptime_ms_total {${berkeley_testnet}} < 360000) > 0 - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "At least one of the nodes on {{ $labels.testnet }} restarted" - description: "{{ $value }} nodes on {{ $labels.testnet }} restarted" - runbook: "https://www.notion.so/minaprotocol/NodeRestarted-99a1cf710ff14aa6930a9f12ad5813a5" - -- name: Berkeley archive node alerts - rules: - - alert: HighUnparentedBlockCount - expr: max by (testnet) (Coda_Archive_unparented_blocks {${berkeley_testnet}}) > 30 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has a critically high unparented block count" - description: "{{ $value }} Unparented block count is critically high on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" - - - alert: HighMissingBlockCount - expr: max by (testnet) (Coda_Archive_missing_blocks {${berkeley_testnet}}) > 30 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: critical - annotations: - summary: "{{ $labels.testnet }} has a critically high missing block count" - description: "{{ $value }} Missing block count is critically high on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" - - - alert: LowPostgresBlockHeightGrowth - expr: min by (testnet) (increase(Coda_Archive_max_block_height {${berkeley_testnet}} [${alert_timeframe}])) < 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "{{ $labels.testnet }} rate of archival of network blocks in Postgres DB is lower than expected" - description: "The rate of {{ $value }} new blocks observed by archive postgres instances is low on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" - - - alert: UnparentedBlocksObserved - expr: max by (testnet) (Coda_Archive_unparented_blocks {${berkeley_testnet}}) > 1 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "Unparented blocks observed on {{ $labels.testnet }}" - description: "{{ $value }} Unparented block(s) observed on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" - - - alert: MissingBlocksObserved - expr: max by (testnet) (Coda_Archive_missing_blocks {${berkeley_testnet}}) > 0 - for: ${alert_evaluation_duration} - labels: - testnet: "{{ $labels.testnet }}" - severity: warning - annotations: - summary: "Missing blocks observed on {{ $labels.testnet }}" - description: "{{ $value }} Missing block(s) observed on network {{ $labels.testnet }}." - runbook: "https://www.notion.so/minaprotocol/Archive-Node-Metrics-9edf9c51dd344f1fbf6722082a2e2465" diff --git a/automation/terraform/monitoring/README.md b/automation/terraform/monitoring/README.md deleted file mode 100644 index f9c93262898..00000000000 --- a/automation/terraform/monitoring/README.md +++ /dev/null @@ -1,183 +0,0 @@ -

Mina logo

- -# Testnet Monitoring & Alerting :fire_engine: Guide - -**Table of Contents** -- [Updating Testnet Alerts](#update-testnet-alerts) - - [Developing alert expressions](#developling) - - [Testing](#testing) - - [Deployment](#deployment) -- [Alert Status](#alert-status) - - [GrafanaCloud Config](#grafancloud-config) - - [Alertmanager UI](#alertmanager-ui) - - [PagerDuty](#pagerduty) -- [HowTo](#howto) - - [Silence Alerts](#silence-alerts) - - [Update Alert Receivers](#update-alert-receivers) - - [View Alert Metrics](#view-alert-metrics) - -## Updating Testnet Alerts - -#### Developing alert expressions - -You can develop alert expressions for devising metric and alerting conditions and rules. Use the Prometheus domain-specific [query language](https://prometheus.io/docs/prometheus/latest/querying/basics/) ([examples](https://prometheus.io/docs/prometheus/latest/querying/examples/)) and follow the alert rules specification [format](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/). - -To enable variability when defining these rules, implement each rule set or group by using the *terraform* [template_file](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) and `(${ ... })` templating mechanisms for including variable substitution where appropriate. (**Note:** Variable substitutions are *optional* and provided as defaults. You can completely define alert rules according to a custom specification). - -You must edit the `testnet-alert-rules.yml.tpl` file when you add rules to be applied to all testnets. A standard set of such testnet alert rules based on templates is defined in the [testnet-alert-rules.yml.tpl](https://github.com/MinaProtocol/mina/blob/develop/automation/terraform/modules/testnet-alerts/templates/testnet-alert-rules.yml.tpl#L6) file. - -Generally, when adding or updating alerts: -1. Consult [Grafanacloud's Prometheus Explorer](https://o1testnet.grafana.net/explore?orgId=1&left=%5B%22now-1h%22,%22now%22,%22grafanacloud-o1testnet-prom%22,%7B%7D%5D) to ensure the metric to alert on is collected by infrastructure's Prometheus instances. If missing, reach out on the Mina Protocol Discord in the [#reliability-engineering](https://discord.com/channels/484437221055922177/610580493859160072) channel for help on getting the alert added. -1. Apply alerting changes to *testnet-alert-rules.yml.tpl* based on the Prometheus query language and alerting rules config. - -#### Testing - -Testing of testnet alerts involves leveraging Grafana's [cortex-tools](https://github.com/grafana/cortex-tools), a toolset developed and maintained by the Grafana community for managing Prometheus/Alertmanager alerting configurations. Specifically, the testing process makes use of `lint` and `check` for ensuring alerting rules defined in *testnet-alert-rules.yml* are syntactically correct and also meet best practices and standards for maintaining consistency in how rules are expressed and formatted. Both operations can be executed automatically in CI or manually within a developer's local environment. - -**Note:** You must run all manual steps from the [automation monitoring](https://github.com/MinaProtocol/mina/tree/develop/automation/terraform/monitoring) directory within the *mina* repo. A copy of the rendered rules configuration will be placed in this directory for reference when testing locally. - -##### Linting - -[lints](https://github.com/grafana/cortex-tools#rules-lint) a testnet alert rules file. The linter verifies YAML and PromQL expression formatting within the rule file but does not verify correctness. - -###### automation - -Executed by CI's *Lint/TestnetAlerts* [job](https://github.com/MinaProtocol/mina/blob/develop/buildkite/src/Jobs/Lint/TestnetAlerts.dhall) when a change is detected to the testnet-alerts template file. - -###### manual steps - -``` - terraform apply -target module.o1testnet_alerts.null_resource.alert_rules_lint -``` - -##### Check alerts against recommended [best practices](https://prometheus.io/docs/practices/rules/) - -###### automation - -Executed by CI's *Lint/TestnetAlerts* [job](https://github.com/MinaProtocol/mina/blob/develop/buildkite/src/Jobs/Lint/TestnetAlerts.dhall) when a change is detected to the testnet-alerts template file. - -###### manual steps - -``` - terraform apply -target module.o1testnet_alerts.null_resource.alert_rules_check -``` - -#### Deployment - -Deploying testnet alert rules entails syncing the rendered configuration in source with the Prometheus instance rules config found [here](https://o1testnet.grafana.net/a/grafana-alerting-ui-app/?tab=rules&rulessource=grafanacloud-o1testnet-prom). Appropriate AWS access is necessary for authenticating with Grafanacloud and must be similar to, if not the same, as those used for deploying testnets. - -###### automation - -Executed by CI's *Release/TestnetAlerts* [job](https://github.com/MinaProtocol/mina/blob/develop/buildkite/src/Jobs/Release/TestnetAlerts.dhall) when a change is detected to the testnet-alerts template file and linting/checking of alerts has succeeded. - -###### manual steps - -``` - terraform apply -target module.o1testnet_alerts.docker_container.sync_alert_rules -``` - -**Note:** Operation will sync provisioned alerts with an exact match of alert file state (e.g. alerts removed from the alert file will be unprovisioned on Grafanacloud) - -**Warning:** Unfortunately, Terraform silences errors that cortext-tool is producing, for example when syncing rules. To debug sync rules, follow these steps: - - Obtain secrets (id,address,key) from AWS secret manager - - Run the previous terraform command once again - - Run the following command in automation/terraform/monitoring folder: - -``` - ~/.local/bin/cortextool rules sync --rule-files alert_rules.yml --id ... --address ... --key ... -``` - -## Alert Status - -#### GrafanaCloud Config - -To view the current testnet alerting rules config or verify that changes were applied correctly following a deployment, visit this Grafanacloud rules config [site](https://o1testnet.grafana.net/alerting/list?search=datasource:grafanacloud-o1testnet-prom). - -**Note:** Ensure the datasource is set to `grafanacloud-o1testnet-prom` to access the appropriate ruleset. - -#### Alertmanager UI - -You can also view alerting rule violations in the Grafanacloud Alertmanager [UI](https://alertmanager-us-central1.grafana.net/alertmanager/#/alerts). This site provides an overview of all violating rule conditions in addition to rules that have been silenced. - -#### PagerDuty - -PagerDuty is O(1) Lab's primary alert receiver and is configured with a single [service](https://o1labs.pagerduty.com/service-directory/PY2JUNP) for monitoring Mina testnet deployments. This service receives alert notifications requiring attention from the development team to assist in repairing issues and restoring network health. - -For more information, reach out to [#reliability-engineering](https://discord.com/channels/484437221055922177/610580493859160072) on Mina's Discord channel with questions etc. - -## HowTo - -#### Silence Alerts - -* Alertmanager alert silencing: You create new alert silences using either the [Alertmanager](https://alertmanager-us-central1.grafana.net/alertmanager/#/silences/new) or the [Grafanacloud](https://o1testnet.grafana.net/a/grafana-alerting-ui-app/?tab=silences&alertmanager=grafanacloud-o1testnet-alertmanager) UI. -* PagerDuty alert suppression: See the PagerDuty [Event Management](https://support.pagerduty.com/docs/event-management#suppressing-alerts) guide. - -##### Creating new silences - -When creating new alert silences (from the preceding links or otherwise), you'll likely want to make use of the Alertmanager `Matchers` construct that basically consists of a set of key-value pairs used to target the alert to silence. For example, to silence the "LowFillRate" alert currently firing for testnet *devnet*: - Create a new silence with individual `Matchers` for the alert name and testnet like the following: - -###### Matchers example - -| Name | Value| -| ------------- | ------------- | -| testnet | devnet | -| alertname | LowFillRate | - -![Grafanacloud New Silence](https://storage.googleapis.com/shared-artifacts/grafanacloud-new-silence-example.png) - -Note the `Start`, `Duration`, and `End` inputs in the UI. Typically, only the duration of a silence is updated although Alertmanager supports the specification of start and end times based on internet timing standards [RFC3339](https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14). - -**Be sure to set the *Creator* and *Comments* field accordingly to provide insight into the reasoning for the silence and guidelines for following up.** - -#### Update Alert Receivers - -Alert receivers are reporting endpoints for messaging alert rules that are in violation, like *PagerDuty* pages, *incident* emails, SMS messages, or Discord notifications. You can find a list of available receivers and their associated configuration documentation in the [Prometheus Alertmanager configuration](https://prometheus.io/docs/alerting/latest/configuration/) documentation. - -Configure all receivers in an *Alertmanager* service receivers config to set a series of alerting routes based on `match` and `match_re` (regular expression) qualifiers that are applied to incoming rule violations received by the service. Both PagerDuty and Discord webhook receivers are set up to receive these rule violations and forward them to their appropriate destinations and are configured in the [testnet-alert-receivers.yml.tpl](https://github.com/MinaProtocol/mina/blob/develop/automation/terraform/modules/testnet-alerts/templates/testnet-alert-receivers.yml.tpl) file. - -Updates to testnet alert receivers typically involve 1 or more of the following tasks: -* modify which testnets trigger Pagerduty incidents when alert rule violations occur -* modify which testnets are included within the monitoring and alerting system (e.g. to exclude testnets launched by CI) -* update the Testnet PagerDuty service integration key -* update the Discord webhook integration key - -##### Modify testnets which alert to PagerDuty - -The list of testnets that trigger PagerDuty incidents when rule violations occur is controlled by a single regular expression defined in the [o1-testnet-alerts](https://github.com/MinaProtocol/mina/blob/develop/automation/terraform/monitoring/o1-testnet-alerts.tf#L17) Terraform module config. - -You can modify this value to any regex for capturing testnets by name, although the value is generally a relatively simple expression (e.g. `"mainnet|qanet|release-net"`) considering the critical nature of the setting and allowing easy identification of which testnets the developers will be paged about. - -##### Modify monitored testnets - -Like the list of testnets that trigger PagerDuty incidents, the list of testnets monitored is also controlled by a single regular expression defined in the [o1-testnet-alerts](https://github.com/MinaProtocol/mina/blob/develop/automation/terraform/monitoring/o1-testnet-alerts.tf#L15) terraform module config. This setting must always be a superset of the testnets alerting to PagerDuty since it manages all testnets to be included in the monitoring and alerting pipeline and both operationally and technically must be as expressive as visibility calls for. - -##### Update Pagerduty Testnet Service Integration Key - -For assistance, reach out to the [#reliability-engineering](https://discord.com/channels/484437221055922177/610580493859160072) channel in Mina Protocol Discord. - -##### Update Discord webhook integration key - -For assistance, reach out to the [#reliability-engineering](https://discord.com/channels/484437221055922177/610580493859160072) channel in Mina Protocol Discord. - -#### Deploy Alert Receiver Updates - -To view the current alerting receiver configuration or verify changes following a deployment, visit O(1) Lab's Grafanacloud alertmanager receiver [configuration](https://o1testnet.grafana.net/a/grafana-alerting-ui-app/?tab=config&alertmanager=grafanacloud-o1testnet-alertmanager). - -##### Steps - -On the command line, run the following command from the [automation monitoring](https://github.com/MinaProtocol/mina/tree/develop/automation/terraform/monitoring) directory: - -``` - terraform apply -target module.o1testnet_alerts.docker_container.update_alert_receivers -``` - -#### View Alert Metrics - -When responding to a PagerDuty incident, you'll likely want to check the Alert's *Annotations:Source* for visualizing the metrics series responsible for the firing alert. This information is contained within each incident page under the `ALERTS : CUSTOM DETAILS` section in the form of a URL which links to Grafancloud's Prometheus explorer. - -![PagerDuty Incident Annotations](https://storage.googleapis.com/shared-artifacts/pagerduty-incident-annotations.png) - -From here, it's possible to explore the values of the offending metric (along with others) over time for investigating incidents. - -![PagerDuty Incident Metric Explorer](https://storage.googleapis.com/shared-artifacts/grafanacloud-incident-metric-explorer.png) diff --git a/automation/terraform/monitoring/o1-testnet-alerts.tf b/automation/terraform/monitoring/o1-testnet-alerts.tf deleted file mode 100644 index 8bf9f118d14..00000000000 --- a/automation/terraform/monitoring/o1-testnet-alerts.tf +++ /dev/null @@ -1,40 +0,0 @@ -terraform { - required_version = ">= 0.12.0" - backend "s3" { - key = "o1-testnet-alerts.tfstate" - encrypt = true - region = "us-west-2" - bucket = "o1labs-terraform-state" - acl = "bucket-owner-full-control" - } - required_providers { - docker = { - source = "kreuzwerker/docker" - version = "2.11.0" - } - } -} - -module "o1testnet_alerts" { - source = "../modules/testnet-alerts" - - rule_filter = "{testnet!~\"^(berkeley|testworld-2-0|it-|ci-net|test-).+\"}" # omit testnets deployed by integration/CI tests and also omit berkeley network and testworld-2-0 - alert_timeframe = "1h" - alert_duration = "10m" - pagerduty_alert_filter = "devnet2|mainnet" - berkeley_testnet = "testnet=~\"(berkeley|testworld-2-0)\"" - synced_status_filter = "syncStatus=\"SYNCED\"" -} - -output "testnet_alert_rules" { - value = module.o1testnet_alerts.rendered_alerts_config -} - -output "testnet_alert_receivers" { - value = module.o1testnet_alerts.rendered_receivers_config - sensitive = true -} - -provider "docker" { - host = "unix:///var/run/docker.sock" -} diff --git a/buildkite/scripts/build-hardfork-package.sh b/buildkite/scripts/build-hardfork-package.sh index 6a83ea82f5a..fc6d0396599 100755 --- a/buildkite/scripts/build-hardfork-package.sh +++ b/buildkite/scripts/build-hardfork-package.sh @@ -58,18 +58,18 @@ _build/default/src/app/runtime_genesis_ledger/runtime_genesis_ledger.exe --confi echo "--- Create hardfork config" FORK_CONFIG_JSON=config.json LEDGER_HASHES_JSON=hardfork_ledger_hashes.json scripts/hardfork/create_runtime_config.sh > new_config.json -existing_files=$(aws s3 ls s3://snark-keys.o1test.net/ | awk '{print $4}') +existing_files=$(aws s3 ls s3://snark-keys-ro.o1test.net/ | awk '{print $4}') for file in hardfork_ledgers/*; do filename=$(basename "$file") if echo "$existing_files" | grep -q "$filename"; then echo "Info: $filename already exists in the bucket, packaging it instead." oldhash=$(openssl dgst -r -sha3-256 "$file" | awk '{print $1}') - aws s3 cp "s3://snark-keys.o1test.net/$filename" "$file" + aws s3 cp "s3://snark-keys-ro.o1test.net/$filename" "$file" newhash=$(openssl dgst -r -sha3-256 "$file" | awk '{print $1}') sed -i "s/$oldhash/$newhash/g" new_config.json else - aws s3 cp --acl public-read "$file" s3://snark-keys.o1test.net/ + aws s3 cp --acl public-read "$file" s3://snark-keys-ro.o1test.net/ fi done diff --git a/buildkite/scripts/build-release.sh b/buildkite/scripts/build-release.sh index f1242fb94f5..fe90606bd1a 100755 --- a/buildkite/scripts/build-release.sh +++ b/buildkite/scripts/build-release.sh @@ -14,7 +14,7 @@ echo " Includes mina daemon, archive-node, rosetta, generate keypair for berkele echo "--- Prepare debian packages" -./scripts/rebuild-deb.sh $@ +./scripts/debian/build.sh $@ echo "--- Git diff after build is complete:" git diff --exit-code -- . \ No newline at end of file diff --git a/buildkite/scripts/check-compatibility.sh b/buildkite/scripts/check-compatibility.sh index f1e571fdb9b..c638ec813c4 100755 --- a/buildkite/scripts/check-compatibility.sh +++ b/buildkite/scripts/check-compatibility.sh @@ -6,7 +6,7 @@ set +e function get_shas { - SHAS=$(git log -n 10 --format="%h" --abbrev=7 --no-merges) + SHAS=$(git log -n 10 --format="%h" --abbrev=7 --first-parent) } function image_tag { diff --git a/buildkite/scripts/promote-deb.sh b/buildkite/scripts/debian/promote.sh similarity index 97% rename from buildkite/scripts/promote-deb.sh rename to buildkite/scripts/debian/promote.sh index 498493cb975..f0a59ac369e 100755 --- a/buildkite/scripts/promote-deb.sh +++ b/buildkite/scripts/debian/promote.sh @@ -1,5 +1,4 @@ #!/bin/bash -set -eox pipefail CLEAR='\033[0m' RED='\033[0;31m' @@ -48,6 +47,8 @@ if [ -z "$AWS_ACCESS_KEY_ID" ]; then exit 0 fi +source buildkite/scripts/export-git-env-vars.sh + echo "Promoting debs: ${PACKAGE}_${VERSION} to Release: ${TO_COMPONENT} and Codename: ${CODENAME}" # Promote the deb . # If this fails, attempt to remove the lockfile and retry. @@ -55,7 +56,7 @@ echo "Promoting debs: ${PACKAGE}_${VERSION} to Release: ${TO_COMPONENT} and Code if [[ -z "$NEW_VERSION" ]] || [[ "$NEW_VERSION" == "$VERSION" ]]; then deb-s3 copy --s3-region=us-west-2 --lock --bucket packages.o1test.net --preserve-versions --cache-control=max-age=120 $PACKAGE $CODENAME $TO_COMPONENT --versions $VERSION --arch $ARCH --component ${FROM_COMPONENT} --codename ${CODENAME} else - source scripts/reversion-deb.sh \ + source scripts/debian/reversion.sh \ --deb $PACKAGE \ --codename $CODENAME \ --new-release $TO_COMPONENT \ diff --git a/buildkite/scripts/publish-deb.sh b/buildkite/scripts/debian/publish.sh similarity index 85% rename from buildkite/scripts/publish-deb.sh rename to buildkite/scripts/debian/publish.sh index f92c44b2aa3..8b96a974591 100755 --- a/buildkite/scripts/publish-deb.sh +++ b/buildkite/scripts/debian/publish.sh @@ -2,7 +2,7 @@ set -eox pipefail SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" -source "${SCRIPTPATH}/export-git-env-vars.sh" +source "${SCRIPTPATH}/../export-git-env-vars.sh" DOWNLOAD_FOLDER=_build @@ -15,7 +15,7 @@ if [ -z "$AWS_ACCESS_KEY_ID" ]; then exit 0 fi -source scripts/publish-deb.sh \ +source scripts/debian/publish.sh \ --names "${DOWNLOAD_FOLDER}/mina-*.deb" \ --release $MINA_DEB_RELEASE \ --version $MINA_DEB_VERSION \ diff --git a/buildkite/scripts/upload-deb-to-gs.sh b/buildkite/scripts/debian/upload-to-gs.sh similarity index 100% rename from buildkite/scripts/upload-deb-to-gs.sh rename to buildkite/scripts/debian/upload-to-gs.sh diff --git a/buildkite/scripts/dump-mina-type-shapes.sh b/buildkite/scripts/dump-mina-type-shapes.sh index ff920e7b143..57d3c2b2302 100755 --- a/buildkite/scripts/dump-mina-type-shapes.sh +++ b/buildkite/scripts/dump-mina-type-shapes.sh @@ -15,8 +15,8 @@ source buildkite/scripts/export-git-env-vars.sh source buildkite/scripts/debian/install.sh "mina-${TESTNET_NAME}" 1 -MINA_COMMIT_SHA1=$(git log -n 1 --format=%h --abbrev=7 --no-merges) +MINA_COMMIT_SHA1=$(git log -n 1 --format=%h --abbrev=7) export TYPE_SHAPE_FILE=${MINA_COMMIT_SHA1}-type_shape.txt echo "--- Create type shapes git note for commit: ${MINA_COMMIT_SHA1}" -mina internal dump-type-shapes > ${TYPE_SHAPE_FILE} \ No newline at end of file +mina internal dump-type-shapes > ${TYPE_SHAPE_FILE} diff --git a/buildkite/scripts/export-git-env-vars.sh b/buildkite/scripts/export-git-env-vars.sh index ae95633734c..9b78aa7123d 100755 --- a/buildkite/scripts/export-git-env-vars.sh +++ b/buildkite/scripts/export-git-env-vars.sh @@ -1,5 +1,4 @@ #!/bin/bash -set -euo pipefail echo "Exporting Variables: " diff --git a/buildkite/scripts/promote-docker.sh b/buildkite/scripts/promote-docker.sh index 640c4dee389..683bbc28acc 100755 --- a/buildkite/scripts/promote-docker.sh +++ b/buildkite/scripts/promote-docker.sh @@ -9,7 +9,7 @@ while [[ "$#" -gt 0 ]]; do case $1 in -n|--name) NAME="$2"; shift;; -v|--version) VERSION="$2"; shift;; -t|--tag) TAG="$2"; shift;; - -p|--publish) PUBLISH=1 ;; + -p|--publish) PUBLISH=1; ;; *) echo "Unknown parameter passed: $1"; exit 1;; esac; shift; done @@ -43,7 +43,9 @@ echo "Adding new tag ($TAG) for docker ${GCR_REPO}/${NAME}:${VERSION}" docker pull ${GCR_REPO}/${NAME}:${VERSION} -if [[ "$PUBLISH" -eq 1 ]]; then +source buildkite/scripts/export-git-env-vars.sh + +if [[ -v PUBLISH ]]; then TARGET_REPO=docker.io/minaprotocol docker tag ${GCR_REPO}/${NAME}:${VERSION} ${TARGET_REPO}/${NAME}:${TAG} docker push "${TARGET_REPO}/${NAME}:${TAG}" diff --git a/buildkite/scripts/rosetta-integration-tests.sh b/buildkite/scripts/rosetta-integration-tests.sh index e9219071677..c3fb9dd378a 100755 --- a/buildkite/scripts/rosetta-integration-tests.sh +++ b/buildkite/scripts/rosetta-integration-tests.sh @@ -30,7 +30,7 @@ export PG_CONN=postgres://${POSTGRES_USERNAME}:${POSTGRES_USERNAME}@127.0.0.1:54 # Mina Archive variables export MINA_ARCHIVE_PORT=${MINA_ARCHIVE_PORT:=3086} -export MINA_ARCHIVE_SQL_SCHEMA_PATH=${MINA_ARCHIVE_SQL_SCHEMA_PATH:=/etc/mina/rosetta/archive/create_schema.sql} +export MINA_ARCHIVE_SQL_SCHEMA_PATH=${MINA_ARCHIVE_SQL_SCHEMA_PATH:=/etc/mina/archive/create_schema.sql} # Mina Rosetta variables export MINA_ROSETTA_ONLINE_PORT=${MINA_ROSETTA_ONLINE_PORT:=3087} diff --git a/buildkite/scripts/run_promote_build_job.sh b/buildkite/scripts/run_promote_build_job.sh index 26feee3e23a..3de86fc13de 100755 --- a/buildkite/scripts/run_promote_build_job.sh +++ b/buildkite/scripts/run_promote_build_job.sh @@ -18,7 +18,7 @@ # - "NETWORK=Devnet" # - "FROM_VERSION=3.0.0devnet-tooling-dkijania-hardfork-package-gen-in-nightly-b37f50e" # - "NEW_VERSION=3.0.0fake-ddb6fc4" -# - "CODENAMES=Focal,Buster,Bullseye" +# - "CODENAMES=Focal,Bullseye" # - "FROM_CHANNEL=Unstable" # - "TO_CHANNEL=Experimental" # image: codaprotocol/ci-toolchain-base:v3 @@ -41,7 +41,7 @@ function usage() { fi echo " DEBIANS The comma delimitered debian names. For example: 'Daemon,Archive' " echo " DOCKERS The comma delimitered docker names. For example: 'Daemon,Archive' " - echo " CODENAMES The Debian codenames (Bullseye, Buster etc.)" + echo " CODENAMES The Debian codenames (Bullseye, Focal etc.)" echo " FROM_VERSION The Source Docker or Debian version " echo " NEW_VERSION The new Debian version or new Docker tag" echo " REMOVE_PROFILE_FROM_NAME Should we remove profile suffix from debian name" diff --git a/buildkite/scripts/run_verify_promoted_build_job.sh b/buildkite/scripts/run_verify_promoted_build_job.sh index ed093b1a44b..da2a3789d3f 100755 --- a/buildkite/scripts/run_verify_promoted_build_job.sh +++ b/buildkite/scripts/run_verify_promoted_build_job.sh @@ -18,7 +18,7 @@ # - "NETWORK=Devnet" # - "FROM_VERSION=3.0.0devnet-tooling-dkijania-hardfork-package-gen-in-nightly-b37f50e" # - "NEW_VERSION=3.0.0fake-ddb6fc4" -# - "CODENAMES=Focal,Buster,Bullseye" +# - "CODENAMES=Focal,Bullseye" # - "FROM_CHANNEL=Unstable" # - "TO_CHANNEL=Experimental" # image: codaprotocol/ci-toolchain-base:v3 @@ -41,7 +41,7 @@ function usage() { fi echo " DEBIANS The comma delimitered debian names. For example: 'Daemon,Archive' " echo " DOCKERS The comma delimitered docker names. For example: 'Daemon,Archive' " - echo " CODENAMES The Debian codenames (Bullseye, Buster etc.)" + echo " CODENAMES The Debian codenames (Bullseye, Focal etc.)" echo " NEW_VERSION The new Debian version or new Docker tag" echo " REMOVE_PROFILE_FROM_NAME Should we remove profile suffix from debian name" echo " PROFILE The Docker and Debian profile (Standard, Lightnet)" diff --git a/buildkite/scripts/setup-database-for-archive-node.sh b/buildkite/scripts/setup-database-for-archive-node.sh index f9ad2fe342e..9aa9062b223 100755 --- a/buildkite/scripts/setup-database-for-archive-node.sh +++ b/buildkite/scripts/setup-database-for-archive-node.sh @@ -8,5 +8,8 @@ db=$3 sudo service postgresql start -sudo -u postgres psql -c "CREATE USER ${user} WITH SUPERUSER PASSWORD '${password}';" +sudo -u postgres psql -c "CREATE USER ${user} WITH LOGIN SUPERUSER PASSWORD '${password}';" +sudo pg_isready +service postgresql status sudo -u postgres createdb -O $user $db +PGPASSWORD=$password psql -h localhost -p 5434 -U $user -d $db -a -f src/app/archive/create_schema.sql diff --git a/buildkite/scripts/version-linter.sh b/buildkite/scripts/version-linter.sh index 183a8db9894..fb1ea8c9d89 100755 --- a/buildkite/scripts/version-linter.sh +++ b/buildkite/scripts/version-linter.sh @@ -23,9 +23,9 @@ source buildkite/scripts/export-git-env-vars.sh pip3 install sexpdata==1.0.0 -base_branch=${REMOTE}/${BUILDKITE_PULL_REQUEST_BASE_BRANCH} +base_branch=${REMOTE}/${BUILDKITE_PULL_REQUEST_BASE_BRANCH:-compatible} pr_branch=origin/${BUILDKITE_BRANCH} -release_branch=${REMOTE}/$1 +release_branch=origin/$1 echo "--- Run Python version linter with branches: ${pr_branch} ${base_branch} ${release_branch}" ./scripts/version-linter.py ${pr_branch} ${base_branch} ${release_branch} diff --git a/buildkite/src/Command/DockerImage.dhall b/buildkite/src/Command/DockerImage.dhall index 1ac61447144..1199d461332 100644 --- a/buildkite/src/Command/DockerImage.dhall +++ b/buildkite/src/Command/DockerImage.dhall @@ -10,6 +10,8 @@ let Size = ./Size.dhall let Profiles = ../Constants/Profiles.dhall +let Artifacts = ../Constants/Artifacts.dhall + let BuildFlags = ../Constants/BuildFlags.dhall let Cmd = ../Lib/Cmds.dhall @@ -26,13 +28,13 @@ let ReleaseSpec = , version : Text , branch : Text , repo : Text + , no_cache : Bool , deb_codename : Text , deb_release : Text , deb_version : Text , deb_profile : Profiles.Type , deb_repo : DebianRepo.Type , build_flags : BuildFlags.Type - , extra_args : Text , step_key : Text , if : Optional B/If } @@ -40,7 +42,7 @@ let ReleaseSpec = { deps = [] : List Command.TaggedKey.Type , network = "devnet" , version = "\\\${MINA_DOCKER_TAG}" - , service = "\\\${MINA_SERVICE}" + , service = Artifacts.dockerName Artifacts.Type.Daemon , branch = "\\\${BUILDKITE_BRANCH}" , repo = "\\\${BUILDKITE_REPO}" , deb_codename = "bullseye" @@ -49,7 +51,7 @@ let ReleaseSpec = , deb_profile = Profiles.Type.Standard , build_flags = BuildFlags.Type.None , deb_repo = DebianRepo.Type.PackagesO1Test - , extra_args = "" + , no_cache = False , step_key = "daemon-standard-docker-image" , if = None B/If } @@ -59,12 +61,15 @@ let generateStep = \(spec : ReleaseSpec.Type) -> let exportMinaDebCmd = "export MINA_DEB_CODENAME=${spec.deb_codename}" + let maybeCacheOption = if spec.no_cache then "--no-cache" else "" + let buildDockerCmd = - "./scripts/release-docker.sh" + "./scripts/docker/build.sh" ++ " --service ${spec.service}" - ++ " --version ${spec.version}" ++ " --network ${spec.network}" + ++ " --version ${spec.version}" ++ " --branch ${spec.branch}" + ++ " ${maybeCacheOption} " ++ " --deb-codename ${spec.deb_codename}" ++ " --deb-repo ${DebianRepo.address spec.deb_repo}" ++ " --deb-release ${spec.deb_release}" @@ -73,7 +78,17 @@ let generateStep = ++ " --deb-build-flags ${BuildFlags.lowerName spec.build_flags}" ++ " --repo ${spec.repo}" - ++ " --extra-args \\\"${spec.extra_args}\\\"" + + let releaseDockerCmd = + "./scripts/docker/release.sh" + ++ " --service ${spec.service}" + ++ " --version ${spec.version}" + ++ " --network ${spec.network}" + ++ " --deb-codename ${spec.deb_codename}" + ++ " --deb-version ${spec.deb_version}" + ++ " --deb-profile ${Profiles.lowerName spec.deb_profile}" + ++ " --deb-build-flags ${BuildFlags.lowerName + spec.build_flags}" let commands = merge @@ -83,6 +98,8 @@ let generateStep = ++ " && source ./buildkite/scripts/export-git-env-vars.sh " ++ " && " ++ buildDockerCmd + ++ " && " + ++ releaseDockerCmd ) ] , Local = @@ -93,6 +110,8 @@ let generateStep = ++ " && source ./buildkite/scripts/export-git-env-vars.sh " ++ " && " ++ buildDockerCmd + ++ " && " + ++ releaseDockerCmd ++ " && ./scripts/debian/aptly.sh stop" ) ] diff --git a/buildkite/src/Command/HardforkPackageGeneration.dhall b/buildkite/src/Command/HardforkPackageGeneration.dhall index f45da4fb027..183826d81b4 100644 --- a/buildkite/src/Command/HardforkPackageGeneration.dhall +++ b/buildkite/src/Command/HardforkPackageGeneration.dhall @@ -30,6 +30,8 @@ let DebianVersions = ../Constants/DebianVersions.dhall let DebianRepo = ../Constants/DebianRepo.dhall +let Artifacts = ../Constants/Artifacts.dhall + let Profiles = ../Constants/Profiles.dhall let Toolchain = ../Constants/Toolchain.dhall @@ -125,8 +127,8 @@ let pipeline ) "./buildkite/scripts/build-hardfork-package.sh" # [ Cmd.run - "./buildkite/scripts/upload-deb-to-gs.sh ${DebianVersions.lowerName - debVersion}" + "./buildkite/scripts/debian/upload-to-gs.sh ${DebianVersions.lowerName + debVersion}" ] , label = "Build Mina Hardfork Package for ${DebianVersions.capitalName @@ -144,7 +146,7 @@ let pipeline , "MINA_DEB_CODENAME=${DebianVersions.lowerName debVersion}" ] - "./buildkite/scripts/publish-deb.sh" + "./buildkite/scripts/debian/publish.sh" , label = "Publish Mina for ${DebianVersions.capitalName debVersion} Hardfork" @@ -157,7 +159,7 @@ let pipeline DockerImage.ReleaseSpec::{ , deps = [ { name = pipelineName, key = generateLedgersJobKey } ] - , service = "mina-daemon" + , service = Artifacts.dockerName Artifacts.Type.Daemon , network = network_name , deb_codename = "${DebianVersions.lowerName debVersion}" , deb_profile = profile @@ -212,7 +214,7 @@ let pipeline DockerImage.ReleaseSpec::{ , deps = [ { name = pipelineName, key = generateLedgersJobKey } ] - , service = "mina-archive" + , service = Artifacts.dockerName Artifacts.Type.Archive , network = network_name , deb_codename = "${DebianVersions.lowerName debVersion}" , deb_profile = profile @@ -226,7 +228,7 @@ let pipeline DockerImage.ReleaseSpec::{ , deps = [ { name = pipelineName, key = generateLedgersJobKey } ] - , service = "mina-rosetta" + , service = Artifacts.dockerName Artifacts.Type.Rosetta , network = network_name , deb_repo = DebianRepo.Type.Local , deb_codename = "${DebianVersions.lowerName debVersion}" diff --git a/buildkite/src/Command/MinaArtifact.dhall b/buildkite/src/Command/MinaArtifact.dhall index f80115fa1ca..28793fb3d22 100644 --- a/buildkite/src/Command/MinaArtifact.dhall +++ b/buildkite/src/Command/MinaArtifact.dhall @@ -24,6 +24,8 @@ let DebianVersions = ../Constants/DebianVersions.dhall let DebianRepo = ../Constants/DebianRepo.dhall +let DebianChannel = ../Constants/DebianChannel.dhall + let Profiles = ../Constants/Profiles.dhall let Network = ../Constants/Network.dhall @@ -45,6 +47,7 @@ let MinaBuildSpec = , toolchainSelectMode : Toolchain.SelectionMode , mode : PipelineMode.Type , tags : List PipelineTag.Type + , channel : DebianChannel.Type } , default = { prefix = "MinaArtifact" @@ -56,6 +59,7 @@ let MinaBuildSpec = , toolchainSelectMode = Toolchain.SelectionMode.ByDebian , mode = PipelineMode.Type.PullRequest , tags = [ PipelineTag.Type.Long, PipelineTag.Type.Release ] + , channel = DebianChannel.Type.Unstable } } @@ -83,8 +87,8 @@ let build_artifacts spec.artifacts spec.networks}" # [ Cmd.run - "./buildkite/scripts/upload-deb-to-gs.sh ${DebianVersions.lowerName - spec.debVersion}" + "./buildkite/scripts/debian/upload-to-gs.sh ${DebianVersions.lowerName + spec.debVersion}" ] , label = "Build Mina for ${DebianVersions.capitalName @@ -101,25 +105,48 @@ let build_artifacts ] } +let publish_to_debian_repo = + \(spec : MinaBuildSpec.Type) + -> Command.build + Command.Config::{ + , commands = + Toolchain.select + spec.toolchainSelectMode + spec.debVersion + [ "AWS_ACCESS_KEY_ID" + , "AWS_SECRET_ACCESS_KEY" + , "MINA_DEB_CODENAME=${DebianVersions.lowerName + spec.debVersion}" + , "MINA_DEB_RELEASE=${DebianChannel.lowerName spec.channel}" + ] + "./buildkite/scripts/debian/publish.sh" + , label = + "Publish Mina for ${DebianVersions.capitalName + spec.debVersion} ${Profiles.toSuffixUppercase + spec.profile}" + , key = "publish-deb-pkg" + , depends_on = + DebianVersions.dependsOnStep + (Some spec.prefix) + spec.debVersion + spec.profile + spec.buildFlags + "build" + , target = Size.Small + } + let docker_step - : Artifacts.Type - -> DebianVersions.DebVersion - -> List Network.Type - -> Profiles.Type - -> BuildFlags.Type - -> List DockerImage.ReleaseSpec.Type + : Artifacts.Type -> MinaBuildSpec.Type -> List DockerImage.ReleaseSpec.Type = \(artifact : Artifacts.Type) - -> \(debVersion : DebianVersions.DebVersion) - -> \(networks : List Network.Type) - -> \(profile : Profiles.Type) - -> \(buildFlags : BuildFlags.Type) + -> \(spec : MinaBuildSpec.Type) -> let step_dep_name = "build" let deps = DebianVersions.dependsOnStep - debVersion - profile - buildFlags + (Some spec.prefix) + spec.debVersion + spec.profile + spec.buildFlags step_dep_name in merge @@ -130,64 +157,55 @@ let docker_step ( \(n : Network.Type) -> DockerImage.ReleaseSpec::{ , deps = deps - , service = "mina-daemon" + , service = + Artifacts.dockerName Artifacts.Type.Daemon , network = Network.lowerName n , deb_codename = - "${DebianVersions.lowerName debVersion}" - , deb_profile = profile - , build_flags = buildFlags + "${DebianVersions.lowerName spec.debVersion}" + , deb_profile = spec.profile + , build_flags = spec.buildFlags , deb_repo = DebianRepo.Type.Local , step_key = "daemon-${Network.lowerName n}-${DebianVersions.lowerName - debVersion}${Profiles.toLabelSegment - profile}${BuildFlags.toLabelSegment - buildFlags}-docker-image" + spec.debVersion}${Profiles.toLabelSegment + spec.profile}${BuildFlags.toLabelSegment + spec.buildFlags}-docker-image" } ) - networks - , TestExecutive = - [ DockerImage.ReleaseSpec::{ - , deps = deps - , service = "mina-test-executive" - , deb_codename = "${DebianVersions.lowerName debVersion}" - , deb_profile = profile - , build_flags = buildFlags - , deb_repo = DebianRepo.Type.Local - , step_key = - "test-executive-${DebianVersions.lowerName - debVersion}${BuildFlags.toLabelSegment - buildFlags}--docker-image" - } - ] + spec.networks + , TestExecutive = [] : List DockerImage.ReleaseSpec.Type + , LogProc = [] : List DockerImage.ReleaseSpec.Type , BatchTxn = [ DockerImage.ReleaseSpec::{ , deps = deps , service = "mina-batch-txn" , network = "berkeley" - , deb_codename = "${DebianVersions.lowerName debVersion}" - , deb_profile = profile - , build_flags = buildFlags + , deb_codename = + "${DebianVersions.lowerName spec.debVersion}" + , deb_profile = spec.profile + , build_flags = spec.buildFlags , deb_repo = DebianRepo.Type.Local , step_key = "batch-txn-${DebianVersions.lowerName - debVersion}${BuildFlags.toLabelSegment - buildFlags}--docker-image" + spec.debVersion}${BuildFlags.toLabelSegment + spec.buildFlags}--docker-image" } ] , Archive = [ DockerImage.ReleaseSpec::{ , deps = deps , service = "mina-archive" - , deb_codename = "${DebianVersions.lowerName debVersion}" - , deb_profile = profile - , build_flags = buildFlags + , deb_codename = + "${DebianVersions.lowerName spec.debVersion}" + , deb_profile = spec.profile + , build_flags = spec.buildFlags , deb_repo = DebianRepo.Type.Local , step_key = "archive-${DebianVersions.lowerName - debVersion}${Profiles.toLabelSegment - profile}${BuildFlags.toLabelSegment - buildFlags}-docker-image" + spec.debVersion}${Profiles.toLabelSegment + spec.profile}${BuildFlags.toLabelSegment + spec.buildFlags}-docker-image" } ] , Rosetta = @@ -195,44 +213,47 @@ let docker_step , deps = deps , service = "mina-rosetta" , network = "berkeley" - , build_flags = buildFlags + , build_flags = spec.buildFlags , deb_repo = DebianRepo.Type.Local - , deb_profile = profile - , deb_codename = "${DebianVersions.lowerName debVersion}" + , deb_profile = spec.profile + , deb_codename = + "${DebianVersions.lowerName spec.debVersion}" , step_key = "rosetta-${DebianVersions.lowerName - debVersion}${BuildFlags.toLabelSegment - buildFlags}-docker-image" + spec.debVersion}${BuildFlags.toLabelSegment + spec.buildFlags}-docker-image" } ] , ZkappTestTransaction = [ DockerImage.ReleaseSpec::{ , deps = deps , service = "mina-zkapp-test-transaction" - , build_flags = buildFlags + , build_flags = spec.buildFlags , deb_repo = DebianRepo.Type.Local - , deb_profile = profile - , deb_codename = "${DebianVersions.lowerName debVersion}" + , deb_profile = spec.profile + , deb_codename = + "${DebianVersions.lowerName spec.debVersion}" , step_key = "zkapp-test-transaction-${DebianVersions.lowerName - debVersion}${Profiles.toLabelSegment - profile}${BuildFlags.toLabelSegment - buildFlags}--docker-image" + spec.debVersion}${Profiles.toLabelSegment + spec.profile}${BuildFlags.toLabelSegment + spec.buildFlags}--docker-image" } ] , FunctionalTestSuite = [ DockerImage.ReleaseSpec::{ , deps = deps , service = "mina-test-suite" - , deb_codename = "${DebianVersions.lowerName debVersion}" - , build_flags = buildFlags + , deb_codename = + "${DebianVersions.lowerName spec.debVersion}" + , build_flags = spec.buildFlags , deb_repo = DebianRepo.Type.Local - , deb_profile = profile + , deb_profile = spec.profile , step_key = "test-suite-${DebianVersions.lowerName - debVersion}${Profiles.toLabelSegment - profile}${BuildFlags.toLabelSegment - buildFlags}--docker-image" + spec.debVersion}${Profiles.toLabelSegment + spec.profile}${BuildFlags.toLabelSegment + spec.buildFlags}--docker-image" , network = "berkeley" } ] @@ -246,14 +267,7 @@ let docker_commands List/map Artifacts.Type (List DockerImage.ReleaseSpec.Type) - ( \(artifact : Artifacts.Type) - -> docker_step - artifact - spec.debVersion - spec.networks - spec.profile - spec.buildFlags - ) + (\(artifact : Artifacts.Type) -> docker_step artifact spec) spec.artifacts let flattened_docker_steps = @@ -275,27 +289,48 @@ let docker_commands ) flattened_docker_steps +let pipelineBuilder + : MinaBuildSpec.Type -> List Command.Type -> Pipeline.Config.Type + = \(spec : MinaBuildSpec.Type) + -> \(steps : List Command.Type) + -> Pipeline.Config::{ + , spec = JobSpec::{ + , dirtyWhen = DebianVersions.dirtyWhen spec.debVersion + , path = "Release" + , name = + "${spec.prefix}${DebianVersions.capitalName + spec.debVersion}${Profiles.toSuffixUppercase + spec.profile}${BuildFlags.toSuffixUppercase + spec.buildFlags}" + , tags = spec.tags + , mode = spec.mode + } + , steps = steps + } + +let onlyDebianPipeline + : MinaBuildSpec.Type -> Pipeline.Config.Type + = \(spec : MinaBuildSpec.Type) + -> pipelineBuilder + spec + [ Libp2p.step spec.debVersion spec.buildFlags + , build_artifacts spec + , publish_to_debian_repo spec + ] + let pipeline : MinaBuildSpec.Type -> Pipeline.Config.Type = \(spec : MinaBuildSpec.Type) - -> let steps = - [ Libp2p.step spec.debVersion spec.buildFlags + -> pipelineBuilder + spec + ( [ Libp2p.step spec.debVersion spec.buildFlags , build_artifacts spec + , publish_to_debian_repo spec ] + # docker_commands spec + ) - in Pipeline.Config::{ - , spec = JobSpec::{ - , dirtyWhen = DebianVersions.dirtyWhen spec.debVersion - , path = "Release" - , name = - "${spec.prefix}${DebianVersions.capitalName - spec.debVersion}${Profiles.toSuffixUppercase - spec.profile}${BuildFlags.toSuffixUppercase - spec.buildFlags}" - , tags = spec.tags - , mode = spec.mode - } - , steps = steps # docker_commands spec - } - -in { pipeline = pipeline, MinaBuildSpec = MinaBuildSpec } +in { pipeline = pipeline + , onlyDebianPipeline = onlyDebianPipeline + , MinaBuildSpec = MinaBuildSpec + } diff --git a/buildkite/src/Command/PromotePackage.dhall b/buildkite/src/Command/PromotePackage.dhall deleted file mode 100644 index b4f0db530df..00000000000 --- a/buildkite/src/Command/PromotePackage.dhall +++ /dev/null @@ -1,305 +0,0 @@ -let B = ../External/Buildkite.dhall - -let B/If = B.definitions/commandStep/properties/if/Type - -let Prelude = ../External/Prelude.dhall - -let List/map = Prelude.List.map - -let Package = ../Constants/DebianPackage.dhall - -let Network = ../Constants/Network.dhall - -let PipelineMode = ../Pipeline/Mode.dhall - -let PipelineTag = ../Pipeline/Tag.dhall - -let Pipeline = ../Pipeline/Dsl.dhall - -let JobSpec = ../Pipeline/JobSpec.dhall - -let DebianChannel = ../Constants/DebianChannel.dhall - -let Profiles = ../Constants/Profiles.dhall - -let Artifact = ../Constants/Artifacts.dhall - -let DebianVersions = ../Constants/DebianVersions.dhall - -let Toolchain = ../Constants/Toolchain.dhall - -let Command = ./Base.dhall - -let Size = ./Size.dhall - -let Cmd = ../Lib/Cmds.dhall - -let PromoteDebianSpec = - { Type = - { deps : List Command.TaggedKey.Type - , package : Package.Type - , version : Text - , new_version : Text - , architecture : Text - , network : Network.Type - , codename : DebianVersions.DebVersion - , from_channel : DebianChannel.Type - , to_channel : DebianChannel.Type - , profile : Profiles.Type - , remove_profile_from_name : Bool - , step_key : Text - , if : Optional B/If - } - , default = - { deps = [] : List Command.TaggedKey.Type - , package = Package.Type.LogProc - , version = "" - , new_version = "" - , architecture = "amd64" - , network = Network.Type.Berkeley - , codename = DebianVersions.DebVersion.Bullseye - , from_channel = DebianChannel.Type.Unstable - , to_channel = DebianChannel.Type.Nightly - , profile = Profiles.Type.Standard - , remove_profile_from_name = False - , step_key = "promote-debian-package" - , if = None B/If - } - } - -let PromoteDockerSpec = - { Type = - { deps : List Command.TaggedKey.Type - , name : Artifact.Type - , version : Text - , profile : Profiles.Type - , codename : DebianVersions.DebVersion - , new_tag : Text - , network : Network.Type - , step_key : Text - , if : Optional B/If - , publish : Bool - , remove_profile_from_name : Bool - } - , default = - { deps = [] : List Command.TaggedKey.Type - , name = Artifact.Type.Daemon - , version = "" - , new_tag = "" - , step_key = "promote-docker" - , profile = Profiles.Type.Standard - , network = Network.Type.Berkeley - , codename = DebianVersions.DebVersion.Bullseye - , if = None B/If - , publish = False - , remove_profile_from_name = False - } - } - -let promoteDebianStep = - \(spec : PromoteDebianSpec.Type) - -> let package_name - : Text - = Package.debianName spec.package spec.profile spec.network - - let new_name = - if spec.remove_profile_from_name - - then "--new-name ${Package.debianName - spec.package - Profiles.Type.Standard - spec.network}" - - else "" - - in Command.build - Command.Config::{ - , commands = - Toolchain.runner - DebianVersions.DebVersion.Bullseye - [ "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY" ] - "./buildkite/scripts/promote-deb.sh --package ${package_name} --version ${spec.version} --new-version ${spec.new_version} --architecture ${spec.architecture} --codename ${DebianVersions.lowerName - spec.codename} --from-component ${DebianChannel.lowerName - spec.from_channel} --to-component ${DebianChannel.lowerName - spec.to_channel} ${new_name}" - , label = "Debian: ${spec.step_key}" - , key = spec.step_key - , target = Size.XLarge - , depends_on = spec.deps - , if = spec.if - } - -let promoteDebianVerificationStep = - \(spec : PromoteDebianSpec.Type) - -> let name = - if spec.remove_profile_from_name - - then "${Package.debianName - spec.package - Profiles.Type.Standard - spec.network}" - - else Package.debianName spec.package spec.profile spec.network - - in Command.build - Command.Config::{ - , commands = - [ Cmd.run - "./scripts/debian/verify.sh --package ${name} --version ${spec.new_version} --codename ${DebianVersions.lowerName - spec.codename} --channel ${DebianChannel.lowerName - spec.to_channel}" - ] - , label = "Debian: ${spec.step_key}" - , key = spec.step_key - , target = Size.Small - , depends_on = spec.deps - , if = spec.if - } - -let promoteDockerStep = - \(spec : PromoteDockerSpec.Type) - -> let old_tag = - Artifact.dockerTag - spec.name - spec.version - spec.codename - spec.profile - spec.network - False - - let new_tag = - Artifact.dockerTag - spec.name - spec.new_tag - spec.codename - spec.profile - spec.network - spec.remove_profile_from_name - - let publish = if spec.publish then "-p" else "" - - in Command.build - Command.Config::{ - , commands = - [ Cmd.run - "./buildkite/scripts/promote-docker.sh --name ${Artifact.dockerName - spec.name} --version ${old_tag} --tag ${new_tag} ${publish}" - ] - , label = "Docker: ${spec.step_key}" - , key = spec.step_key - , target = Size.XLarge - , depends_on = spec.deps - , if = spec.if - } - -let promoteDockerVerificationStep = - \(spec : PromoteDockerSpec.Type) - -> let new_tag = - Artifact.dockerTag - spec.name - spec.new_tag - spec.codename - spec.profile - spec.network - spec.remove_profile_from_name - - let repo = - if spec.publish - - then "docker.io/minaprotocol" - - else "gcr.io/o1labs-192920" - - in Command.build - Command.Config::{ - , commands = - [ Cmd.run - "docker pull ${repo}/${Artifact.dockerName - spec.name}:${new_tag}" - ] - , label = "Docker: ${spec.step_key}" - , key = spec.step_key - , target = Size.Small - , depends_on = spec.deps - , if = spec.if - } - -let promotePipeline - : List PromoteDebianSpec.Type - -> List PromoteDockerSpec.Type - -> DebianVersions.DebVersion - -> PipelineMode.Type - -> Pipeline.Config.Type - = \(debians_spec : List PromoteDebianSpec.Type) - -> \(dockers_spec : List PromoteDockerSpec.Type) - -> \(debVersion : DebianVersions.DebVersion) - -> \(mode : PipelineMode.Type) - -> let steps = - List/map - PromoteDebianSpec.Type - Command.Type - (\(spec : PromoteDebianSpec.Type) -> promoteDebianStep spec) - debians_spec - # List/map - PromoteDockerSpec.Type - Command.Type - (\(spec : PromoteDockerSpec.Type) -> promoteDockerStep spec) - dockers_spec - - in Pipeline.Config::{ - , spec = JobSpec::{ - , dirtyWhen = DebianVersions.dirtyWhen debVersion - , path = "Release" - , name = "PromotePackage" - , tags = [] : List PipelineTag.Type - , mode = mode - } - , steps = steps - } - -let verifyPipeline - : List PromoteDebianSpec.Type - -> List PromoteDockerSpec.Type - -> DebianVersions.DebVersion - -> PipelineMode.Type - -> Pipeline.Config.Type - = \(debians_spec : List PromoteDebianSpec.Type) - -> \(dockers_spec : List PromoteDockerSpec.Type) - -> \(debVersion : DebianVersions.DebVersion) - -> \(mode : PipelineMode.Type) - -> let steps = - List/map - PromoteDebianSpec.Type - Command.Type - ( \(spec : PromoteDebianSpec.Type) - -> promoteDebianVerificationStep spec - ) - debians_spec - # List/map - PromoteDockerSpec.Type - Command.Type - ( \(spec : PromoteDockerSpec.Type) - -> promoteDockerVerificationStep spec - ) - dockers_spec - - in Pipeline.Config::{ - , spec = JobSpec::{ - , dirtyWhen = DebianVersions.dirtyWhen debVersion - , path = "Release" - , name = "VerifyPackage" - , tags = [] : List PipelineTag.Type - , mode = mode - } - , steps = steps - } - -in { promoteDebianStep = promoteDebianStep - , promoteDockerStep = promoteDockerStep - , promoteDebianVerificationStep = promoteDebianVerificationStep - , promoteDockerVerificationStep = promoteDockerVerificationStep - , promotePipeline = promotePipeline - , verifyPipeline = verifyPipeline - , PromoteDebianSpec = PromoteDebianSpec - , PromoteDockerSpec = PromoteDockerSpec - } diff --git a/buildkite/src/Command/Promotion/PromoteDebian.dhall b/buildkite/src/Command/Promotion/PromoteDebian.dhall new file mode 100644 index 00000000000..0019779bbba --- /dev/null +++ b/buildkite/src/Command/Promotion/PromoteDebian.dhall @@ -0,0 +1,92 @@ +let B = ../../External/Buildkite.dhall + +let B/If = B.definitions/commandStep/properties/if/Type + +let Package = ../../Constants/DebianPackage.dhall + +let Network = ../../Constants/Network.dhall + +let DebianChannel = ../../Constants/DebianChannel.dhall + +let Profiles = ../../Constants/Profiles.dhall + +let DebianVersions = ../../Constants/DebianVersions.dhall + +let Toolchain = ../../Constants/Toolchain.dhall + +let Command = ../Base.dhall + +let Size = ../Size.dhall + +let PromoteDebianSpec = + { Type = + { deps : List Command.TaggedKey.Type + , package : Package.Type + , version : Text + , new_version : Text + , architecture : Text + , network : Network.Type + , codename : DebianVersions.DebVersion + , from_channel : DebianChannel.Type + , to_channel : DebianChannel.Type + , profile : Profiles.Type + , remove_profile_from_name : Bool + , step_key : Text + , if : Optional B/If + } + , default = + { deps = [] : List Command.TaggedKey.Type + , package = Package.Type.LogProc + , version = "\\\\\$MINA_DEB_VERSION" + , new_version = "\\\\\$MINA_DEB_VERSION" + , architecture = "amd64" + , network = Network.Type.Berkeley + , codename = DebianVersions.DebVersion.Bullseye + , from_channel = DebianChannel.Type.Unstable + , to_channel = DebianChannel.Type.NightlyCompatible + , profile = Profiles.Type.Standard + , remove_profile_from_name = False + , step_key = "promote-debian-package" + , if = None B/If + } + } + +let promoteDebianStep = + \(spec : PromoteDebianSpec.Type) + -> let package_name + : Text + = Package.debianName spec.package spec.profile spec.network + + let new_name = + if spec.remove_profile_from_name + + then "--new-name ${Package.debianName + spec.package + Profiles.Type.Standard + spec.network}" + + else "" + + in Command.build + Command.Config::{ + , commands = + Toolchain.runner + DebianVersions.DebVersion.Bullseye + [ "AWS_ACCESS_KEY_ID" + , "AWS_SECRET_ACCESS_KEY" + , "FROM_VERSION_MANUAL" + ] + ". ./buildkite/scripts/export-git-env-vars.sh && ./buildkite/scripts/promote-deb.sh --package ${package_name} --version ${spec.version} --new-version ${spec.new_version} --architecture ${spec.architecture} --codename ${DebianVersions.lowerName + spec.codename} --from-component ${DebianChannel.lowerName + spec.from_channel} --to-component ${DebianChannel.lowerName + spec.to_channel} ${new_name}" + , label = "Debian: ${spec.step_key}" + , key = spec.step_key + , target = Size.Small + , depends_on = spec.deps + , if = spec.if + } + +in { PromoteDebianSpec = PromoteDebianSpec + , promoteDebianStep = promoteDebianStep + } diff --git a/buildkite/src/Command/Promotion/PromoteDocker.dhall b/buildkite/src/Command/Promotion/PromoteDocker.dhall new file mode 100644 index 00000000000..cbc60627dc8 --- /dev/null +++ b/buildkite/src/Command/Promotion/PromoteDocker.dhall @@ -0,0 +1,97 @@ +let B = ../../External/Buildkite.dhall + +let Prelude = ../../External/Prelude.dhall + +let List/map = Prelude.List.map + +let B/If = B.definitions/commandStep/properties/if/Type + +let Network = ../../Constants/Network.dhall + +let Profiles = ../../Constants/Profiles.dhall + +let Artifact = ../../Constants/Artifacts.dhall + +let DebianVersions = ../../Constants/DebianVersions.dhall + +let Command = ../Base.dhall + +let Size = ../Size.dhall + +let Cmd = ../../Lib/Cmds.dhall + +let PromoteDockerSpec = + { Type = + { deps : List Command.TaggedKey.Type + , name : Artifact.Type + , version : Text + , profile : Profiles.Type + , codename : DebianVersions.DebVersion + , new_tags : List Text + , network : Network.Type + , step_key : Text + , if : Optional B/If + , publish : Bool + , remove_profile_from_name : Bool + } + , default = + { deps = [] : List Command.TaggedKey.Type + , name = Artifact.Type.Daemon + , version = "" + , new_tags = [] : List Text + , step_key = "promote-docker" + , profile = Profiles.Type.Standard + , network = Network.Type.Berkeley + , codename = DebianVersions.DebVersion.Bullseye + , if = None B/If + , publish = False + , remove_profile_from_name = False + } + } + +let promoteDockerStep = + \(spec : PromoteDockerSpec.Type) + -> let old_tag = + Artifact.dockerTag + spec.name + spec.version + spec.codename + spec.profile + spec.network + False + + let publish = if spec.publish then "-p" else "" + + let commands = + List/map + Text + Cmd.Type + ( \(tag : Text) + -> let new_tag = + Artifact.dockerTag + spec.name + tag + spec.codename + spec.profile + spec.network + spec.remove_profile_from_name + + in Cmd.run + ". ./buildkite/scripts/export-git-env-vars.sh && ./buildkite/scripts/promote-docker.sh --name ${Artifact.dockerName + spec.name} --version ${old_tag} --tag ${new_tag} ${publish}" + ) + spec.new_tags + + in Command.build + Command.Config::{ + , commands = commands + , label = "Docker: ${spec.step_key}" + , key = spec.step_key + , target = Size.XLarge + , depends_on = spec.deps + , if = spec.if + } + +in { PromoteDockerSpec = PromoteDockerSpec + , promoteDockerStep = promoteDockerStep + } diff --git a/buildkite/src/Command/Promotion/PromotePackages.dhall b/buildkite/src/Command/Promotion/PromotePackages.dhall new file mode 100644 index 00000000000..87ada894b59 --- /dev/null +++ b/buildkite/src/Command/Promotion/PromotePackages.dhall @@ -0,0 +1,203 @@ +let Prelude = ../../External/Prelude.dhall + +let List/map = Prelude.List.map + +let Package = ../../Constants/DebianPackage.dhall + +let Network = ../../Constants/Network.dhall + +let PipelineTag = ../../Pipeline/Tag.dhall + +let PipelineMode = ../../Pipeline/Mode.dhall + +let Pipeline = ../../Pipeline/Dsl.dhall + +let JobSpec = ../../Pipeline/JobSpec.dhall + +let DebianChannel = ../../Constants/DebianChannel.dhall + +let Profiles = ../../Constants/Profiles.dhall + +let Artifact = ../../Constants/Artifacts.dhall + +let DebianVersions = ../../Constants/DebianVersions.dhall + +let PromoteDebian = ./PromoteDebian.dhall + +let PromoteDocker = ./PromoteDocker.dhall + +let PromoteDebianSpec = PromoteDebian.PromoteDebianSpec + +let PromoteDockerSpec = PromoteDocker.PromoteDockerSpec + +let Command = ../Base.dhall + +let PromotePackagesSpec = + { Type = + { debians : List Package.Type + , dockers : List Artifact.Type + , version : Text + , new_debian_version : Text + , architecture : Text + , profile : Profiles.Type + , network : Network.Type + , codenames : List DebianVersions.DebVersion + , from_channel : DebianChannel.Type + , to_channel : DebianChannel.Type + , new_tags : List Text + , remove_profile_from_name : Bool + , publish : Bool + } + , default = + { debians = [] : List Package.Type + , dockers = [] : List Artifact.Type + , version = "" + , new_debian_version = "" + , architecture = "amd64" + , profile = Profiles.Type.Standard + , network = Network.Type.Mainnet + , codenames = [] : List DebianVersions.DebVersion + , from_channel = DebianChannel.Type.Unstable + , to_channel = DebianChannel.Type.NightlyCompatible + , new_tags = [] : List Text + , remove_profile_from_name = False + , publish = False + } + } + +let promotePackagesToDebianSpecs + : PromotePackagesSpec.Type -> List PromoteDebianSpec.Type + = \(promote_packages : PromotePackagesSpec.Type) + -> let debians_spec = + List/map + Package.Type + (List PromoteDebianSpec.Type) + ( \(debian : Package.Type) + -> List/map + DebianVersions.DebVersion + PromoteDebianSpec.Type + ( \(codename : DebianVersions.DebVersion) + -> PromoteDebianSpec::{ + , profile = promote_packages.profile + , package = debian + , version = promote_packages.version + , new_version = + promote_packages.new_debian_version + , architecture = promote_packages.architecture + , network = promote_packages.network + , codename = codename + , from_channel = promote_packages.from_channel + , to_channel = promote_packages.to_channel + , remove_profile_from_name = + promote_packages.remove_profile_from_name + , step_key = + "promote-debian-${Package.lowerName + debian}-${DebianVersions.lowerName + codename}-to-${DebianChannel.lowerName + promote_packages.to_channel}" + } + ) + promote_packages.codenames + ) + promote_packages.debians + + in Prelude.List.fold + (List PromoteDebianSpec.Type) + debians_spec + (List PromoteDebianSpec.Type) + ( \(a : List PromoteDebianSpec.Type) + -> \(b : List PromoteDebianSpec.Type) + -> a # b + ) + ([] : List PromoteDebianSpec.Type) + +let promotePackagesToDockerSpecs + : PromotePackagesSpec.Type -> List PromoteDockerSpec.Type + = \(promote_artifacts : PromotePackagesSpec.Type) + -> let dockers_spec = + List/map + Artifact.Type + (List PromoteDockerSpec.Type) + ( \(docker : Artifact.Type) + -> List/map + DebianVersions.DebVersion + PromoteDockerSpec.Type + ( \(codename : DebianVersions.DebVersion) + -> PromoteDockerSpec::{ + , profile = promote_artifacts.profile + , name = docker + , version = promote_artifacts.version + , codename = codename + , new_tags = promote_artifacts.new_tags + , network = promote_artifacts.network + , publish = promote_artifacts.publish + , remove_profile_from_name = + promote_artifacts.remove_profile_from_name + , step_key = + "add-tag-to-${Artifact.lowerName + docker}-${DebianVersions.lowerName + codename}-docker" + } + ) + promote_artifacts.codenames + ) + promote_artifacts.dockers + + in Prelude.List.fold + (List PromoteDockerSpec.Type) + dockers_spec + (List PromoteDockerSpec.Type) + ( \(a : List PromoteDockerSpec.Type) + -> \(b : List PromoteDockerSpec.Type) + -> a # b + ) + ([] : List PromoteDockerSpec.Type) + +let promoteSteps + : List PromoteDebianSpec.Type + -> List PromoteDockerSpec.Type + -> List Command.Type + = \(debians_spec : List PromoteDebianSpec.Type) + -> \(dockers_spec : List PromoteDockerSpec.Type) + -> List/map + PromoteDebianSpec.Type + Command.Type + ( \(spec : PromoteDebianSpec.Type) + -> PromoteDebian.promoteDebianStep spec + ) + debians_spec + # List/map + PromoteDockerSpec.Type + Command.Type + ( \(spec : PromoteDockerSpec.Type) + -> PromoteDocker.promoteDockerStep spec + ) + dockers_spec + +let promotePipeline + : List PromoteDebianSpec.Type + -> List PromoteDockerSpec.Type + -> DebianVersions.DebVersion + -> PipelineMode.Type + -> Pipeline.Config.Type + = \(debians_spec : List PromoteDebianSpec.Type) + -> \(dockers_spec : List PromoteDockerSpec.Type) + -> \(debVersion : DebianVersions.DebVersion) + -> \(mode : PipelineMode.Type) + -> Pipeline.Config::{ + , spec = JobSpec::{ + , dirtyWhen = DebianVersions.dirtyWhen debVersion + , path = "Release" + , name = "PromotePackage" + , tags = [] : List PipelineTag.Type + , mode = mode + } + , steps = promoteSteps debians_spec dockers_spec + } + +in { PromotePackagesSpec = PromotePackagesSpec + , promotePackagesToDebianSpecs = promotePackagesToDebianSpecs + , promotePackagesToDockerSpecs = promotePackagesToDockerSpecs + , promoteSteps = promoteSteps + , promotePipeline = promotePipeline + } diff --git a/buildkite/src/Command/Promotion/VerifyDebian.dhall b/buildkite/src/Command/Promotion/VerifyDebian.dhall new file mode 100644 index 00000000000..bb385126668 --- /dev/null +++ b/buildkite/src/Command/Promotion/VerifyDebian.dhall @@ -0,0 +1,44 @@ +let Package = ../../Constants/DebianPackage.dhall + +let DebianChannel = ../../Constants/DebianChannel.dhall + +let Profiles = ../../Constants/Profiles.dhall + +let DebianVersions = ../../Constants/DebianVersions.dhall + +let Command = ../Base.dhall + +let Size = ../Size.dhall + +let Cmd = ../../Lib/Cmds.dhall + +let PromoteDebian = ./PromoteDebian.dhall + +let promoteDebianVerificationStep = + \(spec : PromoteDebian.PromoteDebianSpec.Type) + -> let name = + if spec.remove_profile_from_name + + then "${Package.debianName + spec.package + Profiles.Type.Standard + spec.network}" + + else Package.debianName spec.package spec.profile spec.network + + in Command.build + Command.Config::{ + , commands = + [ Cmd.run + "source buildkite/scripts/export-git-env-vars.sh && ./scripts/debian/verify.sh --package ${name} --version ${spec.new_version} --codename ${DebianVersions.lowerName + spec.codename} --channel ${DebianChannel.lowerName + spec.to_channel}" + ] + , label = "Debian: ${spec.step_key}" + , key = spec.step_key + , target = Size.Small + , depends_on = spec.deps + , if = spec.if + } + +in { promoteDebianVerificationStep = promoteDebianVerificationStep } diff --git a/buildkite/src/Command/Promotion/VerifyDocker.dhall b/buildkite/src/Command/Promotion/VerifyDocker.dhall new file mode 100644 index 00000000000..6afc4e461d0 --- /dev/null +++ b/buildkite/src/Command/Promotion/VerifyDocker.dhall @@ -0,0 +1,54 @@ +let Artifact = ../../Constants/Artifacts.dhall + +let Prelude = ../../External/Prelude.dhall + +let List/map = Prelude.List.map + +let Command = ../Base.dhall + +let Size = ../Size.dhall + +let Cmd = ../../Lib/Cmds.dhall + +let PromoteDocker = ./PromoteDocker.dhall + +let promoteDockerVerificationStep = + \(spec : PromoteDocker.PromoteDockerSpec.Type) + -> let repo = + if spec.publish + + then "docker.io/minaprotocol" + + else "gcr.io/o1labs-192920" + + let commands = + List/map + Text + Cmd.Type + ( \(tag : Text) + -> let new_tag = + Artifact.dockerTag + spec.name + tag + spec.codename + spec.profile + spec.network + spec.remove_profile_from_name + + in Cmd.run + "docker pull ${repo}/${Artifact.dockerName + spec.name}:${new_tag}" + ) + spec.new_tags + + in Command.build + Command.Config::{ + , commands = commands + , label = "Docker: ${spec.step_key}" + , key = spec.step_key + , target = Size.Small + , depends_on = spec.deps + , if = spec.if + } + +in { promoteDockerVerificationStep = promoteDockerVerificationStep } diff --git a/buildkite/src/Command/Promotion/VerifyPackages.dhall b/buildkite/src/Command/Promotion/VerifyPackages.dhall new file mode 100644 index 00000000000..c8705237bb4 --- /dev/null +++ b/buildkite/src/Command/Promotion/VerifyPackages.dhall @@ -0,0 +1,232 @@ +let Prelude = ../../External/Prelude.dhall + +let Optional/toList = Prelude.Optional.toList + +let Optional/map = Prelude.Optional.map + +let List/map = Prelude.List.map + +let Package = ../../Constants/DebianPackage.dhall + +let Network = ../../Constants/Network.dhall + +let PipelineMode = ../../Pipeline/Mode.dhall + +let PipelineTag = ../../Pipeline/Tag.dhall + +let Pipeline = ../../Pipeline/Dsl.dhall + +let JobSpec = ../../Pipeline/JobSpec.dhall + +let DebianChannel = ../../Constants/DebianChannel.dhall + +let Profiles = ../../Constants/Profiles.dhall + +let Artifact = ../../Constants/Artifacts.dhall + +let DebianVersions = ../../Constants/DebianVersions.dhall + +let Command = ../Base.dhall + +let VerifyDebian = ./VerifyDebian.dhall + +let VerifyDocker = ./VerifyDocker.dhall + +let PromoteDebian = ./PromoteDebian.dhall + +let PromoteDocker = ./PromoteDocker.dhall + +let VerifyPackagesSpec = + { Type = + { promote_step_name : Optional Text + , debians : List Package.Type + , dockers : List Artifact.Type + , new_debian_version : Text + , profile : Profiles.Type + , network : Network.Type + , codenames : List DebianVersions.DebVersion + , channel : DebianChannel.Type + , new_tags : List Text + , remove_profile_from_name : Bool + , published : Bool + } + , default = + { promote_step_name = None + , debians = [] : List Package.Type + , dockers = [] : List Artifact.Type + , new_debian_version = "\\\\\$MINA_DEB_VERSION" + , profile = Profiles.Type.Standard + , network = Network.Type.Mainnet + , codenames = [] : List DebianVersions.DebVersion + , channel = DebianChannel.Type.NightlyCompatible + , new_tags = [] : List Text + , remove_profile_from_name = False + , published = False + } + } + +let verifyPackagesToDockerSpecs + : VerifyPackagesSpec.Type -> List PromoteDocker.PromoteDockerSpec.Type + = \(verify_packages : VerifyPackagesSpec.Type) + -> let dockers_spec = + List/map + Artifact.Type + (List PromoteDocker.PromoteDockerSpec.Type) + ( \(docker : Artifact.Type) + -> List/map + DebianVersions.DebVersion + PromoteDocker.PromoteDockerSpec.Type + ( \(codename : DebianVersions.DebVersion) + -> PromoteDocker.PromoteDockerSpec::{ + , profile = verify_packages.profile + , name = docker + , codename = codename + , new_tags = verify_packages.new_tags + , network = verify_packages.network + , publish = verify_packages.published + , remove_profile_from_name = + verify_packages.remove_profile_from_name + , deps = + Optional/toList + Command.TaggedKey.Type + ( Optional/map + Text + Command.TaggedKey.Type + ( \(name : Text) + -> { name = name + , key = + "add-tag-to-${Artifact.lowerName + docker}-${DebianVersions.lowerName + codename}-docker" + } + ) + verify_packages.promote_step_name + ) + , step_key = + "verify-tag-${Artifact.lowerName + docker}-${DebianVersions.lowerName + codename}-docker" + } + ) + verify_packages.codenames + ) + verify_packages.dockers + + in Prelude.List.fold + (List PromoteDocker.PromoteDockerSpec.Type) + dockers_spec + (List PromoteDocker.PromoteDockerSpec.Type) + ( \(a : List PromoteDocker.PromoteDockerSpec.Type) + -> \(b : List PromoteDocker.PromoteDockerSpec.Type) + -> a # b + ) + ([] : List PromoteDocker.PromoteDockerSpec.Type) + +let verifyPackagesToDebianSpecs + : VerifyPackagesSpec.Type -> List PromoteDebian.PromoteDebianSpec.Type + = \(verify_packages : VerifyPackagesSpec.Type) + -> let debians_spec = + List/map + Package.Type + (List PromoteDebian.PromoteDebianSpec.Type) + ( \(debian : Package.Type) + -> List/map + DebianVersions.DebVersion + PromoteDebian.PromoteDebianSpec.Type + ( \(codename : DebianVersions.DebVersion) + -> PromoteDebian.PromoteDebianSpec::{ + , profile = verify_packages.profile + , package = debian + , new_version = + verify_packages.new_debian_version + , network = verify_packages.network + , codename = codename + , to_channel = verify_packages.channel + , remove_profile_from_name = + verify_packages.remove_profile_from_name + , deps = + Optional/toList + Command.TaggedKey.Type + ( Optional/map + Text + Command.TaggedKey.Type + ( \(name : Text) + -> { name = name + , key = + "promote-debian-${Package.lowerName + debian}-${DebianVersions.lowerName + codename}-to-${DebianChannel.lowerName + verify_packages.channel}" + } + ) + verify_packages.promote_step_name + ) + , step_key = + "verify-promote-debian-${Package.lowerName + debian}-${DebianVersions.lowerName + codename}-to-${DebianChannel.lowerName + verify_packages.channel}" + } + ) + verify_packages.codenames + ) + verify_packages.debians + + in Prelude.List.fold + (List PromoteDebian.PromoteDebianSpec.Type) + debians_spec + (List PromoteDebian.PromoteDebianSpec.Type) + ( \(a : List PromoteDebian.PromoteDebianSpec.Type) + -> \(b : List PromoteDebian.PromoteDebianSpec.Type) + -> a # b + ) + ([] : List PromoteDebian.PromoteDebianSpec.Type) + +let verificationSteps + : List PromoteDebian.PromoteDebianSpec.Type + -> List PromoteDocker.PromoteDockerSpec.Type + -> List Command.Type + = \(debians_spec : List PromoteDebian.PromoteDebianSpec.Type) + -> \(dockers_spec : List PromoteDocker.PromoteDockerSpec.Type) + -> List/map + PromoteDebian.PromoteDebianSpec.Type + Command.Type + ( \(spec : PromoteDebian.PromoteDebianSpec.Type) + -> VerifyDebian.promoteDebianVerificationStep spec + ) + debians_spec + # List/map + PromoteDocker.PromoteDockerSpec.Type + Command.Type + ( \(spec : PromoteDocker.PromoteDockerSpec.Type) + -> VerifyDocker.promoteDockerVerificationStep spec + ) + dockers_spec + +let verifyPipeline + : List PromoteDebian.PromoteDebianSpec.Type + -> List PromoteDocker.PromoteDockerSpec.Type + -> DebianVersions.DebVersion + -> PipelineMode.Type + -> Pipeline.Config.Type + = \(debians_spec : List PromoteDebian.PromoteDebianSpec.Type) + -> \(dockers_spec : List PromoteDocker.PromoteDockerSpec.Type) + -> \(debVersion : DebianVersions.DebVersion) + -> \(mode : PipelineMode.Type) + -> Pipeline.Config::{ + , spec = JobSpec::{ + , dirtyWhen = DebianVersions.dirtyWhen debVersion + , path = "Release" + , name = "VerifyPackage" + , tags = [] : List PipelineTag.Type + , mode = mode + } + , steps = verificationSteps debians_spec dockers_spec + } + +in { VerifyPackagesSpec = VerifyPackagesSpec + , verifyPackagesToDockerSpecs = verifyPackagesToDockerSpecs + , verifyPackagesToDebianSpecs = verifyPackagesToDebianSpecs + , verificationSteps = verificationSteps + , verifyPipeline = verifyPipeline + } diff --git a/buildkite/src/Command/ReplayerTest.dhall b/buildkite/src/Command/ReplayerTest.dhall index 02c02978836..6a742c7e7fd 100644 --- a/buildkite/src/Command/ReplayerTest.dhall +++ b/buildkite/src/Command/ReplayerTest.dhall @@ -6,6 +6,8 @@ let Size = ./Size.dhall let RunWithPostgres = ./RunWithPostgres.dhall +let Network = ../Constants/Network.dhall + in { step = \(dependsOn : List Command.TaggedKey.Type) -> Command.build @@ -15,6 +17,7 @@ in { step = ([] : List Text) "./src/test/archive/sample_db/archive_db.sql" Artifacts.Type.Archive + (None Network.Type) "./buildkite/scripts/replayer-test.sh" ] , label = "Archive: Replayer test" diff --git a/buildkite/src/Command/RunInToolchain.dhall b/buildkite/src/Command/RunInToolchain.dhall index 6d4616b605d..ecc05ca00f1 100644 --- a/buildkite/src/Command/RunInToolchain.dhall +++ b/buildkite/src/Command/RunInToolchain.dhall @@ -33,15 +33,6 @@ let runInToolchainBullseye environment innerScript -let runInToolchainBuster - : List Text -> Text -> List Cmd.Type - = \(environment : List Text) - -> \(innerScript : Text) - -> runInToolchainImage - ContainerImages.minaToolchainBuster - environment - innerScript - let runInToolchain : List Text -> Text -> List Cmd.Type = \(environment : List Text) @@ -55,5 +46,4 @@ in { runInToolchain = runInToolchain , runInToolchainImage = runInToolchainImage , runInToolchainBookworm = runInToolchainBookworm , runInToolchainBullseye = runInToolchainBullseye - , runInToolchainBuster = runInToolchainBuster } diff --git a/buildkite/src/Command/RunWithPostgres.dhall b/buildkite/src/Command/RunWithPostgres.dhall index 179ca706618..b6279112a23 100644 --- a/buildkite/src/Command/RunWithPostgres.dhall +++ b/buildkite/src/Command/RunWithPostgres.dhall @@ -4,17 +4,29 @@ let P = Prelude let Text/concatMap = P.Text.concatMap +let Optional/map = Prelude.Optional.map + +let Optional/default = Prelude.Optional.default + let Cmd = ../Lib/Cmds.dhall let ContainerImages = ../Constants/ContainerImages.dhall let Artifacts = ../Constants/Artifacts.dhall +let Network = ../Constants/Network.dhall + let runInDockerWithPostgresConn - : List Text -> Text -> Artifacts.Type -> Text -> Cmd.Type + : List Text + -> Text + -> Artifacts.Type + -> Optional Network.Type + -> Text + -> Cmd.Type = \(environment : List Text) -> \(initScript : Text) -> \(docker : Artifacts.Type) + -> \(network : Optional Network.Type) -> \(innerScript : Text) -> let port = "5432" @@ -48,6 +60,19 @@ let runInDockerWithPostgresConn : Text = "\\\$BUILDKITE_BUILD_CHECKOUT_PATH" + let minaDockerTag + : Text + = "\\\$MINA_DOCKER_TAG" + + let maybeNetwork = + Optional/map + Network.Type + Text + (\(network : Network.Type) -> "-${Network.lowerName network}") + network + + let networkOrDefault = Optional/default Text "" maybeNetwork + in Cmd.chain [ "( docker stop ${postgresDockerName} && docker rm ${postgresDockerName} ) || true" , "source buildkite/scripts/export-git-env-vars.sh" @@ -55,7 +80,7 @@ let runInDockerWithPostgresConn , "sleep 5" , "docker exec ${postgresDockerName} psql ${pg_conn} -f /workdir/${initScript}" , "docker run --network host --volume ${outerDir}:/workdir --workdir /workdir --entrypoint bash ${envVars} gcr.io/o1labs-192920/${Artifacts.dockerName - docker}:\\\$MINA_DOCKER_TAG ${innerScript}" + docker}:${minaDockerTag}${networkOrDefault} ${innerScript}" ] in { runInDockerWithPostgresConn = runInDockerWithPostgresConn } diff --git a/buildkite/src/Constants/Artifacts.dhall b/buildkite/src/Constants/Artifacts.dhall index 4d7acd9ff12..b41f52cf28c 100644 --- a/buildkite/src/Constants/Artifacts.dhall +++ b/buildkite/src/Constants/Artifacts.dhall @@ -11,6 +11,7 @@ let Network = ./Network.dhall let Artifact : Type = < Daemon + | LogProc | Archive | TestExecutive | BatchTxn @@ -21,6 +22,7 @@ let Artifact let AllButTests = [ Artifact.Daemon + , Artifact.LogProc , Artifact.Archive , Artifact.BatchTxn , Artifact.TestExecutive @@ -28,7 +30,8 @@ let AllButTests = , Artifact.ZkappTestTransaction ] -let Main = [ Artifact.Daemon, Artifact.Archive, Artifact.Rosetta ] +let Main = + [ Artifact.Daemon, Artifact.LogProc, Artifact.Archive, Artifact.Rosetta ] let All = AllButTests # [ Artifact.FunctionalTestSuite ] @@ -36,6 +39,7 @@ let capitalName = \(artifact : Artifact) -> merge { Daemon = "Daemon" + , LogProc = "LogProc" , Archive = "Archive" , TestExecutive = "TestExecutive" , BatchTxn = "BatchTxn" @@ -49,6 +53,7 @@ let lowerName = \(artifact : Artifact) -> merge { Daemon = "daemon" + , LogProc = "logproc" , Archive = "archive" , TestExecutive = "test_executive" , BatchTxn = "batch_txn" @@ -64,6 +69,7 @@ let dockerName = { Daemon = "mina-daemon" , Archive = "mina-archive" , TestExecutive = "mina-test-executive" + , LogProc = "mina-logproc" , BatchTxn = "mina-batch-txn" , Rosetta = "mina-rosetta" , ZkappTestTransaction = "mina-zkapp-test-transaction" @@ -76,10 +82,11 @@ let toDebianName = -> \(network : Network.Type) -> merge { Daemon = "daemon_${Network.lowerName network}" + , LogProc = "logproc" , Archive = "archive" , TestExecutive = "test_executive" , BatchTxn = "batch_txn" - , Rosetta = "" + , Rosetta = "rosetta_${Network.lowerName network}" , ZkappTestTransaction = "zkapp_test_transaction" , FunctionalTestSuite = "functional_test_suite" } @@ -101,9 +108,17 @@ let toDebianNames = (\(n : Network.Type) -> toDebianName a n) networks , Archive = [ "archive" ] + , LogProc = [ "logproc" ] , TestExecutive = [ "test_executive" ] , BatchTxn = [ "batch_txn" ] - , Rosetta = [ "" ] + , Rosetta = + Prelude.List.map + Network.Type + Text + ( \(n : Network.Type) + -> "rosetta_${Network.lowerName n}" + ) + networks , ZkappTestTransaction = [ "zkapp_test_transaction" ] , FunctionalTestSuite = [ "functional_test_suite" ] } @@ -143,9 +158,11 @@ let dockerTag = "${version_and_codename}-${Network.lowerName network}${profile_part}" , Archive = "${version_and_codename}" + , LogProc = "${version_and_codename}" , TestExecutive = "${version_and_codename}" , BatchTxn = "${version_and_codename}" - , Rosetta = "${version_and_codename}" + , Rosetta = + "${version_and_codename}-${Network.lowerName network}" , ZkappTestTransaction = "${version_and_codename}" , FunctionalTestSuite = "${version_and_codename}" } diff --git a/buildkite/src/Constants/ContainerImages.dhall b/buildkite/src/Constants/ContainerImages.dhall index ff3cd4d0d58..f4916e06773 100644 --- a/buildkite/src/Constants/ContainerImages.dhall +++ b/buildkite/src/Constants/ContainerImages.dhall @@ -3,16 +3,12 @@ -- NOTE: minaToolchainBullseye is also used for building Ubuntu Focal packages in CI -- NOTE: minaToolchainBookworm is also used for building Ubuntu Jammy packages in CI { toolchainBase = "codaprotocol/ci-toolchain-base:v3" -, minaToolchainBuster = - "gcr.io/o1labs-192920/mina-toolchain@sha256:d27c15e3143a99b86155ba57696020c00e2a296b388499b3e6fb364478ddda3a" , minaToolchainBullseye = - "gcr.io/o1labs-192920/mina-toolchain@sha256:966863de43c72c294e14762ae567404005f99654c54338a9a89b999476a36d1f" + "gcr.io/o1labs-192920/mina-toolchain@sha256:a1f60d69f3657060d6e7289dc770fd7c36fc5a067853019c2f3f6247cb4b6673" , minaToolchainBookworm = - "gcr.io/o1labs-192920/mina-toolchain@sha256:966863de43c72c294e14762ae567404005f99654c54338a9a89b999476a36d1f" + "gcr.io/o1labs-192920/mina-toolchain@sha256:a1f60d69f3657060d6e7289dc770fd7c36fc5a067853019c2f3f6247cb4b6673" , minaToolchain = - "gcr.io/o1labs-192920/mina-toolchain@sha256:966863de43c72c294e14762ae567404005f99654c54338a9a89b999476a36d1f" -, delegationBackendToolchain = - "gcr.io/o1labs-192920/delegation-backend-production@sha256:12ffd0a9016819c720687f440c7a46b8815f8d3ad06d306d342ee5f8dd4375f5" + "gcr.io/o1labs-192920/mina-toolchain@sha256:a1f60d69f3657060d6e7289dc770fd7c36fc5a067853019c2f3f6247cb4b6673" , elixirToolchain = "elixir:1.10-alpine" , nodeToolchain = "node:14.13.1-stretch-slim" , ubuntu2004 = "ubuntu:20.04" diff --git a/buildkite/src/Constants/DebianChannel.dhall b/buildkite/src/Constants/DebianChannel.dhall index 73e66ffe32a..ed975e02fc4 100644 --- a/buildkite/src/Constants/DebianChannel.dhall +++ b/buildkite/src/Constants/DebianChannel.dhall @@ -1,7 +1,8 @@ let Channel : Type = < Unstable - | Nightly + | NightlyDevelop + | NightlyCompatible | Itn | Umt | UmtMainnet @@ -16,7 +17,8 @@ let capitalName = \(channel : Channel) -> merge { Unstable = "Unstable" - , Nightly = "Nightly" + , NightlyDevelop = "NightlyDevelop" + , NightlyCompatible = "NightlyCompatible" , Itn = "Itn" , Umt = "Umt" , UmtMainnet = "UmtMainnet" @@ -32,7 +34,8 @@ let lowerName = \(channel : Channel) -> merge { Unstable = "unstable" - , Nightly = "nightly" + , NightlyDevelop = "nightly-develop" + , NightlyCompatible = "nightly-compatible" , Itn = "itn" , Umt = "umt" , UmtMainnet = "umt-mainnet" diff --git a/buildkite/src/Constants/DebianVersions.dhall b/buildkite/src/Constants/DebianVersions.dhall index 98cd6882689..f3042f5f067 100644 --- a/buildkite/src/Constants/DebianVersions.dhall +++ b/buildkite/src/Constants/DebianVersions.dhall @@ -1,17 +1,20 @@ +let Prelude = ../External/Prelude.dhall + +let Optional/default = Prelude.Optional.default + let Profiles = ./Profiles.dhall let BuildFlags = ./BuildFlags.dhall let S = ../Lib/SelectFiles.dhall -let DebVersion = < Bookworm | Bullseye | Buster | Jammy | Focal > +let DebVersion = < Bookworm | Bullseye | Jammy | Focal > let capitalName = \(debVersion : DebVersion) -> merge { Bookworm = "Bookworm" , Bullseye = "Bullseye" - , Buster = "Buster" , Jammy = "Jammy" , Focal = "Focal" } @@ -22,20 +25,20 @@ let lowerName = -> merge { Bookworm = "bookworm" , Bullseye = "bullseye" - , Buster = "buster" , Jammy = "jammy" , Focal = "focal" } debVersion let dependsOnStep = - \(debVersion : DebVersion) + \(prefix : Optional Text) + -> \(debVersion : DebVersion) -> \(profile : Profiles.Type) -> \(buildFlag : BuildFlags.Type) -> \(step : Text) -> let profileSuffix = Profiles.toSuffixUppercase profile - let prefix = "MinaArtifact" + let prefix = Optional/default Text "MinaArtifact" prefix in merge { Bookworm = @@ -53,14 +56,6 @@ let dependsOnStep = , key = "${step}-deb-pkg" } ] - , Buster = - [ { name = - "${prefix}${capitalName - debVersion}${profileSuffix}${BuildFlags.toSuffixUppercase - buildFlag}" - , key = "${step}-deb-pkg" - } - ] , Jammy = [ { name = "${prefix}${capitalName @@ -83,7 +78,12 @@ let dependsOnStep = let dependsOn = \(debVersion : DebVersion) -> \(profile : Profiles.Type) - -> dependsOnStep debVersion profile BuildFlags.Type.None "build" + -> dependsOnStep + (None Text) + debVersion + profile + BuildFlags.Type.None + "build" let minimalDirtyWhen = [ S.exactly "buildkite/src/Constants/DebianVersions" "dhall" @@ -92,8 +92,10 @@ let minimalDirtyWhen = , S.exactly "buildkite/src/Command/MinaArtifact" "dhall" , S.strictlyStart (S.contains "buildkite/src/Jobs/Release/MinaArtifact") , S.strictlyStart (S.contains "dockerfiles/stages") - , S.exactly "scripts/rebuild-deb" "sh" - , S.exactly "scripts/release-docker" "sh" + , S.exactly "scripts/debian/build" "sh" + , S.exactly "scripts/debian/builder-helpers" "sh" + , S.exactly "scripts/docker/release" "sh" + , S.exactly "scripts/docker/build" "sh" , S.exactly "buildkite/scripts/build-artifact" "sh" , S.exactly "buildkite/scripts/build-hardfork-package" "sh" , S.exactly "buildkite/scripts/check-compatibility" "sh" @@ -122,7 +124,6 @@ let dirtyWhen = -> merge { Bookworm = minimalDirtyWhen , Bullseye = bullseyeDirtyWhen - , Buster = minimalDirtyWhen , Jammy = minimalDirtyWhen , Focal = minimalDirtyWhen } diff --git a/buildkite/src/Constants/DockerVersions.dhall b/buildkite/src/Constants/DockerVersions.dhall index b57d9785ed0..7db6179132c 100644 --- a/buildkite/src/Constants/DockerVersions.dhall +++ b/buildkite/src/Constants/DockerVersions.dhall @@ -1,15 +1,24 @@ +let Prelude = ../External/Prelude.dhall + +let Optional/map = Prelude.Optional.map + +let Optional/default = Prelude.Optional.default + let Profiles = ./Profiles.dhall +let Artifacts = ./Artifacts.dhall + +let Network = ./Network.dhall + let Docker : Type - = < Bookworm | Bullseye | Buster | Jammy | Focal > + = < Bookworm | Bullseye | Jammy | Focal > let capitalName = \(docker : Docker) -> merge { Bookworm = "Bookworm" , Bullseye = "Bullseye" - , Buster = "Buster" , Jammy = "Jammy" , Focal = "Focal" } @@ -20,7 +29,6 @@ let lowerName = -> merge { Bookworm = "bookworm" , Bullseye = "bullseye" - , Buster = "buster" , Jammy = "jammy" , Focal = "focal" } @@ -28,38 +36,47 @@ let lowerName = let dependsOn = \(docker : Docker) + -> \(network : Optional Network.Type) -> \(profile : Profiles.Type) - -> \(binary : Text) + -> \(binary : Artifacts.Type) -> let profileSuffix = Profiles.toSuffixUppercase profile let prefix = "MinaArtifact" let suffix = "docker-image" + let maybeNetwork = + Optional/map + Network.Type + Text + (\(network : Network.Type) -> "-${Network.lowerName network}") + network + + let networkOrDefault = Optional/default Text "" maybeNetwork + + let key = + "${Artifacts.lowerName + binary}${networkOrDefault}-${lowerName docker}-${suffix}" + in merge { Bookworm = - [ { name = "${prefix}${profileSuffix}" - , key = "${binary}-${lowerName docker}-${suffix}" - } - ] - , Bullseye = [ { name = "${prefix}${capitalName docker}${profileSuffix}" - , key = "${binary}-${lowerName docker}-${suffix}" + , key = key } ] - , Buster = + , Bullseye = [ { name = "${prefix}${capitalName docker}${profileSuffix}" - , key = "${binary}-${lowerName docker}-${suffix}" + , key = key } ] , Jammy = [ { name = "${prefix}${capitalName docker}${profileSuffix}" - , key = "${binary}-${lowerName docker}-${suffix}" + , key = key } ] , Focal = [ { name = "${prefix}${capitalName docker}${profileSuffix}" - , key = "${binary}-${lowerName docker}-${suffix}" + , key = key } ] } diff --git a/buildkite/src/Constants/Toolchain.dhall b/buildkite/src/Constants/Toolchain.dhall index b70181349bf..21cbde37fe5 100644 --- a/buildkite/src/Constants/Toolchain.dhall +++ b/buildkite/src/Constants/Toolchain.dhall @@ -13,7 +13,6 @@ let runner = -> merge { Bookworm = RunInToolchain.runInToolchainBookworm , Bullseye = RunInToolchain.runInToolchainBullseye - , Buster = RunInToolchain.runInToolchainBuster , Jammy = RunInToolchain.runInToolchainBookworm , Focal = RunInToolchain.runInToolchainBullseye } @@ -34,7 +33,6 @@ let image = -> merge { Bookworm = ContainerImages.minaToolchainBookworm , Bullseye = ContainerImages.minaToolchainBullseye - , Buster = ContainerImages.minaToolchainBuster , Jammy = ContainerImages.minaToolchainBookworm , Focal = ContainerImages.minaToolchainBullseye } diff --git a/buildkite/src/Entrypoints/GenerateHardforkPackage.dhall b/buildkite/src/Entrypoints/GenerateHardforkPackage.dhall index 31756138e28..64bfb78f805 100644 --- a/buildkite/src/Entrypoints/GenerateHardforkPackage.dhall +++ b/buildkite/src/Entrypoints/GenerateHardforkPackage.dhall @@ -35,7 +35,7 @@ let generate_hardfork_package = , Cmd.quietly "dhall-to-yaml --quoted <<< '(Pipeline.build (HardforkPackageGeneration.pipeline HardforkPackageGeneration.Spec::{=}).pipeline' | buildkite-agent pipeline upload" , Cmd.quietly - "dhall-to-yaml --quoted <<< '(Pipeline.build (HardforkPackageGeneration.pipeline HardforkPackageGeneration.Spec::{codename = DebianVersions.DebVersion.Buster}).pipeline' | buildkite-agent pipeline upload" + "dhall-to-yaml --quoted <<< '(Pipeline.build (HardforkPackageGeneration.pipeline HardforkPackageGeneration.Spec::{codename = DebianVersions.DebVersion.Bullseye}).pipeline' | buildkite-agent pipeline upload" ] , label = "Generate hardfork package" , key = "generate-hardfork-package" diff --git a/buildkite/src/Entrypoints/PromotePackage.dhall b/buildkite/src/Entrypoints/PromotePackage.dhall index 40fabae3eca..400ec044323 100644 --- a/buildkite/src/Entrypoints/PromotePackage.dhall +++ b/buildkite/src/Entrypoints/PromotePackage.dhall @@ -1,8 +1,6 @@ -let Prelude = ../External/Prelude.dhall +let PromotePackages = ../Command/Promotion/PromotePackages.dhall -let List/map = Prelude.List.map - -let PromotePackage = ../Command/PromotePackage.dhall +let VerifyPackages = ../Command/Promotion/VerifyPackages.dhall let Package = ../Constants/DebianPackage.dhall @@ -34,95 +32,34 @@ let promote_artifacts = -> \(tag : Text) -> \(remove_profile_from_name : Bool) -> \(publish : Bool) - -> let debians_spec = - List/map - Package.Type - (List PromotePackage.PromoteDebianSpec.Type) - ( \(debian : Package.Type) - -> List/map - DebianVersions.DebVersion - PromotePackage.PromoteDebianSpec.Type - ( \(codename : DebianVersions.DebVersion) - -> PromotePackage.PromoteDebianSpec::{ - , profile = profile - , package = debian - , version = version - , new_version = new_version - , architecture = architecture - , network = network - , codename = codename - , from_channel = from_channel - , to_channel = to_channel - , remove_profile_from_name = - remove_profile_from_name - , step_key = - "promote-debian-${Package.lowerName - debian}-${DebianVersions.lowerName - codename}-from-${DebianChannel.lowerName - from_channel}-to-${DebianChannel.lowerName - to_channel}" - } - ) - codenames - ) - debians - - let debians_spec = - Prelude.List.fold - (List PromotePackage.PromoteDebianSpec.Type) - debians_spec - (List PromotePackage.PromoteDebianSpec.Type) - ( \(a : List PromotePackage.PromoteDebianSpec.Type) - -> \(b : List PromotePackage.PromoteDebianSpec.Type) - -> a # b - ) - ([] : List PromotePackage.PromoteDebianSpec.Type) - - let dockers_spec = - List/map - Artifact.Type - (List PromotePackage.PromoteDockerSpec.Type) - ( \(docker : Artifact.Type) - -> List/map - DebianVersions.DebVersion - PromotePackage.PromoteDockerSpec.Type - ( \(codename : DebianVersions.DebVersion) - -> PromotePackage.PromoteDockerSpec::{ - , profile = profile - , name = docker - , version = version - , codename = codename - , new_tag = new_version - , network = network - , publish = publish - , remove_profile_from_name = - remove_profile_from_name - , step_key = - "add-tag-to-${Artifact.lowerName - docker}-${DebianVersions.lowerName - codename}-docker" - } - ) - codenames - ) - dockers - - let dockers_spec = - Prelude.List.fold - (List PromotePackage.PromoteDockerSpec.Type) - dockers_spec - (List PromotePackage.PromoteDockerSpec.Type) - ( \(a : List PromotePackage.PromoteDockerSpec.Type) - -> \(b : List PromotePackage.PromoteDockerSpec.Type) - -> a # b - ) - ([] : List PromotePackage.PromoteDockerSpec.Type) + -> let promotePackages = + PromotePackages.PromotePackagesSpec::{ + , debians = debians + , dockers = dockers + , version = version + , architecture = architecture + , new_debian_version = new_version + , profile = profile + , network = network + , codenames = codenames + , from_channel = from_channel + , to_channel = to_channel + , new_tags = [ tag ] + , remove_profile_from_name = remove_profile_from_name + , publish = publish + } + + let debiansSpecs = + PromotePackages.promotePackagesToDebianSpecs promotePackages + + let dockersSpecs = + PromotePackages.promotePackagesToDockerSpecs promotePackages let pipelineType = Pipeline.build - ( PromotePackage.promotePipeline - debians_spec - dockers_spec + ( PromotePackages.promotePipeline + debiansSpecs + dockersSpecs DebianVersions.DebVersion.Bullseye PipelineMode.Type.Stable ) @@ -140,90 +77,32 @@ let verify_artifacts = -> \(tag : Text) -> \(remove_profile_from_name : Bool) -> \(publish : Bool) - -> let debians_spec = - List/map - Package.Type - (List PromotePackage.PromoteDebianSpec.Type) - ( \(debian : Package.Type) - -> List/map - DebianVersions.DebVersion - PromotePackage.PromoteDebianSpec.Type - ( \(codename : DebianVersions.DebVersion) - -> PromotePackage.PromoteDebianSpec::{ - , profile = profile - , package = debian - , new_version = new_version - , network = network - , codename = codename - , to_channel = to_channel - , remove_profile_from_name = - remove_profile_from_name - , step_key = - "verify-promote-debian-${Package.lowerName - debian}-${DebianVersions.lowerName - codename}-${DebianChannel.lowerName - to_channel}" - } - ) - codenames - ) - debians - - let debians_spec = - Prelude.List.fold - (List PromotePackage.PromoteDebianSpec.Type) - debians_spec - (List PromotePackage.PromoteDebianSpec.Type) - ( \(a : List PromotePackage.PromoteDebianSpec.Type) - -> \(b : List PromotePackage.PromoteDebianSpec.Type) - -> a # b - ) - ([] : List PromotePackage.PromoteDebianSpec.Type) - - let dockers_spec = - List/map - Artifact.Type - (List PromotePackage.PromoteDockerSpec.Type) - ( \(docker : Artifact.Type) - -> List/map - DebianVersions.DebVersion - PromotePackage.PromoteDockerSpec.Type - ( \(codename : DebianVersions.DebVersion) - -> PromotePackage.PromoteDockerSpec::{ - , profile = profile - , name = docker - , codename = codename - , new_tag = new_version - , network = network - , publish = publish - , remove_profile_from_name = - remove_profile_from_name - , step_key = - "verify-tag-${Artifact.lowerName - docker}-${DebianVersions.lowerName - codename}-docker" - } - ) - codenames - ) - dockers - - let dockers_spec = - Prelude.List.fold - (List PromotePackage.PromoteDockerSpec.Type) - dockers_spec - (List PromotePackage.PromoteDockerSpec.Type) - ( \(a : List PromotePackage.PromoteDockerSpec.Type) - -> \(b : List PromotePackage.PromoteDockerSpec.Type) - -> a # b - ) - ([] : List PromotePackage.PromoteDockerSpec.Type) + -> let verify_packages = + VerifyPackages.VerifyPackagesSpec::{ + , promote_step_name = None Text + , debians = debians + , dockers = dockers + , new_debian_version = new_version + , profile = profile + , network = network + , codenames = codenames + , channel = to_channel + , new_tags = [ tag ] + , remove_profile_from_name = remove_profile_from_name + , published = publish + } + + let debiansSpecs = + VerifyPackages.verifyPackagesToDebianSpecs verify_packages + + let dockersSpecs = + VerifyPackages.verifyPackagesToDockerSpecs verify_packages let pipelineType = Pipeline.build - ( PromotePackage.verifyPipeline - debians_spec - dockers_spec + ( VerifyPackages.verifyPipeline + debiansSpecs + dockersSpecs DebianVersions.DebVersion.Bullseye PipelineMode.Type.Stable ) diff --git a/buildkite/src/Jobs/Lint/TestnetAlerts.dhall b/buildkite/src/Jobs/Lint/TestnetAlerts.dhall deleted file mode 100644 index 9162f467097..00000000000 --- a/buildkite/src/Jobs/Lint/TestnetAlerts.dhall +++ /dev/null @@ -1,53 +0,0 @@ -let S = ../../Lib/SelectFiles.dhall - -let Cmd = ../../Lib/Cmds.dhall - -let Pipeline = ../../Pipeline/Dsl.dhall - -let PipelineTag = ../../Pipeline/Tag.dhall - -let JobSpec = ../../Pipeline/JobSpec.dhall - -let Command = ../../Command/Base.dhall - -let Docker = ../../Command/Docker/Type.dhall - -let Size = ../../Command/Size.dhall - -in Pipeline.build - Pipeline.Config::{ - , spec = JobSpec::{ - , dirtyWhen = - [ S.exactly "automation/terraform/monitoring/o1-testnet-alerts" "tf" - , S.strictlyStart - (S.contains "automation/terraform/modules/testnet-alerts") - , S.strictlyStart (S.contains "buildkite/src/Jobs/Lint/TestnetAlerts") - , S.strictlyStart - (S.contains "buildkite/src/Jobs/Release/TestnetAlerts") - ] - , path = "Lint" - , name = "TestnetAlerts" - , tags = - [ PipelineTag.Type.Fast - , PipelineTag.Type.Lint - , PipelineTag.Type.Stable - ] - } - , steps = - [ Command.build - Command.Config::{ - , commands = - [ Cmd.run - "cd automation/terraform/monitoring && terraform init && terraform destroy -auto-approve" - , Cmd.run - ( "terraform apply -auto-approve -target module.o1testnet_alerts.null_resource.alert_rules_lint" - ++ " -target module.o1testnet_alerts.null_resource.alert_rules_check" - ) - ] - , label = "Lint Testnet alert rules" - , key = "lint-testnet-alerts" - , target = Size.Small - , docker = None Docker.Type - } - ] - } diff --git a/buildkite/src/Jobs/Promote/AutoPromoteNightly.dhall b/buildkite/src/Jobs/Promote/AutoPromoteNightly.dhall new file mode 100644 index 00000000000..829a815ec25 --- /dev/null +++ b/buildkite/src/Jobs/Promote/AutoPromoteNightly.dhall @@ -0,0 +1,104 @@ +-- Auto Promote Nightly is job which should be either used just after nightly run or in separate pipeline +-- Small trick to allow manual override of source version which is about to be promoted +-- If FROM_VERSION_MANUAL is set the used it. +-- Otherwise use MINA_DEB_VERSION which is set in export-git-env-vars.sh file + + +let S = ../../Lib/SelectFiles.dhall + +let DebianVersions = ../../Constants/DebianVersions.dhall + +let Artifacts = ../../Constants/Artifacts.dhall + +let DebianPackage = ../../Constants/DebianPackage.dhall + +let DebianChannel = ../../Constants/DebianChannel.dhall + +let Network = ../../Constants/Network.dhall + +let Profiles = ../../Constants/Profiles.dhall + +let JobSpec = ../../Pipeline/JobSpec.dhall + +let PipelineTag = ../../Pipeline/Tag.dhall + +let Pipeline = ../../Pipeline/Dsl.dhall + +let PromotePackages = ../../Command/Promotion/PromotePackages.dhall + +let VerifyPackages = ../../Command/Promotion/VerifyPackages.dhall + +let promotePackages = + PromotePackages.PromotePackagesSpec::{ + , debians = + [ DebianPackage.Type.Daemon + , DebianPackage.Type.LogProc + , DebianPackage.Type.Archive + ] + , dockers = [ Artifacts.Type.Daemon, Artifacts.Type.Archive ] + , version = "\\\${FROM_VERSION_MANUAL:-\\\${MINA_DEB_VERSION}}" + , architecture = "amd64" + , new_debian_version = "\\\$(date \"+%Y%m%d\")" + , profile = Profiles.Type.Standard + , network = Network.Type.Devnet + , codenames = + [ DebianVersions.DebVersion.Bullseye, DebianVersions.DebVersion.Focal ] + , from_channel = DebianChannel.Type.Unstable + , to_channel = DebianChannel.Type.NightlyCompatible + , new_tags = + [ "latest-compatible-nightly" + , "compatible-nightly-\\\$(date \"+%Y%m%d\")" + ] + , remove_profile_from_name = False + , publish = False + } + +let verifyPackages = + VerifyPackages.VerifyPackagesSpec::{ + , promote_step_name = Some "AutoPromoteNightly" + , debians = + [ DebianPackage.Type.Daemon + , DebianPackage.Type.LogProc + , DebianPackage.Type.Archive + ] + , dockers = [ Artifacts.Type.Daemon, Artifacts.Type.Archive ] + , new_debian_version = "\\\$(date \"+%Y%m%d\")" + , profile = Profiles.Type.Standard + , network = Network.Type.Devnet + , codenames = + [ DebianVersions.DebVersion.Bullseye, DebianVersions.DebVersion.Focal ] + , channel = DebianChannel.Type.NightlyCompatible + , new_tags = + [ "latest-compatible-nightly" + , "compatible-nightly-\\\$(date \"+%Y%m%d\")" + ] + , remove_profile_from_name = False + , published = False + } + +let promoteDebiansSpecs = + PromotePackages.promotePackagesToDebianSpecs promotePackages + +let promoteDockersSpecs = + PromotePackages.promotePackagesToDockerSpecs promotePackages + +let verifyDebiansSpecs = + VerifyPackages.verifyPackagesToDebianSpecs verifyPackages + +let verifyDockersSpecs = + VerifyPackages.verifyPackagesToDockerSpecs verifyPackages + +in Pipeline.build + Pipeline.Config::{ + , spec = JobSpec::{ + , dirtyWhen = [ S.everything ] + , path = "Promote" + , tags = [ PipelineTag.Type.Promote ] + , name = "AutoPromoteNightly" + } + , steps = + PromotePackages.promoteSteps promoteDebiansSpecs promoteDockersSpecs + # VerifyPackages.verificationSteps + verifyDebiansSpecs + verifyDockersSpecs + } diff --git a/buildkite/src/Jobs/Release/MinaArtifactBullseye.dhall b/buildkite/src/Jobs/Release/MinaArtifactBullseye.dhall index d2ee7bc60f1..d4c2688f721 100644 --- a/buildkite/src/Jobs/Release/MinaArtifactBullseye.dhall +++ b/buildkite/src/Jobs/Release/MinaArtifactBullseye.dhall @@ -4,11 +4,14 @@ let Artifacts = ../../Constants/Artifacts.dhall let Pipeline = ../../Pipeline/Dsl.dhall +let PipelineTag = ../../Pipeline/Tag.dhall + in Pipeline.build ( ArtifactPipelines.pipeline ArtifactPipelines.MinaBuildSpec::{ , artifacts = [ Artifacts.Type.Daemon + , Artifacts.Type.LogProc , Artifacts.Type.Archive , Artifacts.Type.BatchTxn , Artifacts.Type.TestExecutive @@ -16,5 +19,10 @@ in Pipeline.build , Artifacts.Type.ZkappTestTransaction , Artifacts.Type.FunctionalTestSuite ] + , tags = + [ PipelineTag.Type.Long + , PipelineTag.Type.Release + , PipelineTag.Type.Docker + ] } ) diff --git a/buildkite/src/Jobs/Release/MinaArtifactBullseyeInstrumented.dhall b/buildkite/src/Jobs/Release/MinaArtifactBullseyeInstrumented.dhall index 7181e5fd0a5..b36d1324dc3 100644 --- a/buildkite/src/Jobs/Release/MinaArtifactBullseyeInstrumented.dhall +++ b/buildkite/src/Jobs/Release/MinaArtifactBullseyeInstrumented.dhall @@ -9,7 +9,11 @@ let Pipeline = ../../Pipeline/Dsl.dhall in Pipeline.build ( ArtifactPipelines.pipeline ArtifactPipelines.MinaBuildSpec::{ - , artifacts = [ Artifacts.Type.Daemon, Artifacts.Type.Archive ] + , artifacts = + [ Artifacts.Type.Daemon + , Artifacts.Type.LogProc + , Artifacts.Type.Archive + ] , buildFlags = BuildFlags.Type.Instrumented } ) diff --git a/buildkite/src/Jobs/Release/MinaArtifactBullseyeLightnet.dhall b/buildkite/src/Jobs/Release/MinaArtifactBullseyeLightnet.dhall index 68ce331394c..7551cb02039 100644 --- a/buildkite/src/Jobs/Release/MinaArtifactBullseyeLightnet.dhall +++ b/buildkite/src/Jobs/Release/MinaArtifactBullseyeLightnet.dhall @@ -9,7 +9,7 @@ let Pipeline = ../../Pipeline/Dsl.dhall in Pipeline.build ( ArtifactPipelines.pipeline ArtifactPipelines.MinaBuildSpec::{ - , artifacts = [ Artifacts.Type.Daemon ] + , artifacts = [ Artifacts.Type.Daemon, Artifacts.Type.LogProc ] , profile = Profiles.Type.Lightnet } ) diff --git a/buildkite/src/Jobs/Release/MinaArtifactFocal.dhall b/buildkite/src/Jobs/Release/MinaArtifactFocal.dhall index f8269fab58a..492858b50ab 100644 --- a/buildkite/src/Jobs/Release/MinaArtifactFocal.dhall +++ b/buildkite/src/Jobs/Release/MinaArtifactFocal.dhall @@ -11,6 +11,7 @@ in Pipeline.build ArtifactPipelines.MinaBuildSpec::{ , artifacts = [ Artifacts.Type.Daemon + , Artifacts.Type.LogProc , Artifacts.Type.Archive , Artifacts.Type.BatchTxn , Artifacts.Type.TestExecutive diff --git a/buildkite/src/Jobs/Release/MinaArtifactHardforkBullseye.dhall b/buildkite/src/Jobs/Release/MinaArtifactHardforkBullseye.dhall deleted file mode 100644 index d956c42d42d..00000000000 --- a/buildkite/src/Jobs/Release/MinaArtifactHardforkBullseye.dhall +++ /dev/null @@ -1,6 +0,0 @@ -let HardforkPackageGeneration = ../../Command/HardforkPackageGeneration.dhall - -let Pipeline = ../../Pipeline/Dsl.dhall - -in Pipeline.build - (HardforkPackageGeneration.pipeline HardforkPackageGeneration.Spec::{=}) diff --git a/buildkite/src/Jobs/Release/MinaArtifactHardforkBuster.dhall b/buildkite/src/Jobs/Release/MinaArtifactHardforkBuster.dhall deleted file mode 100644 index b92435c718c..00000000000 --- a/buildkite/src/Jobs/Release/MinaArtifactHardforkBuster.dhall +++ /dev/null @@ -1,12 +0,0 @@ -let HardforkPackageGeneration = ../../Command/HardforkPackageGeneration.dhall - -let DebianVersions = ../../Constants/DebianVersions.dhall - -let Pipeline = ../../Pipeline/Dsl.dhall - -in Pipeline.build - ( HardforkPackageGeneration.pipeline - HardforkPackageGeneration.Spec::{ - , codename = DebianVersions.DebVersion.Buster - } - ) diff --git a/buildkite/src/Jobs/Release/MinaArtifactHardforkFocal.dhall b/buildkite/src/Jobs/Release/MinaArtifactHardforkFocal.dhall deleted file mode 100644 index b60e28822ad..00000000000 --- a/buildkite/src/Jobs/Release/MinaArtifactHardforkFocal.dhall +++ /dev/null @@ -1,12 +0,0 @@ -let HardforkPackageGeneration = ../../Command/HardforkPackageGeneration.dhall - -let DebianVersions = ../../Constants/DebianVersions.dhall - -let Pipeline = ../../Pipeline/Dsl.dhall - -in Pipeline.build - ( HardforkPackageGeneration.pipeline - HardforkPackageGeneration.Spec::{ - , codename = DebianVersions.DebVersion.Focal - } - ) diff --git a/buildkite/src/Jobs/Release/MinaArtifactMainnetBullseye.dhall b/buildkite/src/Jobs/Release/MinaArtifactMainnetBullseye.dhall index 687d72aa43d..aa4037d8626 100644 --- a/buildkite/src/Jobs/Release/MinaArtifactMainnetBullseye.dhall +++ b/buildkite/src/Jobs/Release/MinaArtifactMainnetBullseye.dhall @@ -15,6 +15,7 @@ in Pipeline.build ArtifactPipelines.MinaBuildSpec::{ , artifacts = [ Artifacts.Type.Daemon + , Artifacts.Type.LogProc , Artifacts.Type.Archive , Artifacts.Type.BatchTxn , Artifacts.Type.Rosetta diff --git a/buildkite/src/Jobs/Release/MinaArtifactMainnetBuster.dhall b/buildkite/src/Jobs/Release/MinaArtifactMainnetBuster.dhall deleted file mode 100644 index 49b2adcc03c..00000000000 --- a/buildkite/src/Jobs/Release/MinaArtifactMainnetBuster.dhall +++ /dev/null @@ -1,35 +0,0 @@ -let ArtifactPipelines = ../../Command/MinaArtifact.dhall - -let DebianVersions = ../../Constants/DebianVersions.dhall - -let Network = ../../Constants/Network.dhall - -let Artifacts = ../../Constants/Artifacts.dhall - -let Pipeline = ../../Pipeline/Dsl.dhall - -let PipelineMode = ../../Pipeline/Mode.dhall - -let PipelineTag = ../../Pipeline/Tag.dhall - -in Pipeline.build - ( ArtifactPipelines.pipeline - ArtifactPipelines.MinaBuildSpec::{ - , artifacts = - [ Artifacts.Type.Daemon - , Artifacts.Type.Archive - , Artifacts.Type.BatchTxn - , Artifacts.Type.Rosetta - , Artifacts.Type.ZkappTestTransaction - ] - , debVersion = DebianVersions.DebVersion.Buster - , networks = [ Network.Type.Devnet, Network.Type.Mainnet ] - , tags = - [ PipelineTag.Type.Long - , PipelineTag.Type.Release - , PipelineTag.Type.Stable - ] - , mode = PipelineMode.Type.Stable - , prefix = "MinaArtifactMainnet" - } - ) diff --git a/buildkite/src/Jobs/Release/MinaArtifactMainnetFocal.dhall b/buildkite/src/Jobs/Release/MinaArtifactMainnetFocal.dhall index 06b05770530..82d9d49a532 100644 --- a/buildkite/src/Jobs/Release/MinaArtifactMainnetFocal.dhall +++ b/buildkite/src/Jobs/Release/MinaArtifactMainnetFocal.dhall @@ -17,6 +17,7 @@ in Pipeline.build ArtifactPipelines.MinaBuildSpec::{ , artifacts = [ Artifacts.Type.Daemon + , Artifacts.Type.LogProc , Artifacts.Type.Archive , Artifacts.Type.BatchTxn , Artifacts.Type.Rosetta diff --git a/buildkite/src/Jobs/Release/MinaArtifactBuster.dhall b/buildkite/src/Jobs/Release/MinaArtifactOnlyDebianBullseye.dhall similarity index 57% rename from buildkite/src/Jobs/Release/MinaArtifactBuster.dhall rename to buildkite/src/Jobs/Release/MinaArtifactOnlyDebianBullseye.dhall index c45b8c1b993..b4d2642bbd4 100644 --- a/buildkite/src/Jobs/Release/MinaArtifactBuster.dhall +++ b/buildkite/src/Jobs/Release/MinaArtifactOnlyDebianBullseye.dhall @@ -1,22 +1,28 @@ let ArtifactPipelines = ../../Command/MinaArtifact.dhall -let DebianVersions = ../../Constants/DebianVersions.dhall - let Artifacts = ../../Constants/Artifacts.dhall let Pipeline = ../../Pipeline/Dsl.dhall +let PipelineTag = ../../Pipeline/Tag.dhall + +let DebianChannel = ../../Constants/DebianChannel.dhall + in Pipeline.build - ( ArtifactPipelines.pipeline + ( ArtifactPipelines.onlyDebianPipeline ArtifactPipelines.MinaBuildSpec::{ , artifacts = [ Artifacts.Type.Daemon + , Artifacts.Type.LogProc , Artifacts.Type.Archive , Artifacts.Type.BatchTxn , Artifacts.Type.TestExecutive , Artifacts.Type.Rosetta , Artifacts.Type.ZkappTestTransaction + , Artifacts.Type.FunctionalTestSuite ] - , debVersion = DebianVersions.DebVersion.Buster + , tags = [ PipelineTag.Type.Debian ] + , channel = DebianChannel.Type.Experimental + , prefix = "MinaArtifactOnlyDebian" } ) diff --git a/buildkite/src/Jobs/Release/MinaToolchainArtifactBullseye.dhall b/buildkite/src/Jobs/Release/MinaToolchainArtifactBullseye.dhall index 8603e4001fd..86e483e1e31 100644 --- a/buildkite/src/Jobs/Release/MinaToolchainArtifactBullseye.dhall +++ b/buildkite/src/Jobs/Release/MinaToolchainArtifactBullseye.dhall @@ -29,7 +29,7 @@ in Pipeline.build DockerImage.ReleaseSpec::{ , service = "mina-toolchain" , deb_codename = "bullseye" - , extra_args = "--no-cache" + , no_cache = True , step_key = "toolchain-bullseye-docker-image" } diff --git a/buildkite/src/Jobs/Release/MinaToolchainArtifactBuster.dhall b/buildkite/src/Jobs/Release/MinaToolchainArtifactFocal.dhall similarity index 71% rename from buildkite/src/Jobs/Release/MinaToolchainArtifactBuster.dhall rename to buildkite/src/Jobs/Release/MinaToolchainArtifactFocal.dhall index 3057316b1cc..ab0030f99f4 100644 --- a/buildkite/src/Jobs/Release/MinaToolchainArtifactBuster.dhall +++ b/buildkite/src/Jobs/Release/MinaToolchainArtifactFocal.dhall @@ -4,8 +4,6 @@ let Pipeline = ../../Pipeline/Dsl.dhall let PipelineTag = ../../Pipeline/Tag.dhall -let PipelineMode = ../../Pipeline/Mode.dhall - let JobSpec = ../../Pipeline/JobSpec.dhall let DockerImage = ../../Command/DockerImage.dhall @@ -23,19 +21,18 @@ in Pipeline.build , S.strictlyEnd (S.contains "rust-toolchain.toml") ] , path = "Release" - , name = "MinaToolchainArtifactBuster" + , name = "MinaToolchainArtifactFocal" , tags = [ PipelineTag.Type.Toolchain ] - , mode = PipelineMode.Type.Stable } , steps = - [ let toolchainBusterSpec = + [ let toolchainSpec = DockerImage.ReleaseSpec::{ , service = "mina-toolchain" - , deb_codename = "buster" - , extra_args = "--no-cache" - , step_key = "toolchain-buster-docker-image" + , deb_codename = "focal" + , no_cache = True + , step_key = "toolchain-focal-docker-image" } - in DockerImage.generateStep toolchainBusterSpec + in DockerImage.generateStep toolchainSpec ] } diff --git a/buildkite/src/Jobs/Release/TestnetAlerts.dhall b/buildkite/src/Jobs/Release/TestnetAlerts.dhall deleted file mode 100644 index ad7e060491d..00000000000 --- a/buildkite/src/Jobs/Release/TestnetAlerts.dhall +++ /dev/null @@ -1,53 +0,0 @@ -let S = ../../Lib/SelectFiles.dhall - -let Cmd = ../../Lib/Cmds.dhall - -let Pipeline = ../../Pipeline/Dsl.dhall - -let PipelineTag = ../../Pipeline/Tag.dhall - -let JobSpec = ../../Pipeline/JobSpec.dhall - -let Command = ../../Command/Base.dhall - -let Docker = ../../Command/Docker/Type.dhall - -let Size = ../../Command/Size.dhall - -in Pipeline.build - Pipeline.Config::{ - , spec = JobSpec::{ - , dirtyWhen = - [ S.strictlyStart - (S.contains "automation/terraform/modules/testnet-alerts") - , S.exactly "automation/terraform/monitoring/o1-testnet-alerts" "tf" - , S.strictlyStart - (S.contains "buildkite/src/Jobs/Release/TestnetAlerts") - ] - , path = "Release" - , name = "TestnetAlerts" - , tags = - [ PipelineTag.Type.Fast - , PipelineTag.Type.Release - , PipelineTag.Type.Stable - ] - } - , steps = - [ Command.build - Command.Config::{ - , commands = - [ Cmd.run - "cd automation/terraform/monitoring && terraform init && terraform destroy -auto-approve" - , Cmd.run - "terraform apply -auto-approve -target module.o1testnet_alerts.docker_container.sync_alert_rules" - ] - , label = "Deploy Testnet alert rules" - , key = "deploy-testnet-alerts" - , target = Size.Medium - , depends_on = - [ { name = "TestnetAlerts", key = "lint-testnet-alerts" } ] - , docker = None Docker.Type - , if = Some "build.env('DEPLOY_ALERTS') == 'true'" - } - ] - } diff --git a/buildkite/src/Jobs/Test/ArchiveNodeUnitTest.dhall b/buildkite/src/Jobs/Test/ArchiveNodeUnitTest.dhall index ec739d68c39..2cd73c0090d 100644 --- a/buildkite/src/Jobs/Test/ArchiveNodeUnitTest.dhall +++ b/buildkite/src/Jobs/Test/ArchiveNodeUnitTest.dhall @@ -50,6 +50,7 @@ in Pipeline.build [ "POSTGRES_PASSWORD=${password}" , "POSTGRES_USER=${user}" , "POSTGRES_DB=${db}" + , "MINA_TEST_POSTGRES=postgres://${user}:${password}@localhost:5434/${db}" , "GO=/usr/lib/go/bin/go" , "DUNE_INSTRUMENT_WITH=bisect_ppx" , "COVERALLS_TOKEN" @@ -57,7 +58,6 @@ in Pipeline.build ( Prelude.Text.concatSep " && " [ "bash buildkite/scripts/setup-database-for-archive-node.sh ${user} ${password} ${db}" - , "PGPASSWORD=${password} psql -h localhost -p 5432 -U ${user} -d ${db} -a -f src/app/archive/create_schema.sql" , WithCargo.withCargo "eval \\\$(opam config env) && dune runtest src/app/archive && buildkite/scripts/upload-partial-coverage-data.sh ${command_key} dev" ] diff --git a/buildkite/src/Jobs/Test/ConnectToBerkeley.dhall b/buildkite/src/Jobs/Test/ConnectToBerkeley.dhall index 2396f299df0..312e63f9435 100644 --- a/buildkite/src/Jobs/Test/ConnectToBerkeley.dhall +++ b/buildkite/src/Jobs/Test/ConnectToBerkeley.dhall @@ -14,13 +14,18 @@ let ConnectToTestnet = ../../Command/ConnectToTestnet.dhall let Profiles = ../../Constants/Profiles.dhall +let Artifacts = ../../Constants/Artifacts.dhall + +let Network = ../../Constants/Network.dhall + let Dockers = ../../Constants/DockerVersions.dhall let dependsOn = Dockers.dependsOn Dockers.Type.Bullseye + (Some Network.Type.Berkeley) Profiles.Type.Standard - "daemon-berkeley" + Artifacts.Type.Daemon in Pipeline.build Pipeline.Config::{ diff --git a/buildkite/src/Jobs/Test/NixBuildTest.dhall b/buildkite/src/Jobs/Test/NixBuildTest.dhall index e46157d68ec..97678ce27dd 100644 --- a/buildkite/src/Jobs/Test/NixBuildTest.dhall +++ b/buildkite/src/Jobs/Test/NixBuildTest.dhall @@ -44,6 +44,7 @@ in Pipeline.build Cmd.Docker::{ , image = ContainerImages.nixos , privileged = True + , useBash = False } "./buildkite/scripts/test-nix.sh \$BUILDKITE_BRANCH" ] diff --git a/buildkite/src/Jobs/Test/ReplayerTest.dhall b/buildkite/src/Jobs/Test/ReplayerTest.dhall index 1d538bebaed..0e3d665e2ce 100644 --- a/buildkite/src/Jobs/Test/ReplayerTest.dhall +++ b/buildkite/src/Jobs/Test/ReplayerTest.dhall @@ -12,8 +12,16 @@ let Profiles = ../../Constants/Profiles.dhall let Dockers = ../../Constants/DockerVersions.dhall +let Network = ../../Constants/Network.dhall + +let Artifacts = ../../Constants/Artifacts.dhall + let dependsOn = - Dockers.dependsOn Dockers.Type.Bullseye Profiles.Type.Standard "archive" + Dockers.dependsOn + Dockers.Type.Bullseye + (None Network.Type) + Profiles.Type.Standard + Artifacts.Type.Archive in Pipeline.build Pipeline.Config::{ diff --git a/buildkite/src/Jobs/Test/RosettaIntegrationTests.dhall b/buildkite/src/Jobs/Test/RosettaIntegrationTests.dhall index 2e2dc9c79a9..4d7ae4b9c3b 100644 --- a/buildkite/src/Jobs/Test/RosettaIntegrationTests.dhall +++ b/buildkite/src/Jobs/Test/RosettaIntegrationTests.dhall @@ -1,3 +1,5 @@ +let B = ../../External/Buildkite.dhall + let Cmd = ../../Lib/Cmds.dhall let S = ../../Lib/SelectFiles.dhall @@ -18,8 +20,12 @@ let Dockers = ../../Constants/DockerVersions.dhall let Artifacts = ../../Constants/Artifacts.dhall +let Network = ../../Constants/Network.dhall + let RunWithPostgres = ../../Command/RunWithPostgres.dhall +let B/SoftFail = B.definitions/commandStep/properties/soft_fail/Type + let dirtyWhen = [ S.strictlyStart (S.contains "src") , S.exactly "buildkite/src/Jobs/Test/RosettaIntegrationTests" "dhall" @@ -49,22 +55,25 @@ in Pipeline.build ([] : List Text) "./src/test/archive/sample_db/archive_db.sql" Artifacts.Type.Rosetta + (Some Network.Type.Berkeley) "./buildkite/scripts/rosetta-indexer-test.sh" , Cmd.runInDocker Cmd.Docker::{ , image = - "gcr.io/o1labs-192920/mina-rosetta:\\\${MINA_DOCKER_TAG}" + "gcr.io/o1labs-192920/mina-rosetta:\\\${MINA_DOCKER_TAG}-berkeley" } "buildkite/scripts/rosetta-integration-tests-fast.sh" ] , label = "Rosetta integration tests Bullseye" , key = "rosetta-integration-tests-bullseye" + , soft_fail = Some (B/SoftFail.Boolean True) , target = Size.Small , depends_on = Dockers.dependsOn Dockers.Type.Bullseye + (None Network.Type) Profiles.Type.Standard - "rosetta" + Artifacts.Type.Rosetta } ] } diff --git a/buildkite/src/Jobs/Test/RosettaIntegrationTestsLong.dhall b/buildkite/src/Jobs/Test/RosettaIntegrationTestsLong.dhall index ab4eed58015..10ff09fea4e 100644 --- a/buildkite/src/Jobs/Test/RosettaIntegrationTestsLong.dhall +++ b/buildkite/src/Jobs/Test/RosettaIntegrationTestsLong.dhall @@ -1,5 +1,7 @@ let Cmd = ../../Lib/Cmds.dhall +let B = ../../External/Buildkite.dhall + let S = ../../Lib/SelectFiles.dhall let Pipeline = ../../Pipeline/Dsl.dhall @@ -14,6 +16,16 @@ let Command = ../../Command/Base.dhall let Size = ../../Command/Size.dhall +let Network = ../../Constants/Network.dhall + +let Profiles = ../../Constants/Profiles.dhall + +let Artifacts = ../../Constants/Artifacts.dhall + +let Dockers = ../../Constants/DockerVersions.dhall + +let B/SoftFail = B.definitions/commandStep/properties/soft_fail/Type + let dirtyWhen = [ S.strictlyStart (S.contains "src") , S.exactly "buildkite/src/Jobs/Test/RosettaIntegrationTests" "dhall" @@ -43,18 +55,20 @@ in Pipeline.build , Cmd.runInDocker Cmd.Docker::{ , image = - "gcr.io/o1labs-192920/mina-rosetta:\\\${MINA_DOCKER_TAG}" + "gcr.io/o1labs-192920/mina-rosetta:\\\${MINA_DOCKER_TAG}-berkeley" } "buildkite/scripts/rosetta-integration-tests-full.sh" ] , label = "Rosetta integration tests Bullseye Long" , key = "rosetta-integration-tests-bullseye-long" + , soft_fail = Some (B/SoftFail.Boolean True) , target = Size.Small , depends_on = - [ { name = "MinaArtifactBullseye" - , key = "rosetta-bullseye-docker-image" - } - ] + Dockers.dependsOn + Dockers.Type.Bullseye + (None Network.Type) + Profiles.Type.Standard + Artifacts.Type.Rosetta } ] } diff --git a/buildkite/src/Jobs/Test/TestnetIntegrationTests.dhall b/buildkite/src/Jobs/Test/TestnetIntegrationTests.dhall index e356ad8f3fb..933a21bae6e 100644 --- a/buildkite/src/Jobs/Test/TestnetIntegrationTests.dhall +++ b/buildkite/src/Jobs/Test/TestnetIntegrationTests.dhall @@ -14,12 +14,21 @@ let Profiles = ../../Constants/Profiles.dhall let Dockers = ../../Constants/DockerVersions.dhall +let Network = ../../Constants/Network.dhall + +let Artifacts = ../../Constants/Artifacts.dhall + let dependsOn = Dockers.dependsOn Dockers.Type.Bullseye + (Some Network.Type.Berkeley) + Profiles.Type.Standard + Artifacts.Type.Daemon + # Dockers.dependsOn + Dockers.Type.Bullseye + (None Network.Type) Profiles.Type.Standard - "daemon-berkeley" - # Dockers.dependsOn Dockers.Type.Bullseye Profiles.Type.Standard "archive" + Artifacts.Type.Archive in Pipeline.build Pipeline.Config::{ diff --git a/buildkite/src/Jobs/Test/TestnetIntegrationTestsLong.dhall b/buildkite/src/Jobs/Test/TestnetIntegrationTestsLong.dhall index 4e6de0140c0..c02eb9c5262 100644 --- a/buildkite/src/Jobs/Test/TestnetIntegrationTestsLong.dhall +++ b/buildkite/src/Jobs/Test/TestnetIntegrationTestsLong.dhall @@ -14,12 +14,21 @@ let Profiles = ../../Constants/Profiles.dhall let Dockers = ../../Constants/DockerVersions.dhall +let Network = ../../Constants/Network.dhall + +let Artifacts = ../../Constants/Artifacts.dhall + let dependsOn = Dockers.dependsOn Dockers.Type.Bullseye + (Some Network.Type.Berkeley) + Profiles.Type.Standard + Artifacts.Type.Daemon + # Dockers.dependsOn + Dockers.Type.Bullseye + (None Network.Type) Profiles.Type.Standard - "daemon-berkeley" - # Dockers.dependsOn Dockers.Type.Bullseye Profiles.Type.Standard "archive" + Artifacts.Type.Archive in Pipeline.build Pipeline.Config::{ diff --git a/buildkite/src/Jobs/Test/VersionLint.dhall b/buildkite/src/Jobs/Test/VersionLint.dhall index 83d7e2f6be8..bc47db104ad 100644 --- a/buildkite/src/Jobs/Test/VersionLint.dhall +++ b/buildkite/src/Jobs/Test/VersionLint.dhall @@ -2,6 +2,10 @@ let Cmd = ../../Lib/Cmds.dhall let S = ../../Lib/SelectFiles.dhall +let B = ../../External/Buildkite.dhall + +let B/SoftFail = B.definitions/commandStep/properties/soft_fail/Type + let Pipeline = ../../Pipeline/Dsl.dhall let PipelineTag = ../../Pipeline/Tag.dhall @@ -19,10 +23,11 @@ let Size = ../../Command/Size.dhall let dependsOn = [ { name = "MinaArtifactBullseye", key = "build-deb-pkg" } ] let buildTestCmd - : Text -> Size -> List Command.TaggedKey.Type -> Command.Type + : Text -> Size -> List Command.TaggedKey.Type -> B/SoftFail -> Command.Type = \(release_branch : Text) -> \(cmd_target : Size) -> \(dependsOn : List Command.TaggedKey.Type) + -> \(soft_fail : B/SoftFail) -> Command.build Command.Config::{ , commands = @@ -30,13 +35,14 @@ let buildTestCmd ([] : List Text) "buildkite/scripts/dump-mina-type-shapes.sh" # [ Cmd.run - "gsutil cp \$(git log -n 1 --format=%h --abbrev=7 --no-merges)-type_shape.txt \$MINA_TYPE_SHAPE gs://mina-type-shapes" + "gsutil cp \$(git log -n 1 --format=%h --abbrev=7)-type_shape.txt \$MINA_TYPE_SHAPE gs://mina-type-shapes" ] # RunInToolchain.runInToolchain ([] : List Text) "buildkite/scripts/version-linter.sh ${release_branch}" - , label = "Versioned type linter" - , key = "version-linter" + , label = "Versioned type linter for ${release_branch}" + , key = "version-linter-${release_branch}" + , soft_fail = Some soft_fail , target = cmd_target , docker = None Docker.Type , depends_on = dependsOn @@ -56,7 +62,19 @@ in Pipeline.build , dirtyWhen = lintDirtyWhen , path = "Test" , name = "VersionLint" - , tags = [ PipelineTag.Type.Long, PipelineTag.Type.Test ] + , tags = + [ PipelineTag.Type.Long + , PipelineTag.Type.Test + , PipelineTag.Type.Stable + ] } - , steps = [ buildTestCmd "develop" Size.Small dependsOn ] + , steps = + [ buildTestCmd + "compatible" + Size.Small + dependsOn + (B/SoftFail.Boolean True) + , buildTestCmd "develop" Size.Small dependsOn (B/SoftFail.Boolean True) + , buildTestCmd "master" Size.Small dependsOn (B/SoftFail.Boolean True) + ] } diff --git a/buildkite/src/Lib/Cmds.dhall b/buildkite/src/Lib/Cmds.dhall index 49e2d8fc432..63d5c3d7950 100644 --- a/buildkite/src/Lib/Cmds.dhall +++ b/buildkite/src/Lib/Cmds.dhall @@ -13,8 +13,16 @@ let module = \(environment : List Text) -> let Docker = { Type = - { image : Text, extraEnv : List Text, privileged : Bool } - , default = { extraEnv = [] : List Text, privileged = False } + { image : Text + , extraEnv : List Text + , privileged : Bool + , useBash : Bool + } + , default = + { extraEnv = [] : List Text + , privileged = False + , useBash = True + } } let Cmd = { line : Text, readable : Optional Text } @@ -58,12 +66,16 @@ let module = : Text = "/var/buildkite/shared" + let entrypoint + : Text + = if docker.useBash then "/bin/bash" else "/bin/sh" + in { line = - "docker run -it --rm --entrypoint /bin/sh --init --volume ${sharedDir}:/shared --volume ${outerDir}:/workdir --workdir /workdir${envVars}${ if docker.privileged + "docker run -it --rm --entrypoint ${entrypoint} --init --volume ${sharedDir}:/shared --volume ${outerDir}:/workdir --workdir /workdir${envVars}${ if docker.privileged - then " --privileged" + then " --privileged" - else ""} ${docker.image} -c '${inner.line}'" + else ""} ${docker.image} -c '${inner.line}'" , readable = Optional/map Text @@ -130,7 +142,7 @@ let tests = let dockerExample = assert : { line = - "docker run -it --rm --entrypoint /bin/sh --init --volume /var/buildkite/shared:/shared --volume \\\$BUILDKITE_BUILD_CHECKOUT_PATH:/workdir --workdir /workdir --env ENV1 --env ENV2 --env TEST foo/bar:tag -c 'echo hello'" + "docker run -it --rm --entrypoint /bin/bash --init --volume /var/buildkite/shared:/shared --volume \\\$BUILDKITE_BUILD_CHECKOUT_PATH:/workdir --workdir /workdir --env ENV1 --env ENV2 --env TEST foo/bar:tag -c 'echo hello'" , readable = Some "Docker@foo/bar:tag ( echo hello )" } === M.inDocker @@ -142,7 +154,7 @@ let tests = let cacheExample = assert - : "./buildkite/scripts/cache-through.sh data.tar \"docker run -it --rm --entrypoint /bin/sh --init --volume /var/buildkite/shared:/shared --volume \\\$BUILDKITE_BUILD_CHECKOUT_PATH:/workdir --workdir /workdir --env ENV1 --env ENV2 --env TEST foo/bar:tag -c 'echo hello > /tmp/data/foo.txt && tar cvf data.tar /tmp/data'\"" + : "./buildkite/scripts/cache-through.sh data.tar \"docker run -it --rm --entrypoint /bin/bash --init --volume /var/buildkite/shared:/shared --volume \\\$BUILDKITE_BUILD_CHECKOUT_PATH:/workdir --workdir /workdir --env ENV1 --env ENV2 --env TEST foo/bar:tag -c 'echo hello > /tmp/data/foo.txt && tar cvf data.tar /tmp/data'\"" === M.format ( M.cacheThrough M.Docker::{ diff --git a/buildkite/src/Pipeline/Filter.dhall b/buildkite/src/Pipeline/Filter.dhall index 8603f5e8f0f..1755e99294a 100644 --- a/buildkite/src/Pipeline/Filter.dhall +++ b/buildkite/src/Pipeline/Filter.dhall @@ -14,6 +14,9 @@ let Filter | AllTests | Release | HardforkPackageGeneration + | Promote + | DebianBuild + | DockerBuild > let tags @@ -25,6 +28,8 @@ let tags , Long = [ Tag.Type.Long ] , TearDownOnly = [ Tag.Type.TearDown ] , ToolchainsOnly = [ Tag.Type.Toolchain ] + , DebianBuild = [ Tag.Type.Debian ] + , DockerBuild = [ Tag.Type.Docker ] , AllTests = [ Tag.Type.Lint , Tag.Type.Release @@ -32,6 +37,7 @@ let tags , Tag.Type.Hardfork ] , Release = [ Tag.Type.Release ] + , Promote = [ Tag.Type.Promote ] , HardforkPackageGeneration = [ Tag.Type.Hardfork ] } filter @@ -47,6 +53,9 @@ let show , TearDownOnly = "TearDownOnly" , AllTests = "AllTests" , Release = "Release" + , Promote = "Promote" + , DebianBuild = "DebianBuild" + , DockerBuild = "DockerBuild" , HardforkPackageGeneration = "HardforkPackageGeneration" } filter diff --git a/buildkite/src/Pipeline/Mode.dhall b/buildkite/src/Pipeline/Mode.dhall index 374457c082d..c08a1c0dddf 100644 --- a/buildkite/src/Pipeline/Mode.dhall +++ b/buildkite/src/Pipeline/Mode.dhall @@ -2,6 +2,8 @@ -- -- Goal of the pipeline can be either quick feedback for CI changes -- or Nightly run which supposed to be run only on stable changes. +-- PullRequest - filter elligible jobs based on tags and then apply triage based on changed made in PR +-- Stable - filter only ellligigble jobs and do not perform triage let Mode = < PullRequest | Stable > diff --git a/buildkite/src/Pipeline/Tag.dhall b/buildkite/src/Pipeline/Tag.dhall index 804a359198f..8325058f581 100644 --- a/buildkite/src/Pipeline/Tag.dhall +++ b/buildkite/src/Pipeline/Tag.dhall @@ -15,9 +15,12 @@ let Tag | Lint | Release | Test + | Stable | Toolchain + | Docker + | Debian | Hardfork - | Stable + | Promote > let toNatural @@ -34,6 +37,9 @@ let toNatural , Toolchain = 8 , Hardfork = 9 , Stable = 10 + , Promote = 11 + , Debian = 12 + , Docker = 13 } tag @@ -68,6 +74,9 @@ let capitalName = , Toolchain = "Toolchain" , Hardfork = "Hardfork" , Stable = "Stable" + , Promote = "Promote" + , Docker = "Docker" + , Debian = "Debian" } tag @@ -84,6 +93,9 @@ let lowerName = , Toolchain = "toolchain" , Hardfork = "hardfork" , Stable = "stable" + , Promote = "promote" + , Docker = "docker" + , Debian = "debian" } tag diff --git a/buildkite/src/README.md b/buildkite/src/README.md index d9b577e81b5..e8bfe284ddb 100644 --- a/buildkite/src/README.md +++ b/buildkite/src/README.md @@ -134,7 +134,7 @@ steps: - "NETWORK=Devnet" - "FROM_VERSION=3.0.0devnet-tooling-dkijania-hardfork-package-gen-in-nightly-b37f50e" - "NEW_VERSION=3.0.0fake-ddb6fc4" - - "CODENAMES=Focal,Buster,Bullseye" + - "CODENAMES=Focal,Bullseye" - "FROM_CHANNEL=Unstable" - "TO_CHANNEL=Experimental" image: codaprotocol/ci-toolchain-base:v3 @@ -146,11 +146,11 @@ Above definition one need to paste into steps edit box for given pipeline and th All list of available parameters: -- DEBIANS - The comma delimitered debian names. For example: `Daemon,Archive`. All available names are located in `buildkite/src/Constans/DebianPackage.dhall` files. Only CamelCase format is supported +- DEBIANS - The comma delimited debian names. For example: `Daemon,Archive`. All available names are located in `buildkite/src/Constans/DebianPackage.dhall` files. Only CamelCase format is supported -- DOCKERS - The comma delimitered docker names. For example: `Daemon,Archive`. All available names are located in `buildkite/src/Constans/Artifacts.dhall` files. Only CamelCase format is supported +- DOCKERS - The comma delimited docker names. For example: `Daemon,Archive`. All available names are located in `buildkite/src/Constans/Artifacts.dhall` files. Only CamelCase format is supported -- CODENAMES - The Debian codenames `Bullseye,Buster,Focal`. All available names are located in `buildkite/src/Constans/DebianVersions.dhall`. Only CamelCase format is supported +- CODENAMES - The Debian codenames `Bullseye,Focal`. All available names are located in `buildkite/src/Constans/DebianVersions.dhall`. Only CamelCase format is supported - FROM_VERSION - The Source Docker or Debian version @@ -187,7 +187,7 @@ Pipeline with create 6 jobs for each Docker and Debian component separately. - "FROM_VERSION=3.0.0devnet-tooling-dkijania-hardfork-package-gen-in-nightly-b37f50e" - "NEW_VERSION=3.0.0-ddb6fc4" - "PUBLISH"=1 - - "CODENAMES=Focal,Buster,Bullseye" + - "CODENAMES=Focal,Bullseye" - "FROM_CHANNEL=Unstable" - "TO_CHANNEL=Devnet" @@ -202,6 +202,6 @@ We want only to move dockers from gcr to dockerhub without changing version. Cur - "NETWORK=Devnet" - "FROM_VERSION=3.0.0-dc6bf78" - "NEW_VERSION=3.0.0-dc6bf78" - - "CODENAMES=Focal,Buster,Bullseye" + - "CODENAMES=Focal,Bullseye" - "PUBLISH=1" ``` \ No newline at end of file diff --git a/dev/Makefile b/dev/Makefile index 8e1f1764620..dfb72c5f38a 100644 --- a/dev/Makefile +++ b/dev/Makefile @@ -1,10 +1,10 @@ all: - docker-compose up + docker compose up rebuild: - docker-compose down --volumes - docker-compose build --no-cache - docker-compose up + docker compose down --volumes + docker compose build --no-cache + docker compose up ssh: docker exec -it -w "/mina" mina /bin/bash diff --git a/dev/README.md b/dev/README.md index 2ff5ad2eca5..205c4cf0bb4 100644 --- a/dev/README.md +++ b/dev/README.md @@ -4,7 +4,7 @@ To build your changes using docker, you can use the following flow: - in one window run `make` - in another one run `make ssh` to have a shell into the container - + don't forget to run `./scripts/setup-ocaml.sh` to set up opam/ocaml/etc. + + don't forget to run `sudo chown -R opam .` to set up opam/ocaml/etc. + don't forget to run `eval $(opam config env)` as well + `make build` should work after that :) diff --git a/dev/docker-compose.yml b/dev/docker-compose.yml index cfc2391cdb3..a4c49483d74 100644 --- a/dev/docker-compose.yml +++ b/dev/docker-compose.yml @@ -3,9 +3,7 @@ version: "3.9" services: mina: container_name: mina - build: - context: ../dockerfiles - dockerfile: Dockerfile-toolchain + image: gcr.io/o1labs-192920/mina-toolchain@sha256:966863de43c72c294e14762ae567404005f99654c54338a9a89b999476a36d1f volumes: - "..:/mina" # mount the mina folder so that changes are reflected in the container - "_opam:/mina/_opam" # exclude any existing local switch diff --git a/dockerfiles/Dockerfile-delegation-backend b/dockerfiles/Dockerfile-delegation-backend deleted file mode 100644 index aa02181f6ef..00000000000 --- a/dockerfiles/Dockerfile-delegation-backend +++ /dev/null @@ -1,23 +0,0 @@ -FROM golang:1.18 - -# Set the Current Working Directory inside the container -WORKDIR $GOPATH/src/delegation_backend - -# Copy everything from the current directory to the PWD (Present Working Directory) inside the container -COPY src src -COPY result/headers src/delegation_backend - -# Download all the dependencies -RUN cd src && go get -d -v ./... - -COPY result/libmina_signer.so result/libmina_signer.so -ENV LD_LIBRARY_PATH="result:$LD_LIBRARY_PATH" - -# Install the package -RUN cd src && go install -v ./... - -# This container exposes port 8080 to the outside world -EXPOSE 8080 - -# Run the executable -CMD ["delegation_backend"] diff --git a/dockerfiles/Dockerfile-delegation-backend-toolchain b/dockerfiles/Dockerfile-delegation-backend-toolchain deleted file mode 100644 index 875c9438c0b..00000000000 --- a/dockerfiles/Dockerfile-delegation-backend-toolchain +++ /dev/null @@ -1,4 +0,0 @@ -FROM golang:1.18 - -COPY result/headers /headers -COPY result/libmina_signer.so /lib/x86_64-linux-gnu diff --git a/dockerfiles/Dockerfile-mina-daemon b/dockerfiles/Dockerfile-mina-daemon index 4f718e5ea3f..7d43e27bd0e 100644 --- a/dockerfiles/Dockerfile-mina-daemon +++ b/dockerfiles/Dockerfile-mina-daemon @@ -22,14 +22,6 @@ ENV DEBIAN_FRONTEND noninteractive # We do not install the below platform-specific dependencies, # and instead assume that apt will install the proper deps based on the package definition. # The packages are noted here just for clarity/documentation. -# Stretch-only Deps: -# libffi6 -# libprocps6 -# libjemalloc1 -# Buster-only Deps: -# libffi7 -# libprocps7 -# libjemalloc2 # Bullseye/Focal-only Deps: # libffi7 # libprocps8 diff --git a/dockerfiles/Dockerfile-mina-rosetta b/dockerfiles/Dockerfile-mina-rosetta index 8c5cd9b82b6..51c90c78c0f 100644 --- a/dockerfiles/Dockerfile-mina-rosetta +++ b/dockerfiles/Dockerfile-mina-rosetta @@ -22,14 +22,6 @@ ENV DEBIAN_FRONTEND noninteractive # We do not install the below platform-specific dependencies, # and instead assume that apt will install the proper deps based on the package definition. # The packages are noted here just for clarity/documentation. -# Stretch-only Deps: -# libffi6 -# libprocps6 -# libjemalloc1 -# Buster-only Deps: -# libffi7 -# libprocps7 -# libjemalloc2 # Bullseye/Focal-only Deps: # libffi7 # libprocps8 @@ -99,7 +91,7 @@ RUN mkdir -p --mode=700 ${MINA_CONFIG_DIR}/wallets/store/ \ RUN echo "Building image with version $deb_version from repo $deb_release $deb_codename for network $network" \ && echo "deb [trusted=yes] ${deb_repo} $deb_codename $deb_release" > /etc/apt/sources.list.d/o1.list \ && apt-get update --quiet --yes \ - && apt-get install --quiet --yes --allow-downgrades "mina-$network=$deb_version" "mina-archive=$deb_version" "mina-zkapp-test-transaction=$deb_version" \ + && apt-get install --quiet --yes --allow-downgrades "mina-$network=$deb_version" "mina-rosetta-$network=$deb_version" "mina-archive=$deb_version" "mina-zkapp-test-transaction=$deb_version" \ && rm -rf /var/lib/apt/lists/* # --- Set up postgres diff --git a/dockerfiles/Dockerfile-mina-test-executive b/dockerfiles/Dockerfile-mina-test-executive deleted file mode 100644 index a9d0a56ed5c..00000000000 --- a/dockerfiles/Dockerfile-mina-test-executive +++ /dev/null @@ -1,108 +0,0 @@ -ARG image=debian:bullseye-slim -FROM ${image} -# Run with `docker build --build-arg deb_version=` -ARG deb_version -ARG deb_release=unstable -ARG deb_codename=bullseye -ARG deb_repo="http://packages.o1test.net" -ARG MINA_BRANCH -ARG MINA_REPO=https://github.com/MinaProtocol/mina - -ENV DEBIAN_FRONTEND noninteractive - -# Dependencies -RUN apt-get update --quiet --yes \ - && apt-get upgrade --quiet --yes \ - && apt-get install --quiet --yes --no-install-recommends \ - apt-transport-https \ - ca-certificates \ - curl \ - dnsutils \ - dumb-init \ - gettext \ - gnupg2 \ - jq \ - libgmp10 \ - libgomp1 \ - libssl1.1 \ - libpq-dev \ - procps \ - python3 \ - tzdata \ - 'libjemalloc.$' \ - git \ - wget \ - sudo \ - unzip \ - && rm -rf /var/lib/apt/lists/* - - -# --- Terraform tools -RUN wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg \ - && gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint \ - && echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $deb_codename main" | sudo tee /etc/apt/sources.list.d/hashicorp.list \ - && apt-get update --quiet --yes \ - && apt-get install --quiet --yes terraform \ - && rm -rf /var/lib/apt/lists/* - -# Install google-cloud-sdk for GCLOUD_UPLOAD feature -RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list \ - && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - \ - && apt-get update --quiet --yes \ - && apt-get install --quiet --yes --no-install-recommends google-cloud-sdk kubectl google-cloud-sdk-gke-gcloud-auth-plugin \ - && rm -rf /var/lib/apt/lists/* - -ENV USE_GKE_GCLOUD_AUTH_PLUGIN=True - -# --- Helm tools -RUN curl https://baltocdn.com/helm/signing.asc | sudo apt-key add - \ - && echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list \ - && sudo apt-get update -y \ - && sudo apt-get install -y helm - -# Get yarn + nodejs -RUN curl -sL https://deb.nodesource.com/setup_20.x | sudo -E bash - \ - && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - \ - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list \ - && sudo apt-get update \ - && sudo apt-get install -y nodejs yarn - -# Mina mina test executive package -RUN echo "Installing mina-test-executive onto image with version $deb_version from repo $deb_release $deb_codename " \ - && echo "deb [trusted=yes] ${deb_repo} $deb_codename $deb_release" > /etc/apt/sources.list.d/o1.list \ - && apt-get update --yes \ - && apt-get install --yes --allow-downgrades "mina-test-executive=$deb_version" - -# Move to a non-root UID in the future (specifically 50000, as it is memorable and safely within the bounds of most systems) -# for now stick to root for compatibility -ARG UID=0 - -## Reset workdir, USER, and ${UID} for root-owned version -WORKDIR /root -USER 0 - -RUN git clone $MINA_REPO --branch $MINA_BRANCH --depth 1 mina \ - && cd ./mina - -WORKDIR /root/mina - -# these env vars need to be overriden when the image is `docker run`. listed here for documentation sake if nothing else -# test configuration vars -ENV TEST_NAME="" -ENV MINA_IMAGE="" -ENV ARCHIVE_IMAGE="" -ENV DEBUG_BOOL=false -# testnet infra related vars -ENV GOOGLE_APPLICATION_CREDENTIALS="" -ENV GCLOUD_API_KEY="" -ENV AWS_ACCESS_KEY_ID="" -ENV AWS_SECRET_ACCESS_KEY="" -ENV AWS_DEFAULT_REGION=us-west-2 - -# this var needs to be present but it won't change and doesn't need to be overriden -ENV KUBE_CONFIG_PATH=/root/.kube/config - -COPY --chown=${UID} scripts/run_test_executive.sh /run_test_executive.sh -RUN chmod +x /run_test_executive.sh - -ENTRYPOINT ["/bin/bash", "-c","/run_test_executive.sh"] diff --git a/dockerfiles/Dockerfile-mina-test-suite b/dockerfiles/Dockerfile-mina-test-suite index 98ac49ce9cd..1162bfa5e9e 100644 --- a/dockerfiles/Dockerfile-mina-test-suite +++ b/dockerfiles/Dockerfile-mina-test-suite @@ -13,14 +13,6 @@ ENV DEBIAN_FRONTEND noninteractive # We do not install the below platform-specific dependencies, # and instead assume that apt will install the proper deps based on the package definition. # The packages are noted here just for clarity/documentation. -# Stretch-only Deps: -# libffi6 -# libprocps6 -# libjemalloc1 -# Buster-only Deps: -# libffi7 -# libprocps7 -# libjemalloc2 # Bullseye/Focal-only Deps: # libffi7 # libprocps8 diff --git a/dockerfiles/stages/1-build-deps b/dockerfiles/stages/1-build-deps index 3c57e9d40fd..3e5348cc6e5 100644 --- a/dockerfiles/stages/1-build-deps +++ b/dockerfiles/stages/1-build-deps @@ -2,7 +2,7 @@ # The "build-deps" stage # - Installs all compilers/interpreters, tools, and OS packages on the given debian or ubuntu image ################################################################################################# -# Supports debian:buster-slim, debian:bullseye-slim, and ubuntu:focal +# Supports debian:bullseye-slim, and ubuntu:focal ARG image=ubuntu:focal FROM ${image} AS build-deps diff --git a/dockerfiles/stages/2-opam-deps b/dockerfiles/stages/2-opam-deps index 24b6ad9f246..09da654bdd2 100644 --- a/dockerfiles/stages/2-opam-deps +++ b/dockerfiles/stages/2-opam-deps @@ -25,6 +25,8 @@ ENV OPAMREUSEBUILDDIR false # Limit logs for opam install errors to 20 lines per error ENV OPAMERRLOGLEN 20 +ENV GIT_LFS_SKIP_SMUDGE 1 + # --- Shallow clone the Mina repo, only focused on the given MINA_BRANCH # git will clone into an empty dir, but this also helps us set the workdir in advance RUN git clone \ diff --git a/dune b/dune index 48a58ccc60a..8dfc6dc54d1 100644 --- a/dune +++ b/dune @@ -4,3 +4,5 @@ (deps (:< src/app/graphql_schema_dump/graphql_schema_dump.exe)) (action (with-stdout-to %{target} (run %{<})))) + +(dirs :standard \ opam_switches) diff --git a/flake.lock b/flake.lock index b0d1d44b236..b5b4aa858bd 100644 --- a/flake.lock +++ b/flake.lock @@ -277,6 +277,22 @@ "type": "github" } }, + "o1-opam-repository": { + "flake": false, + "locked": { + "lastModified": 1715294616, + "narHash": "sha256-W2p9Vs8PqpKGvMByxVqpxAljjpEMqNcuNnjMBAAKicI=", + "owner": "o1-labs", + "repo": "opam-repository", + "rev": "38d6995e307c82b3c0b3bc86a867213db724d1c5", + "type": "github" + }, + "original": { + "owner": "o1-labs", + "repo": "opam-repository", + "type": "github" + } + }, "opam-nix": { "inputs": { "flake-compat": "flake-compat_2", @@ -370,6 +386,7 @@ "nix-utils": "nix-utils", "nixpkgs": "nixpkgs_2", "nixpkgs-mozilla": "nixpkgs-mozilla", + "o1-opam-repository": "o1-opam-repository", "opam-nix": "opam-nix", "opam-repository": "opam-repository", "utils": "utils" diff --git a/flake.nix b/flake.nix index 2ec77b25931..453a00d4e32 100644 --- a/flake.nix +++ b/flake.nix @@ -21,6 +21,9 @@ inputs.opam-nix.inputs.nixpkgs.follows = "nixpkgs"; inputs.opam-nix.inputs.opam-repository.follows = "opam-repository"; + inputs.o1-opam-repository.url = "github:o1-labs/opam-repository"; + inputs.o1-opam-repository.flake = false; + inputs.opam-repository.url = "github:ocaml/opam-repository"; inputs.opam-repository.flake = false; diff --git a/genesis_ledgers/devnet.json b/genesis_ledgers/devnet.json index d4a9b1d0e2f..7585f586c80 100644 --- a/genesis_ledgers/devnet.json +++ b/genesis_ledgers/devnet.json @@ -25,5 +25,8 @@ "hash": "jxjmYHK1tnGy5S6CDaLDTRrDbw17DmtEd6Jnw3L86QSsLm15w5g", "s3_data_hash": "094ceb7c580ef53be0bf2385698fd8d2faebf91fdd8542c076df649aa261b94e" } + }, + "daemon": { + "network_id": "devnet" } -} \ No newline at end of file +} diff --git a/genesis_ledgers/mainnet.json b/genesis_ledgers/mainnet.json index 4daf65dfc57..befbba6ed51 100644 --- a/genesis_ledgers/mainnet.json +++ b/genesis_ledgers/mainnet.json @@ -25,5 +25,8 @@ "hash": "jwgzfxD5rEnSP3k4UiZu2569FfhJ1SRUvabfTz21e4btwBHg3jq", "s3_data_hash": "61323d7565130cfa4768c0333f32b2a8ea7fdfbf17065adfa48b4e9956619b44" } + }, + "daemon": { + "network_id": "mainnet" } } diff --git a/graphql_schema.json b/graphql_schema.json index fc218752a95..78fe292b1c0 100644 --- a/graphql_schema.json +++ b/graphql_schema.json @@ -6470,6 +6470,196 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "OBJECT", + "name": "EncodedAccount", + "description": null, + "fields": [ + { + "name": "account", + "description": "Base64 encoded account as binable wire type", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "merklePath", + "description": "Membership proof in the snarked ledger", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MerklePathElement", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "AccountInput", + "description": "An account with a public key and a token id", + "fields": [ + { + "name": "token", + "description": "Token id of the account", + "args": [], + "type": { "kind": "SCALAR", "name": "TokenId", "ofType": null }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "publicKey", + "description": "Public key of the account", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "PublicKey", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": [ + { + "name": "token", + "description": "Token id of the account", + "type": { "kind": "SCALAR", "name": "TokenId", "ofType": null }, + "defaultValue": null + }, + { + "name": "publicKey", + "description": "Public key of the account", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "PublicKey", + "ofType": null + } + }, + "defaultValue": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "MembershipInfo", + "description": null, + "fields": [ + { + "name": "accountBalance", + "description": "Account balance for a pk and token pair", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Balance", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "timingInfo", + "description": "Account timing according to chain state", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "AccountTiming", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": "current nonce related to the account", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "UInt32", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "merklePath", + "description": "Membership proof in the snarked ledger", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MerklePathElement", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "WorkDescription", @@ -15092,6 +15282,130 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "snarkedLedgerAccountMembership", + "description": + "obtain a membership proof for an account in the snarked ledger along with the account's balance, timing information, and nonce", + "args": [ + { + "name": "stateHash", + "description": "Hash of the snarked ledger to check", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "accountInfos", + "description": "Token id of the account to check", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "AccountInput", + "ofType": null + } + } + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MembershipInfo", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "encodedSnarkedLedgerAccountMembership", + "description": + "obtain a membership proof for an account in the snarked ledger along with the accounts full information encoded as base64 binable type", + "args": [ + { + "name": "stateHash", + "description": "Hash of the snarked ledger to check", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "accountInfos", + "description": "Token id of the account to check", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "AccountInput", + "ofType": null + } + } + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "EncodedAccount", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "genesisConstants", "description": diff --git a/nix/README.md b/nix/README.md index 9eecfb0d287..cec901a3401 100644 --- a/nix/README.md +++ b/nix/README.md @@ -192,6 +192,7 @@ TL;DR: ``` nix develop mina#impure opam init --bare +opam repository add --yes --all --set-default o1-labs https://github.com/o1-labs/opam-repository.git opam update opam switch import src/opam.export --strict eval $(opam env) diff --git a/nix/impure-shell.nix b/nix/impure-shell.nix index 6f9fb49ffa7..d957f1e13c9 100644 --- a/nix/impure-shell.nix +++ b/nix/impure-shell.nix @@ -23,7 +23,7 @@ pkgs.mkShell { rosetta-cli ]; OPAMSWITCH = "mina"; - MINA_ROCKSDB = "${pkgs.rocksdb511}/lib/librocksdb.a"; + MINA_ROCKSDB = "${pkgs.rocksdb-mina}/lib/librocksdb.a"; shellHook = '' eval $(opam env) if ! opam switch list --short 2>&1 | grep -w mina 2>&1 > /dev/null; then diff --git a/nix/ocaml.nix b/nix/ocaml.nix index fd750a9e50e..41fb70b6902 100644 --- a/nix/ocaml.nix +++ b/nix/ocaml.nix @@ -11,17 +11,14 @@ let hasPrefix last getAttrs filterAttrs optionalAttrs makeBinPath optionalString escapeShellArg; - external-repo = - opam-nix.makeOpamRepoRec "${src}/src/external"; # Pin external packages - repos = [ external-repo inputs.opam-repository ]; + repos = with inputs; [ o1-opam-repository opam-repository ]; export = opam-nix.importOpam "${src}/opam.export"; - external-packages = pkgs.lib.getAttrs [ "sodium" "base58" ] - (builtins.mapAttrs (_: pkgs.lib.last) (opam-nix.listRepo external-repo)); + # Dependencies required by every Mina package: # Packages which are `installed` in the export. # These are all the transitive ocaml dependencies of Mina. - export-installed = + implicit-deps = builtins.removeAttrs (opam-nix.opamListToQuery export.installed) [ "check_opam_switch" ]; @@ -43,12 +40,6 @@ let xdg = dune; }; - # Dependencies required by every Mina package - implicit-deps = export-installed // external-packages; - - pins = builtins.mapAttrs (name: pkg: { inherit name; } // pkg) - (builtins.removeAttrs export.package.section [ "check_opam_switch" ]); - implicit-deps-overlay = self: super: (if pkgs.stdenv.isDarwin then { async_ssl = super.async_ssl.overrideAttrs { @@ -66,19 +57,23 @@ let (oa: { buildInputs = oa.buildInputs ++ [ self.ctypes-foreign ]; }); # Can't find sodium-static and ctypes - sodium = super.sodium.overrideAttrs (_: { + sodium = super.sodium.overrideAttrs { NIX_CFLAGS_COMPILE = "-I${pkgs.sodium-static.dev}/include"; propagatedBuildInputs = [ pkgs.sodium-static ]; preBuild = '' export LD_LIBRARY_PATH="${super.ctypes}/lib/ocaml/${super.ocaml.version}/site-lib/ctypes"; ''; - }); + }; + + rocksdb_stubs = super.rocksdb_stubs.overrideAttrs { + MINA_ROCKSDB = "${pkgs.rocksdb-mina}/lib/librocksdb.a"; + }; }; scope = opam-nix.applyOverlays (opam-nix.__overlays ++ [ implicit-deps-overlay ]) (opam-nix.defsToScope pkgs { } - ((opam-nix.queryToDefs repos (extra-packages // implicit-deps)) // pins)); + (opam-nix.queryToDefs repos (extra-packages // implicit-deps))); installedPackageNames = map (x: (opam-nix.splitNameVer x).name) (builtins.attrNames implicit-deps); @@ -114,7 +109,7 @@ let for i in $(find -L "${placeholder output}/bin" -type f); do wrapProgram "$i" \ --prefix PATH : ${makeBinPath deps} \ - --set MINA_LIBP2P_HELPER_PATH ${pkgs.libp2p_helper}/bin/libp2p_helper \ + --set MINA_LIBP2P_HELPER_PATH ${pkgs.libp2p_helper}/bin/mina-libp2p_helper \ --set MINA_COMMIT_SHA1 ${escapeShellArg commit_sha1} done '') package.outputs); diff --git a/opam.export b/opam.export index 7429f18709e..6896719355c 100644 --- a/opam.export +++ b/opam.export @@ -31,10 +31,14 @@ roots: [ "ppx_bitstring.4.1.0" "ppx_deriving.5.2.1" "ppx_deriving_yojson.3.6.1" + "ppx_optcomp.v0.14.3" "prometheus.1.1" "qcheck.0.20" "qcheck-alcotest.0.20" + "sodium.dev" "re2.v0.14.0" + "rocks.0.1" + "rocksdb_stubs.5.17.2" "rpc_parallel.v0.14.0" "sexp_diff_kernel.v0.14.0" "utop.2.9.1" @@ -230,12 +234,15 @@ installed: [ "react.1.2.1" "res.5.0.1" "result.1.5" + "rocks.0.1" + "rocksdb_stubs.5.17.2" "rpc_parallel.v0.14.0" "rresult.0.6.0" "seq.base" "sexp_diff_kernel.v0.14.0" "sexplib.v0.14.0" "sexplib0.v0.14.0" + "sodium.dev" "spawn.v0.13.0" "splittable_random.v0.14.0" "stdint.0.7.0" @@ -264,192 +271,3 @@ installed: [ "zarith_stubs_js.v0.14.1" "zed.3.1.0" ] -pinned: [ - "async_kernel.v0.14.0" - "capnp.3.4.0" - "check_opam_switch.~dev" - "graphql_ppx.1.2.2" - "rpc_parallel.v0.14.0" -] -package "async_kernel" { - opam-version: "2.0" - version: "v0.14.0" - synopsis: "Monadic concurrency library" - description: """\ -Part of Jane Street's Core library - The Core suite of libraries is an industrial strength alternative to - OCaml's standard library that was developed by Jane Street, the - largest industrial user of OCaml.""" - maintainer: "opensource@janestreet.com" - authors: "Jane Street Group, LLC " - license: "MIT" - homepage: "https://github.com/janestreet/async_kernel" - doc: - "https://ocaml.janestreet.com/ocaml-core/latest/doc/async_kernel/index.html" - bug-reports: "https://github.com/janestreet/async_kernel/issues" - depends: [ - "ocaml" {>= "4.08.0"} - "core_kernel" {>= "v0.13" & < "v0.15"} - "ppx_jane" {>= "v0.13" & < "v0.15"} - "dune" {>= "2.0.0"} - ] - build: ["dune" "build" "-p" name "-j" jobs] - dev-repo: "git+https://github.com/janestreet/async_kernel.git" - url { - src: - "https://github.com/MinaProtocol/async_kernel/archive/bf02e69c129b6ffec97cc5b7a5d85125802968bb.tar.gz" - checksum: - "sha256=ae824169495106fa9099aa53c0367e58651de426f70653897b3e1168c9a7edb6" - } -} -package "capnp" { - opam-version: "2.0" - version: "3.4.0" - synopsis: - "OCaml code generation plugin for the Cap'n Proto serialization framework" - description: """\ -Cap'n Proto is a multi-language code generation framework designed for - high performance through the use of lazy parsing and arena allocation. - This package provides a plugin for the Cap'n Proto compiler which enables - OCaml code generation, as well as corresponding runtime library support.""" - maintainer: "Paul Pelzl " - authors: "Paul Pelzl " - license: "BSD-2-Clause" - homepage: "https://github.com/capnproto/capnp-ocaml" - bug-reports: "https://github.com/capnproto/capnp-ocaml/issues" - depends: [ - "ocaml" {>= "4.03.0"} - "dune" {>= "1.0"} - "result" - "base" {>= "v0.11"} - "stdio" - "base_quickcheck" {with-test} - "ocplib-endian" {>= "0.7"} - "res" - "stdint" {>= "0.5.1"} - "ounit" {with-test} - "conf-capnproto" {with-test} - ] - build: [ - ["dune" "build" "-p" name "-j" jobs] - [ - "dune" - "build" - "-p" - name - "-j" - jobs - "@runtest" - "@src/benchmark/benchmarks" - ] {with-test} - ] - dev-repo: "git+https://github.com/capnproto/capnp-ocaml.git" - url { - src: - "https://github.com/o1-labs/capnp-ocaml/archive/6f4913503cc971ab34df9bf9d4c65778fe05eb8f.tar.gz" - checksum: - "sha256=03aac06742f3d4ec8a189f0db65d46393b7497e8637ece15c39ff4ec01117b8b" - } -} -package "check_opam_switch" { - opam-version: "2.0" - version: "~dev" - synopsis: - "A tool to check that the current opam environment is up to date with an opam.export file" - description: - "A tool to check that the current opam environment is up to date with an opam.export file" - maintainer: "yves.stan.lecornec@tweag.io" - depends: [ - "dune" {>= "3.3"} - "opam-core" {>= "2.0.0"} - "opam-format" {>= "2.0.0"} - "minicli" {>= "5.0.0"} - "odoc" {with-doc} - ] - build: [ - ["dune" "subst"] {dev} - [ - "dune" - "build" - "-p" - name - "-j" - jobs - "@install" - "@runtest" {with-test} - "@doc" {with-doc} - ] - ] - url { - src: - "https://github.com/tweag/check_opam_switch/archive/d0aa49884e0f9fd4bbb2cd1a32b798a12f84b603.tar.gz" - checksum: - "sha256=24ab29ea4aff9da9d649f0b577c5d4e27ce2bef51058e139965cc9be25494a46" - } -} -package "graphql_ppx" { - opam-version: "2.0" - version: "1.2.2" - synopsis: "GraphQL PPX rewriter for ReScript/ReasonML" - description: - "GraphQL language primitives for ReScript/ReasonML written in ReasonML" - maintainer: "Jaap Frolich " - authors: [ - "Jaap Frolich " - "Tomasz Cichocinski " - ] - license: "MIT" - homepage: "https://github.com/reasonml-community/graphql-ppx" - bug-reports: "https://github.com/reasonml-community/graphql-ppx/issues" - depends: [ - "dune" {>= "2.5"} - "ocaml" {>= "4.06"} - "ppxlib" {>= "0.21.0"} - "result" {>= "1.5"} - ] - build: [ - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} - ] - dev-repo: "git+https://github.com/o1-labs/graphql_ppx.git" - url { - src: - "https://github.com/o1-labs/graphql_ppx/archive/f3ba4f7622240a2299f622b0c1d910f734579c25.tar.gz" - checksum: - "sha256=8aff33988218c99a95a91fb04ef703a3b8cde0676b7a90ee72478959829867d8" - } -} -package "rpc_parallel" { - opam-version: "2.0" - version: "v0.14.0" - synopsis: "Type-safe parallel library built on top of Async_rpc" - description: """\ -Rpc_parallel offers an API to define various workers and protocols, - spawn workers as separate processes, and communicate with them using - Async Rpc.""" - maintainer: "opensource@janestreet.com" - authors: "Jane Street Group, LLC " - license: "MIT" - homepage: "https://github.com/janestreet/rpc_parallel" - doc: - "https://ocaml.janestreet.com/ocaml-core/latest/doc/rpc_parallel/index.html" - bug-reports: "https://github.com/janestreet/rpc_parallel/issues" - depends: [ - "ocaml" {>= "4.08.0"} - "async" {>= "v0.13" & < "v0.15"} - "core" {>= "v0.13" & < "v0.15"} - "core_kernel" {>= "v0.13" & < "v0.15"} - "ppx_jane" {>= "v0.13" & < "v0.15"} - "sexplib" {>= "v0.13" & < "v0.15"} - "dune" {>= "2.0.0"} - "ctypes" - ] - build: ["dune" "build" "-p" name "-j" jobs] - dev-repo: "git+https://github.com/janestreet/rpc_parallel.git" - url { - src: - "https://github.com/MinaProtocol/rpc_parallel/archive/39d6eec98705d5cc1f3ed8479ef19b1a1e0ee70e.tar.gz" - checksum: - "sha256=2b6c758433c5fd12b4971380147be96f0ce5d239932fc7f6df1d84f306bcbd2a" - } -} diff --git a/scripts/archive/missing-blocks-guardian.sh b/scripts/archive/missing-blocks-guardian.sh index 1b6604e8973..84b4dfaa465 100755 --- a/scripts/archive/missing-blocks-guardian.sh +++ b/scripts/archive/missing-blocks-guardian.sh @@ -26,6 +26,8 @@ usage() { echo "" echo " Optional:" echo " MISSING_BLOCKS_AUDITOR Path to the missing-blocks-auditor exe (default: mina-missing-blocks-auditor)" + echo " ARCHIVE_BLOCKS Path to the archive blocks exe (default: mina-archive-blocks)" + echo " BLOCKS_FORMAT Block format type. Possible values: [precomputed/extensional] (default: precomputed)" echo " TIMEOUT Time to sleep in seconds when in daemon mode. After recovery it will sleep six times more (default: 600)" echo "" echo "Example:" @@ -77,7 +79,17 @@ check_env_vars() { echo -e "[INFO] The MISSING_BLOCKS_AUDITOR environment variable is not set or is empty. Defaulting to \033[31mmina-missing-block-auditor\e[m." MISSING_BLOCKS_AUDITOR=mina-missing-blocks-auditor fi + + if [ -z "$BLOCKS_FORMAT" ]; then + echo -e "[INFO] The BLOCKS_FORMAT environment variable is not set or is empty. Defaulting to \033[31mprecomputed\e[m." + BLOCKS_FORMAT=precomputed + fi + if [ -z "$ARCHIVE_BLOCKS" ]; then + echo -e "[INFO] The ARCHIVE_BLOCKS environment variable is not set or is empty. Defaulting to \033[31mmina-archive-blocks\e[m." + ARCHIVE_BLOCKS=mina-archive-blocks + fi + if [ -z "$TIMEOUT" ]; then echo -e "[INFO] The TIMEOUT environment variable is not set or is empty. Defaulting to \033[31m600\e[m." TIMEOUT=600 @@ -95,7 +107,9 @@ jq_parent_hash() { populate_db() { tempfile=$(mktemp) - mina-archive-blocks --precomputed --archive-uri "${1}" "${2}" > tempfile + echo "${ARCHIVE_BLOCKS} --${BLOCKS_FORMAT} --archive-uri ${1} ${2}" + ${ARCHIVE_BLOCKS} "--${BLOCKS_FORMAT}" --archive-uri "${1}" "${2}" > tempfile + if [ $? -ne 0 ]; then echo $'[ERROR] mina-archive-blocks failed. The database remains unhealthy.\n Make sure the environment variables are set correctly and the database is accessible.' rm "${2}" tempfile @@ -230,4 +244,4 @@ main() { esac } -main "$@" +main "$@" \ No newline at end of file diff --git a/scripts/create_hardfork_deb.sh b/scripts/create_hardfork_deb.sh index b248f64eeaf..a66cc9101a2 100755 --- a/scripts/create_hardfork_deb.sh +++ b/scripts/create_hardfork_deb.sh @@ -50,8 +50,6 @@ done # Overwrite outdated ledgers that are being updated by the hardfork (backing up the outdated ledgers) mv "${BUILDDIR}/var/lib/coda/${NETWORK_NAME}.json" "${BUILDDIR}/var/lib/coda/${NETWORK_NAME}.old.json" cp "${RUNTIME_CONFIG_JSON}" "${BUILDDIR}/var/lib/coda/${NETWORK_NAME}.json" -mv "${BUILDDIR}/etc/mina/rosetta/genesis_ledgers/${NETWORK_NAME}.json" "${BUILDDIR}/etc/mina/rosetta/genesis_ledgers/${NETWORK_NAME}.old.json" -cp "${RUNTIME_CONFIG_JSON}" "${BUILDDIR}/etc/mina/rosetta/genesis_ledgers/${NETWORK_NAME}.json" build_deb "${NETWORK_TAG}" build_logproc_deb diff --git a/scripts/debian/aptly.sh b/scripts/debian/aptly.sh index f2e16dbed75..8eae74c3544 100755 --- a/scripts/debian/aptly.sh +++ b/scripts/debian/aptly.sh @@ -16,6 +16,8 @@ declare CLI_VERSION='1.0.0'; declare CLI_NAME='aptly.sh'; declare PS4='debug($LINENO) ${FUNCNAME[0]:+${FUNCNAME[0]}}(): '; +PORT=8080 + # functions function check_required() { @@ -33,6 +35,7 @@ function start_aptly() { local __clean=$4 local __component=$5 local __repo="$__distribution-$__component" + local __port=$6 if [ $__clean = 1 ]; then rm -rf ~/.aptly @@ -47,9 +50,9 @@ function start_aptly() { aptly publish snapshot -distribution=$__distribution -skip-signing $__component if [ $__background = 1 ]; then - aptly serve -listen localhost:8080 & + aptly serve -listen localhost:$__port & else - aptly serve -listen localhost:8080 + aptly serve -listen localhost:$__port fi @@ -70,6 +73,7 @@ function start_help(){ echo " -d, --debians The Debian(s) to be available in aptly. Supports regular expression" echo " -m, --component The Component for debian repository. For example: unstable" echo " -l, --clean Removes existing aptly installation" + echo " -p, --port Server port. default=8080" echo "" echo "Example: $0 start --background --codename focal --debs *.deb --component unstable " echo "" @@ -86,6 +90,7 @@ function start(){ local __background=0 local __clean=0 local __component="unstable" + local __port=$PORT while [ ${#} -gt 0 ]; do @@ -102,6 +107,10 @@ function start(){ __distribution=${2:?$error_message} shift 2; ;; + -p | --port ) + __port=${2:?$error_message} + shift 2; + ;; -d | --debians ) __debs=${2:?$error_message} shift 2; @@ -126,7 +135,9 @@ function start(){ $__debs \ $__background \ $__clean \ - $__component + $__component \ + $__port + } diff --git a/scripts/debian/build.sh b/scripts/debian/build.sh new file mode 100755 index 00000000000..c3e55f3e49d --- /dev/null +++ b/scripts/debian/build.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# Script collects binaries and keys and builds deb archives. + +set -eox pipefail + +SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" +source ${SCRIPTPATH}/../export-git-env-vars.sh + +echo "after export" + +source ${SCRIPTPATH}/builder-helpers.sh + +if [ $# -eq 0 ] + then + echo "No arguments supplied. Building all known debian packages" + build_logproc_deb + build_keypair_deb + build_archive_deb + build_batch_txn_deb + build_daemon_berkeley_deb + build_daemon_mainnet_deb + build_daemon_devnet_deb + build_test_executive_deb + build_functional_test_suite_deb + build_zkapp_test_transaction_deb + + else + for i in "$@"; do + if [[ $(type -t "build_${i}_deb") == function ]] + then + echo "Building $i debian package" + "build_${i}_deb" + else + echo "invalid debian package name '$i'" + exit 1 + fi + done +fi \ No newline at end of file diff --git a/scripts/deb-builder-helpers.sh b/scripts/debian/builder-helpers.sh similarity index 88% rename from scripts/deb-builder-helpers.sh rename to scripts/debian/builder-helpers.sh index d07d358c823..0e34178731d 100755 --- a/scripts/deb-builder-helpers.sh +++ b/scripts/debian/builder-helpers.sh @@ -1,27 +1,23 @@ #!/bin/bash +set -euox pipefail + + + +BUILD_URL=${BUILD_URL:-"local build from '$(hostname)' host"} +MINA_DEB_CODENAME=${MINA_DEB_CODENAME:-"bullseye"} +MINA_DEB_VERSION=${MINA_DEB_VERSION:-"0.0.0-experimental"} +MINA_DEB_RELEASE=${MINA_DEB_RELEASE:-"unstable"} # Helper script to include when building deb archives. echo "--- Setting up the envrionment to build debian packages..." -set -euo pipefail - SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" -cd "${SCRIPTPATH}/../_build" +cd "${SCRIPTPATH}/../../_build" GITHASH=$(git rev-parse --short=7 HEAD) GITHASH_CONFIG=$(git rev-parse --short=8 --verify HEAD) -set +u -BUILD_NUM=${BUILDKITE_BUILD_NUM} -BUILD_URL=${BUILDKITE_BUILD_URL} -set -u - -# Load in env vars for githash/branch/etc. -source "${SCRIPTPATH}/../buildkite/scripts/export-git-env-vars.sh" - -cd "${SCRIPTPATH}/../_build" - # Set dependencies based on debian release SHARED_DEPS="libssl1.1, libgmp10, libgomp1, tzdata, rocksdb-tools" @@ -38,10 +34,6 @@ case "${MINA_DEB_CODENAME}" in DAEMON_DEPS=", libffi7, libjemalloc2, libpq-dev, libprocps8, mina-logproc" ARCHIVE_DEPS="libssl1.1, libgomp1, libpq-dev, libjemalloc2" ;; - buster) - DAEMON_DEPS=", libffi6, libjemalloc2, libpq-dev, libprocps7, mina-logproc" - ARCHIVE_DEPS="libssl1.1, libgomp1, libpq-dev, libjemalloc2" - ;; stretch|bionic) DAEMON_DEPS=", libffi6, libjemalloc1, libpq-dev, libprocps6, mina-logproc" ARCHIVE_DEPS="libssl1.1, libgomp1, libpq-dev, libjemalloc1" @@ -66,7 +58,7 @@ case "${DUNE_PROFILE}" in esac -#ADd suffix to debian to distinguish instrumented packages +#Add suffix to debian to distinguish instrumented packages if [[ -v DUNE_INSTRUMENT_WITH ]]; then INSTRUMENTED_SUFFIX=instrumented MINA_DEB_NAME="${MINA_DEB_NAME}-${INSTRUMENTED_SUFFIX}" @@ -151,33 +143,12 @@ copy_common_daemon_configs() { # Copy shared binaries cp ../src/app/libp2p_helper/result/bin/libp2p_helper "${BUILDDIR}/usr/local/bin/coda-libp2p_helper" - # cp ./default/src/app/logproc/logproc.exe "${BUILDDIR}/usr/local/bin/mina-logproc" cp ./default/src/app/runtime_genesis_ledger/runtime_genesis_ledger.exe "${BUILDDIR}/usr/local/bin/mina-create-genesis" cp ./default/src/app/generate_keypair/generate_keypair.exe "${BUILDDIR}/usr/local/bin/mina-generate-keypair" cp ./default/src/app/validate_keypair/validate_keypair.exe "${BUILDDIR}/usr/local/bin/mina-validate-keypair" # Copy signature-based Binaries (based on signature type $2 passed into the function) cp ./default/src/app/cli/src/mina_${2}_signatures.exe "${BUILDDIR}/usr/local/bin/mina" - - # Copy rosetta-based Binaries - cp ./default/src/app/rosetta/rosetta_${2}_signatures.exe "${BUILDDIR}/usr/local/bin/mina-rosetta" - cp ./default/src/app/rosetta/ocaml-signer/signer_${2}_signatures.exe "${BUILDDIR}/usr/local/bin/mina-ocaml-signer" - - mkdir -p "${BUILDDIR}/etc/mina/rosetta" - mkdir -p "${BUILDDIR}/etc/mina/rosetta/rosetta-cli-config" - mkdir -p "${BUILDDIR}/etc/mina/rosetta/archive" - mkdir -p "${BUILDDIR}/etc/mina/rosetta/genesis_ledgers" - mkdir -p "${BUILDDIR}/etc/mina/rosetta/scripts" - - # --- Copy artifacts - cp ../src/app/rosetta/scripts/* "${BUILDDIR}/etc/mina/rosetta/scripts" - cp ../scripts/archive/missing-blocks-guardian.sh "${BUILDDIR}/etc/mina/rosetta/scripts" - - cp ../src/app/rosetta/rosetta-cli-config/*.json "${BUILDDIR}/etc/mina/rosetta/rosetta-cli-config" - cp ../src/app/rosetta/rosetta-cli-config/*.ros "${BUILDDIR}/etc/mina/rosetta/rosetta-cli-config" - cp ./default/src/app/rosetta/indexer_test/indexer_test.exe "${BUILDDIR}/usr/local/bin/mina-rosetta-indexer-test" - cp ../src/app/archive/*.sql "${BUILDDIR}/etc/mina/rosetta/archive" - cp -r ../genesis_ledgers/* ${BUILDDIR}/etc/mina/rosetta/genesis_ledgers/ # Copy over Build Configs (based on $2) mkdir -p "${BUILDDIR}/etc/coda/build_config" @@ -276,6 +247,64 @@ build_functional_test_suite_deb() { } ##################################### END TEST SUITE PACKAGE ####################################### +function copy_common_rosetta_configs () { + + # Copy rosetta-based Binaries + cp ./default/src/app/rosetta/rosetta_${1}_signatures.exe "${BUILDDIR}/usr/local/bin/mina-rosetta" + cp ./default/src/app/rosetta/ocaml-signer/signer_${1}_signatures.exe "${BUILDDIR}/usr/local/bin/mina-ocaml-signer" + + mkdir -p "${BUILDDIR}/etc/mina/rosetta" + mkdir -p "${BUILDDIR}/etc/mina/rosetta/rosetta-cli-config" + mkdir -p "${BUILDDIR}/etc/mina/rosetta/scripts" + + # --- Copy artifacts + cp ../src/app/rosetta/scripts/* "${BUILDDIR}/etc/mina/rosetta/scripts" + cp ../src/app/rosetta/rosetta-cli-config/*.json "${BUILDDIR}/etc/mina/rosetta/rosetta-cli-config" + cp ../src/app/rosetta/rosetta-cli-config/*.ros "${BUILDDIR}/etc/mina/rosetta/rosetta-cli-config" + cp ./default/src/app/rosetta/indexer_test/indexer_test.exe "${BUILDDIR}/usr/local/bin/mina-rosetta-indexer-test" + +} + +##################################### ROSETTA MAINNET PACKAGE ####################################### +build_rosetta_mainnet_deb() { + + echo "------------------------------------------------------------" + echo "--- Building mainnet rosetta deb" + + create_control_file mina-rosetta-mainnet "${SHARED_DEPS}" 'Mina Protocol Rosetta Client' "${SUGGESTED_DEPS}" + + copy_common_rosetta_configs "mainnet" + + build_deb mina-rosetta-mainnet +} + +##################################### ROSETTA MAINNET PACKAGE ####################################### +build_rosetta_devnet_deb() { + + echo "------------------------------------------------------------" + echo "--- Building devnet rosetta deb" + + create_control_file mina-rosetta-devnet "${SHARED_DEPS}" 'Mina Protocol Rosetta Client' "${SUGGESTED_DEPS}" + + copy_common_rosetta_configs "testnet" + + build_deb mina-rosetta-devnet +} + +##################################### ROSETTA BERKELEY PACKAGE ####################################### +build_rosetta_berkeley_deb() { + + echo "------------------------------------------------------------" + echo "--- Building rosetta berkeley deb" + + create_control_file mina-rosetta-berkeley "${SHARED_DEPS}" 'Mina Protocol Rosetta Client' "${SUGGESTED_DEPS}" + + copy_common_rosetta_configs "testnet" + + build_deb mina-rosetta-berkeley +} + + ##################################### MAINNET PACKAGE ####################################### build_daemon_mainnet_deb() { diff --git a/scripts/clear-deb-s3-lockfile.sh b/scripts/debian/clear-s3-lockfile.sh similarity index 100% rename from scripts/clear-deb-s3-lockfile.sh rename to scripts/debian/clear-s3-lockfile.sh diff --git a/scripts/publish-deb.sh b/scripts/debian/publish.sh similarity index 87% rename from scripts/publish-deb.sh rename to scripts/debian/publish.sh index b00a094817d..f20d9b53d33 100755 --- a/scripts/publish-deb.sh +++ b/scripts/debian/publish.sh @@ -18,14 +18,13 @@ function usage() { if [[ -n "$1" ]]; then echo -e "${RED}☞ $1${CLEAR}\n"; fi - echo "Usage: $0 [-n name] [-r release] [-v version] [-c codename]" - echo " -n, --name The Debian archive name" - echo " --names The Debians archive names" + echo "Usage: $0 -n names -r release -v version -c codename" + echo " -n, --names The Debians archive names" echo " -r, --release The Debian release" echo " -v, --version The Debian version" echo " -c, --codename The Debian codename" echo "" - echo "Example: $0 --name mina-archive_2.0.0berkeley-rc1-berkeley-48efea4 --release unstable --version 2.0.0berkeley-rc1-berkeley-48efea4 --codename bullseye " + echo "Example: $0 --name mina-archive --release unstable --version 2.0.0berkeley-rc1-berkeley-48efea4 --codename bullseye " exit 1 } @@ -45,6 +44,7 @@ S3_REGION_ARG='--s3-region=us-west-2' #>> Attempting to obtain a lock #/var/lib/gems/2.3.0/gems/deb-s3-0.10.0/lib/deb/s3/lock.rb:24:in `throw': uncaught throw #"Unable to obtain a lock after 60, giving up." DEBS3_UPLOAD="deb-s3 upload $BUCKET_ARG $S3_REGION_ARG \ + --fail-if-exists \ --lock \ --preserve-versions \ --cache-control=max-age=120" @@ -57,7 +57,7 @@ for i in {1..10}; do ( --component "${DEB_RELEASE}" \ --codename "${DEB_CODENAME}" \ "${DEB_NAMES}" -) && break || scripts/clear-deb-s3-lockfile.sh; done +) && break || scripts/debian/clear-s3-lockfile.sh; done # Verify integrity of debs on remote repo function verify_o1test_repo_has_package { diff --git a/scripts/reversion-deb.sh b/scripts/debian/reversion.sh similarity index 94% rename from scripts/reversion-deb.sh rename to scripts/debian/reversion.sh index 0c00ef1e265..0aa2c16faf3 100755 --- a/scripts/reversion-deb.sh +++ b/scripts/debian/reversion.sh @@ -60,4 +60,4 @@ function rebuild_deb() { rebuild_deb -source scripts/publish-deb.sh --names "${NEW_NAME}_${NEW_VERSION}.deb" --version ${NEW_VERSION} --codename ${CODENAME} --release ${NEW_RELEASE} +source scripts/debian/publish.sh --names "${NEW_NAME}_${NEW_VERSION}.deb" --version ${NEW_VERSION} --codename ${CODENAME} --release ${NEW_RELEASE} diff --git a/scripts/debian/verify.sh b/scripts/debian/verify.sh index 65fce185d12..c61d3636a7e 100755 --- a/scripts/debian/verify.sh +++ b/scripts/debian/verify.sh @@ -37,7 +37,6 @@ SCRIPT=' set -x \ ' case $CODENAME in - buster) DOCKER_IMAGE="debian:buster" ;; bullseye) DOCKER_IMAGE="debian:bullseye" ;; focal) DOCKER_IMAGE="ubuntu:focal" ;; *) echo "Unknown codename passed: $CODENAME"; exit 1;; diff --git a/scripts/docker/build.sh b/scripts/docker/build.sh new file mode 100755 index 00000000000..34f8f62a0eb --- /dev/null +++ b/scripts/docker/build.sh @@ -0,0 +1,174 @@ +#!/usr/bin/env bash + + +set -x +# Author's Note: Because the structure of this repo is inconsistent (Dockerfiles and build contexts placed willy-nilly) +# we have to trustlist and configure image builds individually because each one is going to be slightly different. +# This is needed as opposed to trusting the structure of the each project to be consistent for every deployable. + +CLEAR='\033[0m' +RED='\033[0;31m' + +SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" +source ${SCRIPTPATH}/helper.sh + +function usage() { + if [[ -n "$1" ]]; then + echo -e "${RED}☞ $1${CLEAR}\n"; + fi + echo "Usage: $0 [-s service-to-release] [-v service-version] [-n network]" + echo " -s, --service The Service being released to Dockerhub" + echo " -v, --version The version to be used in the docker image tag" + echo " -n, --network The network configuration to use (devnet or mainnet). Default=devnet" + echo " -b, --branch The branch of the mina repository to use for staged docker builds. Default=compatible" + echo " -r, --repo The currently used mina repository" + echo " --deb-codename The debian codename (stretch or buster) to build the docker image from. Default=stretch" + echo " --deb-release The debian package release channel to pull from (unstable,alpha,beta,stable). Default=unstable" + echo " --deb-version The version string for the debian package to install" + echo " --deb-profile The profile string for the debian package to install" + echo " --deb-build-flags The build-flags string for the debian package to install" + echo "" + echo "Example: $0 --service faucet --version v0.1.0" + echo "Valid Services: ${VALID_SERVICES[*]}" + exit 1 +} + +while [[ "$#" -gt 0 ]]; do case $1 in + -s|--service) SERVICE="$2"; shift;; + -v|--version) VERSION="$2"; shift;; + -n|--network) INPUT_NETWORK="$2"; shift;; + -b|--branch) INPUT_BRANCH="$2"; shift;; + -c|--cache-from) INPUT_CACHE="$2"; shift;; + -r|--repo) MINA_REPO="$2"; shift;; + --no-cache) NO_CACHE="--no-cache"; ;; + --deb-codename) INPUT_CODENAME="$2"; shift;; + --deb-release) INPUT_RELEASE="$2"; shift;; + --deb-version) INPUT_VERSION="$2"; shift;; + --deb-profile) DEB_PROFILE="$2"; shift;; + --deb-repo) INPUT_REPO="$2"; shift;; + --deb-build-flags) DEB_BUILD_FLAGS="$2"; shift;; + *) echo "Unknown parameter passed: $1"; exit 1;; +esac; shift; done + +# Verify Required Parameters are Present +if [[ -z "$SERVICE" ]]; then usage "Service is not set!"; fi; +if [[ -z "$VERSION" ]]; then usage "Version is not set!"; fi; + +NETWORK="--build-arg network=$INPUT_NETWORK" +if [[ -z "$INPUT_NETWORK" ]]; then + echo "Network is not set. Using the default (devnet)" + NETWORK="--build-arg network=devnet" +fi + +BRANCH="--build-arg MINA_BRANCH=$INPUT_BRANCH" +if [[ -z "$INPUT_BRANCH" ]]; then + echo "Branch is not set. Using the default (compatible)" + BRANCH="--build-arg MINA_BRANCH=compatible" +fi + +REPO="--build-arg MINA_REPO=${MINA_REPO}" +if [[ -z "${MINA_REPO}" ]]; then + echo "Repository is not set. Using the default (https://github.com/MinaProtocol/mina)" + REPO="--build-arg MINA_REPO=https://github.com/MinaProtocol/mina" +fi + +DEB_CODENAME="--build-arg deb_codename=$INPUT_CODENAME" +if [[ -z "$INPUT_CODENAME" ]]; then + echo "Debian codename is not set. Using the default (bullseye)" + DEB_CODENAME="--build-arg deb_codename=bullseye" +fi + +DEB_RELEASE="--build-arg deb_release=$INPUT_RELEASE" +if [[ -z "$INPUT_RELEASE" ]]; then + echo "Debian release is not set. Using the default (unstable)" + DEB_RELEASE="--build-arg deb_release=unstable" +fi + +DEB_VERSION="--build-arg deb_version=$INPUT_VERSION" +if [[ -z "$INPUT_VERSION" ]]; then + echo "Debian version is not set. Using the default ($VERSION)" + DEB_VERSION="--build-arg deb_version=$VERSION" +fi + +if [[ -z "$DEB_PROFILE" ]]; then + echo "Debian profile is not set. Using the default (standard)" + DEB_PROFILE="standard" +fi + +if [[ -z "$DEB_BUILD_FLAGS" ]]; then + DEB_BUILD_FLAGS="" +fi + +CACHE="--cache-from $INPUT_CACHE" +if [[ -z "$INPUT_CACHE" ]]; then + CACHE="" +fi + +DEB_REPO="--build-arg deb_repo=$INPUT_REPO" +if [[ -z "$INPUT_REPO" ]]; then + echo "Debian repository is not set. Using the default (http://localhost:8080)" + DEB_REPO="--build-arg deb_repo=http://localhost:8080" +fi + +if [[ $(echo ${VALID_SERVICES[@]} | grep -o "$SERVICE" - | wc -w) -eq 0 ]]; then usage "Invalid service!"; fi + +case "${SERVICE}" in + mina-archive) + DOCKERFILE_PATH="dockerfiles/Dockerfile-mina-archive" + DOCKER_CONTEXT="dockerfiles/" + ;; + bot) + DOCKERFILE_PATH="frontend/bot/Dockerfile" + DOCKER_CONTEXT="frontend/bot" + ;; + mina-daemon) + DOCKERFILE_PATH="dockerfiles/Dockerfile-mina-daemon" + DOCKER_CONTEXT="dockerfiles/" + ;; + mina-toolchain) + DOCKERFILE_PATH="dockerfiles/stages/1-build-deps dockerfiles/stages/2-opam-deps dockerfiles/stages/3-toolchain" + ;; + mina-batch-txn) + DOCKERFILE_PATH="dockerfiles/Dockerfile-txn-burst" + DOCKER_CONTEXT="dockerfiles/" + ;; + mina-rosetta) + DOCKERFILE_PATH="dockerfiles/Dockerfile-mina-rosetta" + ;; + mina-zkapp-test-transaction) + DOCKERFILE_PATH="dockerfiles/Dockerfile-zkapp-test-transaction" + ;; + leaderboard) + DOCKERFILE_PATH="frontend/leaderboard/Dockerfile" + DOCKER_CONTEXT="frontend/leaderboard" + ;; + delegation-backend) + DOCKERFILE_PATH="dockerfiles/Dockerfile-delegation-backend" + DOCKER_CONTEXT="src/app/delegation_backend" + ;; + delegation-backend-toolchain) + DOCKERFILE_PATH="dockerfiles/Dockerfile-delegation-backend-toolchain" + DOCKER_CONTEXT="src/app/delegation_backend" + ;; + itn-orchestrator) + DOCKERFILE_PATH="dockerfiles/Dockerfile-itn-orchestrator" + DOCKER_CONTEXT="src/app/itn_orchestrator" + ;; + mina-test-suite) + DOCKERFILE_PATH="dockerfiles/Dockerfile-mina-test-suite" + DOCKER_CONTEXT="dockerfiles/" + ;; +esac + +export_version +export_base_image +export_docker_tag + +BUILD_NETWORK="--network=host" + +# If DOCKER_CONTEXT is not specified, assume none and just pipe the dockerfile into docker build +if [[ -z "${DOCKER_CONTEXT}" ]]; then + cat $DOCKERFILE_PATH | docker build $NO_CACHE $BUILD_NETWORK $CACHE $NETWORK $IMAGE $DEB_CODENAME $DEB_RELEASE $DEB_VERSION $DOCKER_DEB_SUFFIX $DEB_REPO $BRANCH $REPO -t "$TAG" - +else + docker build $NO_CACHE $BUILD_NETWORK $CACHE $NETWORK $IMAGE $DEB_CODENAME $DEB_RELEASE $DEB_VERSION $DOCKER_DEB_SUFFIX $DEB_REPO $BRANCH $REPO "$DOCKER_CONTEXT" -t "$TAG" -f $DOCKERFILE_PATH +fi diff --git a/scripts/docker/helper.sh b/scripts/docker/helper.sh new file mode 100644 index 00000000000..07cf02af46a --- /dev/null +++ b/scripts/docker/helper.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +# Array of valid service names +export VALID_SERVICES=('mina-archive' 'mina-daemon' 'mina-rosetta' 'mina-test-suite' 'mina-batch-txn' 'mina-zkapp-test-transaction' 'mina-toolchain' 'bot' 'leaderboard' 'delegation-backend' 'delegation-backend-toolchain' 'itn-orchestrator') + +function export_base_image () { + # Determine the proper image for ubuntu or debian + case "${DEB_CODENAME##*=}" in + bionic|focal|impish|jammy) + IMAGE="ubuntu:${DEB_CODENAME##*=}" + ;; + stretch|buster|bullseye|bookworm|sid) + IMAGE="debian:${DEB_CODENAME##*=}-slim" + ;; + esac + export IMAGE="--build-arg image=${IMAGE}" +} + +function export_version () { + case "${SERVICE}" in + mina-daemon|mina-batch-txn|mina-rosetta) export VERSION="${VERSION}-${NETWORK##*=}" ;; + *) ;; +esac +} + +function export_suffixes () { + # Determine suffix for mina name. Suffix is combined from profile and service name + # Possible outcomes: + # - instrumented + # - hardfork + # - lightnet + # - hardfork-instrumented + case "${DEB_PROFILE}" in + standard) + case "${DEB_BUILD_FLAGS}" in + *instrumented) + export DOCKER_DEB_SUFFIX="--build-arg deb_suffix=instrumented" + export BUILD_FLAG_SUFFIX="-instrumented" + ;; + *) + export DOCKER_DEB_SUFFIX="" + export BUILD_FLAG_SUFFIX="" + ;; + esac + ;; + *) + case "${DEB_BUILD_FLAGS}" in + *instrumented) + export DOCKER_DEB_SUFFIX="--build-arg deb_suffix=${DEB_PROFILE}-instrumented" + export BUILD_FLAG_SUFFIX="-instrumented" + ;; + *) + export DOCKER_DEB_SUFFIX="--build-arg deb_suffix=${DEB_PROFILE}" + export BUILD_FLAG_SUFFIX="" + ;; + esac + ;; + esac +} + + +function export_docker_tag() { + export_suffixes + + export DOCKER_REGISTRY="gcr.io/o1labs-192920" + export TAG="${DOCKER_REGISTRY}/${SERVICE}:${VERSION}${BUILD_FLAG_SUFFIX}" + # friendly, predictable tag + export GITHASH=$(git rev-parse --short=7 HEAD) + export HASHTAG="${DOCKER_REGISTRY}/${SERVICE}:${GITHASH}-${DEB_CODENAME##*=}-${NETWORK##*=}${BUILD_FLAG_SUFFIX}" + +} diff --git a/scripts/docker/release.sh b/scripts/docker/release.sh new file mode 100755 index 00000000000..d198725efaf --- /dev/null +++ b/scripts/docker/release.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +# Author's Note: Because the structure of this repo is inconsistent (Dockerfiles and build contexts placed willy-nilly) +# we have to trustlist and configure image builds individually because each one is going to be slightly different. +# This is needed as opposed to trusting the structure of the each project to be consistent for every deployable. + +set -eo pipefail + +CLEAR='\033[0m' +RED='\033[0;31m' + +SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" +source ${SCRIPTPATH}/helper.sh + +function usage() { + if [[ -n "$1" ]]; then + echo -e "${RED}☞ $1${CLEAR}\n"; + fi + echo "Usage: $0 [-s service-to-release] [-v service-version] [-n network]" + echo " -s, --service The Service being released to Dockerhub" + echo " -v, --version The version to be used in the docker image tag" + echo " -n, --network The network configuration to use (devnet or mainnet). Default=devnet" + echo " -b, --branch The branch of the mina repository to use for staged docker builds. Default=compatible" + echo " -r, --repo The currently used mina repository" + echo " --deb-codename The debian codename (stretch or buster) to build the docker image from. Default=stretch" + echo " --deb-release The debian package release channel to pull from (unstable,alpha,beta,stable). Default=unstable" + echo " --deb-version The version string for the debian package to install" + echo " --deb-profile The profile string for the debian package to install" + echo " --deb-build-flags The build-flags string for the debian package to install" + echo "" + echo "Example: $0 --service faucet --version v0.1.0" + echo "Valid Services: ${VALID_SERVICES[*]}" + exit 1 +} + +while [[ "$#" -gt 0 ]]; do case $1 in + -s|--service) SERVICE="$2"; shift;; + -v|--version) VERSION="$2"; shift;; + -n|--network) NETWORK="--build-arg network=$2"; shift;; + --deb-codename) DEB_CODENAME="--build-arg deb_codename=$2"; shift;; + --deb-version) DEB_VERSION="--build-arg deb_version=$2"; shift;; + --deb-profile) DEB_PROFILE="$2"; shift;; + --deb-build-flags) DEB_BUILD_FLAGS="$2"; shift;; + --help) usage; exit 0;; + *) echo "Unknown parameter passed: $1"; exit 1;; +esac; shift; done + +export_version +export_base_image +export_docker_tag + +echo tag ${TAG} +echo hash ${HASHTAG} + +# push to GCR +docker push "${TAG}" + +# retag and push again to GCR +docker tag "${TAG}" "${HASHTAG}" +docker push "${HASHTAG}" + diff --git a/scripts/export-git-env-vars.sh b/scripts/export-git-env-vars.sh new file mode 100755 index 00000000000..c1d08262488 --- /dev/null +++ b/scripts/export-git-env-vars.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -euo pipefail + +set -x + +echo "Exporting Git Variables: " + +git fetch + +function find_most_recent_numeric_tag() { + # We use the --prune flag because we've had problems with buildkite agents getting conflicting results here + git fetch --tags --prune --prune-tags --force + TAG=$(git describe --always --abbrev=0 $1 | sed 's!/!-!g; s!_!-!g; s!#!-!g') + if [[ $TAG != [0-9]* ]]; then + TAG=$(find_most_recent_numeric_tag $TAG~) + fi + echo $TAG +} + +export GITHASH=$(git rev-parse --short=7 HEAD) +export THIS_COMMIT_TAG=$(git tag --points-at HEAD) +export GITBRANCH=$(git name-rev --name-only $GITHASH | sed "s/remotes\/origin\///g" | sed 's!/!-!g; s!_!-!g; s!#!-!g' ) + +export GITTAG=$(find_most_recent_numeric_tag HEAD) + +export MINA_DEB_VERSION="${GITTAG}-${GITBRANCH}-${GITHASH}" +export MINA_DOCKER_TAG="$(echo "${MINA_DEB_VERSION}-${MINA_DEB_CODENAME}" | sed 's!/!-!g; s!_!-!g')" + +[[ -n ${THIS_COMMIT_TAG} ]] && export MINA_COMMIT_TAG="${THIS_COMMIT_TAG}" + +echo "after commit tag" \ No newline at end of file diff --git a/scripts/mina-verify-packaged-fork-config b/scripts/mina-verify-packaged-fork-config index b19eaf560b0..846a03eb0e7 100755 --- a/scripts/mina-verify-packaged-fork-config +++ b/scripts/mina-verify-packaged-fork-config @@ -212,7 +212,7 @@ for file in "$workdir"/ledgers/*.tar.gz; do mkdir -p "$tardir"/{packaged,generated,web} tar -xzf "$file" -C "$tardir/generated" tar -xzf "$GENESIS_LEDGER_DIR/$tarname.tar.gz" -C "$tardir/packaged" - curl "https://s3-us-west-2.amazonaws.com/snark-keys.o1test.net/$tarname.tar.gz" | tar -xz -C "$tardir/web" + curl "https://s3-us-west-2.amazonaws.com/snark-keys-ro.o1test.net/$tarname.tar.gz" | tar -xz -C "$tardir/web" $ldb_cmd --hex --db="$tardir/packaged" scan > "$workdir/packaged.scan" $ldb_cmd --hex --db="$tardir/web" scan > "$workdir/web.scan" diff --git a/scripts/pin-external-packages.sh b/scripts/pin-external-packages.sh index 84e615b5271..263dfeb976e 100755 --- a/scripts/pin-external-packages.sh +++ b/scripts/pin-external-packages.sh @@ -1,12 +1,4 @@ #!/bin/sh -# update and pin packages, used by CI - -PACKAGES="ocaml-sodium coda_base58" - +# update packages used by CI git submodule sync && git submodule update --init --recursive - -for pkg in $PACKAGES; do - echo "Pinning package" $pkg - opam pin -y add src/external/$pkg -done diff --git a/scripts/publish-pvkeys.sh b/scripts/publish-pvkeys.sh index 1df281dd282..8ed648f34ca 100755 --- a/scripts/publish-pvkeys.sh +++ b/scripts/publish-pvkeys.sh @@ -12,7 +12,7 @@ else genfiles=("${KEYDIR}"*) if [ ${#genfiles[@]} -gt 0 ]; then ls -l ${KEYDIR} - aws s3 sync --acl public-read ${KEYDIR} s3://snark-keys.o1test.net/ + aws s3 sync --acl public-read ${KEYDIR} s3://snark-keys-ro.o1test.net/ else echo "No build time generated keys found." fi diff --git a/scripts/rebuild-deb.sh b/scripts/rebuild-deb.sh deleted file mode 100755 index e90f125f967..00000000000 --- a/scripts/rebuild-deb.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash - -# Script collects binaries and keys and builds deb archives. - -set -eo pipefail - -source scripts/deb-builder-helpers.sh - -# always build log proc since it is often an dependency -# TODO: remove logproc as external dependency -build_logproc_deb - -if [ $# -eq 0 ] - then - echo "No arguments supplied. Building all known debian packages" - build_keypair_deb - build_archive_deb - build_batch_txn_deb - build_daemon_berkeley_deb - build_mainnet_daemon_deb - build_devnet_daemon_deb - build_test_executive_deb - build_functional_test_suite_deb - build_zkapp_test_transaction_deb - - else - for i in "$@"; do - if [[ $(type -t "build_${i}_deb") == function ]] - then - echo "Building $i debian package" - "build_${i}_deb" - else - echo "invalid debian package name '$i'" - exit 1 - fi - done -fi - -# TODO: Find a way to package keys properly without blocking/locking in CI -# TODO: Keys should be their own package, which this 'non-noprovingkeys' deb depends on -# For now, deleting keys in /tmp/ so that the complicated logic below for moving them short-circuits and both packages are built without keys -rm -rf /tmp/s3_cache_dir /tmp/coda_cache_dir - -# Keys -# Identify actual keys used in build -# NOTE: Moving the keys from /tmp because of storage constraints. This is OK -# because building deb is the last step and therefore keys, genesis ledger, and -# proof are not required in /tmp -echo "Checking PV keys" -mkdir -p "${BUILDDIR}/var/lib/coda" -compile_keys=("step" "vk-step" "wrap" "vk-wrap") -for key in ${compile_keys[*]} -do - echo -n "Looking for keys matching: ${key} -- " - - # Awkward, you can't do a filetest on a wildcard - use loops - for f in /tmp/s3_cache_dir/${key}*; do - if [ -e "$f" ]; then - echo " [OK] found key in s3 key set" - mv /tmp/s3_cache_dir/${key}* "${BUILDDIR}/var/lib/coda/." - break - fi - done - - for f in /var/lib/coda/${key}*; do - if [ -e "$f" ]; then - echo " [OK] found key in stable key set" - mv /var/lib/coda/${key}* "${BUILDDIR}/var/lib/coda/." - break - fi - done - - for f in /tmp/coda_cache_dir/${key}*; do - if [ -e "$f" ]; then - echo " [WARN] found key in compile-time set" - mv /tmp/coda_cache_dir/${key}* "${BUILDDIR}/var/lib/coda/." - break - fi - done -done - -# Build mina block producer sidecar -if ${MINA_BUILD_MAINNET} # only builds on mainnet-like branches -then - ../automation/services/mina-bp-stats/sidecar/build.sh # only builds on mainnet-like branches - rm -rf "${BUILDDIR}" -fi - -if ${MINA_BUILD_MAINNET} # only builds on mainnet-like branches -then - echo "---- Built all packages including mainnet, devnet, and the sidecar" -else - echo "---- Not a mainnet-like branch, only built berkeley and beyond packages" -fi - -ls -lh mina*.deb diff --git a/scripts/release-docker.sh b/scripts/release-docker.sh index f6ca90d1fb2..70c0cb63409 100755 --- a/scripts/release-docker.sh +++ b/scripts/release-docker.sh @@ -10,7 +10,8 @@ set -x CLEAR='\033[0m' RED='\033[0;31m' # Array of valid service names -VALID_SERVICES=('mina-archive' 'mina-daemon' 'mina-rosetta' 'mina-test-suite' 'mina-test-executive' 'mina-batch-txn' 'mina-zkapp-test-transaction' 'mina-toolchain' 'bot' 'leaderboard' 'delegation-backend' 'delegation-backend-toolchain' 'itn-orchestrator') + +VALID_SERVICES=('mina-archive' 'mina-daemon' 'mina-rosetta' 'mina-test-suite' 'mina-batch-txn' 'mina-zkapp-test-transaction' 'mina-toolchain' 'bot' 'leaderboard' 'itn-orchestrator') function usage() { if [[ -n "$1" ]]; then @@ -22,7 +23,7 @@ function usage() { echo " -n, --network The network configuration to use (devnet or mainnet). Default=devnet" echo " -b, --branch The branch of the mina repository to use for staged docker builds. Default=compatible" echo " -r, --repo The currently used mina repository" - echo " --deb-codename The debian codename (stretch or buster) to build the docker image from. Default=stretch" + echo " --deb-codename The debian codename (bullseye or focal) to build the docker image from. Default=stretch" echo " --deb-release The debian package release channel to pull from (unstable,alpha,beta,stable). Default=unstable" echo " --deb-version The version string for the debian package to install" echo " --deb-profile The profile string for the debian package to install" @@ -56,7 +57,7 @@ case "${DEB_CODENAME##*=}" in bionic|focal|impish|jammy) IMAGE="ubuntu:${DEB_CODENAME##*=}" ;; - stretch|buster|bullseye|bookworm|sid) + stretch|bullseye|bookworm|sid) IMAGE="debian:${DEB_CODENAME##*=}-slim" ;; esac @@ -84,9 +85,11 @@ IMAGE="--build-arg image=${IMAGE}" *instrumented) DOCKER_DEB_SUFFIX="--build-arg deb_suffix=${DEB_PROFILE}-instrumented" BUILD_FLAG_SUFFIX="-instrumented" + DEB_PROFILE_SUFFIX="-${DEB_PROFILE}" ;; *) DOCKER_DEB_SUFFIX="--build-arg deb_suffix=${DEB_PROFILE}" + DEB_PROFILE_SUFFIX="-${DEB_PROFILE}" ;; esac ;; @@ -121,11 +124,6 @@ mina-daemon) mina-toolchain) DOCKERFILE_PATH="dockerfiles/stages/1-build-deps dockerfiles/stages/2-opam-deps dockerfiles/stages/3-toolchain" ;; -mina-test-executive) - DOCKERFILE_PATH="dockerfiles/Dockerfile-mina-test-executive" - DOCKER_CONTEXT="dockerfiles/" - VERSION="${VERSION}-${NETWORK##*=}" - ;; mina-batch-txn) DOCKERFILE_PATH="dockerfiles/Dockerfile-txn-burst" DOCKER_CONTEXT="dockerfiles/" @@ -133,6 +131,7 @@ mina-batch-txn) ;; mina-rosetta) DOCKERFILE_PATH="dockerfiles/Dockerfile-mina-rosetta" + VERSION="${VERSION}-${NETWORK##*=}" ;; mina-zkapp-test-transaction) DOCKERFILE_PATH="dockerfiles/Dockerfile-zkapp-test-transaction" @@ -141,14 +140,6 @@ leaderboard) DOCKERFILE_PATH="frontend/leaderboard/Dockerfile" DOCKER_CONTEXT="frontend/leaderboard" ;; -delegation-backend) - DOCKERFILE_PATH="dockerfiles/Dockerfile-delegation-backend" - DOCKER_CONTEXT="src/app/delegation_backend" - ;; -delegation-backend-toolchain) - DOCKERFILE_PATH="dockerfiles/Dockerfile-delegation-backend-toolchain" - DOCKER_CONTEXT="src/app/delegation_backend" - ;; itn-orchestrator) DOCKERFILE_PATH="dockerfiles/Dockerfile-itn-orchestrator" DOCKER_CONTEXT="src/app/itn_orchestrator" @@ -166,10 +157,10 @@ if [[ -z "${MINA_REPO}" ]]; then fi DOCKER_REGISTRY="gcr.io/o1labs-192920" -TAG="${DOCKER_REGISTRY}/${SERVICE}:${VERSION}${BUILD_FLAG_SUFFIX}" +TAG="${DOCKER_REGISTRY}/${SERVICE}:${VERSION}${DEB_PROFILE_SUFFIX}${BUILD_FLAG_SUFFIX}" # friendly, predictable tag GITHASH=$(git rev-parse --short=7 HEAD) -HASHTAG="${DOCKER_REGISTRY}/${SERVICE}:${GITHASH}-${DEB_CODENAME##*=}-${NETWORK##*=}${BUILD_FLAG_SUFFIX}" +HASHTAG="${DOCKER_REGISTRY}/${SERVICE}:${GITHASH}-${DEB_CODENAME##*=}-${NETWORK##*=}${DEB_PROFILE_SUFFIX}${BUILD_FLAG_SUFFIX}" BUILD_NETWORK="--network=host" # If DOCKER_CONTEXT is not specified, assume none and just pipe the dockerfile into docker build @@ -184,9 +175,9 @@ if [[ -z "$NOUPLOAD" ]] || [[ "$NOUPLOAD" -eq 0 ]]; then # push to GCR docker push "${TAG}" - # retag and push again to GCR docker tag "${TAG}" "${HASHTAG}" docker push "${HASHTAG}" fi + diff --git a/scripts/update-opam-switch.sh b/scripts/update-opam-switch.sh new file mode 100755 index 00000000000..1f52de1db76 --- /dev/null +++ b/scripts/update-opam-switch.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -eo pipefail + +SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +cd "$SCRIPT_DIR/.." + +# Don't do anything if we're in a nix shell +[[ "$IN_NIX_SHELL$CI$BUILDKITE" == "" ]] || exit 0 + +sum="$(cksum opam.export | grep -oE '^\S*')" +switch_dir=opam_switches/"$sum" +rm -Rf _opam +if [[ ! -d "$switch_dir" ]]; then + # We add o1-labs opam repository and make it default (if it's repeated, it's a no-op) + opam repository add --yes --all --set-default o1-labs https://github.com/o1-labs/opam-repository.git + opam update + opam switch import -y --switch . opam.export + mkdir -p opam_switches + mv _opam "$switch_dir" +fi +ln -s "$switch_dir" _opam diff --git a/scripts/upload-genesis.sh b/scripts/upload-genesis.sh index 2dcc51cf144..9a0fec46cf8 100755 --- a/scripts/upload-genesis.sh +++ b/scripts/upload-genesis.sh @@ -7,6 +7,6 @@ if [ -z "$AWS_ACCESS_KEY_ID" ]; then echo "WARNING: AWS_ACCESS_KEY_ID is missing, not uploading files for genesis" else if ls -l ${GENESIS_DIR}genesis_*; then - aws s3 sync --exclude "*" --include "genesis_*" --acl public-read ${GENESIS_DIR} s3://snark-keys.o1test.net/ + aws s3 sync --exclude "*" --include "genesis_*" --acl public-read ${GENESIS_DIR} s3://snark-keys-ro.o1test.net/ fi fi diff --git a/scripts/version-linter.py b/scripts/version-linter.py index b145b7ba653..0274a1f1c3f 100755 --- a/scripts/version-linter.py +++ b/scripts/version-linter.py @@ -24,6 +24,7 @@ import sys import re import sexpdata +import requests exit_code=0 @@ -33,7 +34,7 @@ def set_error(): def branch_commit(branch): print ('Retrieving', branch, 'head commit...') - result=subprocess.run(['git','log','-n','1','--format="%h"','--abbrev=7','--no-merges',f'{branch}'], + result=subprocess.run(['git','log','-n','1','--format="%h"','--abbrev=7',f'{branch}'], capture_output=True) output=result.stdout.decode('ascii') print ('command stdout:', output) @@ -43,7 +44,19 @@ def branch_commit(branch): def download_type_shapes(role,branch,sha1) : file=type_shape_file(sha1) print ('Downloading type shape file',file,'for',role,'branch',branch,'at commit',sha1) - result=subprocess.run(['wget','--no-clobber',f'https://storage.googleapis.com/mina-type-shapes/{file}']) + url = f'https://storage.googleapis.com/mina-type-shapes/{file}' + r = requests.head(url, allow_redirects=True) + if r.status_code != 200: + print ("cannot fetch file reference from non-existing path: ${url}") + print ("looks like you need to generate it. Please use below steps") + print (f"git checkout ${sha1}") + print ("nix develop mina") + print (f"dune exec src/app/cli/src/mina.exe internal dump-type-shape > ${sha1}-type_shape.txt") + print ("gsutil cp gs://mina-type-shapes ${sha1}-type_shape.txt ") + + sys.exit(1) + + result=subprocess.run(['wget','--no-clobber',url]) def type_shape_file(sha1) : # created by buildkite build-artifact script @@ -222,6 +235,10 @@ def check_type_shapes(pr_branch_dict,base_branch,base_type_dict,release_branch,r set_error() # not an error if the type was introduced in the base branch, and the type changed in PR branch +def assert_commit(commit, desc): + if not commit: + f"Empty commit detected when evaluating commit of {desc}" + if __name__ == "__main__": if len(sys.argv) != 4 : print("Usage: %s pr-branch base-branch release-branch" % sys.argv[0], file=sys.stderr) diff --git a/src/app/archive/cli/archive_cli.ml b/src/app/archive/cli/archive_cli.ml index 9d06c1e09ee..d9835087e91 100644 --- a/src/app/archive/cli/archive_cli.ml +++ b/src/app/archive/cli/archive_cli.ml @@ -45,11 +45,15 @@ let command_run = in fun () -> let logger = Logger.create () in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in Stdout_log.setup log_json log_level ; [%log info] "Starting archive process; built with commit $commit" ~metadata:[ ("commit", `String Mina_version.commit_id) ] ; Archive_lib.Processor.setup_server ~metrics_server_port ~logger - ~constraint_constants:Genesis_constants.Constraint_constants.compiled + ~genesis_constants ~constraint_constants ~postgres_address:postgres.value ~server_port: (Option.value server_port.value ~default:server_port.default) diff --git a/src/app/archive/lib/diff.ml b/src/app/archive/lib/diff.ml index d44fbb12712..22867c73404 100644 --- a/src/app/archive/lib/diff.ml +++ b/src/app/archive/lib/diff.ml @@ -74,7 +74,10 @@ module Builder = struct let block = With_hash.data block_with_hash in let state_hash = (With_hash.hash block_with_hash).state_hash in let start = Time.now () in - let account_ids_accessed = Mina_block.account_ids_accessed block in + let account_ids_accessed = + Mina_block.account_ids_accessed + ~constraint_constants:precomputed_values.constraint_constants block + in let accounts_accessed = List.filter_map account_ids_accessed ~f:(fun (acct_id, status) -> match status with diff --git a/src/app/archive/lib/dune b/src/app/archive/lib/dune index 05d5e165036..b24273b9de8 100644 --- a/src/app/archive/lib/dune +++ b/src/app/archive/lib/dune @@ -64,7 +64,6 @@ consensus genesis_constants genesis_ledger_helper.lib - mina_compile_config verifier quickcheck_lib snark_params diff --git a/src/app/archive/lib/processor.ml b/src/app/archive/lib/processor.ml index 861785421fb..db9a4af803a 100644 --- a/src/app/archive/lib/processor.ml +++ b/src/app/archive/lib/processor.ml @@ -4362,14 +4362,15 @@ module Block = struct (state_hash, height) (* update chain_status for blocks now known to be canonical or orphaned *) - let update_chain_status (module Conn : CONNECTION) ~block_id = + let update_chain_status (module Conn : CONNECTION) + ~(genesis_constants : Genesis_constants.t) ~block_id = let open Deferred.Result.Let_syntax in match%bind get_highest_canonical_block_opt (module Conn) () with | None -> (* unit tests, no canonical block, can't mark any block as canonical *) Deferred.Result.return () | Some (highest_canonical_block_id, greatest_canonical_height) -> - let k_int64 = Genesis_constants.k |> Int64.of_int in + let k_int64 = genesis_constants.protocol.k |> Int64.of_int in let%bind block = load (module Conn) ~id:block_id in if Int64.( > ) block.height @@ -4529,8 +4530,9 @@ let retry ~f ~logger ~error_str retries = in go retries -let add_block_aux ?(retries = 3) ~logger ~pool ~add_block ~hash - ~delete_older_than ~accounts_accessed ~accounts_created ~tokens_used block = +let add_block_aux ?(retries = 3) ~logger ~genesis_constants ~pool ~add_block + ~hash ~delete_older_than ~accounts_accessed ~accounts_created ~tokens_used + block = let state_hash = hash block in (* the block itself is added in a single transaction with a transaction block @@ -4575,7 +4577,9 @@ let add_block_aux ?(retries = 3) ~logger ~pool ~add_block ~hash (* update chain status for existing blocks *) let%bind () = Metrics.time ~label:"update_chain_status" (fun () -> - Block.update_chain_status (module Conn) ~block_id ) + Block.update_chain_status + (module Conn) + ~genesis_constants ~block_id ) in let%bind () = match delete_older_than with @@ -4696,8 +4700,8 @@ let add_block_aux_extensional ~logger ?retries ~pool ~delete_older_than block = ~tokens_used:block.Extensional.Block.tokens_used block (* receive blocks from a daemon, write them to the database *) -let run pool reader ~constraint_constants ~logger ~delete_older_than : - unit Deferred.t = +let run pool reader ~genesis_constants ~constraint_constants ~logger + ~delete_older_than : unit Deferred.t = Strict_pipe.Reader.iter reader ~f:(function | Diff.Transition_frontier (Breadcrumb_added @@ -4705,8 +4709,9 @@ let run pool reader ~constraint_constants ~logger ~delete_older_than : let add_block = Block.add_if_doesn't_exist ~constraint_constants in let hash = State_hash.With_state_hashes.state_hash in match%bind - add_block_aux ~logger ~pool ~delete_older_than ~hash ~add_block - ~accounts_accessed ~accounts_created ~tokens_used block + add_block_aux ~logger ~genesis_constants ~pool ~delete_older_than + ~hash ~add_block ~accounts_accessed ~accounts_created ~tokens_used + block with | Error e -> let state_hash = hash block in @@ -4724,16 +4729,17 @@ let run pool reader ~constraint_constants ~logger ~delete_older_than : (* [add_genesis_accounts] is called when starting the archive process *) let add_genesis_accounts ~logger ~(runtime_config_opt : Runtime_config.t option) - pool = + ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) pool = match runtime_config_opt with | None -> Deferred.unit | Some runtime_config -> ( - let proof_level = Genesis_constants.Proof_level.compiled in let%bind precomputed_values = match%map - Genesis_ledger_helper.init_from_config_file ~logger - ~proof_level:(Some proof_level) runtime_config + Genesis_ledger_helper.init_from_config_file ~logger ~proof_level:None + ~genesis_constants ~constraint_constants runtime_config + ~cli_proof_level:None with | Ok (precomputed_values, _) -> precomputed_values @@ -4741,9 +4747,6 @@ let add_genesis_accounts ~logger ~(runtime_config_opt : Runtime_config.t option) failwithf "Could not get precomputed values, error: %s" (Error.to_string_hum err) () in - let constraint_constants = - Genesis_constants.Constraint_constants.compiled - in let ledger = Precomputed_values.genesis_ledger precomputed_values |> Lazy.force in @@ -4844,7 +4847,7 @@ let add_genesis_accounts ~logger ~(runtime_config_opt : Runtime_config.t option) () ) let create_metrics_server ~logger ~metrics_server_port ~missing_blocks_width - pool = + ~block_window_duration_ms pool = match metrics_server_port with | None -> return () @@ -4856,9 +4859,7 @@ let create_metrics_server ~logger ~metrics_server_port ~missing_blocks_width let%bind metric_server = Mina_metrics.Archive.create_archive_server ~port ~logger () in - let interval = - Float.of_int (Mina_compile_config.block_window_duration_ms * 2) - in + let interval = Float.of_int (block_window_duration_ms * 2) in let rec go () = let%bind () = Metrics.update pool metric_server ~logger ~missing_blocks_width @@ -4869,9 +4870,10 @@ let create_metrics_server ~logger ~metrics_server_port ~missing_blocks_width go () (* for running the archive process *) -let setup_server ~metrics_server_port ~constraint_constants ~logger - ~postgres_address ~server_port ~delete_older_than ~runtime_config_opt - ~missing_blocks_width = +let setup_server ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) + ~metrics_server_port ~logger ~postgres_address ~server_port + ~delete_older_than ~runtime_config_opt ~missing_blocks_width = let where_to_listen = Async.Tcp.Where_to_listen.bind_to All_addresses (On_port server_port) in @@ -4900,14 +4902,18 @@ let setup_server ~metrics_server_port ~constraint_constants ~logger ~metadata:[ ("error", `String (Caqti_error.show e)) ] ; Deferred.unit | Ok pool -> - let%bind () = add_genesis_accounts pool ~logger ~runtime_config_opt in - run ~constraint_constants pool reader ~logger ~delete_older_than + let%bind () = + add_genesis_accounts pool ~logger ~genesis_constants + ~constraint_constants ~runtime_config_opt + in + run ~constraint_constants ~genesis_constants pool reader ~logger + ~delete_older_than |> don't_wait_for ; Strict_pipe.Reader.iter precomputed_block_reader ~f:(fun precomputed_block -> match%map - add_block_aux_precomputed ~logger ~pool ~constraint_constants - ~delete_older_than precomputed_block + add_block_aux_precomputed ~logger ~pool ~genesis_constants + ~constraint_constants ~delete_older_than precomputed_block with | Error e -> [%log warn] @@ -4924,8 +4930,8 @@ let setup_server ~metrics_server_port ~constraint_constants ~logger Strict_pipe.Reader.iter extensional_block_reader ~f:(fun extensional_block -> match%map - add_block_aux_extensional ~logger ~pool ~delete_older_than - extensional_block + add_block_aux_extensional ~genesis_constants ~logger ~pool + ~delete_older_than extensional_block with | Error e -> [%log warn] @@ -4973,6 +4979,7 @@ let setup_server ~metrics_server_port ~constraint_constants ~logger |> don't_wait_for ; (*Update archive metrics*) create_metrics_server ~logger ~metrics_server_port ~missing_blocks_width + ~block_window_duration_ms:constraint_constants.block_window_duration_ms pool |> don't_wait_for ; [%log info] "Archive process ready. Clients can now connect" ; diff --git a/src/app/archive/lib/test.ml b/src/app/archive/lib/test.ml index 02e6acce244..080b88cc175 100644 --- a/src/app/archive/lib/test.ml +++ b/src/app/archive/lib/test.ml @@ -16,6 +16,8 @@ let%test_module "Archive node unit tests" = let constraint_constants = precomputed_values.constraint_constants + let genesis_constants = precomputed_values.genesis_constants + let verifier = Async.Thread_safe.block_on_async_exn (fun () -> Verifier.create ~logger ~proof_level ~constraint_constants @@ -112,7 +114,8 @@ let%test_module "Archive node unit tests" = let%map (zkapp_command : Zkapp_command.t) = Mina_generators.Zkapp_command_generators.gen_zkapp_command_from ~fee_payer_keypair ~keymap ~ledger - ~protocol_state_view:genesis_state_view () + ~protocol_state_view:genesis_state_view ~constraint_constants + ~genesis_constants () in User_command.Zkapp_command zkapp_command @@ -306,6 +309,7 @@ let%test_module "Archive node unit tests" = Strict_pipe.Writer.close writer ; let%bind () = Processor.run + ~genesis_constants:precomputed_values.genesis_constants ~constraint_constants:precomputed_values.constraint_constants pool reader ~logger ~delete_older_than:None in diff --git a/src/app/archive_blocks/archive_blocks.ml b/src/app/archive_blocks/archive_blocks.ml index 7851ca04518..6c001ef801c 100644 --- a/src/app/archive_blocks/archive_blocks.ml +++ b/src/app/archive_blocks/archive_blocks.ml @@ -4,8 +4,8 @@ open Core_kernel open Async open Archive_lib -let main ~archive_uri ~precomputed ~extensional ~success_file ~failure_file - ~log_successes ~files () = +let main ~genesis_constants ~constraint_constants ~archive_uri ~precomputed + ~extensional ~success_file ~failure_file ~log_successes ~files () = let output_file_line path = match path with | Some path -> @@ -58,10 +58,8 @@ let main ~archive_uri ~precomputed ~extensional ~success_file ~failure_file Error (Error.to_string_hum err) in make_add_block of_yojson - (Processor.add_block_aux_precomputed - ~constraint_constants: - Genesis_constants.Constraint_constants.compiled ~pool - ~delete_older_than:None ~logger ) + (Processor.add_block_aux_precomputed ~genesis_constants + ~constraint_constants ~pool ~delete_older_than:None ~logger ) in let add_extensional_block = (* allow use of older-versioned blocks *) @@ -75,7 +73,7 @@ let main ~archive_uri ~precomputed ~extensional ~success_file ~failure_file Error (Error.to_string_hum err) in make_add_block of_yojson - (Processor.add_block_aux_extensional ~logger ~pool + (Processor.add_block_aux_extensional ~genesis_constants ~logger ~pool ~delete_older_than:None ) in Deferred.List.iter files ~f:(fun file -> @@ -101,6 +99,10 @@ let main ~archive_uri ~precomputed ~extensional ~success_file ~failure_file let () = Command.( + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in run (let open Let_syntax in async ~summary:"Write blocks to an archive database" @@ -132,5 +134,5 @@ let () = processed successfully" (Flag.optional_with_default true Param.bool) and files = Param.anon Anons.(sequence ("FILES" %: Param.string)) in - main ~archive_uri ~precomputed ~extensional ~success_file ~failure_file - ~log_successes ~files ))) + main ~genesis_constants ~constraint_constants ~archive_uri ~precomputed + ~extensional ~success_file ~failure_file ~log_successes ~files ))) diff --git a/src/app/batch_txn_tool/batch_txn_tool.ml b/src/app/batch_txn_tool/batch_txn_tool.ml index a9f847bc490..b6cee78488a 100644 --- a/src/app/batch_txn_tool/batch_txn_tool.ml +++ b/src/app/batch_txn_tool/batch_txn_tool.ml @@ -154,7 +154,7 @@ let there_and_back_again ~num_txn_per_acct ~txns_per_block ~slot_time ~fill_rate ~origin_sender_secret_key_path ~(origin_sender_secret_key_pw_option : string option) ~returner_secret_key_path ~(returner_secret_key_pw_option : string option) - ~graphql_target_node_option () = + ~graphql_target_node_option ~minimum_user_command_fee () = let open Deferred.Let_syntax in (* define the rate limiting function *) let open Logger in @@ -201,7 +201,7 @@ let there_and_back_again ~num_txn_per_acct ~txns_per_block ~slot_time ~fill_rate Currency.Amount.to_fee (Option.value_exn (Currency.Amount.scale - (Currency.Amount.of_fee Mina_base.Signed_command.minimum_fee) + (Currency.Amount.of_fee minimum_user_command_fee) 10 ) ) | Some f -> Currency.Amount.to_fee (Currency.Amount.of_mina_string_exn f) @@ -310,6 +310,7 @@ let there_and_back_again ~num_txn_per_acct ~txns_per_block ~slot_time ~fill_rate return () let output_there_and_back_cmds = + let genesis_constants = Genesis_constants.Compiled.genesis_constants in let open Command.Let_syntax in Command.async ~summary: @@ -394,12 +395,20 @@ let output_there_and_back_cmds = "URL The graphql node to send graphl commands to. must be in \ format `:`. default is `127.0.0.1:3085`" (optional string) + and minimum_user_command_fee = + let default = + Currency.Fee.of_mina_string_exn + Mina_compile_config.default_transaction_fee_string + in + Cli_lib.Flag.fee_common + ~minimum_user_command_fee:genesis_constants.minimum_user_command_fee + ~default_transaction_fee:default in there_and_back_again ~num_txn_per_acct ~txns_per_block ~txn_fee_option ~slot_time ~fill_rate ~rate_limit ~rate_limit_level ~rate_limit_interval ~origin_sender_secret_key_path ~origin_sender_secret_key_pw_option ~returner_secret_key_path ~returner_secret_key_pw_option - ~graphql_target_node_option ) + ~graphql_target_node_option ~minimum_user_command_fee ) let () = Command.run diff --git a/src/app/batch_txn_tool/dune b/src/app/batch_txn_tool/dune index 0d6a7347481..f55ebfdf875 100644 --- a/src/app/batch_txn_tool/dune +++ b/src/app/batch_txn_tool/dune @@ -22,6 +22,7 @@ mina_numbers snark_params unsigned_extended + mina_compile_config mina_wire_types integration_test_lib logger diff --git a/src/app/best_tip_merger/best_tip_merger.ml b/src/app/best_tip_merger/best_tip_merger.ml index c2aee5cb975..5b2ed8bcaa3 100644 --- a/src/app/best_tip_merger/best_tip_merger.ml +++ b/src/app/best_tip_merger/best_tip_merger.ml @@ -334,7 +334,8 @@ let main ~input_dir ~output_dir ~output_format ~min_peers () = ~transport: (Logger_file_system.dumb_logrotate ~directory:output_dir ~log_filename:"mina-best-tip-merger.log" ~max_size:logrotate_max_size - ~num_rotate:logrotate_num_rotate ) ; + ~num_rotate:logrotate_num_rotate ) + () ; let logger = Logger.create () in let t' = List.fold ~init:t files ~f:(fun t log_file -> diff --git a/src/app/cli/src/cli_entrypoint/mina_cli_entrypoint.ml b/src/app/cli/src/cli_entrypoint/mina_cli_entrypoint.ml index e5df95c80ee..626963dc5b8 100644 --- a/src/app/cli/src/cli_entrypoint/mina_cli_entrypoint.ml +++ b/src/app/cli/src/cli_entrypoint/mina_cli_entrypoint.ml @@ -49,7 +49,8 @@ let plugin_flag = times" else Command.Param.return [] -let load_config_files ~logger ~conf_dir ~genesis_dir ~proof_level config_files = +let load_config_files ~logger ~genesis_constants ~constraint_constants ~conf_dir + ~genesis_dir ~cli_proof_level ~proof_level config_files = let%bind config_jsons = let config_files_paths = List.map config_files ~f:(fun (config_file, _) -> `String config_file) @@ -98,8 +99,8 @@ let load_config_files ~logger ~conf_dir ~genesis_dir ~proof_level config_files = let genesis_dir = Option.value ~default:(conf_dir ^/ "genesis") genesis_dir in let%bind precomputed_values = match%map - Genesis_ledger_helper.init_from_config_file ~genesis_dir ~logger - ~proof_level config + Genesis_ledger_helper.init_from_config_file ~cli_proof_level ~genesis_dir + ~logger ~genesis_constants ~constraint_constants ~proof_level config with | Ok (precomputed_values, _) -> precomputed_values @@ -306,7 +307,9 @@ let setup_daemon logger = (sprintf "FEE Amount a worker wants to get compensated for generating a \ snark proof (default: %d)" - (Currency.Fee.to_nanomina_int Currency.Fee.default_snark_worker_fee) ) + ( Currency.Fee.to_nanomina_int + @@ Currency.Fee.of_mina_string_exn + Mina_compile_config.default_snark_worker_fee_string ) ) (optional txn_fee) and work_reassignment_wait = flag "--work-reassignment-wait" @@ -464,7 +467,7 @@ let setup_daemon logger = and disable_node_status = flag "--disable-node-status" ~aliases:[ "disable-node-status" ] no_arg ~doc:"Disable reporting node status to other nodes (default: enabled)" - and proof_level = + and cli_proof_level = flag "--proof-level" ~aliases:[ "proof-level" ] (optional (Arg_type.create Genesis_constants.Proof_level.of_string)) ~doc: @@ -599,45 +602,53 @@ let setup_daemon logger = Stdout_log.setup log_json log_level ; (* 512MB logrotate max size = 1GB max filesystem usage *) let logrotate_max_size = 1024 * 1024 * 10 in - Logger.Consumer_registry.register ~id:Logger.Logger_id.mina + Logger.Consumer_registry.register ~commit_id:Mina_version.commit_id + ~id:Logger.Logger_id.mina ~processor:(Logger.Processor.raw ~log_level:file_log_level ()) ~transport: (Logger_file_system.dumb_logrotate ~directory:conf_dir ~log_filename:"mina.log" ~max_size:logrotate_max_size - ~num_rotate:file_log_rotations ) ; + ~num_rotate:file_log_rotations ) + () ; let best_tip_diff_log_size = 1024 * 1024 * 5 in - Logger.Consumer_registry.register ~id:Logger.Logger_id.best_tip_diff + Logger.Consumer_registry.register ~commit_id:Mina_version.commit_id + ~id:Logger.Logger_id.best_tip_diff ~processor:(Logger.Processor.raw ()) ~transport: (Logger_file_system.dumb_logrotate ~directory:conf_dir ~log_filename:"mina-best-tip.log" - ~max_size:best_tip_diff_log_size ~num_rotate:1 ) ; + ~max_size:best_tip_diff_log_size ~num_rotate:1 ) + () ; let rejected_blocks_log_size = 1024 * 1024 * 5 in - Logger.Consumer_registry.register ~id:Logger.Logger_id.rejected_blocks + Logger.Consumer_registry.register ~commit_id:Mina_version.commit_id + ~id:Logger.Logger_id.rejected_blocks ~processor:(Logger.Processor.raw ()) ~transport: (Logger_file_system.dumb_logrotate ~directory:conf_dir ~log_filename:"mina-rejected-blocks.log" - ~max_size:rejected_blocks_log_size ~num_rotate:50 ) ; - Logger.Consumer_registry.register ~id:Logger.Logger_id.oversized_logs + ~max_size:rejected_blocks_log_size ~num_rotate:50 ) + () ; + Logger.Consumer_registry.register ~commit_id:Mina_version.commit_id + ~id:Logger.Logger_id.oversized_logs ~processor:(Logger.Processor.raw ()) ~transport: (Logger_file_system.dumb_logrotate ~directory:conf_dir ~log_filename:"mina-oversized-logs.log" - ~max_size:logrotate_max_size ~num_rotate:20 ) ; + ~max_size:logrotate_max_size ~num_rotate:20 ) + () ; (* Consumer for `[%log internal]` logging used for internal tracing *) Itn_logger.set_message_postprocessor Internal_tracing.For_itn_logger.post_process_message ; - Logger.Consumer_registry.register ~id:Logger.Logger_id.mina + Logger.Consumer_registry.register ~commit_id:Mina_version.commit_id + ~id:Logger.Logger_id.mina ~processor:Internal_tracing.For_logger.processor ~transport: (Internal_tracing.For_logger.json_lines_rotate_transport ~directory:(conf_dir ^ "/internal-tracing") - () ) ; + () ) + () ; let version_metadata = [ ("commit", `String Mina_version.commit_id) ] in - [%log info] - "Mina daemon is booting up; built with commit $commit on branch \ - $branch" + [%log info] "Mina daemon is booting up; built with commit $commit" ~metadata:version_metadata ; let%bind () = Mina_lib.Conf_dir.check_and_set_lockfile ~logger conf_dir @@ -762,9 +773,16 @@ let setup_daemon logger = @ List.map config_files ~f:(fun config_file -> (config_file, `Must_exist) ) in + let genesis_constants = + Genesis_constants.Compiled.genesis_constants + in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in let%bind precomputed_values, config_jsons, config = - load_config_files ~logger ~conf_dir ~genesis_dir ~proof_level - config_files + load_config_files ~logger ~conf_dir ~genesis_dir + ~proof_level:Genesis_constants.Compiled.proof_level config_files + ~genesis_constants ~constraint_constants ~cli_proof_level in let rev_daemon_configs = List.rev_filter_map config_jsons @@ -830,7 +848,10 @@ let setup_daemon logger = |> Option.map ~f:Currency.Fee.of_nanomina_int_exn in or_from_config json_to_currency_fee_option "snark-worker-fee" - ~default:Currency.Fee.default_snark_worker_fee snark_work_fee + ~default: + (Currency.Fee.of_mina_string_exn + Mina_compile_config.default_snark_worker_fee_string ) + snark_work_fee in let node_status_url = maybe_from_config YJ.Util.to_string_option "node-status-url" @@ -1276,20 +1297,13 @@ Pass one of -peer, -peer-list-file, -seed, -peer-list-url.|} ; } in let net_config = - { Mina_networking.Config.logger - ; trust_system - ; time_controller - ; consensus_constants = precomputed_values.consensus_constants - ; consensus_local_state - ; genesis_ledger_hash - ; constraint_constants = precomputed_values.constraint_constants + { Mina_networking.Config.genesis_ledger_hash ; log_gossip_heard ; is_seed ; creatable_gossip_net = Mina_networking.Gossip_net.( Any.Creatable ((module Libp2p), Libp2p.create ~pids gossip_net_params)) - ; precomputed_values } in let coinbase_receiver : Consensus.Coinbase_receiver.t = @@ -1456,8 +1470,8 @@ let daemon logger = (Command.Param.map (setup_daemon logger) ~f:(fun setup_daemon () -> (* Immediately disable updating the time offset. *) Block_time.Controller.disable_setting_offset () ; - let%bind coda = setup_daemon () in - let%bind () = Mina_lib.start ~commit_id:Mina_version.commit_id coda in + let%bind mina = setup_daemon () in + let%bind () = Mina_lib.start mina in [%log info] "Daemon ready. Clients can now connect" ; Async.never () ) ) @@ -1505,11 +1519,8 @@ let replay_blocks logger = In_channel.close blocks_file ; None ) in - let%bind coda = setup_daemon () in - let%bind () = - Mina_lib.start_with_precomputed_blocks - ~commit_id:Mina_version.commit_id coda blocks - in + let%bind mina = setup_daemon () in + let%bind () = Mina_lib.start_with_precomputed_blocks mina blocks in [%log info] "Daemon is ready, replayed precomputed blocks. Clients can now \ connect" ; @@ -1666,31 +1677,23 @@ let snark_hashes = Command.basic ~summary:"List hashes of proving and verification keys" [%map_open let json = Cli_lib.Flag.json in - let print = Core.printf "%s\n%!" in - fun () -> - let hashes = - match Precomputed_values.compiled with - | Some compiled -> - (Lazy.force compiled).constraint_system_digests |> Lazy.force - |> List.map ~f:(fun (_constraint_system_id, digest) -> - (* Throw away the constraint system ID to avoid changing the - format of the output here. - *) - Md5.to_hex digest ) - | None -> - [] - in - if json then print (Yojson.Safe.to_string (Hashes.to_yojson hashes)) - else List.iter hashes ~f:print] + fun () -> if json then Core.printf "[]\n%!"] let internal_commands logger = - [ (Snark_worker.Intf.command_name, Snark_worker.command) + [ ( Snark_worker.Intf.command_name + , Snark_worker.command ~proof_level:Genesis_constants.Compiled.proof_level + ~constraint_constants:Genesis_constants.Compiled.constraint_constants + ~commit_id:Mina_version.commit_id ) ; ("snark-hashes", snark_hashes) ; ( "run-prover" , Command.async ~summary:"Run prover on a sexp provided on a single line of stdin" (Command.Param.return (fun () -> let logger = Logger.create () in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let proof_level = Genesis_constants.Compiled.proof_level in Parallel.init_master () ; match%bind Reader.read_sexp (Lazy.force Reader.stdin) with | `Ok sexp -> @@ -1698,9 +1701,7 @@ let internal_commands logger = [%log info] "Prover state being logged to %s" conf_dir ; let%bind prover = Prover.create ~commit_id:Mina_version.commit_id ~logger - ~proof_level:Genesis_constants.Proof_level.compiled - ~constraint_constants: - Genesis_constants.Constraint_constants.compiled + ~proof_level ~constraint_constants ~pids:(Pid.Table.create ()) ~conf_dir () in Prover.prove_from_input_sexp prover sexp >>| ignore @@ -1717,6 +1718,10 @@ let internal_commands logger = fun () -> let open Deferred.Let_syntax in let logger = Logger.create () in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let proof_level = Genesis_constants.Compiled.proof_level in Parallel.init_master () ; match%bind Reader.with_file filename ~f:(fun reader -> @@ -1725,10 +1730,8 @@ let internal_commands logger = with | `Ok sexp -> ( let%bind worker_state = - Snark_worker.Prod.Inputs.Worker_state.create - ~proof_level:Genesis_constants.Proof_level.compiled - ~constraint_constants: - Genesis_constants.Constraint_constants.compiled () + Snark_worker.Prod.Inputs.Worker_state.create ~proof_level + ~constraint_constants () in let sok_message = { Mina_base.Sok_message.fee = Currency.Fee.of_mina_int_exn 0 @@ -1766,6 +1769,10 @@ let internal_commands logger = fun () -> let open Async in let logger = Logger.create () in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let proof_level = Genesis_constants.Compiled.proof_level in Parallel.init_master () ; let%bind conf_dir = Unix.mkdtemp "/tmp/mina-verifier" in let mode = @@ -1842,10 +1849,8 @@ let internal_commands logger = in let%bind verifier = Verifier.create ~commit_id:Mina_version.commit_id ~logger - ~proof_level:Genesis_constants.Proof_level.compiled - ~constraint_constants: - Genesis_constants.Constraint_constants.compiled - ~pids:(Pid.Table.create ()) ~conf_dir:(Some conf_dir) () + ~proof_level ~constraint_constants ~pids:(Pid.Table.create ()) + ~conf_dir:(Some conf_dir) () in let%bind result = match input with @@ -1925,14 +1930,21 @@ let internal_commands logger = Parallel.init_master () ; let logger = Logger.create () in let conf_dir = Mina_lib.Conf_dir.compute_conf_dir conf_dir in + let genesis_constants = + Genesis_constants.Compiled.genesis_constants + in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in let proof_level = Genesis_constants.Proof_level.Full in let config_files = List.map config_files ~f:(fun config_file -> (config_file, `Must_exist) ) in let%bind precomputed_values, _config_jsons, _config = - load_config_files ~logger ~conf_dir ~genesis_dir - ~proof_level:(Some proof_level) config_files + load_config_files ~logger ~conf_dir ~genesis_dir ~genesis_constants + ~constraint_constants ~proof_level config_files + ~cli_proof_level:None in let pids = Child_processes.Termination.create_pid_table () in let%bind prover = diff --git a/src/app/cli/src/init/client.ml b/src/app/cli/src/init/client.ml index 1558fb6aa4a..39f8080589a 100644 --- a/src/app/cli/src/init/client.ml +++ b/src/app/cli/src/init/client.ml @@ -513,8 +513,15 @@ let send_payment_graphql = flag "--amount" ~aliases:[ "amount" ] ~doc:"VALUE Payment amount you want to send" (required txn_amount) in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in let args = - Args.zip3 Cli_lib.Flag.signed_command_common receiver_flag amount_flag + Args.zip3 + (Cli_lib.Flag.signed_command_common + ~minimum_user_command_fee:genesis_constants.minimum_user_command_fee + ~default_transaction_fee: + (Currency.Fee.of_mina_string_exn + Mina_compile_config.default_transaction_fee_string ) ) + receiver_flag amount_flag in Command.async ~summary:"Send payment to an address" (Cli_lib.Background_daemon.graphql_init args @@ -542,7 +549,16 @@ let delegate_stake_graphql = ~doc:"PUBLICKEY Public key to which you want to delegate your stake" (required public_key_compressed) in - let args = Args.zip2 Cli_lib.Flag.signed_command_common receiver_flag in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let args = + Args.zip2 + (Cli_lib.Flag.signed_command_common + ~minimum_user_command_fee:genesis_constants.minimum_user_command_fee + ~default_transaction_fee: + (Currency.Fee.of_mina_string_exn + Mina_compile_config.default_transaction_fee_string ) ) + receiver_flag + in Command.async ~summary:"Delegate your stake to another public key" (Cli_lib.Background_daemon.graphql_init args ~f:(fun @@ -806,10 +822,10 @@ let hash_ledger = (required string)) and plaintext = Cli_lib.Flag.plaintext in fun () -> + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in let process_accounts accounts = - let constraint_constants = - Genesis_constants.Constraint_constants.compiled - in let packed_ledger = Genesis_ledger_helper.Ledger.packed_genesis_ledger_of_accounts ~depth:constraint_constants.ledger_depth accounts @@ -864,7 +880,7 @@ let currency_in_ledger = Token_id.Table.create () in List.iter accounts ~f:(fun (acct : Account.t) -> - let token_id = Account.token acct in + let token_id = Account.token_id acct in let balance = acct.balance |> Currency.Balance.to_uint64 in match Token_id.Table.find currency_tbl token_id with | None -> @@ -910,11 +926,10 @@ let currency_in_ledger = let constraint_system_digests = Command.async ~summary:"Print MD5 digest of each SNARK constraint" (Command.Param.return (fun () -> - (* TODO: Allow these to be configurable. *) - let proof_level = Genesis_constants.Proof_level.compiled in let constraint_constants = - Genesis_constants.Constraint_constants.compiled + Genesis_constants.Compiled.constraint_constants in + let proof_level = Genesis_constants.Compiled.proof_level in let all = Transaction_snark.constraint_system_digests ~constraint_constants () @ Blockchain_snark.Blockchain_snark_state.constraint_system_digests @@ -1778,6 +1793,9 @@ let add_peers_graphql = } ) ) ) ) let compile_time_constants = + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = Genesis_constants.Compiled.constraint_constants in + let proof_level = Genesis_constants.Compiled.proof_level in Command.async ~summary:"Print a JSON map of the compile-time consensus parameters" (Command.Param.return (fun () -> @@ -1797,11 +1815,14 @@ let compile_time_constants = let open Async in let%map ({ consensus_constants; _ } as precomputed_values), _ = config_file |> Genesis_ledger_helper.load_config_json >>| Or_error.ok - >>| Option.value ~default:(`Assoc []) + >>| Option.value + ~default: + (`Assoc [ ("ledger", `Assoc [ ("accounts", `List []) ]) ]) >>| Runtime_config.of_yojson >>| Result.ok >>| Option.value ~default:Runtime_config.default - >>= Genesis_ledger_helper.init_from_config_file ~genesis_dir - ~logger:(Logger.null ()) ~proof_level:None + >>= Genesis_ledger_helper.init_from_config_file ~genesis_constants + ~constraint_constants ~logger:(Logger.null ()) ~proof_level + ~cli_proof_level:None ~genesis_dir >>| Or_error.ok_exn in let all_constants = @@ -1888,7 +1909,7 @@ let node_status = List.iter all_status_data ~f:(fun peer_status_data -> printf "%s\n%!" ( Yojson.Safe.to_string - @@ Mina_networking.Rpcs.Get_node_status.response_to_yojson + @@ Mina_networking.Node_status.response_to_yojson peer_status_data ) ) | Error err -> printf "Failed to get node status: %s\n%!" @@ -2249,6 +2270,60 @@ let signature_kind = in Core.print_endline signature_kind_string ) +let test_ledger_application = + Command.async ~summary:"Test ledger application" + (let%map_open.Command privkey_path = Cli_lib.Flag.privkey_read_path + and prev_block_path = + flag "--prev-block-path" ~doc:"FILE file with serialized block" + (optional string) + and ledger_path = + flag "--ledger-path" ~doc:"FILE directory with ledger DB" + (required string) + and num_txs = + flag "--num-txs" + ~doc:"NN Number of transactions to create after preparatory rounds" + (required int) + and num_txs_per_round = + flag "--num-txs-per-round" + ~doc: + "NN Number of transactions to create per preparatory round \ + (default: 3)" + (optional int) + and rounds = + flag "--rounds" ~doc:"NN Number of preparatory rounds (default: 580)" + (optional int) + and first_partition_slots = + flag "--first-partition-slots" + ~doc: + "NN Number of slots in first partition of scan state (default: 128)" + (optional int) + and max_depth = + flag "--max-depth" ~doc:"NN Maximum depth of masks (default: 290)" + (optional int) + and no_new_stack = + flag "--old-stack" ~doc:"Use is_new_stack: false (scan state)" no_arg + and has_second_partition = + flag "--has-second-partition" + ~doc:"Assume there is a second partition (scan state)" no_arg + and tracing = flag "--tracing" ~doc:"Wrap test into tracing" no_arg + and no_masks = flag "--no-masks" ~doc:"Do not create masks" no_arg in + Cli_lib.Exceptions.handle_nicely + @@ fun () -> + let first_partition_slots = + Option.value ~default:128 first_partition_slots + in + let num_txs_per_round = Option.value ~default:3 num_txs_per_round in + let rounds = Option.value ~default:580 rounds in + let max_depth = Option.value ~default:290 max_depth in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + Test_ledger_application.test ~privkey_path ~ledger_path ?prev_block_path + ~first_partition_slots ~no_new_stack ~has_second_partition + ~num_txs_per_round ~rounds ~no_masks ~max_depth ~tracing num_txs + ~constraint_constants ~genesis_constants ) + let itn_create_accounts = Command.async ~summary:"Fund new accounts for incentivized testnet" (let open Command.Param in @@ -2272,7 +2347,12 @@ let itn_create_accounts = (required int) in let args = Args.zip5 privkey_path key_prefix num_accounts fee amount in - Cli_lib.Background_daemon.rpc_init args ~f:Itn.create_accounts) + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + Cli_lib.Background_daemon.rpc_init args + ~f:(Itn.create_accounts ~genesis_constants ~constraint_constants)) module Visualization = struct let create_command (type rpc_response) ~name ~f @@ -2411,6 +2491,7 @@ let ledger = [ ("export", export_ledger) ; ("hash", hash_ledger) ; ("currency", currency_in_ledger) + ; ("test-apply", test_ledger_application) ] let libp2p = diff --git a/src/app/cli/src/init/dune b/src/app/cli/src/init/dune index cf38bfd4e5a..aaa7df52dba 100644 --- a/src/app/cli/src/init/dune +++ b/src/app/cli/src/init/dune @@ -35,6 +35,7 @@ cohttp-async graphql-async mirage-crypto-ec + base_quickcheck ;;local libraries bounded_types snark_profiler_lib @@ -62,7 +63,6 @@ genesis_constants bash_colors graphql_lib - node_status o1trace_webkit_event generated_graphql_queries itn_crypto @@ -122,6 +122,7 @@ string_sign zkapp_command_builder internal_tracing + transaction_snark_scan_state ) (instrumentation (backend bisect_ppx)) (preprocessor_deps ../../../../../graphql_schema.json diff --git a/src/app/cli/src/init/itn.ml b/src/app/cli/src/init/itn.ml index aadf0c5746e..d02c987f0b0 100644 --- a/src/app/cli/src/init/itn.ml +++ b/src/app/cli/src/init/itn.ml @@ -6,18 +6,17 @@ open Signature_lib open Mina_base open Mina_transaction -let create_accounts port (privkey_path, key_prefix, num_accounts, fee, amount) = +let create_accounts ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) port + (privkey_path, key_prefix, num_accounts, fee, amount) = let keys_per_zkapp = 8 in let zkapps_per_block = 10 in let pk_check_wait = Time.Span.of_sec 10. in let pk_check_timeout = Time.Span.of_min 30. in let min_fee = - Currency.Fee.to_nanomina_int Currency.Fee.minimum_user_command_fee + Currency.Fee.to_nanomina_int genesis_constants.minimum_user_command_fee in let account_creation_fee_int = - let constraint_constants = - Genesis_constants.Constraint_constants.compiled - in Currency.Fee.to_nanomina_int constraint_constants.account_creation_fee in if fee < min_fee then ( @@ -178,7 +177,8 @@ let create_accounts port (privkey_path, key_prefix, num_accounts, fee, amount) = } in fee_payer_current_nonce := Account.Nonce.succ !fee_payer_current_nonce ; - Transaction_snark.For_tests.multiple_transfers multispec ) + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + multispec ) in let zkapps_batches = List.chunks_of zkapps ~length:zkapps_per_block in Deferred.List.iter zkapps_batches ~f:(fun zkapps_batch -> diff --git a/src/app/cli/src/init/mina_run.ml b/src/app/cli/src/init/mina_run.ml index 77f40130a6f..d4b31431b9d 100644 --- a/src/app/cli/src/init/mina_run.ml +++ b/src/app/cli/src/init/mina_run.ml @@ -135,8 +135,7 @@ let coda_status coda_ref = ~default: (Deferred.return (`String "Shutdown before Coda instance was created")) ~f:(fun t -> - Mina_commands.get_status ~commit_id:Mina_version.commit_id - ~flag:`Performance t + Mina_commands.get_status ~flag:`Performance t >>| Daemon_rpcs.Types.Status.to_yojson ) let make_report exn_json ~conf_dir ~top_logger coda_ref = @@ -273,10 +272,9 @@ let setup_local_server ?(client_trustlist = []) ?rest_server_port aid |> Participating_state.active_error ) ) ; implement_notrace Daemon_rpcs.Get_status.rpc (fun () flag -> - Mina_commands.get_status ~commit_id:Mina_version.commit_id ~flag mina ) + Mina_commands.get_status ~flag mina ) ; implement Daemon_rpcs.Clear_hist_status.rpc (fun () flag -> - Mina_commands.clear_hist_status ~commit_id:Mina_version.commit_id - ~flag mina ) + Mina_commands.clear_hist_status ~flag mina ) ; implement Daemon_rpcs.Get_ledger.rpc (fun () lh -> Mina_lib.get_ledger mina lh ) ; implement Daemon_rpcs.Get_snarked_ledger.rpc (fun () lh -> @@ -355,7 +353,7 @@ let setup_local_server ?(client_trustlist = []) ?rest_server_port ; implement Daemon_rpcs.Get_trustlist.rpc (fun () () -> return (Set.to_list !client_trustlist) ) ; implement Daemon_rpcs.Get_node_status.rpc (fun () peers -> - Node_status.get_node_status_from_peers (Mina_lib.net mina) peers ) + Mina_networking.get_node_status_from_peers (Mina_lib.net mina) peers ) ; implement Daemon_rpcs.Get_object_lifetime_statistics.rpc (fun () () -> return (Yojson.Safe.pretty_to_string @@ Allocation_functor.Table.dump ()) ) @@ -498,10 +496,7 @@ let setup_local_server ?(client_trustlist = []) ?rest_server_port (fun ~body _sock req -> let uri = Cohttp.Request.uri req in let status flag = - let%bind status = - Mina_commands.get_status ~commit_id:Mina_version.commit_id ~flag - mina - in + let%bind status = Mina_commands.get_status ~flag mina in Server.respond_string ( status |> Daemon_rpcs.Types.Status.to_yojson |> Yojson.Safe.pretty_to_string ) @@ -544,9 +539,8 @@ let setup_local_server ?(client_trustlist = []) ?rest_server_port ~bind_to_address: Tcp.Bind_to_address.( if insecure_rest_server then All_addresses else Localhost) - ~schema:(Mina_graphql.schema ~commit_id:Mina_version.commit_id) - ~server_description:"GraphQL server" ~require_auth:false - rest_server_port ) ) ; + ~schema:Mina_graphql.schema ~server_description:"GraphQL server" + ~require_auth:false rest_server_port ) ) ; (* Second graphql server with limited queries exposed *) Option.iter limited_graphql_port ~f:(fun rest_server_port -> O1trace.background_thread "serve_limited_graphql" (fun () -> @@ -554,8 +548,7 @@ let setup_local_server ?(client_trustlist = []) ?rest_server_port ~bind_to_address: Tcp.Bind_to_address.( if open_limited_graphql_port then All_addresses else Localhost) - ~schema: - (Mina_graphql.schema_limited ~commit_id:Mina_version.commit_id) + ~schema:Mina_graphql.schema_limited ~server_description:"GraphQL server with limited queries" ~require_auth:false rest_server_port ) ) ; if Mina_compile_config.itn_features then @@ -568,8 +561,7 @@ let setup_local_server ?(client_trustlist = []) ?rest_server_port ~bind_to_address: Tcp.Bind_to_address.( if insecure_rest_server then All_addresses else Localhost) - ~schema: - (Mina_graphql.schema_itn ~commit_id:Mina_version.commit_id) + ~schema:Mina_graphql.schema_itn ~server_description:"GraphQL server for ITN queries" ~require_auth:true rest_server_port ) ) ; let where_to_listen = diff --git a/src/app/cli/src/init/test_ledger_application.ml b/src/app/cli/src/init/test_ledger_application.ml new file mode 100644 index 00000000000..7adddbef204 --- /dev/null +++ b/src/app/cli/src/init/test_ledger_application.ml @@ -0,0 +1,238 @@ +(* test_ledger_application.ml -- code to test application of transactions to a specific ledger *) + +open Core_kernel +open Async_kernel +open Mina_ledger +open Mina_base +open Mina_state + +let logger = Logger.create () + +let read_privkey privkey_path = + let password = + lazy (Secrets.Keypair.Terminal_stdin.prompt_password "Enter password: ") + in + match%map Secrets.Keypair.read ~privkey_path ~password with + | Ok keypair -> + keypair + | Error err -> + eprintf "Could not read the specified keypair: %s\n" + (Secrets.Privkey_error.to_string err) ; + exit 1 + +let generate_event = + Snark_params.Tick.Field.gen |> Quickcheck.Generator.map ~f:(fun x -> [| x |]) + +let mk_tx ~event_elements ~action_elements + ~(constraint_constants : Genesis_constants.Constraint_constants.t) keypair + nonce = + let num_acc_updates = 8 in + let multispec : Transaction_snark.For_tests.Multiple_transfers_spec.t = + let fee_payer = None in + let generated_values = + let open Base_quickcheck.Generator.Let_syntax in + let%bind receivers = + Base_quickcheck.Generator.list_with_length ~length:num_acc_updates + @@ let%map kp = Signature_lib.Keypair.gen in + ( Signature_lib.Public_key.compress kp.public_key + , Currency.Amount.zero ) + in + let%bind events = + Quickcheck.Generator.list_with_length event_elements generate_event + in + let%map actions = + Quickcheck.Generator.list_with_length action_elements generate_event + in + (receivers, events, actions) + in + let receivers, events, actions = + Quickcheck.random_value + ~seed:(`Deterministic ("test-apply-" ^ Unsigned.UInt32.to_string nonce)) + generated_values + in + let zkapp_account_keypairs = [] in + let new_zkapp_account = false in + let snapp_update = Account_update.Update.dummy in + let call_data = Snark_params.Tick.Field.zero in + let preconditions = Some Account_update.Preconditions.accept in + { fee = Currency.Fee.of_mina_int_exn 1 + ; sender = (keypair, nonce) + ; fee_payer + ; receivers + ; amount = + Currency.Amount.( + scale + (of_fee constraint_constants.account_creation_fee) + num_acc_updates) + |> Option.value_exn ~here:[%here] + ; zkapp_account_keypairs + ; memo = Signed_command_memo.empty + ; new_zkapp_account + ; snapp_update + ; actions + ; events + ; call_data + ; preconditions + } + in + Transaction_snark.For_tests.multiple_transfers ~constraint_constants multispec + +let generate_protocol_state_stub ~consensus_constants ~constraint_constants + ledger = + let open Staged_ledger_diff in + Protocol_state.negative_one + ~genesis_ledger:(lazy ledger) + ~genesis_epoch_data:None ~constraint_constants ~consensus_constants + ~genesis_body_reference + +let apply_txs ~action_elements ~event_elements ~constraint_constants + ~first_partition_slots ~no_new_stack ~has_second_partition ~num_txs + ~prev_protocol_state ~(keypair : Signature_lib.Keypair.t) ~i ledger = + let init_nonce = + let account_id = Account_id.of_public_key keypair.public_key in + let loc = + Ledger.location_of_account ledger account_id + |> Option.value_exn ~here:[%here] + in + let account = Ledger.get ledger loc |> Option.value_exn ~here:[%here] in + account.nonce + in + let to_nonce = + Fn.compose (Unsigned.UInt32.add init_nonce) Unsigned.UInt32.of_int + in + let mk_tx' = + mk_tx ~action_elements ~event_elements ~constraint_constants keypair + in + let fork_slot = + Option.value_map ~default:Mina_numbers.Global_slot_since_genesis.zero + ~f:(fun f -> f.global_slot_since_genesis) + constraint_constants.fork + in + let prev_protocol_state_body_hash = + Protocol_state.body prev_protocol_state |> Protocol_state.Body.hash + in + let prev_protocol_state_hash = + (Protocol_state.hashes_with_body ~body_hash:prev_protocol_state_body_hash + prev_protocol_state ) + .state_hash + in + let prev_state_view = + Protocol_state.body prev_protocol_state + |> Mina_state.Protocol_state.Body.view + in + let global_slot = + Protocol_state.consensus_state prev_protocol_state + |> Consensus.Data.Consensus_state.curr_global_slot + |> Mina_numbers.Global_slot_since_hard_fork.succ + |> Mina_numbers.Global_slot_since_hard_fork.to_int + |> Mina_numbers.Global_slot_span.of_int + |> Mina_numbers.Global_slot_since_genesis.add fork_slot + in + let zkapps = List.init num_txs ~f:(Fn.compose mk_tx' to_nonce) in + let pending_coinbase = + Pending_coinbase.create ~depth:constraint_constants.pending_coinbase_depth + () + |> Or_error.ok_exn + in + let zkapps' = + List.map zkapps ~f:(fun tx -> + { With_status.data = + Mina_transaction.Transaction.Command (User_command.Zkapp_command tx) + ; status = Applied + } ) + in + let accounts_accessed = + List.fold_left ~init:Account_id.Set.empty zkapps ~f:(fun set txn -> + Account_id.Set.( + union set (of_list (Zkapp_command.accounts_referenced txn))) ) + |> Set.to_list + in + Ledger.unsafe_preload_accounts_from_parent ledger accounts_accessed ; + let start = Time.now () in + match%map + Staged_ledger.Test_helpers.update_coinbase_stack_and_get_data_impl + ~first_partition_slots ~is_new_stack:(not no_new_stack) + ~no_second_partition:(not has_second_partition) ~constraint_constants + ~logger ~global_slot ledger pending_coinbase zkapps' prev_state_view + (prev_protocol_state_hash, prev_protocol_state_body_hash) + with + | Ok (b, _, _, _, _) -> + let root = Ledger.merkle_root ledger in + printf + !"Result of application %d: %B (took %s): new root %s\n%!" + i b + Time.(Span.to_string @@ diff (now ()) start) + (Ledger_hash.to_base58_check root) + | Error e -> + eprintf + !"Error applying staged ledger: %s\n%!" + (Staged_ledger.Staged_ledger_error.to_string e) ; + exit 1 + +let test ~privkey_path ~ledger_path ?prev_block_path ~first_partition_slots + ~no_new_stack ~has_second_partition ~num_txs_per_round ~rounds ~no_masks + ~max_depth ~tracing num_txs_final ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) = + O1trace.thread "mina" + @@ fun () -> + let%bind keypair = read_privkey privkey_path in + let init_ledger = + Ledger.create ~directory_name:ledger_path + ~depth:constraint_constants.ledger_depth () + in + let prev_protocol_state = + let%map.Option prev_block_path = prev_block_path in + let prev_block_data = In_channel.read_all prev_block_path in + let prev_block = + Binable.of_string (module Mina_block.Stable.Latest) prev_block_data + in + Mina_block.header prev_block |> Mina_block.Header.protocol_state + in + let consensus_constants = + Consensus.Constants.create ~constraint_constants + ~protocol_constants:genesis_constants.protocol + in + let prev_protocol_state = + match prev_protocol_state with + | None -> + generate_protocol_state_stub ~consensus_constants ~constraint_constants + init_ledger + | Some p -> + p + in + let apply = + apply_txs ~constraint_constants ~first_partition_slots ~no_new_stack + ~has_second_partition ~prev_protocol_state ~keypair + in + let mask_handler ledger = + if no_masks then Fn.const ledger + else + Fn.compose (Ledger.register_mask ledger) + @@ Ledger.Mask.create ~depth:constraint_constants.ledger_depth + in + let drop_old_ledger ledger = + if not no_masks then ( + Ledger.commit ledger ; + Ledger.remove_and_reparent_exn ledger ledger ) + in + let stop_tracing = + if tracing then (fun x -> Mina_tracing.stop () ; x) else ident + in + let init_root = Ledger.merkle_root init_ledger in + printf !"Init root %s\n%!" (Ledger_hash.to_base58_check init_root) ; + Deferred.List.fold (List.init rounds ~f:ident) ~init:(init_ledger, []) + ~f:(fun (ledger, ledgers) i -> + let%bind () = + if tracing && i = 1 then Mina_tracing.start "." else Deferred.unit + in + List.hd (List.drop ledgers (max_depth - 1)) + |> Option.iter ~f:drop_old_ledger ; + apply ~action_elements:0 ~event_elements:0 ~num_txs:num_txs_per_round ~i + ledger + >>| mask_handler ledger + >>| Fn.flip Tuple2.create (ledger :: ledgers) ) + >>| fst + >>= apply ~num_txs:num_txs_final + ~action_elements:genesis_constants.max_action_elements + ~event_elements:genesis_constants.max_event_elements ~i:rounds + >>| stop_tracing diff --git a/src/app/cli/src/init/transaction_snark_profiler.ml b/src/app/cli/src/init/transaction_snark_profiler.ml index 4021e29c86c..ef4e26d284b 100644 --- a/src/app/cli/src/init/transaction_snark_profiler.ml +++ b/src/app/cli/src/init/transaction_snark_profiler.ml @@ -3,14 +3,16 @@ open Snark_profiler_lib let name = "transaction-snark-profiler" -let run ~user_command_profiler ~zkapp_profiler num_transactions ~max_num_updates +let run ~genesis_constants ~constraint_constants ~proof_level + ~user_command_profiler ~zkapp_profiler num_transactions ~max_num_updates ?min_num_updates repeats preeval use_zkapps : unit = let logger = Logger.null () in let print n msg = printf !"[%i] %s\n%!" n msg in if use_zkapps then ( let ledger, transactions = Async.Thread_safe.block_on_async_exn (fun () -> - create_ledger_and_zkapps ?min_num_updates ~max_num_updates () ) + create_ledger_and_zkapps ~genesis_constants ~constraint_constants + ?min_num_updates ~max_num_updates () ) in Parallel.init_master () ; let verifier = @@ -33,7 +35,7 @@ let run ~user_command_profiler ~zkapp_profiler num_transactions ~max_num_updates go repeats ) else let ledger, transactions = - create_ledger_and_transactions num_transactions + create_ledger_and_transactions ~constraint_constants num_transactions in let sparse_ledger = Mina_ledger.Sparse_ledger.of_ledger_subset_exn ledger @@ -55,39 +57,48 @@ let run ~user_command_profiler ~zkapp_profiler num_transactions ~max_num_updates in go repeats -let dry ~max_num_updates ?min_num_updates num_transactions repeats preeval - use_zkapps () = +let dry ~genesis_constants ~constraint_constants ~proof_level ~max_num_updates + ?min_num_updates num_transactions repeats preeval use_zkapps () = let zkapp_profiler ~verifier:_ _ _ = failwith "Can't check base SNARKs on zkApps" in Test_util.with_randomness 123456789 (fun () -> - run ~user_command_profiler:check_base_snarks ~zkapp_profiler - num_transactions ~max_num_updates ?min_num_updates repeats preeval - use_zkapps ) + run ~genesis_constants ~constraint_constants ~proof_level + ~user_command_profiler: + (check_base_snarks ~genesis_constants ~constraint_constants) + ~zkapp_profiler num_transactions ~max_num_updates ?min_num_updates + repeats preeval use_zkapps ) -let witness ~max_num_updates ?min_num_updates num_transactions repeats preeval +let witness ~genesis_constants ~constraint_constants ~proof_level + ~max_num_updates ?min_num_updates num_transactions repeats preeval use_zkapps () = let zkapp_profiler ~verifier:_ _ _ = failwith "Can't generate witnesses for base SNARKs on zkApps" in Test_util.with_randomness 123456789 (fun () -> - run ~user_command_profiler:generate_base_snarks_witness ~zkapp_profiler - num_transactions ~max_num_updates ?min_num_updates repeats preeval - use_zkapps ) + run ~genesis_constants ~constraint_constants ~proof_level + ~user_command_profiler: + (generate_base_snarks_witness ~genesis_constants ~constraint_constants) + ~zkapp_profiler num_transactions ~max_num_updates ?min_num_updates + repeats preeval use_zkapps ) -let main ~max_num_updates ?min_num_updates num_transactions repeats preeval - use_zkapps () = +let main ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) + ~proof_level ~max_num_updates ?min_num_updates num_transactions repeats + preeval use_zkapps () = Test_util.with_randomness 123456789 (fun () -> let module T = Transaction_snark.Make (struct - let constraint_constants = - Genesis_constants.Constraint_constants.compiled + let constraint_constants = constraint_constants - let proof_level = Genesis_constants.Proof_level.Full + let proof_level = proof_level end) in - run - ~user_command_profiler:(profile_user_command (module T)) - ~zkapp_profiler:profile_zkapps num_transactions ~max_num_updates - ?min_num_updates repeats preeval use_zkapps ) + run ~genesis_constants ~constraint_constants ~proof_level + ~user_command_profiler: + (profile_user_command ~genesis_constants ~constraint_constants + (module T) ) + ~zkapp_profiler:(profile_zkapps ~constraint_constants) + num_transactions ~max_num_updates ?min_num_updates repeats preeval + use_zkapps ) let command = let open Command.Let_syntax in @@ -161,12 +172,20 @@ let command = (String.concat !incompatible_flags ~sep:", ") ; exit 1 ) ) ; let repeats = Option.value repeats ~default:1 in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let proof_level = Genesis_constants.Proof_level.Full in if witness_only then - witness ~max_num_updates ?min_num_updates num_transactions repeats - preeval use_zkapps + witness ~genesis_constants ~constraint_constants ~proof_level + ~max_num_updates ?min_num_updates num_transactions repeats preeval + use_zkapps else if check_only then - dry ~max_num_updates ?min_num_updates num_transactions repeats preeval + dry ~genesis_constants ~constraint_constants ~proof_level + ~max_num_updates ?min_num_updates num_transactions repeats preeval use_zkapps else - main ~max_num_updates ?min_num_updates num_transactions repeats preeval + main ~genesis_constants ~constraint_constants ~proof_level + ~max_num_updates ?min_num_updates num_transactions repeats preeval use_zkapps ) diff --git a/src/app/delegation_backend/.gitignore b/src/app/delegation_backend/.gitignore deleted file mode 100644 index d02f33d4ced..00000000000 --- a/src/app/delegation_backend/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -.bazel -bazel-* -user.bazelrc - -# make stuff -result/ - -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ diff --git a/src/app/delegation_backend/Makefile b/src/app/delegation_backend/Makefile deleted file mode 100644 index 8b3aef0dce9..00000000000 --- a/src/app/delegation_backend/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -.PHONY: clean build test tidy docker docker-run docker-toolchain - -ifeq ($(GO),) -GO := go -endif - -build: - GO=$(GO) ./scripts/build.sh - -clean: - rm -rf result - -tidy: - cd src && $(GO) mod tidy - -test: - GO=$(GO) ./scripts/build.sh test - -docker-run: - ./scripts/build.sh $@ - -docker-toolchain: - ./scripts/build.sh $@ - -docker: - ./scripts/build.sh $@ diff --git a/src/app/delegation_backend/README.md b/src/app/delegation_backend/README.md deleted file mode 100644 index a9f8d7090ff..00000000000 --- a/src/app/delegation_backend/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Delegation program backend - -As part of delegation program, nodes are to upload some proof of their activity. These proofs are to be accumulated and utilized for scoring. This service provides the nodes with a way to siubmit their data for score calculation. - -## Constants - -- `MAX_SUBMIT_PAYLOAD_SIZE` : max size (in bytes) of the `POST /submit` payload -- `REQUESTS_PER_IP_HOURLY` : max amount of requests per hour per IP address -- `REQUESTS_PER_PK_HOURLY` : max amount of requests per hour per public key `submitter` - -## Protocol - -1. Node submits a payload to the Service using `POST /submit` -2. Server saves the request -3. Server replies with status `ok` and HTTP 200 if payload is correct and some other HTTP code otherwise - -## Interface - -Backend Service is a web server that exposes the following entrypoints: - -- `POST /submit` to submit a JSON payload containing the following data: - - ```json - { "data": - { "peer_id": "" - , "block": "" - , "created_at": "" - - // Optional argument - , "snark_work": "" - } - , "submitter": "" - , "sig": "" - } - ``` - - - Mina's signature scheme (as described in [https://github.com/MinaProtocol/c-reference-signer](https://github.com/MinaProtocol/c-reference-signer)) is to be used - - Time is represented according to `RFC-3339` with mandatory `Z` suffix (i.e. in UTC), like: `1985-04-12T23:20:50.52Z` - - Payload for signing is to be made as the following JSON (it's important that its fields are in lexicographical order and if no `snark_work` is provided, field is omitted): - - `block`: Base64 representation of a `block` field from payload - - `created_at`: same as in `data` - - `peer_id`: same as in `data` - - `snark_work`: same as in `data` (omitted if `null` or `""`) - - There are three possible responses: - - `400 Bad Request` with `{"error": ""}` payload when the input is considered malformed - - `401 Unauthorized` when public key `submitter` is not on the list of allowed keys or the signature is invalid - - `411 Length Required` when no length header is provided - - `413 Payload Too Large` when payload exceeds `MAX_SUBMIT_PAYLOAD_SIZE` constant - - `429 Too Many Requests` when submission from public key `submitter` is rejected due to rate-limiting policy - - `500 Internal Server Error` with `{"error": ""}` payload for any other server error - - `503 Service Unavailable` when IP-based rate-limiting prohibits the request - - `200` with `{"status": "ok"}` - -## Cloud storage - -Cloud storage has the following structure: - -- `submissions` - - `/-.json` - - Path contents: - - `submitted_at_date` with server's date (of the time of submission) in format `YYYY-MM-DD` - - `submitted_at` with server's timestamp (of the time of submission) in RFC-3339 - - `submitter` is base58check-encoded submitter's public key - - File contents: - - `remote_addr` with the `ip:port` address from which request has come - - `peer_id` (as in user's JSON submission) - - `snark_work` (optional, as in user's JSON submission) - - `submitter` is base58check-encoded submitter's public key - - `created_at` is UTC-based `RFC-3339` -encoded - - `block_hash` is base58check-encoded hash of a block -- `blocks` - - `.dat` - - Contains raw block - -## Validation and rate limitting - -All endpoints are guarded with Nginx which acts as a: - -- HTTPS proxy -- Rate-limiter (by IP address) configured with `REQUESTS_PER_IP_HOURLY` - -On receiving payload on `/submit`, we perform the following validation: - -- Content size doesn't exceed the limit (before reading the data) -- Payload is a JSON of valid format (also check the sizes and formats of `create_at` and `block_hash`) -- `|NOW() - created_at| < 1 min` -- `submitter` is on the list `allowed` of whitelisted public keys -- `sig` is a valid signature of `data` w.r.t. `submitter` public key -- Amount of requests by `submitter` in the last hour is not exceeding `REQUESTS_PER_PK_HOURLY` - -After receiving payload on `/submit` , we update in-memory public key rate-limiting state and save the contents of `block` field as `blocks/.dat`. diff --git a/src/app/delegation_backend/scripts/build.sh b/src/app/delegation_backend/scripts/build.sh deleted file mode 100755 index 15fa75dc317..00000000000 --- a/src/app/delegation_backend/scripts/build.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [[ "$OUT" == "" ]]; then - OUT="$PWD/result" -fi - -ref_signer="$PWD/../../external/c-reference-signer" - -mkdir -p "$OUT"/{headers,bin} -rm -f "$OUT"/libmina_signer.so # Otherwise re-building without clean causes permissions issue -if [[ "$LIB_MINA_SIGNER" == "" ]]; then - # No nix - cp -R "$ref_signer" "$OUT" - make -C "$OUT/c-reference-signer" clean libmina_signer.so - cp "$OUT/c-reference-signer/libmina_signer.so" "$OUT" -else - cp "$LIB_MINA_SIGNER" "$OUT"/libmina_signer.so -fi -cp "$ref_signer"/*.h "$OUT/headers" - -case "$1" in - test) - cd src/delegation_backend - LD_LIBRARY_PATH="$OUT" $GO test - ;; - docker-run) - if [[ "$GOOGLE_APPLICATION_CREDENTIALS" == "" ]]; then - echo "Specify path to credentials JSON file in env variable GOOGLE_APPLICATION_CREDENTIALS" - exit 1 - fi - tag=delegation-backend-test - docker build -t "$tag" -f ../../../dockerfiles/Dockerfile-delegation-backend . - docker run -p 8080:8080 -v "$GOOGLE_APPLICATION_CREDENTIALS":/creds.json -e GOOGLE_APPLICATION_CREDENTIALS=/creds.json "$tag" - ;; - docker-toolchain | docker) - if [[ "$VERSION" == "" ]]; then - echo "Specify VERSION" - exit 1 - fi - cd ../../.. - scripts/release-docker.sh -s delegation-backend${1:6} -v "$VERSION" - ;; - "") - cd src/cmd/delegation_backend - $GO build -o "$OUT/bin/delegation_backend" - echo "to run use cmd: LD_LIBRARY_PATH=result ./result/bin/delegation_backend" - ;; - *) - echo "unknown command $1" - exit 2 - ;; -esac diff --git a/src/app/delegation_backend/shell.nix b/src/app/delegation_backend/shell.nix deleted file mode 100644 index 7949d24e6c1..00000000000 --- a/src/app/delegation_backend/shell.nix +++ /dev/null @@ -1,17 +0,0 @@ -with import { }; -let - minaSigner = import (fetchgit { - url = "https://github.com/MinaProtocol/c-reference-signer.git"; - rev = "6f492281cdf0206aa1771019e322a1fce03f2b35"; - sha256 = "sha256:0x5jwcqqz045ki9zmi2yn90k7bg10r66xcr7j6fdhf3dwpcvgcfi"; - }); -in { - devEnv = stdenv.mkDerivation { - name = "dev"; - buildInputs = [ stdenv go_1_18 glibc minaSigner ]; - shellHook = '' - export LIB_MINA_SIGNER=${minaSigner}/lib/libmina_signer.so - return - ''; - }; -} diff --git a/src/app/delegation_backend/src/cmd/delegation_backend/main_bpu.go b/src/app/delegation_backend/src/cmd/delegation_backend/main_bpu.go deleted file mode 100644 index ba5947b934d..00000000000 --- a/src/app/delegation_backend/src/cmd/delegation_backend/main_bpu.go +++ /dev/null @@ -1,67 +0,0 @@ -package main - -import ( - . "block_producers_uptime/delegation_backend" - "context" - "net/http" - "time" - - "github.com/aws/aws-sdk-go-v2/aws" - "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/service/s3" - logging "github.com/ipfs/go-log/v2" - "google.golang.org/api/option" - sheets "google.golang.org/api/sheets/v4" -) - -func main() { - logging.SetupLogging(logging.Config{ - Format: logging.JSONOutput, - Stderr: true, - Stdout: false, - Level: logging.LevelDebug, - File: "", - }) - log := logging.Logger("delegation backend") - log.Infof("delegation backend has the following logging subsystems active: %v", logging.GetSubsystems()) - - ctx := context.Background() - - appCfg := LoadEnv(log) - - awsCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(appCfg.Aws.Region)) - if err != nil { - log.Fatalf("Error loading AWS configuration: %v", err) - } - - app := new(App) - app.Log = log - http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) { - _, _ = rw.Write([]byte("delegation backend service")) - }) - http.Handle("/v1/submit", app.NewSubmitH()) - client := s3.NewFromConfig(awsCfg) - - awsctx := AwsContext{Client: client, BucketName: aws.String(GetBucketName(appCfg)), Prefix: appCfg.NetworkName, Context: ctx, Log: log} - app.Save = func(objs ObjectsToSave) { - awsctx.S3Save(objs) - } - app.Now = func() time.Time { return time.Now() } - app.SubmitCounter = NewAttemptCounter(REQUESTS_PER_PK_HOURLY) - sheetsService, err2 := sheets.NewService(ctx, option.WithScopes(sheets.SpreadsheetsReadonlyScope)) - if err2 != nil { - log.Fatalf("Error creating Sheets service: %v", err2) - } - initWl := RetrieveWhitelist(sheetsService, log, appCfg) - wlMvar := new(WhitelistMVar) - wlMvar.Replace(&initWl) - app.Whitelist = wlMvar - go func() { - for { - wl := RetrieveWhitelist(sheetsService, log, appCfg) - wlMvar.Replace(&wl) - time.Sleep(WHITELIST_REFRESH_INTERVAL) - } - }() - log.Fatal(http.ListenAndServe(DELEGATION_BACKEND_LISTEN_TO, nil)) -} diff --git a/src/app/delegation_backend/src/delegation_backend/app_config.go b/src/app/delegation_backend/src/delegation_backend/app_config.go deleted file mode 100644 index 4885760fd45..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/app_config.go +++ /dev/null @@ -1,94 +0,0 @@ -package delegation_backend - -import ( - "encoding/json" - "os" - - logging "github.com/ipfs/go-log/v2" -) - -func loadAwsCredentials(filename string, log logging.EventLogger) { - file, err := os.Open(filename) - if err != nil { - log.Fatalf("Error loading credentials file: %s", err) - } - defer file.Close() - decoder := json.NewDecoder(file) - var credentials AwsCredentials - err = decoder.Decode(&credentials) - if err != nil { - log.Fatalf("Error loading credentials file: %s", err) - } - os.Setenv("AWS_ACCESS_KEY_ID", credentials.AccessKeyId) - os.Setenv("AWS_SECRET_ACCESS_KEY", credentials.SecretAccessKey) -} - -func LoadEnv(log logging.EventLogger) AppConfig { - var config AppConfig - - configFile := os.Getenv("CONFIG_FILE") - if configFile != "" { - file, err := os.Open(configFile) - if err != nil { - log.Fatalf("Error loading config file: %s", err) - } - defer file.Close() - decoder := json.NewDecoder(file) - err = decoder.Decode(&config) - if err != nil { - log.Fatalf("Error loading config file: %s", err) - } - } else { - networkName := os.Getenv("CONFIG_NETWORK_NAME") - if networkName == "" { - log.Fatal("missing NETWORK_NAME environment variable") - } - - gsheetId := os.Getenv("CONFIG_GSHEET_ID") - if gsheetId == "" { - log.Fatal("missing GSHEET_ID environment variable") - } - - awsRegion := os.Getenv("CONFIG_AWS_REGION") - if awsRegion == "" { - log.Fatal("missing AWS_REGION environment variable") - } - - awsAccountId := os.Getenv("CONFIG_AWS_ACCOUNT_ID") - if awsAccountId == "" { - log.Fatal("missing AWS_ACCOUNT_ID environment variable") - } - - config = AppConfig{ - NetworkName: networkName, - GsheetId: gsheetId, - Aws: AwsConfig{ - Region: awsRegion, - AccountId: awsAccountId, - }, - } - } - - awsCredentialsFile := os.Getenv("AWS_CREDENTIALS_FILE") - if awsCredentialsFile != "" { - loadAwsCredentials(awsCredentialsFile, log) - } - - return config -} - -type AwsConfig struct { - Region string `json:"region"` - AccountId string `json:"account_id"` -} - -type AppConfig struct { - Aws AwsConfig `json:"aws"` - NetworkName string `json:"network_name"` - GsheetId string `json:"gsheet_id"` -} - -type AwsCredentials struct { - AccessKeyId string `json:"access_key_id"` - SecretAccessKey string `json:"secret_access_key"` -} diff --git a/src/app/delegation_backend/src/delegation_backend/constants.go b/src/app/delegation_backend/src/delegation_backend/constants.go deleted file mode 100644 index a440ffc14ac..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/constants.go +++ /dev/null @@ -1,37 +0,0 @@ -package delegation_backend - -import ( - "os" - "time" -) - -const MAX_SUBMIT_PAYLOAD_SIZE = 50000000 // max payload size in bytes -const REQUESTS_PER_PK_HOURLY = 120 -const DELEGATION_BACKEND_LISTEN_TO = ":8080" -const TIME_DIFF_DELTA time.Duration = -5 * 60 * 1000000000 // -5m -const WHITELIST_REFRESH_INTERVAL = 10 * 60 * 1000000000 // 10m -const DELEGATION_WHITELIST_LIST = "Form Responses 1" -const DELEGATION_WHITELIST_COLUMN = "E" - -var PK_PREFIX = [...]byte{1, 1} -var SIG_PREFIX = [...]byte{1} -var BLOCK_HASH_PREFIX = [...]byte{1} - -func NetworkId() uint8 { - if os.Getenv("NETWORK") == "" { - return 1 - } - return 0 -} - -func GetBucketName(config AppConfig) string { - return config.Aws.AccountId + "-block-producers-uptime" -} - -const PK_LENGTH = 33 // one field element (32B) + 1 bit (encoded as full byte) -const SIG_LENGTH = 64 // one field element (32B) and one scalar (32B) - -// we use state hash code here, although it's not state hash -const BASE58CHECK_VERSION_BLOCK_HASH byte = 0x10 -const BASE58CHECK_VERSION_PK byte = 0xCB -const BASE58CHECK_VERSION_SIG byte = 0x9A diff --git a/src/app/delegation_backend/src/delegation_backend/data.go b/src/app/delegation_backend/src/delegation_backend/data.go deleted file mode 100644 index 9216a9092e0..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/data.go +++ /dev/null @@ -1,210 +0,0 @@ -package delegation_backend - -import ( - "bytes" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "time" - - "github.com/btcsuite/btcutil/base58" - "golang.org/x/crypto/blake2b" -) - -// Just a different interface for Unmarshal -func JSONToString(b []byte) (s string, err error) { - err = json.Unmarshal(b, &s) - return -} -func StringToPk(pk *Pk, s string) error { - bs, ver, err := base58.CheckDecode(s) - if err == nil && ver != BASE58CHECK_VERSION_PK { - return errors.New("unexpected base58check version for Pk") - } - if err == nil { - prefixLen := len(PK_PREFIX) - if len(bs) == PK_LENGTH+prefixLen { - if bytes.Equal(bs[:prefixLen], PK_PREFIX[:]) { - copy(pk[:], bs[prefixLen:]) - } else { - err = errors.New("unexpected prefix of Pk") - } - } else { - err = fmt.Errorf("public key of an unexpected size %d", len(bs)) - } - } - return err -} -func StringToSig(sig *Sig, s string) error { - bs, ver, err := base58.CheckDecode(s) - if err == nil && ver != BASE58CHECK_VERSION_SIG { - return errors.New("unexpected base58check version for Sig") - } - if err == nil { - prefixLen := len(SIG_PREFIX) - if len(bs) == SIG_LENGTH+prefixLen { - if bytes.Equal(bs[:prefixLen], SIG_PREFIX[:]) { - copy(sig[:], bs[prefixLen:]) - } else { - err = errors.New("unexpected prefix of signature") - } - } else { - err = fmt.Errorf("signature of an unexpected size %d", len(bs)) - } - } - return err -} - -type Sig [SIG_LENGTH]byte - -func (sig *Sig) UnmarshalJSON(b []byte) error { - s, err := JSONToString(b) - if err == nil { - err = StringToSig(sig, s) - } - return err -} -func (d Sig) MarshalJSON() ([]byte, error) { - return json.Marshal(base58.CheckEncode(append(SIG_PREFIX[:], d[:]...), BASE58CHECK_VERSION_SIG)) -} - -type Pk [PK_LENGTH]byte - -func (pk *Pk) UnmarshalJSON(b []byte) error { - s, err := JSONToString(b) - if err == nil { - err = StringToPk(pk, s) - } - return err -} -func (pk Pk) MarshalJSON() ([]byte, error) { - return json.Marshal(pk.String()) -} -func (pk Pk) Format() string { - return pk.String() -} -func (pk Pk) String() string { - return base58.CheckEncode(append(PK_PREFIX[:], pk[:]...), BASE58CHECK_VERSION_PK) -} - -type Base64 struct { - data []byte - json []byte -} - -func (d *Base64) UnmarshalJSON(b []byte) error { - var s string - if err := json.Unmarshal(b, &s); err != nil { - return err - } - bs, err := base64.StdEncoding.DecodeString(s) - if err == nil { - d.data = bs - d.json = b - } - return err -} -func (d *Base64) MarshalJSON() ([]byte, error) { - return d.json, nil -} - -type BufferOrError struct { - Buf bytes.Buffer - Err error -} - -func (boe *BufferOrError) WriteString(s string) { - if boe.Err == nil { - _, err := boe.Buf.WriteString(s) - boe.Err = err - } -} - -func (boe *BufferOrError) Write(b []byte) { - if boe.Err == nil { - _, err := boe.Buf.Write(b) - boe.Err = err - } -} - -type MetaToBeSaved struct { - CreatedAt string `json:"created_at"` - PeerId string `json:"peer_id"` - SnarkWork *Base64 `json:"snark_work,omitempty"` - RemoteAddr string `json:"remote_addr"` - Submitter Pk `json:"submitter"` // is base58check-encoded submitter's public key - BlockHash string `json:"block_hash"` // is base58check-encoded hash of a block - GraphqlControlPort int `json:"graphql_control_port,omitempty"` - BuiltWithCommitSha string `json:"built_with_commit_sha,omitempty"` -} - -type submitRequestData struct { - PeerId string `json:"peer_id"` - Block *Base64 `json:"block"` - SnarkWork *Base64 `json:"snark_work,omitempty"` - CreatedAt time.Time `json:"created_at"` - GraphqlControlPort int `json:"graphql_control_port,omitempty"` - BuiltWithCommitSha string `json:"built_with_commit_sha,omitempty"` -} -type submitRequest struct { - Submitter Pk `json:"submitter"` - Sig Sig `json:"signature"` - Data submitRequestData `json:"data"` -} - -func (req submitRequest) GetBlockDataHash() string { - blockHashBytes := blake2b.Sum256(req.Data.Block.data) - return base58.CheckEncode(blockHashBytes[:], BASE58CHECK_VERSION_BLOCK_HASH) -} - -func (req submitRequestData) MakeSignPayload() ([]byte, error) { - createdAtStr := req.CreatedAt.UTC().Format(time.RFC3339) - createdAtJson, err2 := json.Marshal(createdAtStr) - if err2 != nil { - return nil, err2 - } - signPayload := new(BufferOrError) - signPayload.WriteString("{\"block\":") - signPayload.Write(req.Block.json) - signPayload.WriteString(",\"created_at\":") - signPayload.Write(createdAtJson) - signPayload.WriteString(",\"peer_id\":\"") - signPayload.WriteString(req.PeerId) - signPayload.WriteString("\"") - if req.SnarkWork != nil { - signPayload.WriteString(",\"snark_work\":") - signPayload.Write(req.SnarkWork.json) - } - if req.GraphqlControlPort != 0 { - signPayload.WriteString(",\"graphql_control_port\":") - signPayload.WriteString(fmt.Sprintf("%d", req.GraphqlControlPort)) - } - if req.BuiltWithCommitSha != "" { - signPayload.WriteString(",\"built_with_commit_sha\":\"") - signPayload.WriteString(req.BuiltWithCommitSha) - signPayload.WriteString("\"") - } - signPayload.WriteString("}") - return signPayload.Buf.Bytes(), signPayload.Err -} - -func (req submitRequest) MakeMetaToBeSaved(remoteAddr string) ([]byte, error) { - meta := MetaToBeSaved{ - CreatedAt: req.Data.CreatedAt.Format(time.RFC3339), - PeerId: req.Data.PeerId, - SnarkWork: req.Data.SnarkWork, - RemoteAddr: remoteAddr, - BlockHash: req.GetBlockDataHash(), - Submitter: req.Submitter, - GraphqlControlPort: req.Data.GraphqlControlPort, - BuiltWithCommitSha: req.Data.BuiltWithCommitSha, - } - - return json.Marshal(meta) -} - -func (req submitRequest) CheckRequiredFields() bool { - return req.Data.Block != nil && req.Data.PeerId != "" && - req.Data.CreatedAt != nilTime && req.Submitter != nilPk && req.Sig != nilSig -} diff --git a/src/app/delegation_backend/src/delegation_backend/data_test.go b/src/app/delegation_backend/src/delegation_backend/data_test.go deleted file mode 100644 index f2f32277262..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/data_test.go +++ /dev/null @@ -1,128 +0,0 @@ -package delegation_backend - -import ( - "encoding/json" - "github.com/btcsuite/btcutil/base58" - "math/rand" - "reflect" - "testing" - "testing/quick" -) - -var STR_ALPHABET = []rune("0123456789[]{};'/.,~abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") - -const B58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" - -func randBytes(n int, r *rand.Rand) []byte { - b := make([]byte, n) - _, _ = r.Read(b) - return b -} - -func randB58(prefix []byte, n int, ver byte, r *rand.Rand) ([]byte, string) { - bs := append(prefix, randBytes(n, r)...) - return bs, base58.CheckEncode(bs, ver) -} - -func randB58WithWrongCheck(prefix []byte, n int, ver byte, r *rand.Rand) string { - var v2 string - _, v2 = randB58(prefix, n, ver, r) - return randReplaceOneChar(v2, B58_ALPHABET, r) -} - -func randReplaceOneChar(s string, alphabet string, r *rand.Rand) string { - bs := []byte(s) - i := r.Intn(len(bs)) - bs[i] = randOther(bs[i], func() interface{} { - return alphabet[r.Intn(len(alphabet))] - }, r).(byte) - return string(bs) -} - -func randOther(orig interface{}, gen func() interface{}, r *rand.Rand) interface{} { - for { - c := gen() - if orig != c { - return c - } - } -} - -func randString(r *rand.Rand) string { - n := r.Intn(100) - b := make([]rune, n) - for i := range b { - b[i] = STR_ALPHABET[r.Intn(len(STR_ALPHABET))] - } - return string(b) -} - -type PkJSONUnmarshalTestData struct { - good string - bad []string - pk Pk -} - -type SigJSONUnmarshalTestData struct { - good string - bad []string - sig Sig -} - -func genB58JSONUnmarshalData(prefix []byte, bs []byte, ver byte, r *rand.Rand) (string, []string) { - fullBs := append(prefix, bs...) - good := base58.CheckEncode(fullBs, ver) - rv := randOther(ver, func() interface{} { - return byte(r.Uint32() % 256) - }, r).(byte) - bad1 := base58.CheckEncode(fullBs, rv) - bad2 := randReplaceOneChar(good, B58_ALPHABET, r) - bad3 := randReplaceOneChar(bad1, B58_ALPHABET, r) - l := randOther(len(bs), func() interface{} { - return r.Intn(1000) + 1 - }, r).(int) - _, bad4 := randB58(prefix, l, ver, r) - return good, []string{bad1, bad2, bad3, bad4} -} - -func (PkJSONUnmarshalTestData) Generate(r *rand.Rand, size int) reflect.Value { - var pk Pk - r.Read(pk[:]) - good, bad := genB58JSONUnmarshalData(PK_PREFIX[:], pk[:], BASE58CHECK_VERSION_PK, r) - return reflect.ValueOf(PkJSONUnmarshalTestData{good, bad, pk}) -} - -func (SigJSONUnmarshalTestData) Generate(r *rand.Rand, size int) reflect.Value { - var sig Sig - r.Read(sig[:]) - good, bad := genB58JSONUnmarshalData(SIG_PREFIX[:], sig[:], BASE58CHECK_VERSION_SIG, r) - return reflect.ValueOf(SigJSONUnmarshalTestData{good, bad, sig}) -} - -func TestPkJSONUnmarshal(t *testing.T) { - f := func(td PkJSONUnmarshalTestData) bool { - var v Pk - b := json.Unmarshal([]byte("\""+td.good+"\""), &v) == nil && v == td.pk - for _, bad := range td.bad { - b = b && json.Unmarshal([]byte("\""+bad+"\""), &v) != nil - } - return b - } - if err := quick.Check(f, nil); err != nil { - t.Error(err) - } -} - -func TestSigJSONUnmarshal(t *testing.T) { - f := func(td SigJSONUnmarshalTestData) bool { - var v Sig - b := json.Unmarshal([]byte("\""+td.good+"\""), &v) == nil && v == td.sig - for _, bad := range td.bad { - b = b && json.Unmarshal([]byte("\""+bad+"\""), &v) != nil - } - return b - } - if err := quick.Check(f, nil); err != nil { - t.Error(err) - } -} diff --git a/src/app/delegation_backend/src/delegation_backend/sheets.go b/src/app/delegation_backend/src/delegation_backend/sheets.go deleted file mode 100644 index 788d1765621..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/sheets.go +++ /dev/null @@ -1,39 +0,0 @@ -package delegation_backend - -import ( - logging "github.com/ipfs/go-log/v2" - sheets "google.golang.org/api/sheets/v4" -) - -// Process rows retrieved from Google spreadsheet -// and extract public keys from the first column. -func processRows(rows [][](interface{})) Whitelist { - wl := make(Whitelist) - for _, row := range rows { - if len(row) > 0 { - switch v := row[0].(type) { - case string: - var pk Pk - err := StringToPk(&pk, v) - if err == nil { - wl[pk] = true // we need something to be provided as value - } - } - } - } - return wl -} - -// Retrieve data from delegation program spreadsheet -// and extract public keys out of the column containing -// public keys of program participants. -func RetrieveWhitelist(service *sheets.Service, log *logging.ZapEventLogger, appCfg AppConfig) Whitelist { - col := DELEGATION_WHITELIST_COLUMN - readRange := DELEGATION_WHITELIST_LIST + "!" + col + ":" + col - spId := appCfg.GsheetId - resp, err := service.Spreadsheets.Values.Get(spId, readRange).Do() - if err != nil { - log.Fatalf("Unable to retrieve data from sheet: %v", err) - } - return processRows(resp.Values) -} diff --git a/src/app/delegation_backend/src/delegation_backend/sheets_test.go b/src/app/delegation_backend/src/delegation_backend/sheets_test.go deleted file mode 100644 index 9a580f843fb..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/sheets_test.go +++ /dev/null @@ -1,80 +0,0 @@ -package delegation_backend - -import ( - "encoding/hex" - "math/rand" - "reflect" - "testing" - "testing/quick" -) - -func randRow(r *rand.Rand) ([](interface{}), *Pk) { - var v (interface{}) - var pk *Pk - switch i := r.Intn(10); i { - case 0: // Random hexadecimal string - v = hex.EncodeToString(randBytes(r.Intn(100)+1, r)) - case 1: // Random string starting with https:// - v = "https://" + randString(r) - case 2: // Correct base58check-encoded pk - var bs []byte - bs, v = randB58(PK_PREFIX[:], PK_LENGTH, BASE58CHECK_VERSION_PK, r) - var pk_ Pk - copy(pk_[:], bs[len(PK_PREFIX):]) - pk = &pk_ - case 3: // Correct base58check-encoded bytestring with a random non-pk version byte - ver := randOther(BASE58CHECK_VERSION_PK, func() interface{} { - return byte(r.Uint32() % 256) - }, r).(byte) - _, v = randB58(PK_PREFIX[:], PK_LENGTH, ver, r) - case 4: // Incorrect base58check-encoded (one of the symbols altered, so check won't succeed) - v = randB58WithWrongCheck(PK_PREFIX[:], PK_LENGTH, BASE58CHECK_VERSION_PK, r) - case 5: // Integer - v = r.Int() - case 6: // Empty cell - v = "" - case 7: // Empty row - return [](interface{}){}, nil - case 8: // Correct base58check-encoded, wrong length - l := randOther(PK_LENGTH, func() interface{} { - return r.Intn(1000) + 1 - }, r).(int) - _, v = randB58(PK_PREFIX[:], l, BASE58CHECK_VERSION_PK, r) - case 9: // Float - v = r.Float64() - } - return [](interface{}){v}, pk -} - -type Rows struct { - rows [][](interface{}) - expected Whitelist -} - -func (Rows) Generate(r *rand.Rand, size int) reflect.Value { - res := make([][](interface{}), 0, size) - wl := make(Whitelist) - for j := 0; j < size; j++ { - row, pk := randRow(r) - res = append(res, row) - if pk != nil { - wl[*pk] = true - } - } - return reflect.ValueOf(Rows{res, wl}) -} - -func TestProcessRow(t *testing.T) { - f := func(rows Rows) bool { - actual := processRows(rows.rows) - res := reflect.DeepEqual(map[Pk]unit(rows.expected), map[Pk]unit(actual)) - if !res { - t.Logf("expected: %s", rows.expected) - t.Logf("actual: %s", actual) - } - return res - } - if err := quick.Check(f, nil); err != nil { - t.Error(err) - } -} diff --git a/src/app/delegation_backend/src/delegation_backend/signer.go b/src/app/delegation_backend/src/delegation_backend/signer.go deleted file mode 100644 index aeb861a87b7..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/signer.go +++ /dev/null @@ -1,20 +0,0 @@ -package delegation_backend - -// TODO think of getting rid of -L flags with relative paths - -// #cgo LDFLAGS: -L ../../result -// #cgo LDFLAGS: -lmina_signer -lm -// #cgo CFLAGS: -w -I ../../result/headers -// #include "crypto.h" -import "C" -import "unsafe" - -func verifySig(pk *Pk, sig *Sig, data []byte, networkId uint8) bool { - pkC := C.CString(string(pk[:])) - defer C.free(unsafe.Pointer(pkC)) - sigC := C.CString(string(sig[:])) - defer C.free(unsafe.Pointer(sigC)) - dataC := C.CString(string(data)) - defer C.free(unsafe.Pointer(dataC)) - return bool(C.verify_message_string(sigC, pkC, dataC, C.size_t(len(data)), C.uint8_t(networkId))) -} diff --git a/src/app/delegation_backend/src/delegation_backend/signer_test.go b/src/app/delegation_backend/src/delegation_backend/signer_test.go deleted file mode 100644 index 7e9337c66fc..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/signer_test.go +++ /dev/null @@ -1,96 +0,0 @@ -package delegation_backend - -import ( - "encoding/json" - "testing" - - "golang.org/x/crypto/blake2b" -) - -func testVerifySig(pkStr string, sigStr string, data []byte, t *testing.T) { - var pk Pk - var sig Sig - if err := StringToSig(&sig, sigStr); err != nil { - t.Logf("Error parsing sig: %s", sigStr) - t.FailNow() - } - if err := StringToPk(&pk, pkStr); err != nil { - t.Logf("Error parsing pk: %s", pkStr) - t.FailNow() - } - if !verifySig(&pk, &sig, data, 1) { - t.FailNow() - } -} - -func testVerifyRequest(name string, networkId uint8, t *testing.T) { - body := readTestFile(name, t) - var req submitRequest - - if err := json.Unmarshal(body, &req); err != nil { - t.Log("failed decoding test file") - t.FailNow() - } - j, err := req.Data.MakeSignPayload() - if err != nil { - t.Log("failed making sign test file") - t.FailNow() - } - hash := blake2b.Sum256(j) - t.Logf("sign payload:\n%s", j) - if !verifySig(&req.Submitter, &req.Sig, hash[:], networkId) { - t.Log("signature verification failed") - t.FailNow() - } -} - -const PK1 = "B62qkaKV3BLvLTf7nYXRehSaZAd36NWijt3MEmy2QgHRavboeRGtBMN" -const SIG1 = "7mX7qCqaB8G5ry12EkqY9fcE6np8sdF1Kg3Hac77bRhwGq5PTBLEiNveEXn7oLgFs1dmxXyGwn5iCunBhamjNjrzNEdoJhwd" - -func TestVerifySig1(t *testing.T) { - testVerifySig(PK1, SIG1, []byte{0, 0}, t) -} - -const PK2 = "B62qn4kByk45GFDMHwVf2smYEVTehGN638UBHMaQzyLJf52wtdtCjRA" -const SIG2 = "7mXTf2BWNYSPuKGa3LT4ywcNH4EAqY5YoaasShG4Dpm44oJZMu1BZmVuGGqeDbfxUhvt2UcPZgSSQcv567dFueK22JoHndk9" - -func TestVerifySig2(t *testing.T) { - testVerifySig(PK2, SIG2, []byte{0x80}, t) -} - -const PK3 = "B62qkgvrx8WoDqTzXaUm2vqBRbkiqTts35Z9n4XcrFez1KG3MHKHTbn" -const SIG3 = "7mX6xdEWghp5vhuV33h1o4n8PQ8RYYMGNEwUXxk3rPm8inZ72Yxjw9zhvc3mtkFPnGAbqy3rxBYXdFrVBt9YbKzRKZ1RLLeC" - -func TestVerifySig3(t *testing.T) { - testVerifySig(PK3, SIG3, []byte{0xFF}, t) -} - -const PK4 = "B62qoJC4KuLXgTEX2uwQGPNZSnqRTvJHzcEzkWTDFTXMsqdXPNKxJLs" -const SIG4 = "7mXHTjT2Rbt2L2u8uqdtXcLP4iKPLtDAQ1qhfGhuFAjCzc85T6yAuhVndh8pnuhdQqRrz2x2G6uFJUdfCYdJFUWNgEb6g9zH" - -func TestVerifySig4(t *testing.T) { - body := readTestFile("payload-no-snark", t) - hash := blake2b.Sum256(body) - testVerifySig(PK4, SIG4, hash[:], t) -} - -const PK5 = "B62qoJC4KuLXgTEX2uwQGPNZSnqRTvJHzcEzkWTDFTXMsqdXPNKxJLs" -const SIG5 = "7mX9wQokYSpqabWdsD8neahB1DEHeeYwHdsw9d5ADTcLgwN6pjXCshM7p8pySiFF8epxk4mvxa8fmwTQu7tjjg3UUSzSBTwA" - -func TestVerifySig5(t *testing.T) { - body := readTestFile("payload-with-snark", t) - hash := blake2b.Sum256(body) - testVerifySig(PK5, SIG5, hash[:], t) -} - -func TestVerifyRequest1(t *testing.T) { - testVerifyRequest("req-with-snark", 1, t) -} - -func TestVerifyRequest2(t *testing.T) { - testVerifyRequest("req-no-snark", 1, t) -} - -func TestVerifyRequestV1(t *testing.T) { - testVerifyRequest("req-v1-with-snark", 0, t) -} diff --git a/src/app/delegation_backend/src/delegation_backend/submit.go b/src/app/delegation_backend/src/delegation_backend/submit.go deleted file mode 100644 index 273b3e02c20..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/submit.go +++ /dev/null @@ -1,207 +0,0 @@ -package delegation_backend - -import ( - "bytes" - "context" - "encoding/json" - "io" - "net/http" - "strings" - "time" - - "github.com/aws/aws-sdk-go-v2/aws" - "github.com/aws/aws-sdk-go-v2/service/s3" - logging "github.com/ipfs/go-log/v2" - "golang.org/x/crypto/blake2b" -) - -type errorResponse struct { - Msg string `json:"error"` -} - -func writeErrorResponse(app *App, w *http.ResponseWriter, msg string) { - app.Log.Debugf("Responding with error: %s", msg) - bs, err := json.Marshal(errorResponse{msg}) - if err == nil { - _, err2 := io.Copy(*w, bytes.NewReader(bs)) - if err2 != nil { - app.Log.Debugf("Failed to respond with error status: %v", err2) - } - } else { - app.Log.Fatal("Failed to json-marshal error message") - } -} - -func (ctx *AwsContext) S3Save(objs ObjectsToSave) { - for path, bs := range objs { - fullKey := aws.String(ctx.Prefix + "/" + path) - if strings.HasPrefix(path, "blocks/") { - _, err := ctx.Client.HeadObject(ctx.Context, &s3.HeadObjectInput{ - Bucket: ctx.BucketName, - Key: fullKey, - }) - if err == nil { - //block already exists, skipping - continue - } - if !strings.Contains(err.Error(), "NotFound") { - ctx.Log.Warnf("S3Save: Error when checking if block exists, but will continue with block save: %s, error: %v", path, err) - } - } - - ctx.Log.Debugf("S3Save: saving %s", path) - _, err := ctx.Client.PutObject(ctx.Context, &s3.PutObjectInput{ - Bucket: ctx.BucketName, - Key: fullKey, - Body: bytes.NewReader(bs), - ContentMD5: nil, - }) - if err != nil { - ctx.Log.Warnf("S3Save: Error while saving metadata: %v", err) - } - } -} - -type ObjectsToSave map[string][]byte - -type AwsContext struct { - Client *s3.Client - BucketName *string - Prefix string - Context context.Context - Log *logging.ZapEventLogger -} - -type App struct { - Log *logging.ZapEventLogger - SubmitCounter *AttemptCounter - Whitelist *WhitelistMVar - Save func(ObjectsToSave) - Now nowFunc -} - -type SubmitH struct { - app *App -} - -type Paths struct { - Meta string - Block string -} - -func MakePathsImpl(submittedAt string, blockHash string, submitter Pk) (res Paths) { - res.Meta = strings.Join([]string{"submissions", submittedAt[:10], submittedAt + "-" + submitter.String() + ".json"}, "/") - res.Block = "blocks/" + blockHash + ".dat" - return -} -func makePaths(submittedAt time.Time, blockHash string, submitter Pk) Paths { - submittedAtStr := submittedAt.UTC().Format(time.RFC3339) - return MakePathsImpl(submittedAtStr, blockHash, submitter) -} - -// TODO consider using pointers and doing `== nil` comparison -var nilSig Sig -var nilPk Pk -var nilTime time.Time - -func (h *SubmitH) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if r.ContentLength == -1 { - w.WriteHeader(411) - return - } else if r.ContentLength > MAX_SUBMIT_PAYLOAD_SIZE { - w.WriteHeader(413) - return - } - body, err1 := io.ReadAll(io.LimitReader(r.Body, r.ContentLength)) - if err1 != nil || int64(len(body)) != r.ContentLength { - h.app.Log.Debugf("Error while reading /submit request's body: %v", err1) - w.WriteHeader(400) - writeErrorResponse(h.app, &w, "Error reading the body") - return - } - - var req submitRequest - if err := json.Unmarshal(body, &req); err != nil { - h.app.Log.Debugf("Error while unmarshaling JSON of /submit request's body: %v", err) - w.WriteHeader(400) - writeErrorResponse(h.app, &w, "Error decoding payload") - return - } - - if !req.CheckRequiredFields() { - h.app.Log.Debug("One of required fields wasn't provided") - w.WriteHeader(400) - writeErrorResponse(h.app, &w, "One of required fields wasn't provided") - return - } - - wl := h.app.Whitelist.ReadWhitelist() - if (*wl)[req.Submitter] == nil { - w.WriteHeader(401) - writeErrorResponse(h.app, &w, "Submitter is not registered") - return - } - - submittedAt := h.app.Now() - if req.Data.CreatedAt.Add(TIME_DIFF_DELTA).After(submittedAt) { - h.app.Log.Debugf("Field created_at is a timestamp in future: %v", submittedAt) - w.WriteHeader(400) - writeErrorResponse(h.app, &w, "Field created_at is a timestamp in future") - return - } - - payload, err := req.Data.MakeSignPayload() - if err != nil { - h.app.Log.Errorf("Error while making sign payload: %v", err) - w.WriteHeader(500) - writeErrorResponse(h.app, &w, "Unexpected server error") - return - } - - hash := blake2b.Sum256(payload) - if !verifySig(&req.Submitter, &req.Sig, hash[:], NetworkId()) { - w.WriteHeader(401) - writeErrorResponse(h.app, &w, "Invalid signature") - return - } - - passesAttemptLimit := h.app.SubmitCounter.RecordAttempt(req.Submitter) - if !passesAttemptLimit { - w.WriteHeader(429) - writeErrorResponse(h.app, &w, "Too many requests per hour") - return - } - - blockHash := req.GetBlockDataHash() - ps := makePaths(submittedAt, blockHash, req.Submitter) - - remoteAddr := r.Header.Get("X-Forwarded-For") - if remoteAddr == "" { - // If there is no X-Forwarded-For header, use the remote address - remoteAddr = r.RemoteAddr - } - - metaBytes, err1 := req.MakeMetaToBeSaved(remoteAddr) - if err1 != nil { - h.app.Log.Errorf("Error while marshaling JSON for metaToBeSaved: %v", err1) - w.WriteHeader(500) - writeErrorResponse(h.app, &w, "Unexpected server error") - return - } - - toSave := make(ObjectsToSave) - toSave[ps.Meta] = metaBytes - toSave[ps.Block] = []byte(req.Data.Block.data) - h.app.Save(toSave) - - _, err2 := io.Copy(w, bytes.NewReader([]byte("{\"status\":\"ok\"}"))) - if err2 != nil { - h.app.Log.Debugf("Error while responding with ok status to the user: %v", err2) - } -} - -func (app *App) NewSubmitH() *SubmitH { - s := new(SubmitH) - s.app = app - return s -} diff --git a/src/app/delegation_backend/src/delegation_backend/submit_test.go b/src/app/delegation_backend/src/delegation_backend/submit_test.go deleted file mode 100644 index 984a8943e0f..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/submit_test.go +++ /dev/null @@ -1,257 +0,0 @@ -package delegation_backend - -import ( - "bytes" - "encoding/base64" - "encoding/json" - "io/ioutil" - "math/rand" - "net/http/httptest" - "testing" - "time" - - logging "github.com/ipfs/go-log/v2" -) - -const TSPG_EXPECTED_1 = `{"block":"zLgvHQzxSh8MWlTjXK+cMA==","created_at":"2021-07-01T16:21:33Z","peer_id":"MLF0jAGTpL84LLerLddNs5M10NCHM+BwNeMxK78+"}` -const TSPG_EXPECTED_2 = `{"block":"zLgvHQzxSh8MWlTjXK+cMA==","created_at":"2021-07-01T16:21:33Z","peer_id":"MLF0jAGTpL84LLerLddNs5M10NCHM+BwNeMxK78+","snark_work":"Bjtox/3Yu4cT5eVCQz/JQ+P3Ce1JmCIE7N6b1MAa"}` - -func mkB64(s string) *Base64 { - r := new(Base64) - r.json = []byte("\"" + s + "\"") - r.data, _ = base64.StdEncoding.DecodeString(s) - return r -} - -func mkB64B(b []byte) *Base64 { - r := new(Base64) - r.json = []byte("\"" + base64.StdEncoding.EncodeToString(b) + "\"") - r.data = b - return r -} - -func TestSignPayloadGeneration(t *testing.T) { - req := new(submitRequest) - req.Data.PeerId = "MLF0jAGTpL84LLerLddNs5M10NCHM+BwNeMxK78+" - req.Data.Block = mkB64("zLgvHQzxSh8MWlTjXK+cMA==") - req.Data.CreatedAt, _ = time.Parse(time.RFC3339, "2021-07-01T19:21:33+03:00") - json, err := req.Data.MakeSignPayload() - if err != nil || !bytes.Equal(json, []byte(TSPG_EXPECTED_1)) { - t.FailNow() - } - req.Data.SnarkWork = mkB64("Bjtox/3Yu4cT5eVCQz/JQ+P3Ce1JmCIE7N6b1MAa") - json, err = req.Data.MakeSignPayload() - if err != nil || !bytes.Equal(json, []byte(TSPG_EXPECTED_2)) { - t.FailNow() - } -} - -func testSubmitH(maxAttempt int, initWl Whitelist) (*ObjectsToSave, *SubmitH, *timeMock) { - storage := make(ObjectsToSave) - log := logging.Logger("delegation backend test") - app := new(App) - app.Log = log - app.Save = func(objs ObjectsToSave) { - for path, value := range objs { - storage[path] = value - } - } - counter, tm := newTestAttemptCounter(1) - app.SubmitCounter = counter - app.Now = tm.Now - wlMvar := new(WhitelistMVar) - wlMvar.Replace(&initWl) - app.Whitelist = wlMvar - return &storage, app.NewSubmitH(), tm -} - -const v1Submit = "http://127.0.0.1/v1/submit" - -func (sh *SubmitH) testRequest(body []byte) *httptest.ResponseRecorder { - recorder := httptest.NewRecorder() - req := httptest.NewRequest("POST", v1Submit, bytes.NewReader(body)) - sh.ServeHTTP(recorder, req) - return recorder -} - -func readTestFile(n string, t *testing.T) []byte { - body, err := ioutil.ReadFile("../../test/data/" + n + ".json") - if err != nil { - t.Log("can not read test file") - t.FailNow() - } - return body -} - -func TestWrongLengthProvided(t *testing.T) { - body := readTestFile("req-no-snark", t) - _, sh, _ := testSubmitH(1, Whitelist{}) - rep := httptest.NewRecorder() - req := httptest.NewRequest("POST", v1Submit, bytes.NewReader(body)) - req.ContentLength = req.ContentLength + 100 - sh.ServeHTTP(rep, req) - if rep.Code != 400 { - t.Log(rep) - t.FailNow() - } -} - -func TestNoLengthProvided(t *testing.T) { - body := readTestFile("req-no-snark", t) - _, sh, _ := testSubmitH(1, Whitelist{}) - rep := httptest.NewRecorder() - req := httptest.NewRequest("POST", v1Submit, bytes.NewReader(body)) - req.ContentLength = -1 - sh.ServeHTTP(rep, req) - if rep.Code != 411 { - t.Log(rep) - t.FailNow() - } -} - -func TestTooLarge(t *testing.T) { - var req submitRequest - if err := json.Unmarshal(readTestFile("req-no-snark", t), &req); err != nil { - t.Log("failed decoding test file") - t.FailNow() - } - block := make([]byte, MAX_SUBMIT_PAYLOAD_SIZE+1) - _, _ = rand.Read(block) - req.Data.Block = mkB64B(block[:]) - body, err := json.Marshal(req) - if err != nil { - t.Log("failed encoding JSON body") - t.FailNow() - } - _, sh, _ := testSubmitH(1, Whitelist{}) - rep := sh.testRequest(body) - if rep.Code != 413 { - t.Log(rep) - t.FailNow() - } -} - -func TestUnauthorized(t *testing.T) { - body := readTestFile("req-no-snark", t) - _, sh, _ := testSubmitH(1, Whitelist{}) - rep := sh.testRequest(body) - if rep.Code != 401 { - t.Log(rep) - t.FailNow() - } -} - -func TestPkLimitExceeded(t *testing.T) { - body := readTestFile("req-with-snark", t) - var req submitRequest - if err := json.Unmarshal(body, &req); err != nil { - t.Log("failed decoding test file") - t.FailNow() - } - otherSubmitter := mkPk() - _, sh, _ := testSubmitH(1, Whitelist{req.Submitter: true, otherSubmitter: true}) - rep := sh.testRequest(body) - if rep.Code != 200 { - t.Logf("Unexpected failure: %v", rep) - t.FailNow() - } - rep2 := sh.testRequest(body) - if rep2.Code != 429 { - t.Log(rep2) - t.FailNow() - } - req.Submitter = otherSubmitter - body2, err := json.Marshal(req) - if err != nil { - t.Log("failed encoding JSON body") - t.FailNow() - } - rep3 := sh.testRequest(body2) - if rep3.Code != 401 { - t.Log(rep3) - t.FailNow() - } -} - -func TestSuccess(t *testing.T) { - testNames := []string{"req-no-snark", "req-with-snark"} - for _, f := range testNames { - body := readTestFile(f, t) - var req submitRequest - if err := json.Unmarshal(body, &req); err != nil { - t.Logf("failed decoding test file %s", f) - t.FailNow() - } - objs, sh, tm := testSubmitH(1, Whitelist{req.Submitter: true}) - rep := sh.testRequest(body) - if rep.Code != 200 { - t.Logf("Failed testing %s: %v", f, rep) - t.FailNow() - } - bhStr := req.GetBlockDataHash() - paths := makePaths(tm.Now(), bhStr, req.Submitter) - var meta MetaToBeSaved - meta.CreatedAt = req.Data.CreatedAt.Format(time.RFC3339) - meta.PeerId = req.Data.PeerId - meta.SnarkWork = req.Data.SnarkWork - meta.RemoteAddr = "192.0.2.1:1234" - meta.BlockHash = bhStr - meta.Submitter = req.Submitter - metaBytes, err2 := json.Marshal(meta) - if err2 != nil || !bytes.Equal((*objs)[paths.Meta], metaBytes) || - !bytes.Equal((*objs)[paths.Block], req.Data.Block.data) { - t.Logf("Content check failed for %s", f) - t.FailNow() - } - } -} - -func Test40x(t *testing.T) { - body := readTestFile("req-with-snark", t) - var req submitRequest - if err := json.Unmarshal(body, &req); err != nil { - t.Log("failed decoding test file") - t.FailNow() - } - _, sh, tm := testSubmitH(1, Whitelist{req.Submitter: true}) - //2. Malformed JSON - if rep := sh.testRequest([]byte("{}")); rep.Code != 400 { - t.Logf("Empty json test failed: %v", rep) - t.FailNow() - } - if rep := sh.testRequest([]byte("~~not really a json~~")); rep.Code != 400 { - t.Logf("Not a json test failed: %v", rep) - t.FailNow() - } - //3. Block or peer id not provided - req2 := req - req2.Data.Block = nil - body2, err2 := json.Marshal(req2) - if rep := sh.testRequest(body2); err2 != nil || rep.Code != 400 { - t.Log("No block test failed") - t.FailNow() - } - req2 = req - req2.Data.PeerId = "" - body2, err2 = json.Marshal(req2) - if rep := sh.testRequest(body2); err2 != nil || rep.Code != 400 { - t.Log("No peerId test failed") - t.FailNow() - } - //4. Invalid signatures - var badSig Sig - rand.Read(badSig[:]) - req2 = req - req2.Sig = badSig - body2, err2 = json.Marshal(req2) - if rep := sh.testRequest(body2); err2 != nil || rep.Code != 401 { - t.Log("Bad signature check failed") - t.FailNow() - } - //5. Created_at in the future - tm.Set1971() - if rep := sh.testRequest(body); rep.Code != 400 { - t.Logf("Failed to test created_at in future: %v", rep) - t.FailNow() - } -} diff --git a/src/app/delegation_backend/src/delegation_backend/time_heap.go b/src/app/delegation_backend/src/delegation_backend/time_heap.go deleted file mode 100644 index f810bae16d8..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/time_heap.go +++ /dev/null @@ -1,76 +0,0 @@ -package delegation_backend - -import ( - "container/heap" - "sync" - "time" -) - -const minusOneHour time.Duration = -60 * 60 * 1000000000 - -type timeHeap []time.Time -type nowFunc = func() time.Time - -type AttemptCounter struct { - attempts map[Pk]*timeHeap - maxAttempt int - mutex sync.Mutex - now nowFunc -} - -func (h timeHeap) Len() int { - return len(h) -} -func (h timeHeap) Less(i, j int) bool { - return h[j].After(h[i]) -} -func (h timeHeap) Swap(i, j int) { - h[i], h[j] = h[j], h[i] -} - -func (h *timeHeap) Push(x interface{}) { - // Push and Pop use pointer receivers because they modify the slice's length, - // not just its contents. - *h = append(*h, x.(time.Time)) -} - -func (h *timeHeap) Pop() interface{} { - old := *h - n := len(old) - x := old[n-1] - *h = old[0 : n-1] - return x -} - -func NewAttemptCounter(maxAttemptPerHour int) *AttemptCounter { - th := new(AttemptCounter) - th.maxAttempt = maxAttemptPerHour - th.attempts = make(map[Pk]*timeHeap) - th.now = func() time.Time { return time.Now() } - return th -} - -// Record attempt to access the service -// Returns `true` if attempt was successfully recorded -// or `false` if amount of attempts per Pk per hour exceeded. -func (h *AttemptCounter) RecordAttempt(pk Pk) bool { - h.mutex.Lock() - defer h.mutex.Unlock() - curTime := h.now() - if h.attempts[pk] == nil { - t := timeHeap(make([]time.Time, 0, h.maxAttempt)) - h.attempts[pk] = &t - } - t := h.attempts[pk] - for { - if len(*t) == 0 || (*t)[0].After(curTime.Add(minusOneHour)) { - break - } - _ = heap.Pop(t) - } - if len(*t) >= h.maxAttempt { - return false - } - heap.Push(t, curTime) - return true -} diff --git a/src/app/delegation_backend/src/delegation_backend/time_heap_test.go b/src/app/delegation_backend/src/delegation_backend/time_heap_test.go deleted file mode 100644 index 170d18f3a00..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/time_heap_test.go +++ /dev/null @@ -1,138 +0,0 @@ -package delegation_backend - -import ( - "math/rand" - "reflect" - "sync" - "testing" - "testing/quick" - "time" -) - -const s time.Duration = 1000000000 -const m time.Duration = 60 * s -const h time.Duration = 60 * m - -type timeMock struct { - mutex sync.RWMutex - time time.Time -} - -func (t *timeMock) Now() time.Time { - t.mutex.RLock() - defer t.mutex.RUnlock() - return t.time -} - -func (t *timeMock) Set1971() { - t.mutex.Lock() - defer t.mutex.Unlock() - t.time = time.Date(1971, 8, 11, 14, 37, 12, 0, time.UTC) -} - -func (t *timeMock) Advance(dur time.Duration) { - t.mutex.Lock() - defer t.mutex.Unlock() - t.time = t.time.Add(dur) -} - -func newTestAttemptCounter(maxAttemptPerHour int) (*AttemptCounter, *timeMock) { - th := new(AttemptCounter) - th.maxAttempt = maxAttemptPerHour - th.attempts = make(map[Pk]*timeHeap) - tm := new(timeMock) - tm.time = time.Now() - th.now = func() time.Time { return tm.Now() } - return th, tm -} - -func mkPk() Pk { - var a Pk - rand.Read(a[:]) - return a -} - -func TestZeroMaxAttempt(t *testing.T) { - counter, mock := newTestAttemptCounter(0) - pk := mkPk() - if counter.RecordAttempt(pk) { - t.FailNow() - } - if counter.RecordAttempt(pk) { - t.FailNow() - } - mock.Advance(h) - if counter.RecordAttempt(pk) { - t.FailNow() - } -} - -type MaxAttempt int - -func (MaxAttempt) Generate(r *rand.Rand, size int) reflect.Value { - p := MaxAttempt(r.Intn(100) + 1) - return reflect.ValueOf(p) -} - -func TestManyAttempts(t *testing.T) { - pk := mkPk() - f := func(maxAttempt MaxAttempt) bool { - counter, timeMock := newTestAttemptCounter(int(maxAttempt)) - mad := time.Duration(maxAttempt) - gap := 50 * m / mad - rem := h - gap*mad - for j := 0; j < 2; j++ { - for i := MaxAttempt(0); i < maxAttempt; i++ { - if !counter.RecordAttempt(pk) { - return false - } - timeMock.Advance(gap) - } - if counter.RecordAttempt(pk) { - return false - } - timeMock.Advance(rem - s) - if counter.RecordAttempt(pk) { - return false - } - timeMock.Advance(s) - if !counter.RecordAttempt(pk) { - return false - } - if counter.RecordAttempt(pk) { - return false - } - timeMock.Advance(h) - } - return true - } - if err := quick.Check(f, nil); err != nil { - t.Error(err) - } -} - -func TestTwoPks(t *testing.T) { - pk1 := mkPk() - pk2 := mkPk() - counter, timeMock := newTestAttemptCounter(1) - if !counter.RecordAttempt(pk1) { - t.FailNow() - } - if counter.RecordAttempt(pk1) { - t.FailNow() - } - timeMock.Advance(30 * m) - if !counter.RecordAttempt(pk2) { - t.FailNow() - } - if counter.RecordAttempt(pk2) { - t.FailNow() - } - timeMock.Advance(30 * m) - if counter.RecordAttempt(pk2) { - t.FailNow() - } - if !counter.RecordAttempt(pk1) { - t.FailNow() - } -} diff --git a/src/app/delegation_backend/src/delegation_backend/unmarshal_test.go b/src/app/delegation_backend/src/delegation_backend/unmarshal_test.go deleted file mode 100644 index aeb95677f02..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/unmarshal_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package delegation_backend - -import ( - "encoding/json" - "testing" -) - -func TestUnmarshalSuccess(t *testing.T) { - testNames := []string{"req-no-snark", "req-with-snark", "req-v1-with-snark"} - for _, f := range testNames { - body := readTestFile(f, t) - - var req submitRequest - - if err := json.Unmarshal(body, &req); err != nil { - t.Logf("failed decoding test file %s", f) - t.Logf(err.Error()) - t.FailNow() - } - if !req.CheckRequiredFields() { - t.Logf("missing required fields in payload %s", f) - t.FailNow() - } - } -} diff --git a/src/app/delegation_backend/src/delegation_backend/whitelist.go b/src/app/delegation_backend/src/delegation_backend/whitelist.go deleted file mode 100644 index 719c2859c6e..00000000000 --- a/src/app/delegation_backend/src/delegation_backend/whitelist.go +++ /dev/null @@ -1,23 +0,0 @@ -package delegation_backend - -import "sync" - -type unit = interface{} -type Whitelist map[Pk]unit - -type WhitelistMVar struct { - whitelistMutex sync.RWMutex - whitelistSet *Whitelist -} - -func (mvar *WhitelistMVar) Replace(wl *Whitelist) { - mvar.whitelistMutex.Lock() - defer mvar.whitelistMutex.Unlock() - mvar.whitelistSet = wl -} - -func (mvar *WhitelistMVar) ReadWhitelist() (wl *Whitelist) { - mvar.whitelistMutex.RLock() - defer mvar.whitelistMutex.RUnlock() - return mvar.whitelistSet -} diff --git a/src/app/delegation_backend/src/go.mod b/src/app/delegation_backend/src/go.mod deleted file mode 100644 index 971c925ebd2..00000000000 --- a/src/app/delegation_backend/src/go.mod +++ /dev/null @@ -1,52 +0,0 @@ -module block_producers_uptime - -go 1.18 - -require ( - github.com/aws/aws-sdk-go-v2 v1.18.1 - github.com/aws/aws-sdk-go-v2/config v1.18.26 - github.com/aws/aws-sdk-go-v2/service/s3 v1.34.0 - github.com/btcsuite/btcutil v1.0.2 - github.com/ipfs/go-log/v2 v2.5.1 - golang.org/x/crypto v0.10.0 - google.golang.org/api v0.127.0 -) - -require ( - cloud.google.com/go/compute v1.19.3 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.25 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.26 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.29 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.11 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.19.1 // indirect - github.com/aws/smithy-go v1.13.5 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect - github.com/googleapis/gax-go/v2 v2.10.0 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.19.1 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/text v0.10.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect -) diff --git a/src/app/delegation_backend/src/go.sum b/src/app/delegation_backend/src/go.sum deleted file mode 100644 index 9aa7bbfa15f..00000000000 --- a/src/app/delegation_backend/src/go.sum +++ /dev/null @@ -1,297 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aws/aws-sdk-go-v2 v1.18.1 h1:+tefE750oAb7ZQGzla6bLkOwfcQCEtC5y2RqoqCeqKo= -github.com/aws/aws-sdk-go-v2 v1.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= -github.com/aws/aws-sdk-go-v2/config v1.18.26 h1:ivCHcSmKd1+9rBlqVsxZHB35eCW88KWbMdG2VL3BuBw= -github.com/aws/aws-sdk-go-v2/config v1.18.26/go.mod h1:NVmd//z/PNl7U+ZU2EnuffxOA060JWzgbH3BnqQrUoY= -github.com/aws/aws-sdk-go-v2/credentials v1.13.25 h1:5wROoMcUC7nAE66e0b3IIht6Tos76M4HC+GQw8MeqxU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.25/go.mod h1:W9I2660WXSwZQ23mM1Ks72+UGeyirIxuU7/KzN7daeA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 h1:LxK/bitrAr4lnh9LnIS6i7zWbCOdMsfzKFBI6LUCS0I= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4/go.mod h1:E1hLXN/BL2e6YizK1zFlYd8vsfi2GTjbjBazinMmeaM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 h1:A5UqQEmPaCFpedKouS4v+dHCTUo2sKqhoKO9U5kxyWo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34/go.mod h1:wZpTEecJe0Btj3IYnDx/VlUzor9wm3fJHyvLpQF0VwY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 h1:srIVS45eQuewqz6fKKu6ZGXaq6FuFg5NzgQBAM6g8Y4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.26 h1:wscW+pnn3J1OYnanMnza5ZVYXLX4cKk5rAvUAl4Qu+c= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.26/go.mod h1:MtYiox5gvyB+OyP0Mr0Sm/yzbEAIPL9eijj/ouHAPw0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 h1:y2+VQzC6Zh2ojtV2LoC0MNwHWc6qXv/j2vrQtlftkdA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.29 h1:zZSLP3v3riMOP14H7b4XP0uyfREDQOYv2cqIrvTXDNQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.29/go.mod h1:z7EjRjVwZ6pWcWdI2H64dKttvzaP99jRIj5hphW0M5U= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28/go.mod h1:jj7znCIg05jXlaGBlFMGP8+7UN3VtCkRBG2spnmRQkU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.3 h1:dBL3StFxHtpBzJJ/mNEsjXVgfO+7jR0dAIEwLqMapEA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.3/go.mod h1:f1QyiAsvIv4B49DmCqrhlXqyaR+0IxMmyX+1P+AnzOM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.34.0 h1:2qt8zaVqQCMpnQHBB+PAbfSSXgMl9+zpTRNDHmachJk= -github.com/aws/aws-sdk-go-v2/service/s3 v1.34.0/go.mod h1:aVbf0sko/TsLWHx30c/uVu7c62+0EAJ3vbxaJga0xCw= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.11 h1:cNrMc266RsZJ8V1u1OQQONKcf9HmfxQFqgcpY7ZJBhY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.11/go.mod h1:HuCOxYsF21eKrerARYO6HapNeh9GBNq7fius2AcwodY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.11 h1:h2VhtCE5PBiJefmlVCjJRSzBfFcQeAE10SXIGkXw1jQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.11/go.mod h1:E4VrHCPzmVB/KFXtqBGKb3c8zpbNBgKe3fisDNLAW5w= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.1 h1:ehPTnLR/es8TL1fpBfq8qw9cAwOpQr47fLmZD9yhHjk= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.1/go.mod h1:dp0yLPsLBOi++WTxzCjA/oZqi6NPIhoR+uF7GeMU9eg= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= -github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.10.0 h1:ebSgKfMxynOdxw8QQuFOKMgomqeLGPqNLQox2bo42zg= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= -github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.127.0 h1:v7rj0vA0imM3Ou81k1eyFxQNScLzn71EyGnJDr+V/XI= -google.golang.org/api v0.127.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/src/app/delegation_backend/test/data/payload-1.json b/src/app/delegation_backend/test/data/payload-1.json deleted file mode 100644 index 6d36190b796..00000000000 --- a/src/app/delegation_backend/test/data/payload-1.json +++ /dev/null @@ -1 +0,0 @@ -{"block":"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","created_at":"2021-07-13T21:09:41Z","peer_id":"12D3KooWPHkYonRykLsng4kD86MGswLu6qJ1D9VbPQoCyfjq238Y","snark_work":"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"} \ No newline at end of file diff --git a/src/app/delegation_backend/test/data/payload-no-snark.json b/src/app/delegation_backend/test/data/payload-no-snark.json deleted file mode 100644 index 63142110859..00000000000 --- a/src/app/delegation_backend/test/data/payload-no-snark.json +++ /dev/null @@ -1 +0,0 @@ -{"block":"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","created_at":"2021-07-19T19:36:47Z","peer_id":"12D3KooWH4QzeErz8b77Ve7T3Fa3iy28xpHpaVSM7eM8KFcKy16w"} \ No newline at end of file diff --git a/src/app/delegation_backend/test/data/payload-with-snark.json b/src/app/delegation_backend/test/data/payload-with-snark.json deleted file mode 100644 index e4a02555f32..00000000000 --- a/src/app/delegation_backend/test/data/payload-with-snark.json +++ /dev/null @@ -1 +0,0 @@ -{"block":"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","created_at":"2021-07-19T19:36:47Z","peer_id":"12D3KooWH4QzeErz8b77Ve7T3Fa3iy28xpHpaVSM7eM8KFcKy16w","snark_work":"AQEBAQH95VXmlZ1QBia4bH//OPDGUTMrN+vnVk5yt4JrEThNNAG+RfM+Tl+5kh5q8mjQcLaxweFtzNbCC0xYJdc7g8REMQEBAAEBAQEBwrZ/s+xrm5WU+kCUfgiElD76khBysPVDR8XJnncWcCEBAQHKkyePzBi+yVwz9BdyS3mufACG89B/lfR13AvKj+fRDwH0ixA3YJoTT8Hn0EAw7QFc9ucpYDOc+vErSV/8PpAaGwEBAcK2f7Psa5uVlPpAlH4IhJQ++pIQcrD1Q0fFyZ53FnAhAQEBypMnj8wYvslcM/QXckt5rnwAhvPQf5X0ddwLyo/n0Q8B9IsQN2CaE0/B59BAMO0BXPbnKWAznPrxK0lf/D6QGhsBAQEBAQEBAQH9QIr3AQEBAQEBAQEBAQABAAEBAQIBAQECASC/DmL2WKgqdfBedRLu32FxITL8Aud0sOKOrunPY7uZjQEBAQEBAQEBAQEAAQH84N9Ku/+PzegB/Gxpv1L9+V7rAAEB/MUG6lkEU0Q7AfyxOvEYn7EmDgABAfw2tmLKtzE5wgH8Y19RyfFS9e0AAQABAfwUfx9yrFCGXgH8St61gimPAsMAAQDfuCM/cRlMU+gcAc5TBh89mWhgDoSTiNS5zGjCwZ/TOAEAxf4WTi++58Op7988epb9rQH7dUGgLVmK9il3KkCqIQ8BAAEB/EZDRvx/oCg1Afz5XcGmfKLzfQABAQEBAAEB/NFB8Hv+TByiAfylpXYMFti9cQABAQABAfyyOKfxyrfPTwH85AMKRt23200AAQEAAQH83VuM4AoUNaAB/JTv6BAxr6tvAAEBAAEB/D2iWQ4KnfB0Afyf9fcp3FrGqwABAQABAfwRoOO6DIXPewH8MVdphLXyPuQAAQEAAQH839KyNi/TzxoB/G23N536e8nMAAEBAAEB/A/MEAQMMF4tAfyXHVaCnbOenwABAQABAfxofSvUg7h71AH8BxBvGhsHkyMAAQEAAQH8zK3PTxqWCOkB/CruS2YUlqx0AAEBAAEB/O4dmbBkRsWXAfzPMctK/5snxwABAQABAfwV/HI+t4HOtgH8zn8vEa5scLYAAQEAAQH80zMJ7hCphQkB/DkMUoQi3WujAAEBAAEB/MZHUxLaKTG9AfyEswIk4zOuhAABAQABAfy3OwVg15gLigH8e905SLIvK/sAAQEAAQH8H22evpnKCVMB/PFm4mkNkm3jAAEBAAEB/B1Ab9h5t9TVAfwair32JiTFFQABAQABAfz8z6BFU6jjDAH8l9XWIvoFJmAAAQEAAQH86qBIXBkVkJwB/K7uis0LNFFmAAABAAEBAfzaIrlgFhR8NwH8Sy5PYncrIaYB/MNbqc5aCiM1Afza4EUWTzLQBAABjuSdnnfc9e29wZlpHB1FSynFkbf1jB61JpY/Mv/V6R5l62DLWChy6aVSRGRL9/QzUqhiYcOn10irGOhWZLi7MQEBAQEBAQABAfwTdTG4ErdwxgH8CD5ImjPMdRYAAQEAAQH80bjKsaKwwUgB/M6xccDjBGYbAAEBAAEB/G+/5qzJs4IzAfxjGHb5WEOXeQABAQABAfyXh4jpBis63QH8x6FEKUDmet0AAQEAAQH8y5+c9DDl6MYB/N2coM1lu90HAAEBAAEB/BMaaYeiWSxTAfx7b2UqsLwhqQABAQABAfyLBxCPsXec4gH87gxr3wBfXPgAAQEAAQH8h5ywBy2nvR0B/KAmX+nilxtNAAEBAAEB/BFfgFZ8dHWcAfzo8c76aWP+oQABAQABAfxNYOnb34orXAH8m/cQ8oxxjFoAAQEAAQH8SGvgUVyzwCIB/O1tqUBzi4imAAEBAAEB/G5kdl611weQAfwSjk7bOYvGwQABAQABAfzJKz83XuNFRAH85c2M/BXHQJ0AAQEAAQH8Tqq8S4SCmEIB/Ly3r9DXJ6mXAAEBAAEB/Hdu/f9bPcqZAfyUQlwVVWrm7wABAQABAfxUmZchcbJ9SwH8QMiTYeCiH5UAAQEAAQH8s0cHsr7M0SwB/B0CZPI83tFbAAABAQEBAQABAfwTdTG4ErdwxgH8CD5ImjPMdRYAAQEAAQH80bjKsaKwwUgB/M6xccDjBGYbAAEBAAEB/G+/5qzJs4IzAfxjGHb5WEOXeQABAQABAfyXh4jpBis63QH8x6FEKUDmet0AAQEAAQH8y5+c9DDl6MYB/N2coM1lu90HAAEBAAEB/BMaaYeiWSxTAfx7b2UqsLwhqQABAQABAfyLBxCPsXec4gH87gxr3wBfXPgAAQEAAQH8h5ywBy2nvR0B/KAmX+nilxtNAAEBAAEB/BFfgFZ8dHWcAfzo8c76aWP+oQABAQABAfxNYOnb34orXAH8m/cQ8oxxjFoAAQEAAQH8SGvgUVyzwCIB/O1tqUBzi4imAAEBAAEB/G5kdl611weQAfwSjk7bOYvGwQABAQABAfzJKz83XuNFRAH85c2M/BXHQJ0AAQEAAQH8Tqq8S4SCmEIB/Ly3r9DXJ6mXAAEBAAEB/Hdu/f9bPcqZAfyUQlwVVWrm7wABAQABAfxUmZchcbJ9SwH8QMiTYeCiH5UAAQEAAQH8s0cHsr7M0SwB/B0CZPI83tFbAAAAAQABAAEAAQEBASJkApCyl1D4LNjeIXFkdCChefgnHp3OYg+fvY61dNsqAQEYxzmztKWaQlzYtsS8QQCkuCYahojh1iCvLBSzorvhJQEB2PUuLB0AbBdJjIo70OKWBkMSIzjrpDRE8Q0eCxsmxRsBAbj0WzpaSKaGy9VcddoVD7vD6epV0HZfDTUVrrD0ijgxAQKW31tvA+SqMcabhMmzNjYAcDIlmomgwO2tKVoiL7xBFjOcRXNdEKdyR7D+XzZzMWIHYf2v0ZKeChlNXjxTH3YXAQHDNzvuglaF6Vf4K3Q+CZ1ho8QD+T3mme4ImUQQSuEMEQEBPbJPRTolq3CoYY+nT7FqncnmrC+pCwZ62+xc5UmeJhkBAc1RjaqRvkTDl5IZ7B2BL+iLiMzaQzNmfg72+be5FaAMAQEB/CvnNTZadvw7ySGvBh7kfvA3m6jS1rD84p4lcy8szDIBAW4E/chDBLvUBeD4EXi4TFPgtK0EbLyyEec6Ghj4Eg0GAQGL+YnCs6/O2bW+YTIbvQziX1XEiQ3VbVqAo43/IgRFHAEBu/j/Ai5DiXkwwgpTWUUdXs8po60beNohi4oXKK8qDjcBAuN4Sh6Oa3VhcwwuwtdKnMk7nS7wDm109x0dVxtk+xUpP5MMkCRtkk2hzrxCdhI7ylvc2fnbWK9qLwqLziKdzxABAQtFFCHnnz7ecIvdiIYUEflAfMsiuKDQBgrjnLRXybo+AQEILd926kOv6EwqwALaXTsUOPS7AffawAxjIrgb3KndHQEBTuWnJiIXRKRLtjz60F9jvxbHBzm1jbJTL0msZN+Aui0Brma+0IOxBTe/ZZ16VTMHcinSn8wIWViZB0C+zTqvcib6aRtZQHVZ5QtOywq0Nye1L4y09R8iveQbCsKxZ/2PGAEBAQEBAX1kpPFuQNHFiC4sBNclA8XiymAGzQDNcewmQcRL33oRFA+cDR8GQRKywxTiVQLzDKOYRpzrMXgCRM6kr5XwzhQBAQGAWU/wZYKg3YsvmsHWZMZ9agnMVV+8EYQdl1Uxi0WAN4VnZOHaLH0AKSNDvoNYMEFj6qV3kzDQ5MpKcRonxVg6AQEB0ARrcycGlOsjMD4IEERmRH2Vw68UEMYNlwNscSZi0g5NQtKGDZFxz9VO1knfghtDE+wImKVPdgNhc3FbluSFJwEBAdotm9gldguv0aXpYfsZUnsTP6vj3pfrjc4jC8PXnMQbGzZXObjTe4jbsdiL+8+Ce0Fjt23f5YlUQjKE25IQ3RIBAQUBAfixSwNnY51d0hxe+9bbGY0IBfECpZNf4jMTNEzqWCAxkxgCEe7GPCSe1sp8UqeCwPQzCNW8MLYiyCAiGoRS9Q4BAX+572wlOxw/1suwT/uacnEpqZZ0uRa3q9vSdoaP2bAwQoZ4uRmz50xlBjW9gDDsGCquzbj6rsKsAJr8kK/XWQYBAXgup0gxmCP151+l29Qi3REoIQB15vWfWrzkg4+Mu1Qhi8TG5pb1Z7fMYO3LZ8vFj79xcvjVwzrI71A6JJo48CYBAYGlyztu3224VGNB1UzVZmb3UG3WdFtPFuCp5BT0EZMxtqOV9dmyCgo5vXfEWYOiJ5xkHyvCvtgcFLQwXv2tbxABASWXHNNN7kMRT4Y/vLt/K2vqBYfVW6EwCBmLrhLwqN0WS2lyVjb+S2zgiXrQnyGVUbutrefx1IRKj38Bdf1vFBkBAW9hW2CDagdz2vWF65YWZnSOosL/hexinrIdFJrnQ5Ej8xHjiDhO9U2TkAQPUcMD0+NJC1WlCgzRHl7fmr3CEDkBAQERgKrow8C5D2/mLHm+by7lKO/t9A2ztMUcitm+Pk04pAqVGeftrsr88wCkRxsr9ake65mmfAweQTNlZACZG5OGDFR9emTcLdaNAbV6rmkZu4C5I6f8LIqMUtQ/6WWV+LoaAATr7FB8WQRkg6q5AtCW8iAznS5Ee1Lmem1mhGNtaTm4FzPXnQydYYewdyAuM3Fq2MAxFTudvWo7TQxbzVSwBmerC45v1jTPb/RHfqUC9iI/wTIquwtJHA+AHpvv8II3P2pGypeygk7lesZExpraKfIV2cynpi9EU5+D733O8y4/TP1GKkTLKsMNbkcgkBGU70JvNMDT5LSK7fvF24AULD4UT1aV9oQ22mKKZvXtMzL4BCJWtrYGqaYxAY13RHwheoVc8lkTeZ4I3a+0Zwmx620E6ORAX52kVROsH5ScNjEua8qLD4e5GSZAEbG+npnHe3M7DldEg/kYXH7qgl+aOILjxv5GVAwfScc4iAEb6+LdxY+hHgz/xlXUGfVGD0sB7K/rrxb9h2dQEY9Ddv391pDOZHsk2yQHOr3qKUaw/DM6aMAB49wmqLuvabTJaExPB9F2Kia79eFghIuJc25vHIUTrCoP/pxDTYOIXyMbyc2XmKZH2/3+SThryNc0BiQCVc65t67U+PBeHlp0jcfd4Dvyju1ro1aKjx36let0YhwK3yERpXZ1j7BwMiyJ/Mcp8Uebm1+1Zk0JIzhSHDmPMRMo0aAffcF5siyk5mCH18neNmHMYUvEbFe8qtMcseEAzlj7mk+U9dO3WlRZdtkJUDT9np0JxzK7AVFtbPAHZTDKqc0Z3sPalfqcCPvN5o+c0NIWXBXOylyhuQy/eoLgMe5mDovIC/CTVu51qr/eUF7r9HW7R0jGXp17s3kc60YS5DutX/IM1nEAUBT7eT4Zk2va9TYrmV8b0qWRC5Igxj8jMqcWT/TgjCB790ComJ4+oO5/I2Th6ge9o4FtA620DkyqCIVvigKYhU2E1PxV7WzjHf5+VB6lXjMYrspf94cS7jG13B3wGWeAMywZbkr09mjVREigWoyYqvPGa2O4Az0Dwg5DsTXJwwZp6zpOow3AhdZWfsZ+oRvrmwTj9xRJKzZpo4OSvo4nY9gB1mZEVJqTQlLUDFkTPUv/fgnmvzg0y6HrOy8N4lpks3viiDt6ExWRbCTBJAhS8XTTfNQiERJCaQr8F17IyGwArtwdmTPp1iB/ndj9O/RAN/FwKQT4EM8MTTkD07PeAa+21P7NLdYsN4seldDJ3KaUhQ0y40wW5GpdetWiaeh+llUVMQ7BeG4yKS+HSKTRPcRdFVEmzzu8qlDzgkpFBXW1izDpNtaVBdoVJcW7ufgI6Je94o0sGJqgo2PaLqmw0BM816JYbxW3+QgC33ED1Ih3Jn+R3AQ/nMfohiTZSTDdMJWiuF941jpG6jxO2d70lz5eXnoy8jv/Rt4SaiRCmvpKMEGFNJ3k/vH2pYYrjAj4LSzieaWjJ3jMOzhFft2SP4kbwcBhF//VyeDNFmsLMoV8Au3ysuspRwFWhcCN7Dq6ejOBRmxb2aL0wXB0mJ4FtTEHUhvIBR6MtNRmICDEDZduFlUhUpYTQIpisareeX6q7BYJ3bM2CCZPQE7qMT+uNRrSw3GI19WI9M05u67rBWrznblSaekiExJzDql6j3SDKPX9m6COqxEbJwIHI/5elWkePayM/jBMPKrAtPsDG2+p8pd0CPQppcp6LG5J0FzJhZ0OoVziEttltWPa6YkPBXO2Q+dzLcw1evORHZDP49V4Nx8LongfHj2NWA3Np0WqUz1RyMpbLGyG3+nebCuH4dRq5csJABOtqmZ+IEPeK+q1mjKLZ9QdE6L9WuC1yC+pwsGVw9AXGeG6fiS+jt5KWArRZM8QERbGVioTTSJpbZVi8GxridIa5/9NMk4e6htmEfl91GUTp6cHcAp76Ifqc1oWh/C+HxCQK1r5jsI0NQ5p+EXHOeGTak7Qmrgt8HXGwk7puqb4CMMRTLBW/svTYYw+BO+UexLOHYD7ESf+PyhM/HECEuQlfuw261C7vYvyahgV8n8pAPt+75Tv1iYVVfXv5PLNjBvgiCtso+do5XJqu9cpf1ISPLc+C4Sy/ioEuXkyFYL9GTnZIG1kh1rgeERtsd2qR8PI2fcrohhrO4nPw+go7kIjO6wTX/pvARBYQZodRSz8Z099y9BSy7E+5Cwq4iCsSAhY8ktmIKnrZLG/U+b/KTUtTELjSqR4cwjeM4Yip1rtLVMilSZ2EWPmBAzl6Vsj9EykXnG8Fr/06CtflG006r0DBgEtyYBkdsSVdcSPIrkKcD8QH4WDw4UlC+IoynJWYgb1Czha5REW1A8/I1HOyY55e5Az+ctRbkK0tA9hXl25FrEI3AnmNNnL7gQZl6rYdbbWnqRu422Wdvf8b4jqoWYzKeoTKjVZfjNIDs64SrF6ouV3jIn4scN7tJxQuRE/lBdYkpg3YB+/dFRy/a/aJmII+EdNrOBWSlvuyjNhtlu7L9RAJy1W3kWjQTlGsMBh8k2pJpy7FhgUl+7FO+Ay10s0IXU/0AlxtNmdcBqIlYDh21P9rsE2RfgNOlQ2W9PqAyrX9JyFTYXQgxjYyYr6o0i7er8XGH2MhcSG++XxLS3+Dhm9Rc2kwiA1xHsqV5sNk/RPKHKekrxcj+BsrSjpOjkxOXsR0UA2DD7Cx7QSlIzpycjkAykzTw5eS2ZdzhfGcDzV96JSxpH/KJr7o1DSuZQbHXTp1mlOcr/zV1LygZLvO0285Mb6VTkPNg/eAE6S6XSw01UrfN4h1nL9TiuI95Q2v8RKovLs9hqyGbQgiqBrl8E929If9c3C8TutcPCU/DQIoMGwzjliQv9uZEYhD38xRoLd8Td2XVw2VrrlpjL1Eoyw9CB89p8jNnP/vLnPnhE8vdKU7t7FZo2CsXkoGs4Iv4vGefuXJeYXcX5CyCLGmQWh7aYeh6wie19exoSohDpFM+3MnRv+Klb6BiGKjqW369wmI7sx9s8xZc+ttsuNK7DwFmvvtmTOEbrpDKLZpf0AIJgvQuMeBGyRUHIpS+MSj7/7RxSsI2F+VECs9G6pd0iiz/N4Y6ZrwLWnyAknCwxgZKNcbt4K6UX//IoJ91W1aFj4FR1spb4Foqi4MZFsKwEBAbQdHcYrqCiy/LScbjx6+7HcL4a7LObGmLyMv8YD7gAjAQEkU41EM6kgJptxSWVKCZ8BPttDJQIx1m8K6ulHT/GvIwEBLM2y9jprqhl+TeWcYYKZ8wf3cSnlnkYkQp/vnB5CZToBASAt/lKY9/OuYbHC8/Gn/YZR3KXRvt9KJNM8rz0TSQETAQWAu4HBL7suInhzL1g4VFwquyHwnvlJv/D6wYeg0ASRBrJvnOdmuSoGaK1TWSk6Bdvh6oso0g0lPNf13yva+eIFFNoC3/5Nj9C1nF3+jcDUVQFgKicPDjRFRjbIK7HelwNDZQthnyhG2YYzhozBS1XadcobiYvYeIG/AoXZn5jjKIsi9zDqPimiQYei2bIFSQOY0BoFCvo49j63c082esw0AQEXpZhdrD9tx5x7Z+lwATkZ8vdhro36vhL5Ln5uhnaAHAEBObW1CnOZ9l5BmST2fT89X2qKjlD3FEDSseRKsmO+TiwBAcGxuDl8CiltBrSMiOshLmrco+0VIwUZ1o8d5wgYyx0TAQEBVxvZk/f7nMLq9VO1cyfj0CPrCYaj3FitSLKe4/FxGRYBATS+pFeShCmdwqAJOKEwPtR1KBOCtsZiPc6vNjtDsN4EAQGP2u6eH8Uvc9ZQkUiQqM31dmrIszIwpz9TxZ4LUbQ7OAEB0Mn8KyRm+5dtCqmfa5/6Ql/l372leaSkfDPHhTH5bQMBBb/1d1nHwxcKvvDoitxnajJwxxG8yi0B7hc+xw0VqKkURi3gWh80xTYyS/cHG1IEUwSiYYr2yREO8jXuzpFBzRppQDOzY6kPpywD9UH9b13nYsGipceVXlPrMVcZVMmaNzT2DJvmSAGb5cNkWNvmYXrLESytA3ES4ctw1NDcrGEMJL7j1QvbArUBy+zRlz/s9krt+KQmM/ZPo2oufwyWdh0BAdAo31NHIkTjeH0NEUFUKcjCjDTCD6MHZSk4adjhYYsPAQHr/kBNu4K7/sCYb/so3X6vchCdUr2X7MmI8Jj9iCJ8KAEB+od7Z9X/7/VD8BkZfveMPV7DttKdSQ3LKD2sw3tKhhQAAACkHzc9QAEB/QDh9QU="} \ No newline at end of file diff --git a/src/app/delegation_backend/test/data/req-no-snark.json b/src/app/delegation_backend/test/data/req-no-snark.json deleted file mode 100644 index 49ed475ff32..00000000000 --- a/src/app/delegation_backend/test/data/req-no-snark.json +++ /dev/null @@ -1 +0,0 @@ -{"data":{"block":"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","created_at":"2021-07-17T22:39:48Z","peer_id":"12D3KooWS3diRw3SzPQyuCLbTxrshRbXtHZ5h3oz9aEFAkvbeMtB"},"signature":"7mX9FpkdZN5DfNXG5UxdcdhDxjzsYnjwRBg9m256aCSzyGhHG1UqLp3f5PvdpoFXZqHm5RmV9fnxh8Ekf71zUedqZzN9SsJE","submitter":"B62qoJC4KuLXgTEX2uwQGPNZSnqRTvJHzcEzkWTDFTXMsqdXPNKxJLs"} diff --git a/src/app/delegation_backend/test/data/req-v1-with-snark.json b/src/app/delegation_backend/test/data/req-v1-with-snark.json deleted file mode 100644 index d7d026974de..00000000000 --- a/src/app/delegation_backend/test/data/req-v1-with-snark.json +++ /dev/null @@ -1 +0,0 @@ -{"data":{"block":"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","created_at":"2023-06-12T15:15:55Z","peer_id":"12D3KooWLTvNv685CWbLn5nAGQpTTXu6DkQ3D8z64CVyKNb1686m","snark_work":"09w368pywQJMeWmOHSYWXltlGiOJ78BAuvHztiH0OTK7gLEY/eAPLh1/DiZSjIs6sWXnX8WvUgZzPe0JtYHUMsa2exhP14PO6fJppXLvFw2ejaQasHTBxW2FWEMqkjAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABx39rkFvynLNefI+VIwxgiRppByzVXPA/dlgTeBJYqA2zGcOUmHvvZzEjFiM2i9LspJ9BZwK/QcMmO1pQuZkEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABu4CxGP3gDy4dfw4mUoyLOrFl51/Fr1IGcz3tCbWB1DK7gLEY/eAPLh1/DiZSjIs6sWXnX8WvUgZzPe0JtYHUMqX6rxYuwwHAZZecv+sUUGdOemZx9F6cMYVv7i6UiCkcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACticpRf+2WVduXM9CavzGuSEjtejhmmZRx03xvHdawGGzGcOUmHvvZzEjFiM2i9LspJ9BZwK/QcMmO1pQuZkEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABu4CxGP3gDy4dfw4mUoyLOrFl51/Fr1IGcz3tCbWB1DK7gLEY/eAPLh1/DiZSjIs6sWXnX8WvUgZzPe0JtYHUMvwAyBeoBAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDnNGcjVBjGbrEJ/M9FMV1Yoco6NUGvQnuKTPJIz9GLBvzuAIIR3p78MvxlfrMZWZz3mwD8jVAbo3nEn1/8U+1jT9L34QAA/Bxsj7M+EGGg/PvKxI1q0xgBAPzqw/wqXVaswvx5CKsbWqnhiwAAAAAAAAAAAAAAN+RV/QQsoRqP5ydUyu7+GHDy2N9PWUfHc+zl2EFMXCcAz40G6A704rLilhzcXFnmvPJaEo7/k6SUh+lAXes7wBP8DTxDDvPeQ3v88QUBVg+/2jQA/HHVf935NARX/NG4U/rtrqftAPwKqxOmKAaV4fwiD0XRHMK1pgD8otinTrs6f5H8CinnTSI8PFUA/Ohj8tzia22y/LHSMS1dz9y4APzCMvuAAfJpt/z71j8NFUXTTgD8rQtDZqsCqtz8UhGKmWA6bY4A/Hg06XNOoYPf/FDv6qWneXhkAPyPDkGGWVkQ1vxbltNyVEFvzAD8W1cHD2qB8qP8ReqAPcHqqlMA/MYHSuxQGnaq/F97U1UlxP1pAPzwwqkwjL41AfwfAPOWD/wz2AD8AvTj54a0SYL82Nz4yPnRKrIA/OES7OmhKHXC/Ae/w+c8RGscAPyvHxJ3pymOaPxOUTpKdnqIvgD8mhdrvaypfAT8rp2xrHzh+pgA/GNYIAE2v2/y/JGLfD9a+Ne6AAAADvzOWg85TI88BPxRYlk8Cwo57PxYLycqq4aYafzjqzfyXL3QKwAu9cxrRvAxtBoFqlVlcB+TokGWe6byYU020tV+p1eFB5vuH8PypsK++S5O6tMrEieZXqPi8AeIk5bNUNGu9yEm/G+/5qzJs4Iz/GMYdvlYQ5d5APyXh4jpBis63fzHoUQpQOZ63QD8y5+c9DDl6Mb83ZygzWW73QcA/BMaaYeiWSxT/HtvZSqwvCGpAPyLBxCPsXec4vzuDGvfAF9c+AD8h5ywBy2nvR38oCZf6eKXG00A/BFfgFZ8dHWc/OjxzvppY/6hAPxNYOnb34orXPyb9xDyjHGMWgD8SGvgUVyzwCL87W2pQHOLiKYA/G5kdl611weQ/BKOTts5i8bBAPzJKz83XuNFRPzlzYz8FcdAnQD8Tqq8S4SCmEL8vLev0NcnqZcA/Hdu/f9bPcqZ/JRCXBVVaubvAPxUmZchcbJ9S/xAyJNh4KIflQD8s0cHsr7M0Sz8HQJk8jze0VsAAPxvv+asybOCM/xjGHb5WEOXeQD8l4eI6QYrOt38x6FEKUDmet0A/MufnPQw5ejG/N2coM1lu90HAPwTGmmHolksU/x7b2UqsLwhqQD8iwcQj7F3nOL87gxr3wBfXPgA/IecsActp70d/KAmX+nilxtNAPwRX4BWfHR1nPzo8c76aWP+oQD8TWDp29+KK1z8m/cQ8oxxjFoA/Ehr4FFcs8Ai/O1tqUBzi4imAPxuZHZetdcHkPwSjk7bOYvGwQD8ySs/N17jRUT85c2M/BXHQJ0A/E6qvEuEgphC/Ly3r9DXJ6mXAPx3bv3/Wz3KmfyUQlwVVWrm7wD8VJmXIXGyfUv8QMiTYeCiH5UA/LNHB7K+zNEs/B0CZPI83tFbAAAAAAAAaKO7w/oe3NJ8Lfs0q/ud5UUehZu7QBAq5gioE0QikDWPDnr5OPMkG3A/dJDTXvo7WPwP9OgZ7kWadgWAa1b8GQEDFBVqZOcEonD26V+e9yUUmBvDAfo2L5TqKRI1fCTRAQGl/0ByDgKphovIdofKjzu+r1tF4s7lzKNmgXqQ9HyjKgFNb9zf3yzkyUGuYzsctMtegq08kZd/4kT3fYw/wOB7CQGaVQ/SP2S9LYEhDJcTkk3AMgYeY2u+THysQ8xa1jMGKwH82VdIdhHwGx+0c+nFKju8ao3C8CKs6MYpa5+CBeKPJwGgq8KSu5CxJhM1zpWeJkS24/Ag4SwdefkiJyAa2vKYGQGN4DYgaTauJ7VT2ATd/yHIGYIJ9820h5cwqqrNuXcpOAEaePdfI0u124b6V6Tz+iu3fjYzefyB4iDlOp4Yo5TZDwEBUL9q5fFIBzJ48xjD0Ax8qQt81zZkxGgq52LWKFnHLQEcOtUCMDP/m5MB6EopeZJCkkUMNLosuX0Xgx/MPkoXCwGWrecdwGKD2WbckgAlyxZ2ZElnLQgpiwnbcNwgjQ1iPwEH3/E1ARjKQQjiui3rsanPgp2b5x9bzYlU8XcuPBPuKQH1HfHbH2z3zj7djTrLP4jll17RVm5SVU0uT1voio9qBgH4C4tF0hFk8+9fIFzOUxBQZZQyf9o8DWuxwS0nBXgcLgFn1s/q6Yi34x5brWUrc+gGTmtzdP1BcOXhhEUBSR0EMAHk/1s+/DVHDBT/8dOkio+qgEVRC4GaeosNHBpB8OgXIAE78/tVmoJUXvgCQXKo/qJV7QMtoLglr4/V2IYSx7N0IwHBHsSU5a9KaUQBOpBzi2YpQTHuH0YldkB3IF68B+GeCwE2rlhax/a4a5FxWelrnJ0ryjatVZ8LoS7xNgrruOdzGgFvPE5TOD/SfFUEHJcM6/muB3SaE09wqM1vpn8L2A1YPgEG5PP08bgAtO+iF1/RTmNDwywTKkGic1Z358JLqusAMgGI9FOQeTjtupal60n6Mh6Q943pFWqZjbppvB+OZL+3CAERD/pwGMo3xFbyJcMA0uy1GRb8IxAz6OXi2zyvaR+PHQHrpMpoar/hEjyOEIT+bhybaxdaeJCv8EnB/6Y5NuslBQEicoytMYvFqcoEfNIBNBiXbBKIDuqYfpLKNYSZx+NjOgExeutiEcvRrOKx2F37zHSMd5aORXoOapd88+BBJQQ9EwGD/NYBbWAXC6nEVcsyeM94aVoUGxfCmZ1G0i/Lui/2BgE+9Swt6E6kDQaC6+4s6Xg22p1tYHol7Qp8XR9Cnw8KLAEZtrMmQUgIoPQo5AposdbVH8lbvIuMZovKLSXDal31JwHPlQiuJ4n2t75dnw5ttZNjA03P7WrnZUDbf7kTkphENQABPDB8gj2GCvLA9duM7luXQVom9rtHh0nLHayxEa6LuhUBskCXuOOwkTPY2LxEV4MvZNupR/IJ9gzB89/kO4u7/CMBVsc6oMZKe0FTXGUMGiO4SuDzg/Uh7hmyYffx43LLLCMBwi9vXS6DED1P7cwLAMvL34P/iQmwn4bUgfSLVTbIdh0Bi6lZzmcTn7pawua6p9OaJpc6fmK0PkznEomr46xS4DkBuoBIlnizSElJwoTp0nRSxD310c4dhadIMZpaWASJ1zgBA7w88HUKwR6xWZRUpAKdIrg3cdg5f81tJkyK7Xq2nTsBZwHbrjiSXAoizaGHdFQSekNcfh4oq/VLYLccpL27fjoBazsXEkXKVlAQU1Ebua7Jk5fV0yWbDXhNSilJ743cYSUBrrMDeCy6QuD8enxvZnwDoy3lSFmN01XLjRGUujFiTjgBh3ORAWXvYNGhIkaM92kVc2t4Q3wALn5A6ylluQOlqwoBAplsI/JgnhKqrqq1gfEdDvFEFe74GTdu89NTEeikoQ8BSxzX/LLObF4vOfUlcyVtPNjyTQjIwn1YyuPERsxwmg0BI532QjvPu6QEedbrI/gBrO4hVWKVGJ0g+RRlJ9CuuDUBvln3Iblr8aHSA/pOQzPDlwBd2rBL27G2Xh2SCVzVQigBswohwHW8YUr00ky5KKhqeRP0ai2yHB3h1ygMAEbFHCABY74ROy9xe4bZ87EINjjD7jy8kofbkn9I3i2ApKTDSRUBj2jYIakz8XAJug3BJuRDFL96IJvZynJ+hRxtNMXE5D0B33lfD3O9H0sx85OVgx8DkJjjdLJRTsg2vowrQdJtmhMBQJIhv9RQ0BLjbM3ZChoTVRhinBdj1DvZM++B31PyPyYBSYwQht0eSBzBwYhgQy+hSIVZavpqGHArUUTja/aeXjYB6xHVabsk8NteYIkHzmU8vlWxHKz3eIEIjsRe92BRwR0BwK0fIfwH3M97RiwJazXYkrp7tnx/VY8WpLPoLml3YR8BNQHBgUIAsJoIX/Ay45dz3DItq/eB7/oCNgRcB+n62zMBbug6F39dFzeF+lnz6jFeQ9Bt6sU5WAjgcEezOct92hIBsIWPd9LxgLTGBRCJUsciGopl201SFJU7/WdpQk8AZyYB5BFlskzrsDTjplYBohdQMFD8GbqPzPQ2sTVSAuEnjS8BcVlK9X3EVkwAvXOzYcPsLJWRoVkd3B2XhShTpVvosxUBI1WGNQHHaKF34Ft5wCQoD1zZqkDt6mt1F9TgieQ8cTABC1Q93Sv1wk9FTuYNk/70cn2dr8BpnlIEHbDlNzhToBcAAcwaSiHvauxk5DqJRuz+HcJ6zoNHPtKwjxr7TQoM9PEUAYFl1qEliipASDR2/XEY1aN18OMHgxWvy+rfC7QkyQg4AYDcUyPtp8GcaFGtN5AhFuOTqoWkAwiA6hO/AdwRMmoiAXe79iY38QgJJg/u0u+jnAEpc1w7ewPkZguh7M6gHjgQAcq1uaQ1yBhu5/e4m31Xs6didYfEH0OGpdI1B/TF+uIyAdlXew/aWU5ayf40sTB8mavkQTKJcYjMYA2fWHIpKrA/AXxFY215u76U13XtSzj72oGV+u3OBiqVQn5pFzRAyiYlAe9DDgMMSHcClQpueNYKV30PqrytoOiZ4YbH+AwGzZs2Aa+BmfZTiFZPiEPXWP8tS6aV2LmGpd7Hvdy9WoQNjZ8OAWYbIouWTAEnDmeFOdKQlw+vofcaFGgZylvatl0DZmM8AX1PjGZX/HcTA8lJjVPyB+Ps/hSQohk2dMj++rfs/sI0AUz7Qgxp/GXsFZhcSp+Mse7STHUc7IhTWLGVvkrdg+8yAXIWMzLJcaUyER92fQu9te+u5P4NF9yWzjh0g9OOGfg5AYaiwGrxFxgxvvugoNKiTUJN/wckmwncTaGg+wSScMs7AAGizfB3nQsoy4fejDzUd+y/ZVnDjiJyVCTVPtYxdVWfHQHzzEPEBIGsgoZLK78dGRfABKwWSeJDESjs8rTTqg07FgHYDTBTNLncML9xQ/OKfaEq5Um/hA3O11GWiGDHPhc4GgFsFWGZkrJKZmI1XQiLDokQvaal05LNTkhkUdEWkip9HABNJUtS/oAqmyAe/lgraLQVDYSiJ01ls21JeZBNasSCGQHhOnsBdBdICNu3MtegidCF581GmlE1sF0YF5/nrcx7CIesKo7A+uBZovxZAzM6bnM3nuJuPcWhbo0s2iF/+TQ9AVirrGvdpT8mZHsfrBRH4XJ/wHIlh6WCH9Bs6DjyB/o6EbR+0DHIdF8U/nibVl1InzD0UVSP5R202K9ARYgjIhkBy9TDACgDdNch8Jd7hdAlzhucx0z7vJE4MQZ+FUgvKABTtnH4FdUdaIdKzgzFjWGpBaq1cMVmV5ufWFXtZ03RKwGljlreqWk9cMB8fm0ckTjxqMbCnHDiA69JXcZjV3BjGQNi5FIujmD48YwPftT9gVu+fL9k/TCL34VKwDsZpxkkAXU2+qRc845WDDT3p6tM7Fn047X+n1rFL467FfNcPmUPFKz1miBCHdWgxxy4y2OJ46B7NFQQPSfAdKLQKXLimjsByaa78C5sGsyp9VFVRZU7tSMNRdMCqINjyFz3UjyJFw6D5SKxG0uo7CUCpoxczrSRAGLk/3b/R/S7hsz6B22xCQFaXOEFl3VFHGhzJDb+HUds1+Q545yEKkZaV5T+pBhvKnqMBDi483w0nHbam/vItOUTZ6w2QX8FHd3qhdeA0/IwAXyhvm83cVrMqxnRhwe9Ss8XtJLm9nN+HZCFuz8IA3Y4+aSGxtiCmKVQz7b9OXzv/ToOzJJy6rHoLfj+NqQ9MxABjGJsK8RNhOR2sQNhpYvBCTqDEYrfdraP+94+yS3/3T8CBj4jXPPVVjXKXRKUGB/lEzDJLzMNZCKQ9LQKdJE6FQF9p9JIho7T9SA5zkAf1XEoUYSdu0+t9IPFGxQ91OicNsLEckz54zeSDJjDIXRtPg3zLGQaR3To5zrcyAKkq1slAYwC0/HfUp/flRGZZt110vDuegt6paq76kyttGoloDg+KgPvbf9uWQ+ysx0xmmDCfQWqwoJaIB/qBgTS5qOZegsBHdoJQMOoKW80PD4fOnSFjkqd9aKI6YxBBX6RogfCuDu8hfBvo47PxwIlIHszL9O34ulD5biCSrVzdUh/G2jkMwHA9r2PIWj3+iEwDMnakjwKRL5ZJlJQi4PzZ+hAmpoAMN4/c7KeGL1aFIwsYHRut1S1oi2e4r0mG9ffAj97loAZATtQQyiWrGCm0xZLEHjVGvaqMczFupUSVtJwTjWpZK4Hxg3Rmx9wnDK6kAHD8RuA+nh6H3RK5Nr0N5woU5L95CgByM5/GisAeS/uH9Kf9Y/XcsMGfGpixPnow3rBnS5Q4xdqPrEmOojmu7UakEN1bmBL9yvae/v5MUVZV9Dch3JQGAABfy6/w7P5BKZQEvzp1mTiyFCEc+WFV8cGAedtz3IHMAzscA+utH/bJ8wilXOYVbtt8tyd9KaH7sFTZHDpkHWpFgf4yznL1g3V90YjwjnWfVoUKAQJr8WqZ900tw7gFhVCKBfTIqNdeoh1fMlEmuVaUxLH3z+Oz4ipoNzo65eUbB4uzHYUlL/RQPf4SAyfPa3UHDJzRpDuZQN+c7wYcSb/pirG1LJKQifB+EsiJxY92Yxj/et1G92mKxY4tCh6+9uqATzx04nJUhhmvl0sg6Kq2P5m9j66iVyz7FYv7+SedGoAhcKO1xUoQue5zPtBhTl+hxDTddsmzZvh+0nUmaPbBTc8XtTaYQ1JZuY4rOB3/Orpn8HgE+rb9Xf1ghliXvYFO9FxhVMAG7+4VgB2S1hSonE/Mj2sqpOILemvf/42c906Zo4E176w4YD4Ll+vQN9bMa6IakNBEni3HjPNKXpvUTGxVG/pZ6nqjTRKi4/AMnLsHg7sk8JfYwmgl1+5mWh5KYWWD3BtCsLnCmpDeHRuUj4fESBKoErfxzmg9wyAox8WvZrwZgqocm2lTKHqojKqXmOfBquLuMwn9sXYjUxThhd1F4biCJ9a1o/Q8qFVYysgNv6Nh5gdc35++F8s6zoZH5dBAP9wsH4XhpldBfJHfH5/87JGrdywJfvt2QIFs2A7AA8Ttq9ElHUcsyrdqmqHK1bLNxxseWACdRT0UpvEP+fsJ8koVTEJJHf9mcgr/+1XTmUJ0BxKIO/Yhzdgm5pBZAIWN2gBe4wuPTPBY1awjGLrNDeHG58qhTBSQLRz++zF/B+bB2Oy+GwDkVWE+tjnjL2+b5iYNrDVD/OQ+OvDIRiiPUgHLnQ6Uapxt9mHurwLSQ1hdtOP6OrcuKv3JLPYxYEQyENjhPM0et3FyK9hyzMjaT0OjLcyrfjKHJjz4i5dsgU3vnYVkrzMRXaDTo2wDN/Rmkfl0Qu9RIaw2cDpBc6lHMTceFgXkUThKr6uctxdqaAtr17CpnjzXkkEhD5dP3Q/zBSdiMYhFm5eje10yTqSlJ8kQ9vEak5sryanmtANVwTvGasUPTcpDujjyakDHove2u+V54h/mNQ6rTgjZUTuNGYcucZFMYpnWhvJarKcC2hesM9COxFBhGdynA68PqshB7tA9BSGM7UDIF+Fkvkv+TYEXCAhgWCSPNMMVQxsESW/tnAs/xz/JvHc7HuskXcQkWckwN9oKC4YwFOEFFCxLJGhmh098KFmFNNarbnqMwjaHU7PXgnIIyxIzy1OfHABv8EqGd632odkWXeLB1FLD5Xt45wwFyrPwWL1U8YHExM7wGunffFdISvubcyKtqBQkoVR4wj7Wa3GGYDEB7zZDfmanTiEDUJ3+zJGM55FsLck3tkFLydNimeeCUShthIzGieXoB2kAduFhBwhlJDfHpVNJgtVV3u6QftQcOnnDyhCubT/bh7n9Q4QOhWLlUdO/uhTrE277gLfsZDkxzQLJ8H8rQjwx7RmleJRbVThyrlxaXhgoZxUxZIFdKxA3aYcefodc1sGMR9X17EsvLJCpRREfNfJo3r0hL8Q8REO4RHzq4ldp24XKrX5MEkCnYBvfydRu4Tmce0axycthdb+CY+Vt/VCwImAc2+dKha6es3cclSxzKtI3lZbh4Wt5zEXWQlzKralWHIPajSeav67jNMjfoUJcZNSTbJisetLzDMJs2cWiAWMnUCcKaptFb4ji0C7jlGfkBDM2ywip+3qO9v3jqMR3L54dfydggocD5rT3Cc/wtefqI0dWJu0Lk8K20ouOINPRcKDSh369K9SqoT3hRcWf3TIb/aiMog+EwlbMGH86uK08uF78sdZZjZ4ChR9fV4V2ftwLQXLesJ7Ly7EiGk3o0d1JinCh6LbI9SGI/PKhimM1513+6Oha/k8zhRXb2FJMEgCY8VWsAalvW+ShkS1AeNTrsOj7SpdpTCtWnS/dBvkWV0FMD1uklH0Dh9gy5oP3EkrLMK26TZ5PU64O1hZwdeYRnY8cDPfNTT89W9tOyapNGh3ooTx4nMEc+CtI1TcPZ9Ni1N8vej0SRiZEOWN7IYG481frG4M7AqVS2QklD/ASOW6w8eUL/pSkTWc3rl+bbOnIXGRVZwFDqxD5hFEbCh/w3pHJxPa2bj3SUrlPkPYq8fZQYryC5sMxjjYIEc6QBDSjvIHTsp9hikD7zwcyLLtvMtVqKUgKQsgEev2GMRQp4aIAUavNPJn6yk/dmLunsYCRHuKDmt/GO9EMvNSpC+GhjJWuFr/i3q7HKAwzl7PL6bECXW4ploc3i+HV+2a+KFfupIjj6QkgxSbbU7KiESQhIYMgAxY0xR0yLpmIDKxQtP6F6lccwWfUGeIgoFyWjRBQhylRlzbO5GiPvzPSd1hB1VVTEFqT9SKeKAUowIKcr/eOQffjvwuD2DhSdC9yjQD719MuJVmocRxgA3fGnw1Sj2DIYVkSgFSMoE5jlWOhyAVtmryeU3vDFz+BfE5ThEBQ4ywgwo3H04ZPgFz5CyHdHYo4fM/WGCIwBVYuleZolQIhLKMT44ygDwbcPLLC82eRBHNYOPtgSzn28l17tIrYPpZ9UHiwQ/rqU3RhCX+5W6bQYEo72HFjuYM6wk4ZlifNH5NZ538AmbRjvMTV1N2KoQE3s6W4ZOLMMXPCrz5cY3Ry3leWOQbZW8Xl0K7uKdzz4B2CsplfY5YHpdEgfSppPUUbWWqOgMyBxEFVZ1cYgRmAACVMqCGouHSqy98OM1zvAfI3R6iLohRIK6Yp9f94bxSm4eOjZU0YrZPcVW/ySYh3ggnup0wdIu0lPrjNkHTSthmBSqCzqXTPHV36Bhg8ax+GaxhKRSVOA4JmmubPJFPkPZ5LoxxVY8TLr2LnUPGIDtHagpiAkJCbyEu/DGHLJ/IC1n+ZENhB2wtMfXlM0MBlzjCKaYOvLj9xvxSNPT2KOl7VpqiABWkeCeug8p3opByEnNHWD6t43uTZu2tSplsqvIOB6QBED5f1zuUXKHQjwdRCR2RP7LmlvjbRF1EoTdmLeIA04WCV2QiEiJzjun7MhBvqy8FTuLxJ2NE/1zK02vSRnMTHd5d+qHJyUs/ojcoX4jsfztqq4SpIy1ypBB/wbow2nU6a6EBJ1Zm4DHdScrXuH8xBFa4nGlwe+FXMMuvFDxcqOrWe09jBoRn58DX/i4lrrc02Jy2YDQ0fuo4s1IbsVoEHG+p4OPm60pjkfNM/x+6WAB962m+gXgTgM7FXZh2sjS/3OlChPZYv5ETBtsscf3TNbwni/gQE322tUhxYb5r0PXaCoBOzOuPGyv4LZ7JOOsbvmTb5AiZhmX6l1JvZY3R+1WfhphRki8y84q/jEO5Bw9P96GGCWdii91CZ/3IHcoGFPihmiV2FF82DzGIQGJiBg6No8nfWohrU7vohMHiecwoQgUjXWLrTDT4slgvtYc6cIhR3+VI9UlV0x3qxB3sVDjMqpGbq9lzlsHMTyoBhQwBeEG0kY+SP/5/TwzY/nnOk+P3pQI1ZyVwB8WuoaYN8w0BkIEypWIIBCS+aUc/gB4jzTWWHgPHFw6YYWohFS32yyUB+ILuGVt6i9Xhb+W0e3v0g8AcM8lp6/xeqQBVkjOrMi0BhJWfFBTUwraW04qf+0KXlz4njShlj3rtilJHA2HoyiYBXUWQ+ygDSB/ayDuGWi50KTBxQKxx4isa2Ijz3vWXwgUB1NTuxoHhj7mTblHt5nVUtEyimmDb+X0GSX7iwncANAQBUP9U1CtbE6Hgp4giq8Pt6A45AZBfKXkwUvYVinpBEh0BP2z71jG4TJIulWuqAaEuAsyvujIaLGCP6ZINdqUaMCsBVTlGvnO8JE5qH/934slVafNWf0X9h4e4ffwe2tHKFjgBPHiBWiZWbHCbVwBXk0ONUm1vbQqyDMIhAxefIwGFlRUBxkUE3rc/gsrfne9PZqjT6SwQgYAZ0SZM1Jr0Ruzg1DwBVPby6ovVW3HJXNUO8Hx5YlfBJrZ/GdFQ+dmR7PWZMjQB3sTWYLW7rtCWkphDxHxNPgEEV347w2xeY4opEY0YHAsBdPKPm1Wu3wAHUen28oV8MIyJhrNvveTb0NdkJIDQZy8BDbdQ+gWR8pfRxq+KGEwRZCjve8XZXJzKOLvYQxM82Q4BuogksPZ27+Krdd5YbUvXRbJuMs7SbTZgmEM0QMA1xz8B0HkUoYbgCSY3HGoRQZ8oVl2WF4uQcDk4dhMkmHJnUggBeTLiDIRdL1z6moVURtC0an28swz79e5HlkR1K/UIrBgBk/BWE83LT3fO6rUcb9FoVHb1iMuWS9bbgRz4qe4lUAEBtai98+jtq9WkHSdyrvL38H8usd5zvfCTezzHgfcYjzoBA7JJfyVJJ1kCTLyoje3JWHd71MTwNyfG3Q4rtZDm5BAB6sira9uF6dw16yGaUQmW5idj659dJZ+1kYm5SUxWPwYBcKIdkjMRtNF2JJZPhsnOnMOZVgBXlOD+hl//Yq7B+B4BPPrzJbtdrXkqcq8FbVoI2t+AMEWuWh8919m2MJta3iEBsYlnByvY5xyIxJ41GG6Uy0nYiIKMJJZsPzS/Q5UzqDoBY5NhVRHG5sd/ZV0cKYp6FS/Z2QBEgule9rrjQi8sPxABuqOYeAfWKROubnuAZ4opdCEcHbEoRQUVVdI3QpljaTMBCspqaimBpfNyhsav3keGwkMXyF9mBzW8+S3oAvBwgD0Bga3H6fW0+ARFI4a0Ja74PL+exe+AGk94F8M5gaozSQkBYWiWk0n0TzgtIVj2ox72sv9pehEiBEB7VjRCfxNILSkAAfHqKmkA/r8bseuqagDHQPhmLluFcMkMqYkzdvW+lacUAbPtVNh90IOBJi7ckVSAr4ONiivIAaYJiNmZvO4RyAo/AYl/Y+BPtkyNAcYFfBHpWE7OaHWL3yFsn3ibcp+YHowDARsT4cF2vNdH6vocKp73sa9V02LTetYNYShcoUFkZH4MAXVwNjcDrU6WCS7i5qIfZCtwiTpnFBvnimiA2eflrzMrAUzzinn8GdvyqOZcKkXWWkXfsiS2qKnIq7U9YxWQcDopATyy+r8JbQil6p72fKjuaiuqqnqmufgYuInmKH6C98ojAdnIDBDIIJ31czfqIgCh9pOvgo5AsbqTFHVgj2/nZRkHAatFD0R7yBgaKXdCi4NkDSRZtmlqG3Go9Y27daVNNdgdATktvR1etC/Vd9W/JGK5jttsBZ1h5bKfhQPDFKtD/dgIAVHaupRowDJNvZd9Ip/N0Cizv43xMbctY5Q8XBZz87kXActymzCHar9ZeKhfoE4ln7fUA2mUbz7UZBPF0WSQOlIHAQtTDBqPmT5MsqY+Jwz19jnKnW7RUVPFKDzW5nrxCz89Aed0SaVGLEk2Beb627QIw/5w8ag+Bjo4i4O8Sxkd0EEGAdq4/78Y/Kg4BJndmD1e2dOLI8r4zZ/+ZAQCpAHf+4QhAQGvTnguBWqGeOH6wDmbkiRxWP61omYHn4coaYPR4d8qAeae60OrRwymFqHBM6LGBAmBC2WjtierxFnK/HmpJj0BAU+8XzaBgaZC/ofCTrub668F2n805m18ZLVHY5bQmZI5AS1vaqqtOipTO6yl4ilrkz0gr2eblMLy7BWaKRQLRdwYARw2SSImOw0VR2cUvW5rxijFCNqtPn/PZYIUXSAOknsjASgGhVL5/byAbS5lwg+fHdfcwHOO+S4UDEaQdoHCjEcsAbvRsEUnuzzEzQXRcUCD06RVJhXbLpUfCVexWC3x0JA7AcOSFRsnL6loaWxVsrY3xfrcuUlhDC09+t/9d5qy+r0hAXCASYSefXzzawAEsQkAag/OXk9QXvdJZ7yzm+o/GqI2AbMnn7OTtWFHZYq4N1dwIOWxMjjT21Z4/lcWJ4o0KJ8dAWOFVAoDeBbSs7aTw/syzBKfnj51O6ntb0HEcu+V9+gyAToPR/3ltE91t/oAHNwCLxrtz5WYT9uEUzMiOahMeF4CAYEVKxokI+l1j3J7IeVewEj08kDR92z01+ATgofAtGYtAQQ1izswCOctsSE2iSrxCO2BnoY+6usvRDvpr52VfFciAaJcBadu2PDNpd/Zy6hRs+HI1i/OOlVtT3biBFawoQ0SAAHs3yVt35hDbllreYm3tCEcAVkvrSgDWGogeyeMHhbUPgEdqOIUPOgVdzeqD2qeLjW/t/oU60Yz+NUE1KVJ+ZsEPwEe3EeH+Yk7sqesiJxGYtkuqwgyRt25Yw9oWfeogYhbCAFdj/70EHgPCBKyXzuurRxuViGA3MbijHRsaHiKdRlVLQELR4PIY7OCyxNjYMbsdZv5imY0l0o+4Fik5F+W0VjnGQGU11i8fVPlmT2K6Nw0Ngu5d2pUujiJeQUhPnlUgKACKwHTyQzVdEA+t1vjMDWiAFynhgA75wKWwXxba39TmX7XKAGw3+K7xYWbQ4eZOXgD/0lVOzYwVqSZWZAxOJJbfug4OQFIlvsalAiwr5gdCMy1lXFnwpbLyG1yJDYeRkzgi1thDAEYedJRqQW+1DWZi2rLTDl1MoYQ6vOP7bWx/0gN2kGdGgGmj4qj0QtpwNwWZBZHtURJuSa4cGOBXNox08NW34uHMwEzfELPDllGhTOKocfb6Wd+vMMLosQVKX2/wG9rSzqHOAEtXiT5n2r2fHNGDpTXiAaZ3MSAXGix6N0LwtLQp9f5BQGuadPo41ceaaPpZGt5LFySfm2WNjSkVGiXWNX39JsuIgABN9qwNkKI+jPr3PrvKmvSi4raq798O252fFZsCNFHniEBhcH4/S291P5Jg2joMtqsmaB6m4enc+MxDx1qZpvF6gwBgLHP5wNN/pIAl+KCkLqeffqWXpGqDADtafd3h858FxQBPd1UKAJFA0gIZMS27ZVo3WCBP1BE2NxrusWGNZfgITwAgbLFiQXAgtQNCe8zq7rEvkPEEuP47FUVmrAHMONJwRgAAADQeDEZQP0Aypo7","built_with_commit_sha":"36e0198c"},"signature":"7mXQNbMGHXL8BA2ScSo5nSnwER1mW1snzAfraSS8R1upgTVPEzjT7YjUt5whPKt31BkexMf4yQ5NXiHyNWscFHYxcChiuLq4","submitter":"B62qnZEWRGp4eRCzzpVRmEqA8wTPjKmm3NSzGNzxDww9yHHo9vnRdmc"} \ No newline at end of file diff --git a/src/app/delegation_backend/test/data/req-with-snark.json b/src/app/delegation_backend/test/data/req-with-snark.json deleted file mode 100644 index 01a1b071179..00000000000 --- a/src/app/delegation_backend/test/data/req-with-snark.json +++ /dev/null @@ -1 +0,0 @@ -{"data":{"block":"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","created_at":"2021-07-17T22:39:48Z","peer_id":"12D3KooWS3diRw3SzPQyuCLbTxrshRbXtHZ5h3oz9aEFAkvbeMtB","snark_work":"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"},"signature":"7mXBS1iznYyPKkHvfocfQs5KWhRBnxwphe4ty88sYqSPP1XDZ6vvddwT6CdQmYbKq4XqTTGQUAaFBcpugoQ42cbmffkM7aZ1","submitter":"B62qoJC4KuLXgTEX2uwQGPNZSnqRTvJHzcEzkWTDFTXMsqdXPNKxJLs"} diff --git a/src/app/delegation_verify/delegation_verify.ml b/src/app/delegation_verify/delegation_verify.ml index cc1de4b72fc..883494c5a28 100644 --- a/src/app/delegation_verify/delegation_verify.ml +++ b/src/app/delegation_verify/delegation_verify.ml @@ -44,12 +44,11 @@ let timestamp = let open Command.Param in anon ("timestamp" %: string) -let instantiate_verify_functions ~logger = function +let instantiate_verify_functions ~logger ~genesis_constants + ~constraint_constants ~proof_level ~cli_proof_level = function | None -> Deferred.return - (Verifier.verify_functions - ~constraint_constants:Genesis_constants.Constraint_constants.compiled - ~proof_level:Genesis_constants.Proof_level.compiled () ) + (Verifier.verify_functions ~constraint_constants ~proof_level ()) | Some config_file -> let%bind.Deferred precomputed_values = let%bind.Deferred.Or_error config_json = @@ -60,8 +59,8 @@ let instantiate_verify_functions ~logger = function @@ Result.map_error ~f:Error.of_string @@ Runtime_config.of_yojson config_json in - Genesis_ledger_helper.init_from_config_file ~logger ~proof_level:None - config + Genesis_ledger_helper.init_from_config_file ~logger ~proof_level + ~constraint_constants ~genesis_constants config ~cli_proof_level in let%map.Deferred precomputed_values = match precomputed_values with @@ -154,8 +153,14 @@ let filesystem_command = and config_file = config_flag in fun () -> let logger = Logger.create () in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let proof_level = Genesis_constants.Compiled.proof_level in let%bind.Deferred verify_blockchain_snarks, verify_transaction_snarks = - instantiate_verify_functions ~logger config_file + instantiate_verify_functions ~logger config_file ~genesis_constants + ~constraint_constants ~proof_level ~cli_proof_level:None in let submission_paths = get_filenames inputs in let module V = Make_verifier (struct @@ -187,8 +192,14 @@ let cassandra_command = fun () -> let open Deferred.Let_syntax in let logger = Logger.create () in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let proof_level = Genesis_constants.Compiled.proof_level in let%bind.Deferred verify_blockchain_snarks, verify_transaction_snarks = - instantiate_verify_functions ~logger config_file + instantiate_verify_functions ~logger config_file ~genesis_constants + ~constraint_constants ~proof_level ~cli_proof_level:None in let module V = Make_verifier (struct include Submission.Cassandra @@ -219,8 +230,14 @@ let stdin_command = fun () -> let open Deferred.Let_syntax in let logger = Logger.create () in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let proof_level = Genesis_constants.Compiled.proof_level in let%bind.Deferred verify_blockchain_snarks, verify_transaction_snarks = - instantiate_verify_functions ~logger config_file + instantiate_verify_functions ~logger config_file ~genesis_constants + ~constraint_constants ~proof_level ~cli_proof_level:None in let module V = Make_verifier (struct include Submission.Stdin diff --git a/src/app/delegation_verify/dune b/src/app/delegation_verify/dune index 16bdcc1ed1d..af2363a72c9 100644 --- a/src/app/delegation_verify/dune +++ b/src/app/delegation_verify/dune @@ -23,7 +23,7 @@ transaction_snark blockchain_snark mina_base - genesis_constants + genesis_constants uptime_service currency ledger_proof diff --git a/src/app/disk_caching_stats/disk_caching_stats.ml b/src/app/disk_caching_stats/disk_caching_stats.ml index 77b26497489..c7ebdf0b5bd 100644 --- a/src/app/disk_caching_stats/disk_caching_stats.ml +++ b/src/app/disk_caching_stats/disk_caching_stats.ml @@ -3,20 +3,21 @@ open Core (* number of operations to do when performing benchmarks *) let bench_count = 10_000 -module Const = struct - let k = 290 - - let ledger_depth = 30 +type config = + { constraint_constants : Genesis_constants.Constraint_constants.t + ; genesis_constants : Genesis_constants.t + } +module Const = struct let scan_state_depth = 7 let scan_state_delay = 2 (* 2*k for best tip path (including root history), k for duplicate block producers *) - let est_blocks_in_frontier = 3 * k + let est_blocks_in_frontier ~config = 3 * config.genesis_constants.protocol.k (* k for best tip boath (excluding root history), k for duplicate block producers *) - let est_scan_states = 2 * k + let est_scan_states ~config = 2 * config.genesis_constants.protocol.k let max_accounts_modified_per_signed_command = 2 end @@ -258,28 +259,29 @@ module Values (S : Sample) = struct } } - let ledger_mask ?(n = Params.max_accounts_modified_per_block) () : + let ledger_mask ?(n = Params.max_accounts_modified_per_block) ~config () : Mina_ledger.Ledger.t = let ledger = - Mina_ledger.Ledger.create_ephemeral ~depth:Const.ledger_depth () + Mina_ledger.Ledger.create_ephemeral + ~depth:config.constraint_constants.ledger_depth () in List.init n ~f:Fn.id |> List.iter ~f:(fun i -> Mina_ledger.Ledger.set_at_index_exn ledger i (account ()) ) ; ledger - let ledger_witness n : Mina_ledger.Sparse_ledger.t = + let ledger_witness ~config n : Mina_ledger.Sparse_ledger.t = let ledger_mask = ledger_mask ~n () in let ids = ref [] in - Mina_ledger.Ledger.iteri ledger_mask ~f:(fun _ acc -> + Mina_ledger.Ledger.iteri (ledger_mask ~config) ~f:(fun _ acc -> ids := Mina_base.Account.identifier acc :: !ids ) ; - Mina_ledger.Sparse_ledger.of_ledger_subset_exn ledger_mask !ids + Mina_ledger.Sparse_ledger.of_ledger_subset_exn (ledger_mask ~config) !ids - let zkapp_command_witness () : Mina_ledger.Sparse_ledger.t = - ledger_witness Params.max_accounts_modified_per_zkapp_command + let zkapp_command_witness ~config () : Mina_ledger.Sparse_ledger.t = + ledger_witness ~config Params.max_accounts_modified_per_zkapp_command - let signed_command_witness () : Mina_ledger.Sparse_ledger.t = - ledger_witness Const.max_accounts_modified_per_signed_command + let signed_command_witness ~config () : Mina_ledger.Sparse_ledger.t = + ledger_witness ~config Const.max_accounts_modified_per_signed_command let signed_command' () : Mina_base.Signed_command.t = { payload = @@ -396,7 +398,7 @@ module Values (S : Sample) = struct ; block_global_slot = global_slot_since_genesis () } - let zkapp_command_base_work () : + let zkapp_command_base_work ~config () : Transaction_snark_scan_state.Transaction_with_witness.t = base_work (fun () -> @@ -412,9 +414,9 @@ module Values (S : Sample) = struct (* the worst case is that no new accounts are created and they are all cached, so we leave this empty *) ; new_accounts = [] } ) ) - zkapp_command_witness + (zkapp_command_witness ~config) - let signed_command_base_work () : + let signed_command_base_work ~config () : Transaction_snark_scan_state.Transaction_with_witness.t = base_work (fun () -> @@ -430,7 +432,7 @@ module Values (S : Sample) = struct [ Mina_base.Account.identifier (account ()) ] } } ) ) - signed_command_witness + (signed_command_witness ~config) let sok_message () : Mina_base.Sok_message.t = Mina_base.Sok_message.create ~fee:(fee ()) ~prover:(public_key ()) @@ -615,7 +617,7 @@ let serial_bench (type a) ~(name : string) ; hash = Timer.average hash_timer } -let compute_ram_usage (sizes : size_params) = +let compute_ram_usage ~config (sizes : size_params) = let format_gb size = Int.to_float size /. (1024.0 **. 3.0) in (* let format_kb size = (Int.to_float size /. 1024.0) in @@ -652,7 +654,7 @@ let compute_ram_usage (sizes : size_params) = * (sizes.merge_work - sizes.ledger_proof) in (* the deltas apply for all but the root scan state *) - (Const.est_scan_states - 1) * (base + merge) + (Const.est_scan_states ~config - 1) * (base + merge) in (* for the root, we cannot subtract out shared references, since the data in the root can be from bootstrap *) (* after k blocks, some references can be shared from root history, but not necessarily all *) @@ -669,7 +671,7 @@ let compute_ram_usage (sizes : size_params) = in root + deltas in - let ledger_masks = Const.k * sizes.ledger_mask in + let ledger_masks = config.genesis_constants.protocol.k * sizes.ledger_mask in let staged_ledger_diffs = (* TODO: coinbases, fee transfers *) let zkapp_commands_size_per_block = @@ -678,13 +680,13 @@ let compute_ram_usage (sizes : size_params) = let signed_commands_size_per_block = Params.max_signed_commands_per_block * sizes.signed_command in - Const.est_blocks_in_frontier + Const.est_blocks_in_frontier ~config * (zkapp_commands_size_per_block + signed_commands_size_per_block) in let snark_pool = Printf.printf "snark pool references = %d\n" ( (128 * (Const.scan_state_delay + 1)) - + (128 * (Const.est_scan_states - 1)) ) ; + + (128 * (Const.est_scan_states ~config - 1)) ) ; (* NB: the scan state is split up into (depth+1)+(delay+1) trees, but with different layers being built across each tree, they squash down into (delay+1) full trees of work referenced *) (* the size of works referenced per a squashed tree; 127 bundles of 2 proofs, 1 bundle of 1 @@ -698,7 +700,8 @@ let compute_ram_usage (sizes : size_params) = in (* the size of delta references added by each full block in the frontier after the root *) let delta_referenced_size = referenced_size_per_squashed_tree in - root_referenced_size + ((Const.est_scan_states - 1) * delta_referenced_size) + root_referenced_size + + ((Const.est_scan_states ~config - 1) * delta_referenced_size) in (* TODO: measure the actuall network pool memory footprint instead of estimating *) let transaction_pool = Params.max_txn_pool_size * sizes.zkapp_command in @@ -721,15 +724,18 @@ let compute_ram_usage (sizes : size_params) = let () = Async.Thread_safe.block_on_async_exn @@ fun () -> + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = Genesis_constants.Compiled.constraint_constants in + let config = { constraint_constants; genesis_constants } in let%bind.Async_kernel.Deferred _, generated_zkapps = let num_updates = 1 in - Snark_profiler_lib.create_ledger_and_zkapps ~min_num_updates:num_updates + Snark_profiler_lib.create_ledger_and_zkapps ~genesis_constants + ~constraint_constants ~min_num_updates:num_updates ~num_proof_updates:num_updates ~max_num_updates:num_updates () in let%map.Async_kernel.Deferred vk = let `VK vk, `Prover _ = - Transaction_snark.For_tests.create_trivial_snapp - ~constraint_constants:Genesis_constants.Constraint_constants.compiled () + Transaction_snark.For_tests.create_trivial_snapp ~constraint_constants () in vk in @@ -741,11 +747,11 @@ let () = let module Values = Sizes.Values in print_header "PRE FIX SIZES" ; Printf.printf !"%{sexp: size_params}\n" Sizes.pre_fix ; - compute_ram_usage Sizes.pre_fix ; + compute_ram_usage ~config Sizes.pre_fix ; Printf.printf "\n" ; print_header "POST FIX SIZES" ; Printf.printf !"%{sexp: size_params}\n" Sizes.post_fix ; - compute_ram_usage Sizes.post_fix ; + compute_ram_usage ~config Sizes.post_fix ; Printf.printf "\n" ; let side_loaded_proof_serial_times = serial_bench ~name:"Pickles.Side_loaded.Proof.t" diff --git a/src/app/extract_blocks/extract_blocks.ml b/src/app/extract_blocks/extract_blocks.ml index 5e3574139a3..c161eab1657 100644 --- a/src/app/extract_blocks/extract_blocks.ml +++ b/src/app/extract_blocks/extract_blocks.ml @@ -466,7 +466,8 @@ let check_state_hash ~logger state_hash_opt = ] ; Core.exit 1 ) -let main ~archive_uri ~start_state_hash_opt ~end_state_hash_opt ~all_blocks () = +let main ~archive_uri ~start_state_hash_opt ~end_state_hash_opt ~all_blocks + ~output_folder ~network ~include_block_height_in_name () = ( match (start_state_hash_opt, end_state_hash_opt, all_blocks) with | None, None, true | None, Some _, false | Some _, Some _, false -> () @@ -620,8 +621,20 @@ let main ~archive_uri ~start_state_hash_opt ~end_state_hash_opt ~all_blocks () = [%log info] "Writing block with $state_hash" ~metadata: [ ("state_hash", State_hash.to_yojson block.state_hash) ] ; + + let network_prefix = + network + |> Option.value_map ~default:"" ~f:(fun network -> network ^ "-") + in + let height_prefix = + if include_block_height_in_name then + Unsigned.UInt32.to_string block.height ^ "-" + else "" + in let output_file = - State_hash.to_base58_check block.state_hash ^ ".json" + output_folder ^ "/" ^ network_prefix ^ height_prefix + ^ State_hash.to_base58_check block.state_hash + ^ ".json" in (* use Latest.to_yojson to get versioned JSON *) Async_unix.Writer.with_file output_file ~f:(fun writer -> @@ -660,6 +673,17 @@ let () = and all_blocks = Param.flag "--all-blocks" Param.no_arg ~doc:"Extract all blocks in the archive database" + and output_folder = + Param.flag "--output-folder" ~doc:"Output folder for blocks jsons" + Param.(optional_with_default "." string) + and network = + Param.flag "--network" + ~doc:"Network name which will be a prefix of each individual file" + Param.(optional string) + and include_block_height_in_name = + Param.flag "--include-block-height-in-name" + ~doc:"Includes block height in block name" Param.no_arg in + main ~archive_uri ~start_state_hash_opt ~end_state_hash_opt ~all_blocks - ))) + ~output_folder ~network ~include_block_height_in_name ))) diff --git a/src/app/graphql_schema_dump/dune b/src/app/graphql_schema_dump/dune index 0d33dc265a8..7116105997b 100644 --- a/src/app/graphql_schema_dump/dune +++ b/src/app/graphql_schema_dump/dune @@ -1,5 +1,5 @@ (executable (name graphql_schema_dump) - (libraries graphql_parser mina_version mina_graphql async async_unix graphql-async yojson bounded_types) + (libraries graphql_parser mina_version mina_graphql async async_unix graphql-async yojson bounded_types genesis_constants) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_version))) diff --git a/src/app/graphql_schema_dump/graphql_schema_dump.ml b/src/app/graphql_schema_dump/graphql_schema_dump.ml index 500b3597753..69f4b5d04b2 100644 --- a/src/app/graphql_schema_dump/graphql_schema_dump.ml +++ b/src/app/graphql_schema_dump/graphql_schema_dump.ml @@ -101,9 +101,8 @@ let () = let fake_mina_lib = Obj.magic () in let res = Async.Thread_safe.block_on_async_exn (fun () -> - Graphql_async.Schema.execute - (Mina_graphql.schema ~commit_id:Mina_version.commit_id) - fake_mina_lib introspection_query ) + Graphql_async.Schema.execute Mina_graphql.schema fake_mina_lib + introspection_query ) in let response = match res with diff --git a/src/app/heap_usage/heap_usage.ml b/src/app/heap_usage/heap_usage.ml index ea3a248382d..5fa54b3f535 100644 --- a/src/app/heap_usage/heap_usage.ml +++ b/src/app/heap_usage/heap_usage.ml @@ -12,14 +12,18 @@ let print_heap_usage name v = Format.printf "Data of type %-46s uses %6d heap words = %8d bytes@." name words (words * bytes_per_word) -let main () = +(* NOTE: Some of these values are dependant on a stateful zkapp_command value + threaded through as an argument. It's important to not recreate it. +*) +let main ~genesis_constants ~constraint_constants () = let open Values in print_heap_usage "Account.t (w/ zkapp)" account ; - let%bind zkapp_command = Lazy.force zkapp_command in + let%bind zkapp_command = + zkapp_command ~genesis_constants ~constraint_constants + in print_heap_usage "Zkapp_command.t" zkapp_command ; - let%bind zkapp_proof = Lazy.force zkapp_proof in - print_heap_usage "Pickles.Side_loaded.Proof.t" zkapp_proof ; - let%bind verification_key = Lazy.force verification_key in + print_heap_usage "Pickles.Side_loaded.Proof.t" @@ zkapp_proof ~zkapp_command ; + let%bind verification_key = verification_key ~constraint_constants in print_heap_usage "Mina_base.Side_loaded_verification_key.t" verification_key ; print_heap_usage "Dummy Pickles.Side_loaded.Proof.t" dummy_proof ; print_heap_usage "Dummy Mina_base.Side_loaded_verification_key.t" dummy_vk ; @@ -30,14 +34,19 @@ let main () = print_heap_usage "Parallel_scan.Base.t (coinbase)" scan_state_base_node_coinbase ; print_heap_usage "Parallel_scan.Base.t (payment)" scan_state_base_node_payment ; - let%map scan_state_base_node_zkapp = Lazy.force scan_state_base_node_zkapp in + let scan_state_base_node_zkapp = + scan_state_base_node_zkapp ~constraint_constants ~zkapp_command + in print_heap_usage "Parallel_scan.Base.t (zkApp)" scan_state_base_node_zkapp ; print_heap_usage "Parallel_scan.Merge.t" scan_state_merge_node ; - print_heap_usage "Transaction_snark.Statement.t" transaction_snark_statement + print_heap_usage "Transaction_snark.Statement.t" transaction_snark_statement ; + Async.return () let () = + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = Genesis_constants.Compiled.constraint_constants in Command.( run (async ~summary:"Print heap usage of selected Mina data structures" (let%map.Command () = Let_syntax.return () in - main ) )) + main ~genesis_constants ~constraint_constants ) )) diff --git a/src/app/heap_usage/values.ml b/src/app/heap_usage/values.ml index 5d09128cbb2..ba84f6c721a 100644 --- a/src/app/heap_usage/values.ml +++ b/src/app/heap_usage/values.ml @@ -33,29 +33,27 @@ let account : Mina_base.Account.t = } (* beefy zkapp command with all proof updates *) -let zkapp_command = - lazy - (let num_updates = 16 in - let%map.Async.Deferred _ledger, zkapp_commands = - Snark_profiler_lib.create_ledger_and_zkapps ~min_num_updates:num_updates - ~num_proof_updates:num_updates ~max_num_updates:num_updates () - in - List.hd_exn zkapp_commands ) +let zkapp_command ~genesis_constants ~constraint_constants = + let num_updates = 16 in + let%map.Async.Deferred _, zkapp_commands = + Snark_profiler_lib.create_ledger_and_zkapps ~genesis_constants + ~constraint_constants ~min_num_updates:num_updates + ~num_proof_updates:num_updates ~max_num_updates:num_updates () + in + List.hd_exn zkapp_commands -let zkapp_proof = - lazy - (let%map.Async.Deferred zkapp_command = Lazy.force zkapp_command in - List.fold_until - (Mina_base.Zkapp_command.all_account_updates_list zkapp_command) - ~init:None - ~f:(fun _acc a -> - match a.Mina_base.Account_update.authorization with - | Proof proof -> - Stop (Some proof) - | _ -> - Continue None ) - ~finish:Fn.id - |> Option.value_exn ) +let zkapp_proof ~zkapp_command = + List.fold_until + (Mina_base.Zkapp_command.all_account_updates_list zkapp_command) + ~init:None + ~f:(fun _acc a -> + match a.Mina_base.Account_update.authorization with + | Proof proof -> + Stop (Some proof) + | _ -> + Continue None ) + ~finish:Fn.id + |> Option.value_exn let dummy_proof = Pickles.Proof.dummy Pickles_types.Nat.N2.n Pickles_types.Nat.N2.n @@ -63,20 +61,18 @@ let dummy_proof = let dummy_vk = Mina_base.Side_loaded_verification_key.dummy -let verification_key = - lazy - (let `VK vk, `Prover _ = - Transaction_snark.For_tests.create_trivial_snapp - ~constraint_constants:Genesis_constants.Constraint_constants.compiled - () - in - let%map.Async.Deferred vk = vk in - With_hash.data vk ) +let verification_key ~constraint_constants = + let `VK vk, `Prover _ = + Transaction_snark.For_tests.create_trivial_snapp ~constraint_constants () + in + let%map.Async.Deferred vk = vk in + With_hash.data vk let applied = Mina_base.Transaction_status.Applied let mk_scan_state_base_node - (varying : Mina_transaction_logic.Transaction_applied.Varying.t) : + (varying : Mina_transaction_logic.Transaction_applied.Varying.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) : Transaction_snark_scan_state.Transaction_with_witness.t Parallel_scan.Base.t = let weight : Parallel_scan.Weight.t = { base = 42; merge = 99 } in @@ -91,9 +87,7 @@ let mk_scan_state_base_node Transaction_snark.Pending_coinbase_stack_state.Init_stack.Merge in let ledger_witness = - let depth = - Genesis_constants.Constraint_constants.compiled.ledger_depth - in + let depth = constraint_constants.ledger_depth in let account_access_statuses = match varying with | Command (Signed_command signed_cmd) -> @@ -207,37 +201,34 @@ let scan_state_base_node_payment = in mk_scan_state_base_node varying -let scan_state_base_node_zkapp = - lazy - (let%map.Async.Deferred zkapp_command = Lazy.force zkapp_command in - let varying : Mina_transaction_logic.Transaction_applied.Varying.t = - let zkapp_command_applied : - Mina_transaction_logic.Transaction_applied.Zkapp_command_applied.t = - let accounts = - (* fudge: the `accounts` calculation is more complex; see `apply_zkapp_command_unchecked_aux` - also, we're using the same account repeatedly - *) - let accessed = - Mina_base.Zkapp_command.account_access_statuses zkapp_command - applied - |> List.filter_map ~f:(fun (acct_id, accessed) -> - match accessed with - | `Accessed -> - Some acct_id - | `Not_accessed -> - None ) - in - List.map accessed ~f:(fun acct_id -> (acct_id, Some account)) - in - let command = - Mina_base.With_status.{ data = zkapp_command; status = applied } - in - let new_accounts = [] in - { accounts; command; new_accounts } - in - Command (Zkapp_command zkapp_command_applied) - in - mk_scan_state_base_node varying ) +let scan_state_base_node_zkapp ~constraint_constants ~zkapp_command = + let varying : Mina_transaction_logic.Transaction_applied.Varying.t = + let zkapp_command_applied : + Mina_transaction_logic.Transaction_applied.Zkapp_command_applied.t = + let accounts = + (* fudge: the `accounts` calculation is more complex; see `apply_zkapp_command_unchecked_aux` + also, we're using the same account repeatedly + *) + let accessed = + Mina_base.Zkapp_command.account_access_statuses zkapp_command applied + |> List.filter_map ~f:(fun (acct_id, accessed) -> + match accessed with + | `Accessed -> + Some acct_id + | `Not_accessed -> + None ) + in + List.map accessed ~f:(fun acct_id -> (acct_id, Some account)) + in + let command = + Mina_base.With_status.{ data = zkapp_command; status = applied } + in + let new_accounts = [] in + { accounts; command; new_accounts } + in + Command (Zkapp_command zkapp_command_applied) + in + mk_scan_state_base_node varying ~constraint_constants let scan_state_merge_node : Transaction_snark_scan_state.Ledger_proof_with_sok_message.t @@ -467,11 +458,10 @@ let protocol_state = in Mina_state.Protocol_state.value_of_yojson json |> Result.ok_or_failwith -let pending_coinbase = +let pending_coinbase + ~(constraint_constants : Genesis_constants.Constraint_constants.t) = (* size is fixed, given a particular depth *) - let depth = - Genesis_constants.Constraint_constants.compiled.pending_coinbase_depth - in + let depth = constraint_constants.pending_coinbase_depth in Mina_base.Pending_coinbase.create ~depth () |> Or_error.ok_exn let staged_ledger_diff = @@ -698,11 +688,10 @@ let staged_ledger_diff = in Staged_ledger_diff.of_yojson json |> Result.ok_or_failwith -let merkle_path = +let merkle_path + ~(constraint_constants : Genesis_constants.Constraint_constants.t) = (* size is constant for a given length, assuming each hash is distinct *) - let ledger_depth = - Genesis_constants.Constraint_constants.compiled.ledger_depth - in + let ledger_depth = constraint_constants.ledger_depth in let hashes = Quickcheck.random_value @@ Quickcheck.Generator.list_with_length ledger_depth diff --git a/src/app/print_blockchain_snark_vk/dune b/src/app/print_blockchain_snark_vk/dune index ef2d85109fd..28872e1df1e 100644 --- a/src/app/print_blockchain_snark_vk/dune +++ b/src/app/print_blockchain_snark_vk/dune @@ -1,7 +1,7 @@ (executable (name print_blockchain_snark_vk) (libraries - blockchain_snark) + blockchain_snark genesis_constants) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_version))) diff --git a/src/app/print_blockchain_snark_vk/print_blockchain_snark_vk.ml b/src/app/print_blockchain_snark_vk/print_blockchain_snark_vk.ml index 24492fd7b95..c42eeb49d48 100644 --- a/src/app/print_blockchain_snark_vk/print_blockchain_snark_vk.ml +++ b/src/app/print_blockchain_snark_vk/print_blockchain_snark_vk.ml @@ -1,42 +1,30 @@ open Core_kernel -module Config = struct - let constraint_constants = Genesis_constants.Constraint_constants.compiled - - let proof_level = Genesis_constants.Proof_level.Full -end - -let () = Format.eprintf "Generating transaction snark circuit..@." - -let before = Time.now () - -module Transaction_snark_instance = Transaction_snark.Make (Config) - -let after = Time.now () - -let () = - Format.eprintf "Generated transaction snark circuit in %s.@." - (Time.Span.to_string_hum (Time.diff after before)) - -let () = Format.eprintf "Generating blockchain snark circuit..@." - -let before = Time.now () - -module Blockchain_snark_instance = -Blockchain_snark.Blockchain_snark_state.Make (struct - let tag = Transaction_snark_instance.tag - - include Config -end) - -let after = Time.now () - -let () = - Format.eprintf "Generated blockchain snark circuit in %s.@." - (Time.Span.to_string_hum (Time.diff after before)) - let () = Async.Thread_safe.block_on_async_exn (fun () -> + let () = Format.eprintf "Generating transaction snark circuit..@." in + let module Transaction_snark_instance = Transaction_snark.Make (struct + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + + let proof_level = Genesis_constants.Proof_level.Full + end) in + let () = Format.eprintf "Generating blockchain snark circuit..@." in + let before = Time.now () in + let module Blockchain_snark_instance = + Blockchain_snark.Blockchain_snark_state.Make (struct + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + + let proof_level = Genesis_constants.Proof_level.Full + + let tag = Transaction_snark_instance.tag + end) in + let after = Time.now () in + let () = + Format.eprintf "Generated blockchain snark circuit in %s.@." + (Time.Span.to_string_hum (Time.diff after before)) + in Lazy.force Blockchain_snark_instance.Proof.verification_key ) |> Pickles.Verification_key.to_yojson |> Yojson.Safe.to_string |> Format.print_string diff --git a/src/app/replayer/replayer.ml b/src/app/replayer/replayer.ml index a7edb988e23..957f4a0f234 100644 --- a/src/app/replayer/replayer.ml +++ b/src/app/replayer/replayer.ml @@ -54,10 +54,6 @@ end let error_count = ref 0 -let constraint_constants = Genesis_constants.Constraint_constants.compiled - -let proof_level = Genesis_constants.Proof_level.Full - let json_ledger_hash_of_ledger ledger = Ledger_hash.to_yojson @@ Ledger.merkle_root ledger @@ -199,7 +195,7 @@ let update_epoch_ledger ~logger ~name ~ledger ~epoch_ledger epoch_ledger_hash = let epoch_ledger = Ledger.create ~depth:(Ledger.depth ledger) () in List.iter accounts ~f:(fun account -> let pk = Account.public_key account in - let token = Account.token account in + let token = Account.token_id account in let account_id = Account_id.create pk token in match Ledger.get_or_create_account epoch_ledger account_id account with | Ok (`Added, _loc) -> @@ -634,8 +630,14 @@ let write_replayer_checkpoint ~logger ~ledger ~last_global_slot_since_genesis let main ~input_file ~output_file_opt ~archive_uri ~continue_on_error ~checkpoint_interval ~checkpoint_output_folder_opt ~checkpoint_file_prefix - ~genesis_dir_opt ~log_json ~log_level () = + ~genesis_dir_opt ~log_json ~log_level ~log_filename ~file_log_level + ~constraint_constants ~proof_level () = Cli_lib.Stdout_log.setup log_json log_level ; + Option.iter log_filename ~f:(fun log_filename -> + Logger.Consumer_registry.register ~id:"default" + ~processor:(Logger.Processor.raw ~log_level:file_log_level ()) + ~transport:(Logger_file_system.evergrowing ~log_filename) + () ) ; let logger = Logger.create () in let json = Yojson.Safe.from_file input_file in let input = @@ -1681,6 +1683,8 @@ let main ~input_file ~output_file_opt ~archive_uri ~continue_on_error exit 1 ) ) ) let () = + let constraint_constants = Genesis_constants.Compiled.constraint_constants in + let proof_level = Genesis_constants.Proof_level.Full in Command.( run (let open Let_syntax in @@ -1719,7 +1723,10 @@ let () = ~doc:"string Checkpoint file prefix (default: 'replayer')" Param.(optional_with_default "replayer" string) and log_json = Cli_lib.Flag.Log.json - and log_level = Cli_lib.Flag.Log.level in + and log_level = Cli_lib.Flag.Log.level + and file_log_level = Cli_lib.Flag.Log.file_log_level + and log_filename = Cli_lib.Flag.Log.file in main ~input_file ~output_file_opt ~archive_uri ~checkpoint_interval ~continue_on_error ~checkpoint_output_folder_opt - ~checkpoint_file_prefix ~genesis_dir_opt ~log_json ~log_level ))) + ~checkpoint_file_prefix ~genesis_dir_opt ~log_json ~log_level + ~file_log_level ~log_filename ~constraint_constants ~proof_level ))) diff --git a/src/app/rosetta/dune b/src/app/rosetta/dune index 6275778c0d0..83be7c2bc27 100644 --- a/src/app/rosetta/dune +++ b/src/app/rosetta/dune @@ -4,7 +4,7 @@ (public_name rosetta) (modules rosetta) (modes native) - (libraries lib async core_kernel base async.async_command core async_kernel) + (libraries lib async core_kernel base async.async_command core async_kernel genesis_constants) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_version)) ) @@ -15,7 +15,7 @@ (public_name rosetta-testnet) (modules rosetta_testnet_signatures) (modes native) - (libraries lib mina_signature_kind.testnet async core_kernel base async.async_command core async_kernel) + (libraries lib mina_signature_kind.testnet async core_kernel base async.async_command core async_kernel genesis_constants) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_version)) ) @@ -26,7 +26,7 @@ (public_name rosetta-mainnet) (modules rosetta_mainnet_signatures) (modes native) - (libraries lib mina_signature_kind.mainnet async core_kernel base async.async_command core async_kernel) + (libraries lib mina_signature_kind.mainnet async core_kernel base async.async_command core async_kernel genesis_constants) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_version)) ) diff --git a/src/app/rosetta/lib/account.ml b/src/app/rosetta/lib/account.ml index 0b2265c2068..90a3cf39bd9 100644 --- a/src/app/rosetta/lib/account.ml +++ b/src/app/rosetta/lib/account.ml @@ -30,11 +30,6 @@ end module Sql = struct module Balance_from_last_relevant_command = struct - let max_txns = - Int.pow 2 - Genesis_constants.Constraint_constants.compiled - .transaction_capacity_log_2 - let query_pending = Caqti_request.find_opt Caqti_type.(tup3 string int64 string) @@ -268,6 +263,7 @@ module Balance = struct M.t ; validate_network_choice : network_identifier:Network_identifier.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> graphql_uri:Uri.t -> (unit, Errors.t) M.t } @@ -279,11 +275,15 @@ module Balance = struct (* But for tests, we want things to go fast *) module Mock = T (Result) - let real : with_db:_ -> graphql_uri:Uri.t -> 'gql Real.t = - fun ~with_db ~graphql_uri -> + let real : + with_db:_ + -> graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t + -> 'gql Real.t = + fun ~with_db ~graphql_uri ~minimum_user_command_fee -> { gql = (fun ?token_id ~address () -> - Graphql.query + Graphql.query ~minimum_user_command_fee Get_balance.( make @@ makeVariables ~public_key:(`String address) @@ -342,16 +342,17 @@ module Balance = struct let handle : graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> env:'gql E.t -> Account_balance_request.t -> (Account_balance_response.t, Errors.t) M.t = - fun ~graphql_uri ~env req -> + fun ~graphql_uri ~minimum_user_command_fee ~env req -> let open M.Let_syntax in let address = req.account_identifier.address in let%bind token_id = Token_id.decode req.account_identifier.metadata in let%bind () = env.validate_network_choice ~network_identifier:req.network_identifier - ~graphql_uri + ~graphql_uri ~minimum_user_command_fee in let make_balance_amount ~liquid_balance ~total_balance = let amount = @@ -448,7 +449,7 @@ module Balance = struct ~expected: (Mock.handle ~graphql_uri:(Uri.of_string "http://minaprotocol.com") - ~env:Env.mock + ~minimum_user_command_fee:Mina_currency.Fee.one ~env:Env.mock (Account_balance_request.create (Network_identifier.create "x" "y") (Account_identifier.create "x") ) ) @@ -487,7 +488,7 @@ module Balance = struct ~expected: (Mock.handle ~graphql_uri:(Uri.of_string "http://minaprotocol.com") - ~env:Env.mock + ~minimum_user_command_fee:Mina_currency.Fee.one ~env:Env.mock Account_balance_request. { block_identifier = Some @@ -528,7 +529,8 @@ module Balance = struct end ) end -let router ~graphql_uri ~logger ~with_db (route : string list) body = +let router ~graphql_uri ~minimum_user_command_fee ~logger ~with_db + (route : string list) body = let open Async.Deferred.Result.Let_syntax in [%log debug] "Handling /account/ $route" ~metadata:[ ("route", `List (List.map route ~f:(fun s -> `String s))) ] ; @@ -565,8 +567,9 @@ let router ~graphql_uri ~logger ~with_db (route : string list) body = |> Errors.Lift.wrap in let%map res = - Balance.Real.handle ~graphql_uri - ~env:(Balance.Env.real ~with_db ~graphql_uri) + Balance.Real.handle ~graphql_uri ~minimum_user_command_fee + ~env: + (Balance.Env.real ~with_db ~graphql_uri ~minimum_user_command_fee) req |> Errors.Lift.wrap in diff --git a/src/app/rosetta/lib/block.ml b/src/app/rosetta/lib/block.ml index 6fac0426b3b..9a9ad6b6baa 100644 --- a/src/app/rosetta/lib/block.ml +++ b/src/app/rosetta/lib/block.ml @@ -1,5 +1,6 @@ open Core_kernel open Async +module Mina_currency = Currency open Rosetta_lib open Rosetta_models open Commands_common @@ -934,6 +935,7 @@ module Specific = struct ; db_block : Block_query.t -> (Block_info.t, Errors.t) M.t ; validate_network_choice : network_identifier:Network_identifier.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> graphql_uri:Uri.t -> (unit, Errors.t) M.t } @@ -971,16 +973,17 @@ module Specific = struct let handle : graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> env:'gql Env.T(M).t -> Block_request.t -> (Block_response.t, Errors.t) M.t = - fun ~graphql_uri ~env req -> + fun ~graphql_uri ~minimum_user_command_fee ~env req -> let open M.Let_syntax in let logger = env.logger in let%bind query = Query.of_partial_identifier req.block_identifier in let%bind () = env.validate_network_choice ~network_identifier:req.network_identifier - ~graphql_uri + ~graphql_uri ~minimum_user_command_fee in let%bind block_info = env.db_block query in let%bind internal_transactions = @@ -1049,7 +1052,8 @@ module Specific = struct end ) end -let router ~graphql_uri ~logger ~with_db (route : string list) body = +let router ~graphql_uri ~minimum_user_command_fee ~logger ~with_db + (route : string list) body = let open Async.Deferred.Result.Let_syntax in [%log debug] "Handling /block/ $route" ~metadata:[ ("route", `List (List.map route ~f:(fun s -> `String s))) ] ; @@ -1062,7 +1066,7 @@ let router ~graphql_uri ~logger ~with_db (route : string list) body = |> Errors.Lift.wrap in let%map res = - Specific.Real.handle ~graphql_uri + Specific.Real.handle ~graphql_uri ~minimum_user_command_fee ~env:(Specific.Env.real ~logger ~db) req |> Errors.Lift.wrap diff --git a/src/app/rosetta/lib/cli.ml b/src/app/rosetta/lib/cli.ml index 1f082357b3d..457d7d801c2 100644 --- a/src/app/rosetta/lib/cli.ml +++ b/src/app/rosetta/lib/cli.ml @@ -34,6 +34,7 @@ let logger_setup log_json log_level = ; pretty_print = true } in - Logger.Consumer_registry.register ~id:"default" - ~processor:stdout_log_processor + Logger.Consumer_registry.register ~commit_id:Mina_version.commit_id + ~id:"default" ~processor:stdout_log_processor ~transport:(Logger.Transport.stdout ()) + () diff --git a/src/app/rosetta/lib/construction.ml b/src/app/rosetta/lib/construction.ml index 90297f8b177..36f5a609351 100644 --- a/src/app/rosetta/lib/construction.ml +++ b/src/app/rosetta/lib/construction.ml @@ -217,6 +217,7 @@ module Metadata = struct -> ('gql, Errors.t) M.t ; validate_network_choice : network_identifier:Network_identifier.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> graphql_uri:Uri.t -> (unit, Errors.t) M.t ; lift : 'a 'e. ('a, 'e) Result.t -> ('a, 'e) M.t @@ -226,11 +227,14 @@ module Metadata = struct module Real = T (Deferred.Result) module Mock = T (Result) - let real : graphql_uri:Uri.t -> 'gql Real.t = - fun ~graphql_uri -> + let real : + graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t + -> 'gql Real.t = + fun ~graphql_uri ~minimum_user_command_fee -> { gql = (fun ?token_id:_ ~address ~receiver () -> - Graphql.query + Graphql.query ~minimum_user_command_fee Get_options_metadata.( make @@ makeVariables @@ -291,8 +295,8 @@ module Metadata = struct [%test_eq: int] sugg 700 module Impl (M : Monad_fail.S) = struct - let handle ~graphql_uri ~(env : 'gql Env.T(M).t) - (req : Construction_metadata_request.t) = + let handle ~graphql_uri ~account_creation_fee ~minimum_user_command_fee + ~(env : 'gql Env.T(M).t) (req : Construction_metadata_request.t) = let open M.Let_syntax in let%bind req_options = match req.options with @@ -308,7 +312,7 @@ module Metadata = struct in let%bind () = env.validate_network_choice ~network_identifier:req.network_identifier - ~graphql_uri + ~minimum_user_command_fee ~graphql_uri in let%bind account = match res.Get_options_metadata.account with @@ -344,8 +348,7 @@ module Metadata = struct M.fail (Errors.create `Chain_info_missing) in if Array.is_empty fees then - Amount_of.mina - (Mina_currency.Fee.to_uint64 Signed_command.minimum_fee) + Amount_of.mina (Mina_currency.Fee.to_uint64 minimum_user_command_fee) else Amount_of.mina (suggest_fee @@ -361,23 +364,16 @@ module Metadata = struct [ ( "minimum_fee" , Amount.to_yojson (Amount_of.mina - (Mina_currency.Fee.to_uint64 - Mina_currency.Fee.minimum_user_command_fee ) ) ) + (Mina_currency.Fee.to_uint64 minimum_user_command_fee) ) ) ] in let receiver_exists = Option.is_some res.receiver in - let constraint_constants = - Genesis_constants.Constraint_constants.compiled - in { Construction_metadata_response.metadata = Metadata_data.create ~sender:options.Options.sender ~token_id:options.Options.token_id ~nonce ~receiver:options.receiver ~account_creation_fee: ( if receiver_exists then None - else - Some - (Mina_currency.Fee.to_uint64 - constraint_constants.account_creation_fee ) ) + else Some (Mina_currency.Fee.to_uint64 account_creation_fee) ) ~valid_until:options.valid_until ~memo:options.memo |> Metadata_data.to_yojson ; suggested_fee = @@ -687,18 +683,26 @@ module Parse = struct end module Impl (M : Monad_fail.S) = struct - let check_sufficient_fee (type a) + let check_sufficient_fee (type a) ~minimum_user_command_fee (payment : a -> Transaction.Unsigned.Rendered.Payment.t option) (transaction : a) : (unit, Errors.t) Result.t = match payment transaction with | Some pay -> - if Transaction.Unsigned.Rendered.Payment.is_fee_sufficient pay then - Ok () - else Result.fail @@ Errors.create `Transaction_submit_fee_small + if + Transaction.Unsigned.Rendered.Payment.is_fee_sufficient + ~minimum_user_command_fee pay + then Ok () + else + Result.fail + @@ Errors.create + (`Transaction_submit_fee_small + (Mina_currency.Fee.to_mina_string minimum_user_command_fee) + ) | None -> Ok () - let handle ~(env : Env.T(M).t) (req : Construction_parse_request.t) = + let handle ~minimum_user_command_fee ~(env : Env.T(M).t) + (req : Construction_parse_request.t) = let open M.Let_syntax in let%bind json = try M.return (Yojson.Safe.from_string req.transaction) @@ -717,7 +721,7 @@ module Parse = struct |> env.lift in let%bind () = - check_sufficient_fee + check_sufficient_fee ~minimum_user_command_fee Transaction.Signed.Rendered.(fun a -> a.payment) signed_rendered_transaction |> env.lift @@ -753,7 +757,7 @@ module Parse = struct |> env.lift in let%bind () = - check_sufficient_fee + check_sufficient_fee ~minimum_user_command_fee Transaction.Unsigned.Rendered.(fun a -> a.payment) unsigned_rendered_transaction |> env.lift @@ -926,6 +930,7 @@ module Submit = struct let real : db:(module Caqti_async.CONNECTION) -> graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> ( 'gql_payment , 'gql_delegation , 'gql_create_token @@ -934,10 +939,10 @@ module Submit = struct Real.t = let uint64 x = `String (Unsigned.UInt64.to_string x) in let uint32 x = `String (Unsigned.UInt32.to_string x) in - fun ~db ~graphql_uri -> + fun ~db ~graphql_uri ~minimum_user_command_fee -> { gql_payment = (fun ~payment ~signature () -> - Graphql.query_and_catch + Graphql.query_and_catch ~minimum_user_command_fee Send_payment.( make @@ makeVariables ~from:(`String payment.from) @@ -949,7 +954,7 @@ module Submit = struct graphql_uri ) ; gql_delegation = (fun ~delegation ~signature () -> - Graphql.query + Graphql.query ~minimum_user_command_fee Send_delegation.( make @@ makeVariables ~sender:(`String delegation.delegator) @@ -1076,8 +1081,8 @@ module Submit = struct module Mock = Impl (Result) end -let router ~get_graphql_uri_or_error ~with_db ~logger (route : string list) body - = +let router ~get_graphql_uri_or_error ~with_db ~logger ~account_creation_fee + ~minimum_user_command_fee (route : string list) body = [%log debug] "Handling /construction/ $route" ~metadata:[ ("route", `List (List.map route ~f:(fun s -> `String s))) ] ; let open Deferred.Result.Let_syntax in @@ -1111,8 +1116,9 @@ let router ~get_graphql_uri_or_error ~with_db ~logger (route : string list) body in let%bind graphql_uri = get_graphql_uri_or_error () in let%map res = - Metadata.Real.handle ~graphql_uri - ~env:(Metadata.Env.real ~graphql_uri) + Metadata.Real.handle ~graphql_uri ~account_creation_fee + ~minimum_user_command_fee + ~env:(Metadata.Env.real ~graphql_uri ~minimum_user_command_fee) req |> Errors.Lift.wrap in @@ -1144,7 +1150,8 @@ let router ~get_graphql_uri_or_error ~with_db ~logger (route : string list) body |> Errors.Lift.wrap in let%map res = - Parse.Real.handle ~env:Parse.Env.real req |> Errors.Lift.wrap + Parse.Real.handle ~minimum_user_command_fee ~env:Parse.Env.real req + |> Errors.Lift.wrap in Construction_parse_response.to_yojson res | [ "hash" ] -> @@ -1166,7 +1173,9 @@ let router ~get_graphql_uri_or_error ~with_db ~logger (route : string list) body |> Errors.Lift.wrap in let%map res = - Submit.Real.handle ~env:(Submit.Env.real ~db ~graphql_uri) req + Submit.Real.handle + ~env:(Submit.Env.real ~db ~graphql_uri ~minimum_user_command_fee) + req |> Errors.Lift.wrap in Transaction_identifier_response.to_yojson res ) diff --git a/src/app/rosetta/lib/graphql.ml b/src/app/rosetta/lib/graphql.ml index 42956a90b79..278617ecb6a 100644 --- a/src/app/rosetta/lib/graphql.ml +++ b/src/app/rosetta/lib/graphql.ml @@ -23,10 +23,10 @@ let graphql_error_to_string e = | e -> error_obj_to_string e -let query query_obj uri = +let query ~minimum_user_command_fee query_obj uri = let variables_string = Yojson.Basic.to_string query_obj#variables in let body_string = - String.substr_replace_all ~pattern:"\n" ~with_:"" + String.substr_replace_all ~pattern:"\n" ~with_:" " @@ Printf.sprintf {|{"query": "%s", "variables": %s}|} query_obj#query variables_string in @@ -67,7 +67,8 @@ let query query_obj uri = (Errors.create ~context:"Empty response from Mina Daemon" (`Graphql_mina_query "Empty response") ) | error, `Null -> - Errors.Transaction_submit.of_request_error (graphql_error_to_string error) + Errors.Transaction_submit.of_request_error ~minimum_user_command_fee + (graphql_error_to_string error) |> Option.value ~default: (Errors.create ~context:"Explicit error response from Mina Daemon" @@ -83,7 +84,7 @@ let query query_obj uri = (Exn.to_string e) ) ) ) ) |> Deferred.return -let query_and_catch query_obj uri = +let query_and_catch ~minimum_user_command_fee query_obj uri = let open Deferred.Let_syntax in - let%map res = query query_obj uri in + let%map res = query ~minimum_user_command_fee query_obj uri in match res with Ok r -> Ok (`Successful r) | Error e -> Ok (`Failed e) diff --git a/src/app/rosetta/lib/mempool.ml b/src/app/rosetta/lib/mempool.ml index 259e2aea908..b1791e1ef2e 100644 --- a/src/app/rosetta/lib/mempool.ml +++ b/src/app/rosetta/lib/mempool.ml @@ -47,6 +47,8 @@ module Get_transactions_by_hash = } |}] +module Mina_currency = Currency + (* Avoid shadowing graphql_ppx functions *) open Core_kernel open Async @@ -61,6 +63,7 @@ module All = struct { gql : unit -> ('gql, Errors.t) M.t ; validate_network_choice : network_identifier:Network_identifier.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> graphql_uri:Uri.t -> (unit, Errors.t) M.t } @@ -72,10 +75,16 @@ module All = struct (* But for tests, we want things to go fast *) module Mock = T (Result) - let real : graphql_uri:Uri.t -> 'gql Real.t = - fun ~graphql_uri -> + let real : + graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t + -> 'gql Real.t = + fun ~graphql_uri ~minimum_user_command_fee -> { gql = - (fun () -> Graphql.query (Get_all_transactions.make ()) graphql_uri) + (fun () -> + Graphql.query ~minimum_user_command_fee + (Get_all_transactions.make ()) + graphql_uri ) ; validate_network_choice = Network.Validate_choice.Real.validate } @@ -95,15 +104,16 @@ module All = struct module Impl (M : Monad_fail.S) = struct let handle : graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> env:'gql Env.T(M).t -> Network_request.t -> (Mempool_response.t, Errors.t) M.t = - fun ~graphql_uri ~env req -> + fun ~graphql_uri ~minimum_user_command_fee ~env req -> let open M.Let_syntax in let%bind res = env.gql () in let%map () = env.validate_network_choice ~network_identifier:req.network_identifier - ~graphql_uri + ~graphql_uri ~minimum_user_command_fee in let open Get_all_transactions in { Mempool_response.transaction_identifiers = @@ -123,7 +133,8 @@ module All = struct ~expected: (Mock.handle ~graphql_uri:(Uri.of_string "https://minaprotocol.com") - ~env:Env.mock Network.dummy_network_request ) + ~minimum_user_command_fee:Mina_currency.Fee.one ~env:Env.mock + Network.dummy_network_request ) ~actual: (Result.return { Mempool_response.transaction_identifiers = @@ -141,6 +152,7 @@ module Transaction = struct { gql : hash:string -> ('gql, Errors.t) M.t ; validate_network_choice : network_identifier:Network_identifier.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> graphql_uri:Uri.t -> (unit, Errors.t) M.t } @@ -149,11 +161,14 @@ module Transaction = struct module Real = T (Deferred.Result) module Mock = T (Result) - let real : graphql_uri:Uri.t -> 'gql Real.t = - fun ~graphql_uri -> + let real : + graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t + -> 'gql Real.t = + fun ~graphql_uri ~minimum_user_command_fee -> { gql = (fun ~hash -> - Graphql.query + Graphql.query ~minimum_user_command_fee Get_transactions_by_hash.( make @@ makeVariables ~hashes:[| hash |] ()) graphql_uri ) @@ -272,15 +287,16 @@ module Transaction = struct let handle : graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> env:'gql Env.T(M).t -> Mempool_transaction_request.t -> (Mempool_transaction_response.t, Errors.t) M.t = - fun ~graphql_uri ~env req -> + fun ~graphql_uri ~minimum_user_command_fee ~env req -> let open M.Let_syntax in let%bind res = env.gql ~hash:req.transaction_identifier.hash in let%bind () = env.validate_network_choice ~network_identifier:req.network_identifier - ~graphql_uri + ~graphql_uri ~minimum_user_command_fee in let open Get_transactions_by_hash in let%bind user_command_obj = @@ -325,7 +341,8 @@ module Transaction = struct end ) end -let router ~graphql_uri ~logger (route : string list) body = +let router ~graphql_uri ~minimum_user_command_fee ~logger (route : string list) + body = let open Async.Deferred.Result.Let_syntax in [%log debug] "Handling /mempool/ $route" ~metadata:[ ("route", `List (List.map route ~f:(fun s -> `String s))) ] ; @@ -337,7 +354,9 @@ let router ~graphql_uri ~logger (route : string list) body = |> Errors.Lift.wrap in let%map res = - All.Real.handle ~graphql_uri ~env:(All.Env.real ~graphql_uri) req + All.Real.handle ~graphql_uri ~minimum_user_command_fee + ~env:(All.Env.real ~graphql_uri ~minimum_user_command_fee) + req |> Errors.Lift.wrap in Mempool_response.to_yojson res @@ -348,8 +367,8 @@ let router ~graphql_uri ~logger (route : string list) body = |> Errors.Lift.wrap in let%map res = - Transaction.Real.handle ~graphql_uri - ~env:(Transaction.Env.real ~graphql_uri) + Transaction.Real.handle ~graphql_uri ~minimum_user_command_fee + ~env:(Transaction.Env.real ~graphql_uri ~minimum_user_command_fee) req |> Errors.Lift.wrap in diff --git a/src/app/rosetta/lib/network.ml b/src/app/rosetta/lib/network.ml index 420d3569aca..81bac9ca5e3 100644 --- a/src/app/rosetta/lib/network.ml +++ b/src/app/rosetta/lib/network.ml @@ -43,6 +43,7 @@ module Get_status = (** Open after GraphQL query, to avoid shadowing functions used by the PPX *) open Core_kernel +module Mina_currency = Currency open Async open Rosetta_lib open Rosetta_models @@ -56,19 +57,22 @@ module Get_status_t = struct module Get_genesis_block_identifier_memoized = struct let query = Memoize.build - @@ fun ~graphql_uri () -> - Graphql.query + @@ fun ~graphql_uri ~minimum_user_command_fee () -> + Graphql.query ~minimum_user_command_fee Get_genesis_block_identifier.(make @@ makeVariables ()) graphql_uri end - let query ~graphql_uri () = + let query ~graphql_uri ~minimum_user_command_fee () = let open Deferred.Result.Let_syntax in let%bind genesis_block_identifier = - Get_genesis_block_identifier_memoized.query ~graphql_uri () + Get_genesis_block_identifier_memoized.query ~graphql_uri + ~minimum_user_command_fee () in let%map status = - Graphql.query Get_status.(make @@ makeVariables ()) graphql_uri + Graphql.query ~minimum_user_command_fee + Get_status.(make @@ makeVariables ()) + graphql_uri in { genesis_block_identifier; status } end @@ -134,15 +138,19 @@ module Get_network = [%graphql {| module Get_network_memoized = struct let query = Memoize.build - @@ fun ~graphql_uri () -> - Graphql.query Get_network.(make @@ makeVariables ()) graphql_uri + @@ fun ~graphql_uri ~minimum_user_command_fee () -> + Graphql.query ~minimum_user_command_fee + Get_network.(make @@ makeVariables ()) + graphql_uri end module Validate_choice = struct module Real = struct - let validate ~network_identifier ~graphql_uri = + let validate ~network_identifier ~minimum_user_command_fee ~graphql_uri = let open Deferred.Result.Let_syntax in - let%bind gql_response = Get_network_memoized.query ~graphql_uri () in + let%bind gql_response = + Get_network_memoized.query ~graphql_uri ~minimum_user_command_fee () + in let network_tag = gql_response.networkID in let requested_tag = Format.sprintf "%s:%s" network_identifier.Network_identifier.blockchain @@ -155,7 +163,9 @@ module Validate_choice = struct end module Mock = struct - let succeed ~network_identifier:_ ~graphql_uri:_ = Result.return () + let succeed ~network_identifier:_ ~minimum_user_command_fee:_ ~graphql_uri:_ + = + Result.return () end end @@ -167,10 +177,12 @@ module List_ = struct module Real = Make (Deferred.Result) - let real ~graphql_uri : Real.t = + let real ~graphql_uri ~minimum_user_command_fee : Real.t = fun () -> let open Deferred.Result.Let_syntax in - let%map resp = Get_network_memoized.query ~graphql_uri () in + let%map resp = + Get_network_memoized.query ~graphql_uri ~minimum_user_command_fee () + in resp.networkID end @@ -207,6 +219,7 @@ module Status = struct ; db_latest_block : unit -> (int64 * string * int64, Errors.t) M.t ; validate_network_choice : network_identifier:Network_identifier.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> graphql_uri:Uri.t -> (unit, Errors.t) M.t } @@ -218,10 +231,13 @@ module Status = struct let oldest_block_ref = ref None let real : - db:(module Caqti_async.CONNECTION) -> graphql_uri:Uri.t -> 'gql Real.t = - fun ~db ~graphql_uri -> + db:(module Caqti_async.CONNECTION) + -> graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t + -> 'gql Real.t = + fun ~db ~graphql_uri ~minimum_user_command_fee -> let (module Db : Caqti_async.CONNECTION) = db in - { gql = Get_status_t.query ~graphql_uri + { gql = Get_status_t.query ~graphql_uri ~minimum_user_command_fee ; db_oldest_block = (fun () -> match !oldest_block_ref with @@ -244,12 +260,12 @@ module Status = struct end module Impl (M : Monad_fail.S) = struct - let handle ~graphql_uri ~(env : 'gql Env.T(M).t) + let handle ~graphql_uri ~minimum_user_command_fee ~(env : 'gql Env.T(M).t) (network : Network_request.t) = let open M.Let_syntax in let%bind res = env.gql () in let%bind () = - env.validate_network_choice ~graphql_uri + env.validate_network_choice ~graphql_uri ~minimum_user_command_fee ~network_identifier:network.network_identifier in let%bind latest_node_block = @@ -351,6 +367,7 @@ module Status = struct ~actual: (Mock.handle ~graphql_uri:(Uri.of_string "https://minaprotocol.com") + ~minimum_user_command_fee:Mina_currency.Fee.one ~env:no_chain_info_env dummy_network_request ) ~expected:(Result.fail (Errors.create `Chain_info_missing)) @@ -370,6 +387,7 @@ module Status = struct ~actual: (Mock.handle ~graphql_uri:(Uri.of_string "https://minaprotocol.com") + ~minimum_user_command_fee:Mina_currency.Fee.one ~env:oldest_block_is_genesis_env dummy_network_request ) ~expected: ( Result.return @@ -411,6 +429,7 @@ module Status = struct ~actual: (Mock.handle ~graphql_uri:(Uri.of_string "https://minaprotocol.com") + ~minimum_user_command_fee:Mina_currency.Fee.one ~env:oldest_block_is_different_env dummy_network_request ) ~expected: ( Result.return @@ -496,8 +515,8 @@ module Options = struct end ) end -let router ~get_graphql_uri_or_error ~logger ~with_db (route : string list) body - = +let router ~get_graphql_uri_or_error ~logger ~with_db ~minimum_user_command_fee + (route : string list) body = let open Async.Deferred.Result.Let_syntax in [%log debug] "Handling /network/ $route" ~metadata:[ ("route", `List (List.map route ~f:(fun s -> `String s))) ] ; @@ -510,7 +529,9 @@ let router ~get_graphql_uri_or_error ~logger ~with_db (route : string list) body |> Errors.Lift.wrap in let%map res = - List_.Real.handle ~env:(List_.Env.real ~graphql_uri) |> Errors.Lift.wrap + List_.Real.handle + ~env:(List_.Env.real ~graphql_uri ~minimum_user_command_fee) + |> Errors.Lift.wrap in Network_list_response.to_yojson res | [ "status" ] -> @@ -521,8 +542,8 @@ let router ~get_graphql_uri_or_error ~logger ~with_db (route : string list) body in let%bind res = with_db (fun ~db -> - Status.Real.handle ~graphql_uri - ~env:(Status.Env.real ~graphql_uri ~db) + Status.Real.handle ~graphql_uri ~minimum_user_command_fee + ~env:(Status.Env.real ~graphql_uri ~minimum_user_command_fee ~db) network |> Errors.Lift.wrap ) in diff --git a/src/app/rosetta/lib/rosetta.ml b/src/app/rosetta/lib/rosetta.ml index 135235db65a..f315b6e1e81 100644 --- a/src/app/rosetta/lib/rosetta.ml +++ b/src/app/rosetta/lib/rosetta.ml @@ -2,7 +2,7 @@ open Core_kernel open Async open Rosetta_lib -let router ~graphql_uri +let router ~graphql_uri ~minimum_user_command_fee ~account_creation_fee ~(pool : ( (Caqti_async.connection, [> Caqti_error.connect ]) Caqti_async.Pool.t , [ `App of Errors.t ] ) @@ -41,22 +41,25 @@ let router ~graphql_uri match route with | "network" :: tl -> Network.router tl body ~get_graphql_uri_or_error ~logger - ~with_db:with_db' + ~with_db:with_db' ~minimum_user_command_fee | "account" :: tl -> let%bind graphql_uri = get_graphql_uri_or_error () in Account.router tl body ~graphql_uri ~logger ~with_db + ~minimum_user_command_fee | "mempool" :: tl -> let%bind graphql_uri = get_graphql_uri_or_error () in - Mempool.router tl body ~graphql_uri ~logger + Mempool.router tl body ~graphql_uri ~logger ~minimum_user_command_fee | "block" :: tl -> let%bind graphql_uri = get_graphql_uri_or_error () in Block.router tl body ~graphql_uri ~logger ~with_db:with_db' + ~minimum_user_command_fee | "construction" :: tl -> Construction.router tl body ~get_graphql_uri_or_error ~logger - ~with_db:with_db' + ~with_db:with_db' ~minimum_user_command_fee ~account_creation_fee | "search" :: tl -> let%bind graphql_uri = get_graphql_uri_or_error () in Search.router tl body ~graphql_uri ~logger ~with_db:with_db' + ~minimum_user_command_fee | _ -> Deferred.return (Error `Page_not_found) with exn -> Deferred.return (Error (`Exception exn)) @@ -102,16 +105,19 @@ let pg_log_data ~logger ~pool : unit Deferred.t = ~metadata:[ ("error", `String (Errors.show err)) ] ; Deferred.unit -let server_handler ~pool ~graphql_uri ~logger ~body _sock req = +let server_handler ~pool ~graphql_uri ~logger ~minimum_user_command_fee + ~account_creation_fee ~body _sock req = let uri = Cohttp_async.Request.uri req in let%bind body = Cohttp_async.Body.to_string body in let route = List.tl_exn (String.split ~on:'/' (Uri.path uri)) in let%bind result = match Yojson.Safe.from_string body with | body -> - router route body ~pool ~graphql_uri ~logger + router route body ~pool ~graphql_uri ~logger ~minimum_user_command_fee + ~account_creation_fee | exception Yojson.Json_error "Blank input data" -> - router route `Null ~pool ~graphql_uri ~logger + router route `Null ~pool ~graphql_uri ~logger ~minimum_user_command_fee + ~account_creation_fee | exception Yojson.Json_error err -> Errors.create ~context:"JSON in request malformed" (`Json_parse (Some err)) @@ -147,7 +153,7 @@ let server_handler ~pool ~graphql_uri ~logger ~body _sock req = [%log warn] ~metadata "Error response: $error" ; respond_500 error -let command = +let command ~minimum_user_command_fee ~account_creation_fee = let open Command.Let_syntax in let%map_open archive_uri = flag "--archive-uri" ~aliases:[ "archive-uri" ] @@ -223,7 +229,8 @@ let command = env_var ~metadata ; ignore (exit 1) ) ) (Async.Tcp.Where_to_listen.bind_to All_addresses (On_port port)) - (server_handler ~pool ~graphql_uri ~logger) + (server_handler ~pool ~graphql_uri ~logger ~minimum_user_command_fee + ~account_creation_fee ) in [%log info] ~metadata:[ ("port", `Int port) ] diff --git a/src/app/rosetta/lib/search.ml b/src/app/rosetta/lib/search.ml index 65abad87162..37f42fa1bf9 100644 --- a/src/app/rosetta/lib/search.ml +++ b/src/app/rosetta/lib/search.ml @@ -1,5 +1,6 @@ open Core_kernel open Async +module Mina_currency = Currency open Rosetta_lib module Rosetta_lib_block = Block open Rosetta_models @@ -1029,6 +1030,7 @@ module Specific = struct Transaction_query.t -> (Transactions_info.t, Errors.t) M.t ; validate_network_choice : network_identifier:Network_identifier.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> graphql_uri:Uri.t -> (unit, Errors.t) M.t } @@ -1061,15 +1063,16 @@ module Specific = struct let handle : graphql_uri:Uri.t + -> minimum_user_command_fee:Mina_currency.Fee.t -> env:'gql Env.T(M).t -> Search_transactions_request.t -> (Search_transactions_response.t, Errors.t) M.t = - fun ~graphql_uri ~env req -> + fun ~graphql_uri ~minimum_user_command_fee ~env req -> let open M.Let_syntax in let%bind query = Query.of_search_transaction_request req in let%bind () = env.validate_network_choice ~network_identifier:req.network_identifier - ~graphql_uri + ~graphql_uri ~minimum_user_command_fee in let%bind transactions_info = env.db_transactions query in let%bind internal_transactions = @@ -1119,7 +1122,8 @@ module Specific = struct module Real = Impl (Deferred.Result) end -let router ~graphql_uri ~logger ~with_db (route : string list) body = +let router ~graphql_uri ~minimum_user_command_fee ~logger ~with_db + (route : string list) body = let open Async.Deferred.Result.Let_syntax in [%log debug] "Handling /search/ $route" ~metadata:[ ("route", `List (List.map route ~f:(fun s -> `String s))) ] ; @@ -1133,7 +1137,7 @@ let router ~graphql_uri ~logger ~with_db (route : string list) body = |> Errors.Lift.wrap in let%map res = - Specific.Real.handle ~graphql_uri + Specific.Real.handle ~graphql_uri ~minimum_user_command_fee ~env:(Specific.Env.real ~logger ~db) req |> Errors.Lift.wrap diff --git a/src/app/rosetta/rosetta.ml b/src/app/rosetta/rosetta.ml index b7a558d7145..410201c7039 100644 --- a/src/app/rosetta/rosetta.ml +++ b/src/app/rosetta/rosetta.ml @@ -2,5 +2,9 @@ open Lib.Rosetta open Async let () = + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = Genesis_constants.Compiled.constraint_constants in Command.run - (Command.async ~summary:"Run Rosetta process on top of Mina" command) + (Command.async ~summary:"Run Rosetta process on top of Mina" + (command ~account_creation_fee:constraint_constants.account_creation_fee + ~minimum_user_command_fee:genesis_constants.minimum_user_command_fee ) ) diff --git a/src/app/rosetta/rosetta_mainnet_signatures.ml b/src/app/rosetta/rosetta_mainnet_signatures.ml index b7a558d7145..410201c7039 100644 --- a/src/app/rosetta/rosetta_mainnet_signatures.ml +++ b/src/app/rosetta/rosetta_mainnet_signatures.ml @@ -2,5 +2,9 @@ open Lib.Rosetta open Async let () = + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = Genesis_constants.Compiled.constraint_constants in Command.run - (Command.async ~summary:"Run Rosetta process on top of Mina" command) + (Command.async ~summary:"Run Rosetta process on top of Mina" + (command ~account_creation_fee:constraint_constants.account_creation_fee + ~minimum_user_command_fee:genesis_constants.minimum_user_command_fee ) ) diff --git a/src/app/rosetta/rosetta_testnet_signatures.ml b/src/app/rosetta/rosetta_testnet_signatures.ml index b7a558d7145..410201c7039 100644 --- a/src/app/rosetta/rosetta_testnet_signatures.ml +++ b/src/app/rosetta/rosetta_testnet_signatures.ml @@ -2,5 +2,9 @@ open Lib.Rosetta open Async let () = + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = Genesis_constants.Compiled.constraint_constants in Command.run - (Command.async ~summary:"Run Rosetta process on top of Mina" command) + (Command.async ~summary:"Run Rosetta process on top of Mina" + (command ~account_creation_fee:constraint_constants.account_creation_fee + ~minimum_user_command_fee:genesis_constants.minimum_user_command_fee ) ) diff --git a/src/app/rosetta/scripts/docker-demo-start.sh b/src/app/rosetta/scripts/docker-demo-start.sh index 853d4972ec1..571c4b7a424 100755 --- a/src/app/rosetta/scripts/docker-demo-start.sh +++ b/src/app/rosetta/scripts/docker-demo-start.sh @@ -36,7 +36,7 @@ export MINA_POSTGRES_CONF=${MINA_POSTGRES_CONF:=/etc/mina/rosetta/scripts/postgr # Mina Archive variables export MINA_ARCHIVE_PORT=${MINA_ARCHIVE_PORT:=3086} -export MINA_ARCHIVE_SQL_SCHEMA_PATH=${MINA_ARCHIVE_SQL_SCHEMA_PATH:=/etc/mina/rosetta/archive/create_schema.sql} +export MINA_ARCHIVE_SQL_SCHEMA_PATH=${MINA_ARCHIVE_SQL_SCHEMA_PATH:=/etc/mina/archive/create_schema.sql} # Mina Rosetta variables # To interact with rosetta, use MINA_ROSETTA_ONLINE_PORT and MINA_ROSETTA_OFFLINE_PORT. diff --git a/src/app/rosetta/scripts/docker-start.sh b/src/app/rosetta/scripts/docker-start.sh index a322159a53c..5af7f9e8d61 100755 --- a/src/app/rosetta/scripts/docker-start.sh +++ b/src/app/rosetta/scripts/docker-start.sh @@ -30,7 +30,7 @@ export MINA_LIBP2P_PASS=${MINA_LIBP2P_PASS:=''} export MINA_NETWORK=${MINA_NETWORK:=mainnet} export MINA_SUFFIX=${MINA_SUFFIX:=} export MINA_GENESIS_LEDGER_URL=${MINA_GENESIS_LEDGER_URL:=} -export MINA_CONFIG_FILE="${MINA_CONFIG_FILE:=/etc/mina/rosetta/genesis_ledgers/${MINA_NETWORK}.json}" +export MINA_CONFIG_FILE="${MINA_CONFIG_FILE:=/var/lib/coda/${MINA_NETWORK}.json}" export MINA_CONFIG_DIR="${MINA_CONFIG_DIR:=/data/.mina-config}" export MINA_CLIENT_TRUSTLIST=${MINA_CLIENT_TRUSTLIST:=} export PEER_LIST_URL=${PEER_LIST_URL:=https://storage.googleapis.com/seed-lists/${MINA_NETWORK}_seeds.txt} diff --git a/src/app/runtime_genesis_ledger/runtime_genesis_ledger.ml b/src/app/runtime_genesis_ledger/runtime_genesis_ledger.ml index 3ddd781a4b0..3c8b0317975 100644 --- a/src/app/runtime_genesis_ledger/runtime_genesis_ledger.ml +++ b/src/app/runtime_genesis_ledger/runtime_genesis_ledger.ml @@ -13,20 +13,18 @@ module Hash_json = struct type t = { ledger : Hashes.t; epoch_data : epoch_data } [@@deriving to_yojson] end -let ledger_depth = - (Lazy.force Precomputed_values.compiled_inputs).constraint_constants - .ledger_depth - let logger = Logger.create () -let load_ledger (accounts : Runtime_config.Accounts.t) = +let load_ledger + ~(constraint_constants : Genesis_constants.Constraint_constants.t) + (accounts : Runtime_config.Accounts.t) = let accounts = List.map accounts ~f:(fun account -> (None, Runtime_config.Accounts.Single.to_account account) ) in let packed = Genesis_ledger_helper.Ledger.packed_genesis_ledger_of_accounts - ~depth:ledger_depth + ~depth:constraint_constants.ledger_depth (lazy accounts) in Lazy.force (Genesis_ledger.Packed.t packed) @@ -120,16 +118,21 @@ let load_config_exn config_file = , Option.map ~f:extract_accounts_exn staking_ledger , Option.map ~f:extract_accounts_exn next_ledger ) -let main ~config_file ~genesis_dir ~hash_output_file () = +let main ~(constraint_constants : Genesis_constants.Constraint_constants.t) + ~config_file ~genesis_dir ~hash_output_file () = let%bind accounts, staking_accounts_opt, next_accounts_opt = load_config_exn config_file in - let ledger = load_ledger accounts in - let staking_ledger = - Option.value_map ~default:ledger ~f:load_ledger staking_accounts_opt + let ledger = load_ledger ~constraint_constants accounts in + let staking_ledger : Ledger.t = + Option.value_map ~default:ledger + ~f:(load_ledger ~constraint_constants) + staking_accounts_opt in let next_ledger = - Option.value_map ~default:staking_ledger ~f:load_ledger next_accounts_opt + Option.value_map ~default:staking_ledger + ~f:(load_ledger ~constraint_constants) + next_accounts_opt in let%bind hash_json = generate_hash_json ~genesis_dir ledger staking_ledger next_ledger @@ -138,6 +141,7 @@ let main ~config_file ~genesis_dir ~hash_output_file () = ~contents:(Yojson.Safe.to_string (Hash_json.to_yojson hash_json)) let () = + let constraint_constants = Genesis_constants.Compiled.constraint_constants in Command.run (Command.async ~summary: @@ -164,4 +168,4 @@ let () = "PATH path to the file where the hashes of the ledgers are to \ be saved" in - main ~config_file ~genesis_dir ~hash_output_file) ) + main ~constraint_constants ~config_file ~genesis_dir ~hash_output_file) ) diff --git a/src/app/snark_work_debugger/snark_work_debugger.ml b/src/app/snark_work_debugger/snark_work_debugger.ml index 3789a7a04a0..06f29637ba9 100644 --- a/src/app/snark_work_debugger/snark_work_debugger.ml +++ b/src/app/snark_work_debugger/snark_work_debugger.ml @@ -15,13 +15,11 @@ let rec sexp_to_sexp : Sexp.t -> Sexplib0.Sexp.t = function let () = ignore sexp_to_sexp -let main (spec_path : string) = +let main (spec_path : string) ~constraint_constants ~proof_level = let module Inputs = Snark_worker.Prod.Inputs in let%bind spec = Reader.load_sexp_exn spec_path Inputs.single_spec_of_sexp in let%bind worker = - Inputs.Worker_state.create - ~constraint_constants:Genesis_constants.Constraint_constants.compiled - ~proof_level:Full () + Inputs.Worker_state.create ~constraint_constants ~proof_level () in let message = Mina_base.Sok_message.create ~fee:Currency.Fee.zero @@ -40,6 +38,11 @@ let cmd = let open Command.Param in flag "--spec" ~doc:"PATH Spec path" (required string) in - fun () -> Obj.magic (main path)) + fun () -> + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let proof_level = Genesis_constants.Compiled.proof_level in + Obj.magic (main path ~constraint_constants ~proof_level)) let () = Command.run cmd diff --git a/src/app/test_executive/README.md b/src/app/test_executive/README.md index 8ba68aad9fb..113af81f60a 100644 --- a/src/app/test_executive/README.md +++ b/src/app/test_executive/README.md @@ -133,7 +133,7 @@ Running it directly in the terminal is not the most recommended method, but it i There are several ways to run Lucy: 1. Running the mina-test-executive package directly from command line. (not particularly recommended but it'll be fine) -2. Running from the pre-built docker container. (most recommended method) +2. Running from the pre-built debian package. (most recommended method) 3. compiling from source code, then running what you compiled. (if you want to modify or extend existing tests, or write new tests, then you will need to do this) We will go over each method in turn. @@ -179,41 +179,6 @@ mina-test-executive cloud $TEST_NAME --mina-image $MINA_IMAGE --archive-image $A If you prefer, it is also idiomatic to just manually edit and execute the `mina-test-executive` line instead of exporting the env vars. - -#### Run Lucy in dockerized form - -If you don't need to write your own tests and simply wish to run existing tests, the recommended way to run Lucy is to use docker. It's more encapsulated than downloading the `mina-test-executive` package with `apt`. All necessary infrastructure and terraform files are baked directly into the image, so it won't matter where you run the docker image from. - -All docker images for Lucy are in the [mina-test-executive GCR page](https://console.cloud.google.com/gcr/images/o1labs-192920/global/mina-test-executive). Click the link and pick a version of the test_executive image. The short-hash in the tag refers to the git hash that the test executive is compiled off of. The debian version doesn't really matter, it's simply the debian version of the image (it doesn't need to match your machine). - -Once you've picked an image, pull it with: - -``` -docker pull gcr.io/o1labs-192920/mina-test-executive@sha256:92c8f0315b53edfba0d885fdc12928e2a91811928ce751b65f943811c0c84463 -``` - -(Replace the GCR url with the url of your choice.) - -Once the image is downloaded, you can run it with the following idiomatic command (from any directory): - -``` -docker run \ ---env TEST_NAME= \ ---env MINA_IMAGE=minaprotocol/mina-daemon:1.3.2beta2-compatible-b8ce9fb-bullseye-devnet \ ---env ARCHIVE_IMAGE=minaprotocol/mina-archive:1.3.2beta2-compatible-b8ce9fb-bullseye \ ---env DEBUG_BOOL=false \ ---mount "type=bind,source=//o1labs-gcp-192920-cd2c1759278d.json,dst=/keys/o1labs-gcp-192920-cd2c1759278d.json,readonly" \ ---env GOOGLE_APPLICATION_CREDENTIALS=/keys/o1labs-gcp-192920-cd2c1759278d.json \ ---env GCLOUD_API_KEY \ -gcr.io/o1labs-192920/mina-test-executive@sha256:92c8f0315b53edfba0d885fdc12928e2a91811928ce751b65f943811c0c84463 - -``` - -As you'll notice, the env vars `TEST_NAME`, `MINA_IMAGE`, `ARCHIVE_IMAGE`, `DEBUG_BOOL` are the same as the flags and arguments that you'd put into the idiomatic command that you'd be using if you were directly running mina-test-executive in your terminal. Refer to the section [`mina-test-executive` command line breakdown](README.md#mina-test-executive-command-line-breakdown) for a detailed explaination of the arguments and flags. - -The env vars `GOOGLE_APPLICATION_CREDENTIALS`, `GCLOUD_API_KEY`, are the same GCP access credentials environment variables that you set up in the earlier section of this readme [GCP credentials and infrastructure related env vars](README.md#gcp-credentials-and-infrastructure-related-env-vars). The `--mount` argument simply tells docker to put the keyfile of the service account onto the file system inside of the container, so that processes running inside the container can access the keyfile. The env var `GOOGLE_APPLICATION_CREDENTIALS` is to be set to the path to the keyfile inside the container, not the path to the keyfile on the host machine, so unless you've modified other things there's no need to modify it. - - #### Compile Lucy from source If you wish to modify or extend existing tests, and/or write a whole new test, or modify the Lucy test executive itself, you will need to compile the Lucy test_executive from source. Lucy is a complex piece of software written in OCaml, it's not some simple python or bash script. diff --git a/src/app/test_executive/block_production_priority.ml b/src/app/test_executive/block_production_priority.ml index a00c2fa5ba7..4af15868188 100644 --- a/src/app/test_executive/block_production_priority.ml +++ b/src/app/test_executive/block_production_priority.ml @@ -19,9 +19,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct (* let num_sender_nodes = 4 *) - let config = + let config ~(constants : Test_config.constants) = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in diff --git a/src/app/test_executive/block_reward_test.ml b/src/app/test_executive/block_reward_test.ml index 32631b468c2..14ae2188a16 100644 --- a/src/app/test_executive/block_reward_test.ml +++ b/src/app/test_executive/block_reward_test.ml @@ -16,9 +16,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct type dsl = Dsl.t - let config = + let config ~(constants : Test_config.constants) = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in diff --git a/src/app/test_executive/chain_reliability_test.ml b/src/app/test_executive/chain_reliability_test.ml index a5ac243a927..e7274e65b32 100644 --- a/src/app/test_executive/chain_reliability_test.ml +++ b/src/app/test_executive/chain_reliability_test.ml @@ -15,9 +15,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct type dsl = Dsl.t - let config = + let config ~(constants : Test_config.constants) = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in diff --git a/src/app/test_executive/epoch_ledger.ml b/src/app/test_executive/epoch_ledger.ml index fdc51b58c41..2abe6f5cf19 100644 --- a/src/app/test_executive/epoch_ledger.ml +++ b/src/app/test_executive/epoch_ledger.ml @@ -21,7 +21,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct ; global_slot_since_genesis = 500000 } - let config = + let config ~constants = let open Test_config in let staking_accounts : Test_account.t list = let open Test_account in @@ -49,7 +49,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct let epoch_ledger = next_accounts in { epoch_ledger; epoch_seed } in - { default with + { (default ~constants) with requires_graphql = true ; epoch_data = Some { staking; next = Some next } ; genesis_ledger = next_accounts diff --git a/src/app/test_executive/gossip_consistency.ml b/src/app/test_executive/gossip_consistency.ml index f635ed84244..88fcd37e80b 100644 --- a/src/app/test_executive/gossip_consistency.ml +++ b/src/app/test_executive/gossip_consistency.ml @@ -15,9 +15,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct type dsl = Dsl.t - let config = + let config ~constants = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in diff --git a/src/app/test_executive/hard_fork.ml b/src/app/test_executive/hard_fork.ml index d78cc3b9fd1..d5e3a7701e8 100644 --- a/src/app/test_executive/hard_fork.ml +++ b/src/app/test_executive/hard_fork.ml @@ -95,7 +95,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct ; global_slot_since_genesis = 500000 } - let config = + let config ~constants = let open Test_config in let staking_accounts : Test_account.t list = let open Test_account in @@ -129,7 +129,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct let epoch_ledger = next_accounts in { epoch_ledger; epoch_seed } in - { default with + { (default ~constants) with requires_graphql = true ; epoch_data = Some { staking; next = Some next } ; genesis_ledger = @@ -212,9 +212,6 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct let run network t = let open Malleable_error.Let_syntax in - let constraint_constants = - Genesis_constants.Constraint_constants.compiled - in let logger = Logger.create () in let all_mina_nodes = Network.all_mina_nodes network in let%bind () = @@ -365,6 +362,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct ; sender = (fish1.keypair, Account.Nonce.(succ one)) } in + let constraint_constants = Network.constraint_constants network in let%bind vk_proof = Malleable_error.lift @@ Transaction_snark.For_tests.update_states ~constraint_constants @@ -482,9 +480,14 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct send_payments ~logger ~sender_pub_key ~receiver_pub_key ~amount:Currency.Amount.one ~fee ~node:sender 10 in + let constants : Test_config.constants = + { genesis_constants = Network.genesis_constants network + ; constraint_constants = Network.constraint_constants network + } + in wait_for t (Wait_condition.ledger_proofs_emitted_since_genesis - ~test_config:config ~num_proofs:1 ) ) + ~test_config:(config ~constants) ~num_proofs:1 ) ) in let%bind () = section_hard "Check vesting of timed3/timed4 account" diff --git a/src/app/test_executive/medium_bootstrap.ml b/src/app/test_executive/medium_bootstrap.ml index 29d5f372999..1a8070ca4d2 100644 --- a/src/app/test_executive/medium_bootstrap.ml +++ b/src/app/test_executive/medium_bootstrap.ml @@ -16,9 +16,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct type dsl = Dsl.t - let config = + let config ~constants = let open Test_config in - { default with + { (default ~constants) with k = 2 ; requires_graphql = true ; genesis_ledger = diff --git a/src/app/test_executive/payments_test.ml b/src/app/test_executive/payments_test.ml index a36a8611e16..c087c2db425 100644 --- a/src/app/test_executive/payments_test.ml +++ b/src/app/test_executive/payments_test.ml @@ -19,9 +19,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct (* TODO: refactor all currency values to decimal represenation *) (* TODO: test account creation fee *) - let config = + let config ~constants = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in @@ -378,6 +378,12 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct Malleable_error.soft_error_format ~value:() "Payment failed for unexpected reason: %s" err_str ) ) in + let constants : Test_config.constants = + { genesis_constants = Network.genesis_constants network + ; constraint_constants = Network.constraint_constants network + } + in + let config = config ~constants in let%bind () = section_hard "send out a bunch more txns to fill up the snark ledger, then wait for \ diff --git a/src/app/test_executive/peers_reliability_test.ml b/src/app/test_executive/peers_reliability_test.ml index 1edaad9026b..2c9f305f0cb 100644 --- a/src/app/test_executive/peers_reliability_test.ml +++ b/src/app/test_executive/peers_reliability_test.ml @@ -16,9 +16,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct type dsl = Dsl.t - let config = + let config ~constants = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in diff --git a/src/app/test_executive/slot_end_test.ml b/src/app/test_executive/slot_end_test.ml index 4d846a7d48a..5cdf8d49486 100644 --- a/src/app/test_executive/slot_end_test.ml +++ b/src/app/test_executive/slot_end_test.ml @@ -23,9 +23,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct let sender_account_prefix = "sender-account-" - let config = + let config ~constants = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in diff --git a/src/app/test_executive/test_executive.ml b/src/app/test_executive/test_executive.ml index 0c5071c1b49..8c714100f01 100644 --- a/src/app/test_executive/test_executive.ml +++ b/src/app/test_executive/test_executive.ml @@ -267,6 +267,24 @@ let main inputs = * Exec.execute ~logger ~engine_cli_inputs ~images (module Test (Engine)) *) let logger = Logger.create () in + let constants : Test_config.constants = + let protocol = + { Genesis_constants.Compiled.genesis_constants.protocol with + k = 20 + ; delta = 0 + ; slots_per_epoch = 3 * 8 * 20 + ; slots_per_sub_window = 2 + ; grace_period_slots = 140 + } + in + { genesis_constants = + { Genesis_constants.Compiled.genesis_constants with + protocol + ; txpool_max_size = 3000 + } + ; constraint_constants = Genesis_constants.Compiled.constraint_constants + } + in let images = { Test_config.Container_images.mina = inputs.mina_image ; archive_node = @@ -276,11 +294,12 @@ let main inputs = ; points = "codaprotocol/coda-points-hack:32b.4" } in - let%bind () = validate_inputs ~logger inputs T.config in + let test_config = T.config ~constants in + let%bind () = validate_inputs ~logger inputs test_config in [%log trace] "expanding network config" ; let network_config = Engine.Network_config.expand ~logger ~test_name ~cli_inputs - ~debug:inputs.debug ~test_config:T.config ~images + ~debug:inputs.debug ~constants ~images ~test_config in (* resources which require additional cleanup at end of test *) let net_manager_ref : Engine.Network_manager.t option ref = ref None in diff --git a/src/app/test_executive/verification_key_update.ml b/src/app/test_executive/verification_key_update.ml index 987d11cb0b9..ddcfbc8c697 100644 --- a/src/app/test_executive/verification_key_update.ml +++ b/src/app/test_executive/verification_key_update.ml @@ -71,13 +71,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct type dsl = Dsl.t - let `VK vk, `Prover prover = - Transaction_snark.For_tests.create_trivial_snapp - ~constraint_constants:Genesis_constants.Constraint_constants.compiled () - - let config = + let config ~constants = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in diff --git a/src/app/test_executive/zkapps.ml b/src/app/test_executive/zkapps.ml index 88460305cd2..94b82586bd0 100644 --- a/src/app/test_executive/zkapps.ml +++ b/src/app/test_executive/zkapps.ml @@ -16,9 +16,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct type dsl = Dsl.t - let config = + let config ~(constants : Test_config.constants) = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in @@ -123,6 +123,11 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct let run network t = let open Malleable_error.Let_syntax in let logger = Logger.create () in + let constants : Test_config.constants = + { genesis_constants = Network.genesis_constants network + ; constraint_constants = Network.constraint_constants network + } + in let block_producer_nodes = Network.block_producers network |> Core.String.Map.data in @@ -896,7 +901,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct section_hard "Wait for proof to be emitted" (wait_for t (Wait_condition.ledger_proofs_emitted_since_genesis - ~test_config:config ~num_proofs:1 ) ) + ~test_config:(config ~constants) ~num_proofs:1 ) ) in Event_router.cancel (event_router t) snark_work_event_subscription () ; Event_router.cancel (event_router t) snark_work_failure_subscription () ; diff --git a/src/app/test_executive/zkapps_nonce_test.ml b/src/app/test_executive/zkapps_nonce_test.ml index 76c6454e63f..8fda3b4fe81 100644 --- a/src/app/test_executive/zkapps_nonce_test.ml +++ b/src/app/test_executive/zkapps_nonce_test.ml @@ -16,9 +16,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct type dsl = Dsl.t - let config = + let config ~constants = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in @@ -52,9 +52,10 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct let num_proofs = 2 - let padding_payments () = + let padding_payments ~constants () = let needed_for_padding = - Test_config.transactions_needed_for_ledger_proofs config ~num_proofs + Test_config.transactions_needed_for_ledger_proofs (config ~constants) + ~num_proofs in if !transactions_sent >= needed_for_padding then 0 else needed_for_padding - !transactions_sent @@ -88,6 +89,11 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct let run network t = let open Malleable_error.Let_syntax in + let constants : Test_config.constants = + { genesis_constants = Network.genesis_constants network + ; constraint_constants = Network.constraint_constants network + } + in let logger = Logger.create () in let block_producer_nodes = Network.block_producers network |> Core.String.Map.data @@ -125,7 +131,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct let%bind () = let fee = Currency.Fee.of_nanomina_int_exn 3_000_000 in send_padding_transactions block_producer_nodes ~fee ~logger - ~n:(padding_payments ()) + ~n:(padding_payments ~constants ()) in (*wait for the rest*) let%bind () = @@ -370,7 +376,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct section_hard "Wait for proof to be emitted" ( wait_for t @@ Wait_condition.ledger_proofs_emitted_since_genesis - ~test_config:config ~num_proofs ) + ~test_config:(config ~constants) ~num_proofs ) in Event_router.cancel (event_router t) snark_work_event_subscription () ; Event_router.cancel (event_router t) snark_work_failure_subscription () ; diff --git a/src/app/test_executive/zkapps_timing.ml b/src/app/test_executive/zkapps_timing.ml index 24a94273237..6f657ef8b23 100644 --- a/src/app/test_executive/zkapps_timing.ml +++ b/src/app/test_executive/zkapps_timing.ml @@ -15,9 +15,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct type dsl = Dsl.t - let config = + let config ~constants = let open Test_config in - { default with + { (default ~constants) with requires_graphql = true ; genesis_ledger = (let open Test_account in @@ -46,9 +46,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct Network.block_producers network |> Core.String.Map.data in let node = List.hd_exn block_producer_nodes in - let constraint_constants = - Genesis_constants.Constraint_constants.compiled - in + let constraint_constants = Network.constraint_constants network in let block_window_duration_ms = constraint_constants.block_window_duration_ms in @@ -277,7 +275,8 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct } in return - @@ Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + @@ Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in let%bind zkapp_command_invalid_transfer_from_timed_account = let open Mina_base in @@ -308,7 +307,8 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct } in return - @@ Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + @@ Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in let%bind.Deferred zkapp_command_update_timing = let open Mina_base in @@ -566,7 +566,8 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct } } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in let%bind.Deferred () = after (Time.Span.of_ms (float_of_int block_window_duration_ms)) diff --git a/src/app/zkapp_limits/zkapp_limits.ml b/src/app/zkapp_limits/zkapp_limits.ml index 725f34e16ad..47f78d8f873 100644 --- a/src/app/zkapp_limits/zkapp_limits.ml +++ b/src/app/zkapp_limits/zkapp_limits.ml @@ -1,9 +1,8 @@ (*All the limits set for zkApp transactions*) open Core_kernel -let genesis_constants = Genesis_constants.compiled - let main () = + let genesis_constants = Genesis_constants.Compiled.genesis_constants in let cost_limit = genesis_constants.zkapp_transaction_cost_limit in let max_event_elements = genesis_constants.max_event_elements in let max_action_elements = genesis_constants.max_action_elements in diff --git a/src/app/zkapp_test_transaction/lib/commands.ml b/src/app/zkapp_test_transaction/lib/commands.ml index 16b5bfc4720..08fe3ee5860 100644 --- a/src/app/zkapp_test_transaction/lib/commands.ml +++ b/src/app/zkapp_test_transaction/lib/commands.ml @@ -3,10 +3,6 @@ open Async open Mina_base module Ledger = Mina_ledger.Ledger -let constraint_constants = Genesis_constants.Constraint_constants.compiled - -let proof_level = Genesis_constants.Proof_level.Full - let underToCamel s = String.lowercase s |> Mina_graphql.Reflection.underToCamel let graphql_zkapp_command (zkapp_command : Zkapp_command.t) = @@ -26,7 +22,7 @@ let parse_field_element_or_hash_string s ~f = | Error e1 -> Error.raise (Error.tag ~tag:"Expected a field element" e1) -let vk_and_prover = +let vk_and_prover ~constraint_constants = lazy (Transaction_snark.For_tests.create_trivial_snapp ~constraint_constants ()) @@ -48,7 +44,10 @@ let get_second_pass_ledger_mask ~ledger ~constraint_constants ~global_slot in second_pass_ledger -let gen_proof ?(zkapp_account = None) (zkapp_command : Zkapp_command.t) = +let gen_proof ?(zkapp_account = None) (zkapp_command : Zkapp_command.t) + ~(genesis_constants : Genesis_constants.t) + ~(proof_level : Genesis_constants.Proof_level.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) = let ledger = Ledger.create ~depth:constraint_constants.ledger_depth () in let _v = let id = @@ -62,7 +61,9 @@ let gen_proof ?(zkapp_account = None) (zkapp_command : Zkapp_command.t) = let open Async.Deferred.Let_syntax in let%bind () = Option.value_map zkapp_account ~default:(Deferred.return ()) ~f:(fun pk -> - let `VK vk, `Prover _ = Lazy.force vk_and_prover in + let `VK vk, `Prover _ = + Lazy.force @@ vk_and_prover ~constraint_constants + in let%map vk = vk in let id = Account_id.create pk Token_id.default in Ledger.get_or_create_account ledger id @@ -81,7 +82,7 @@ let gen_proof ?(zkapp_account = None) (zkapp_command : Zkapp_command.t) = in let consensus_constants = Consensus.Constants.create ~constraint_constants - ~protocol_constants:Genesis_constants.compiled.protocol + ~protocol_constants:genesis_constants.protocol in let state_body = let compile_time_genesis = @@ -145,7 +146,8 @@ let gen_proof ?(zkapp_account = None) (zkapp_command : Zkapp_command.t) = () let generate_zkapp_txn (keypair : Signature_lib.Keypair.t) (ledger : Ledger.t) - ~zkapp_kp = + ~zkapp_kp ~(genesis_constants : Genesis_constants.t) ~proof_level + ~constraint_constants = let open Deferred.Let_syntax in let receiver = Quickcheck.random_value Signature_lib.Public_key.Compressed.gen @@ -160,7 +162,7 @@ let generate_zkapp_txn (keypair : Signature_lib.Keypair.t) (ledger : Ledger.t) in let consensus_constants = Consensus.Constants.create ~constraint_constants - ~protocol_constants:Genesis_constants.compiled.protocol + ~protocol_constants:genesis_constants.protocol in let open Staged_ledger_diff in let compile_time_genesis = @@ -324,6 +326,8 @@ module Util = struct end let test_zkapp_with_genesis_ledger_main keyfile zkapp_keyfile config_file () = + let constraint_constants = Genesis_constants.Compiled.constraint_constants in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in let open Deferred.Let_syntax in let%bind keypair = Util.fee_payer_keypair_of_file keyfile in let%bind zkapp_kp = Util.snapp_keypair_of_file zkapp_keyfile in @@ -347,10 +351,13 @@ let test_zkapp_with_genesis_ledger_main keyfile zkapp_keyfile config_file () = in Lazy.force (Genesis_ledger.Packed.t packed) in - generate_zkapp_txn keypair ledger ~zkapp_kp + generate_zkapp_txn keypair ledger ~zkapp_kp ~constraint_constants + ~proof_level:Full ~genesis_constants let create_zkapp_account ~debug ~sender ~sender_nonce ~fee ~fee_payer ~fee_payer_nonce ~zkapp_keyfile ~amount ~memo = + let constraint_constants = Genesis_constants.Compiled.constraint_constants in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in let open Deferred.Let_syntax in let%bind sender_keypair = Util.keypair_of_file sender ~which:"Sender" in let%bind fee_payer_keypair = Util.fee_payer_keypair_of_file fee_payer in @@ -373,11 +380,17 @@ let create_zkapp_account ~debug ~sender ~sender_nonce ~fee ~fee_payer Transaction_snark.For_tests.deploy_snapp ~permissions:Permissions.user_default ~constraint_constants spec in - let%map () = if debug then gen_proof zkapp_command else return () in + let%map () = + if debug then + gen_proof ~genesis_constants ~constraint_constants ~proof_level:Full + zkapp_command + else return () + in zkapp_command let upgrade_zkapp ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~verification_key ~zkapp_uri ~auth = + ~constraint_constants ~genesis_constants ~verification_key ~zkapp_uri ~auth + = let open Deferred.Let_syntax in let%bind keypair = Util.fee_payer_keypair_of_file keyfile in let%bind zkapp_account_keypair = Util.snapp_keypair_of_file zkapp_keyfile in @@ -411,13 +424,16 @@ let upgrade_zkapp ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile } in let%bind zkapp_command = - let `VK vk, `Prover prover = Lazy.force vk_and_prover in + let `VK vk, `Prover prover = + Lazy.force @@ vk_and_prover ~constraint_constants + in Transaction_snark.For_tests.update_states ~zkapp_prover_and_vk:(prover, vk) ~constraint_constants spec in let%map () = if debug then - gen_proof zkapp_command + gen_proof zkapp_command ~constraint_constants ~genesis_constants + ~proof_level:Full ~zkapp_account: (Some (Signature_lib.Public_key.compress zkapp_account_keypair.public_key) @@ -427,7 +443,7 @@ let upgrade_zkapp ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile zkapp_command let transfer_funds ~debug ~sender ~sender_nonce ~fee ~fee_payer ~fee_payer_nonce - ~memo ~receivers = + ~memo ~receivers ~genesis_constants ~constraint_constants = let open Deferred.Let_syntax in let%bind receivers = receivers in let amount = @@ -453,13 +469,21 @@ let transfer_funds ~debug ~sender ~sender_nonce ~fee ~fee_payer ~fee_payer_nonce ; preconditions = None } in - let zkapp_command = Transaction_snark.For_tests.multiple_transfers spec in + let zkapp_command = + Transaction_snark.For_tests.multiple_transfers + ~constraint_constants: + Genesis_constants.For_unit_tests.Constraint_constants.t spec + in let%map () = - if debug then gen_proof zkapp_command ~zkapp_account:None else return () + if debug then + gen_proof zkapp_command ~zkapp_account:None ~genesis_constants + ~constraint_constants ~proof_level:Full + else return () in zkapp_command -let update_state ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile ~app_state = +let update_state ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile ~app_state + ~genesis_constants ~constraint_constants = let open Deferred.Let_syntax in let%bind keypair = Util.fee_payer_keypair_of_file keyfile in let%bind zkapp_keypair = Util.snapp_keypair_of_file zkapp_keyfile in @@ -482,13 +506,16 @@ let update_state ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile ~app_state = } in let%bind zkapp_command = - let `VK vk, `Prover prover = Lazy.force vk_and_prover in + let `VK vk, `Prover prover = + Lazy.force @@ vk_and_prover ~constraint_constants + in Transaction_snark.For_tests.update_states ~zkapp_prover_and_vk:(prover, vk) ~constraint_constants spec in let%map () = if debug then - gen_proof zkapp_command + gen_proof zkapp_command ~genesis_constants ~constraint_constants + ~proof_level:Full ~zkapp_account: (Some (Signature_lib.Public_key.compress zkapp_keypair.public_key)) else return () @@ -496,7 +523,7 @@ let update_state ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile ~app_state = zkapp_command let update_zkapp_uri ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile ~zkapp_uri - ~auth = + ~auth ~constraint_constants ~genesis_constants = let open Deferred.Let_syntax in let%bind keypair = Util.fee_payer_keypair_of_file keyfile in let%bind zkapp_account_keypair = Util.snapp_keypair_of_file snapp_keyfile in @@ -519,13 +546,16 @@ let update_zkapp_uri ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile ~zkapp_uri } in let%bind zkapp_command = - let `VK vk, `Prover prover = Lazy.force vk_and_prover in + let `VK vk, `Prover prover = + Lazy.force @@ vk_and_prover ~constraint_constants + in Transaction_snark.For_tests.update_states ~zkapp_prover_and_vk:(prover, vk) ~constraint_constants spec in let%map () = if debug then - gen_proof zkapp_command + gen_proof zkapp_command ~genesis_constants ~constraint_constants + ~proof_level:Full ~zkapp_account: (Some (Signature_lib.Public_key.compress zkapp_account_keypair.public_key) @@ -535,7 +565,7 @@ let update_zkapp_uri ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile ~zkapp_uri zkapp_command let update_action_state ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~action_state = + ~action_state ~genesis_constants ~constraint_constants = let open Deferred.Let_syntax in let%bind keypair = Util.fee_payer_keypair_of_file keyfile in let%bind zkapp_keypair = Util.snapp_keypair_of_file zkapp_keyfile in @@ -558,13 +588,16 @@ let update_action_state ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile } in let%bind zkapp_command = - let `VK vk, `Prover prover = Lazy.force vk_and_prover in + let `VK vk, `Prover prover = + Lazy.force @@ vk_and_prover ~constraint_constants + in Transaction_snark.For_tests.update_states ~zkapp_prover_and_vk:(prover, vk) ~constraint_constants spec in let%map () = if debug then - gen_proof zkapp_command + gen_proof zkapp_command ~genesis_constants ~constraint_constants + ~proof_level:Full ~zkapp_account: (Some (Signature_lib.Public_key.compress zkapp_keypair.public_key)) else return () @@ -572,7 +605,7 @@ let update_action_state ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile zkapp_command let update_token_symbol ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile - ~token_symbol ~auth = + ~token_symbol ~auth ~genesis_constants ~constraint_constants = let open Deferred.Let_syntax in let%bind keypair = Util.fee_payer_keypair_of_file keyfile in let%bind zkapp_account_keypair = Util.snapp_keypair_of_file snapp_keyfile in @@ -595,13 +628,16 @@ let update_token_symbol ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile } in let%bind zkapp_command = - let `VK vk, `Prover prover = Lazy.force vk_and_prover in + let `VK vk, `Prover prover = + Lazy.force @@ vk_and_prover ~constraint_constants + in Transaction_snark.For_tests.update_states ~zkapp_prover_and_vk:(prover, vk) ~constraint_constants spec in let%map () = if debug then - gen_proof zkapp_command + gen_proof zkapp_command ~genesis_constants ~constraint_constants + ~proof_level:Full ~zkapp_account: (Some (Signature_lib.Public_key.compress zkapp_account_keypair.public_key) @@ -611,7 +647,7 @@ let update_token_symbol ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile zkapp_command let update_snapp ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile ~snapp_update - ~current_auth = + ~current_auth ~genesis_constants ~constraint_constants = let open Deferred.Let_syntax in let%bind keypair = Util.fee_payer_keypair_of_file keyfile in let%bind zkapp_keypair = Util.snapp_keypair_of_file zkapp_keyfile in @@ -633,14 +669,17 @@ let update_snapp ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile ~snapp_update } in let%bind zkapp_command = - let `VK vk, `Prover prover = Lazy.force vk_and_prover in + let `VK vk, `Prover prover = + Lazy.force @@ vk_and_prover ~constraint_constants + in Transaction_snark.For_tests.update_states ~zkapp_prover_and_vk:(prover, vk) ~constraint_constants spec in (*Util.print_snapp_transaction zkapp_command ;*) let%map () = if debug then - gen_proof zkapp_command + gen_proof zkapp_command ~genesis_constants ~constraint_constants + ~proof_level:Full ~zkapp_account: (Some (Signature_lib.Public_key.compress zkapp_keypair.public_key)) else return () @@ -778,7 +817,10 @@ let%test_module "ZkApps test transaction" = let%test_unit "zkapps transaction graphql round trip" = Quickcheck.test ~trials:20 - (Mina_generators.User_command_generators.zkapp_command_with_ledger ()) + (Mina_generators.User_command_generators.zkapp_command_with_ledger + ~genesis_constants:Genesis_constants.For_unit_tests.t + ~constraint_constants: + Genesis_constants.For_unit_tests.Constraint_constants.t () ) ~f:(fun (user_cmd, _, _, _) -> match user_cmd with | Zkapp_command p -> diff --git a/src/app/zkapp_test_transaction/zkapp_test_transaction.ml b/src/app/zkapp_test_transaction/zkapp_test_transaction.ml index 6eaf5d46232..2e4221c6d12 100644 --- a/src/app/zkapp_test_transaction/zkapp_test_transaction.ml +++ b/src/app/zkapp_test_transaction/zkapp_test_transaction.ml @@ -92,11 +92,13 @@ let create_zkapp_account = let upgrade_zkapp = let create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~verification_key ~zkapp_uri ~auth () = + ~verification_key ~zkapp_uri ~auth ~constraint_constants + ~genesis_constants () = let open Deferred.Let_syntax in let%map zkapp_command = upgrade_zkapp ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~verification_key ~zkapp_uri ~auth + ~verification_key ~zkapp_uri ~auth ~constraint_constants + ~genesis_constants in Util.print_snapp_transaction ~debug zkapp_command ; () @@ -126,21 +128,27 @@ let upgrade_zkapp = in let fee = Option.value ~default:Flags.default_fee fee in let auth = Util.auth_of_string auth in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in if Currency.Fee.(fee < Flags.min_fee) then failwith (sprintf "Fee must at least be %s" (Currency.Fee.to_mina_string Flags.min_fee) ) ; let zkapp_uri = Zkapp_basic.Set_or_keep.of_option zkapp_uri_str in create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~verification_key ~zkapp_uri ~auth )) + ~verification_key ~zkapp_uri ~auth ~constraint_constants + ~genesis_constants )) let transfer_funds_one_receiver = let create_command ~debug ~sender ~sender_nonce ~fee ~fee_payer - ~fee_payer_nonce ~memo ~receiver ~amount () = + ~fee_payer_nonce ~memo ~receiver ~amount ~genesis_constants + ~constraint_constants () = let open Deferred.Let_syntax in let%map zkapp_command = transfer_funds ~debug ~sender ~sender_nonce ~fee ~fee_payer - ~fee_payer_nonce ~memo + ~fee_payer_nonce ~memo ~genesis_constants ~constraint_constants ~receivers:(Deferred.return [ (receiver, amount) ]) in Util.print_snapp_transaction ~debug zkapp_command ; @@ -172,16 +180,23 @@ let transfer_funds_one_receiver = failwithf "Fee must at least be %s" (Currency.Fee.to_mina_string Flags.min_fee) () ; + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in create_command ~debug ~sender ~sender_nonce ~fee ~fee_payer - ~fee_payer_nonce ~memo ~receiver ~amount )) + ~fee_payer_nonce ~memo ~receiver ~amount ~genesis_constants + ~constraint_constants )) let transfer_funds = let create_command ~debug ~sender ~sender_nonce ~fee ~fee_payer - ~fee_payer_nonce ~memo ~receivers () = + ~fee_payer_nonce ~memo ~receivers ~genesis_constants ~constraint_constants + () = let open Deferred.Let_syntax in let%map zkapp_command = transfer_funds ~debug ~sender ~sender_nonce ~fee ~fee_payer - ~fee_payer_nonce ~memo ~receivers + ~fee_payer_nonce ~memo ~receivers ~genesis_constants + ~constraint_constants in Util.print_snapp_transaction ~debug zkapp_command ; () @@ -250,15 +265,21 @@ let transfer_funds = () ; let max_keys = 10 in let receivers = read_key_and_amount max_keys in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in create_command ~debug ~sender ~sender_nonce ~fee ~fee_payer - ~fee_payer_nonce ~memo ~receivers )) + ~fee_payer_nonce ~memo ~receivers ~genesis_constants + ~constraint_constants )) let update_state = let create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile ~app_state - () = + ~genesis_constants ~constraint_constants () = let open Deferred.Let_syntax in let%map zkapp_command = update_state ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile ~app_state + ~genesis_constants ~constraint_constants in Util.print_snapp_transaction ~debug zkapp_command ; () @@ -280,20 +301,24 @@ let update_state = Param.(listed string) in let fee = Option.value ~default:Flags.default_fee fee in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in if Currency.Fee.(fee < Flags.min_fee) then failwith (sprintf "Fee must at least be %s" (Currency.Fee.to_mina_string Flags.min_fee) ) ; create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~app_state )) + ~app_state ~genesis_constants ~constraint_constants )) let update_zkapp_uri = let create_command ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile ~zkapp_uri - ~auth () = + ~auth ~genesis_constants ~constraint_constants () = let open Deferred.Let_syntax in let%map zkapp_command = update_zkapp_uri ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile - ~zkapp_uri ~auth + ~zkapp_uri ~auth ~genesis_constants ~constraint_constants in Util.print_snapp_transaction ~debug zkapp_command ; () @@ -324,16 +349,20 @@ let update_zkapp_uri = failwith (sprintf "Fee must at least be %s" (Currency.Fee.to_mina_string Flags.min_fee) ) ; + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in create_command ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile - ~zkapp_uri ~auth )) + ~zkapp_uri ~auth ~genesis_constants ~constraint_constants )) let update_action_state = let create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~action_state () = + ~action_state ~genesis_constants ~constraint_constants () = let open Deferred.Let_syntax in let%map zkapp_command = update_action_state ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~action_state + ~action_state ~genesis_constants ~constraint_constants in Util.print_snapp_transaction ~debug zkapp_command ; () @@ -382,20 +411,24 @@ let update_action_state = ~f:(fun s -> if List.is_empty s then None else Some (Array.of_list s)) [ action_state0; action_state1; action_state2; action_state3 ] in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in if Currency.Fee.(fee < Flags.min_fee) then failwith (sprintf "Fee must at least be %s" (Currency.Fee.to_mina_string Flags.min_fee) ) ; create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~action_state )) + ~action_state ~genesis_constants ~constraint_constants )) let update_token_symbol = let create_command ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile - ~token_symbol ~auth () = + ~token_symbol ~auth ~genesis_constants ~constraint_constants () = let open Deferred.Let_syntax in let%map zkapp_command = update_token_symbol ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile - ~token_symbol ~auth + ~token_symbol ~auth ~genesis_constants ~constraint_constants in Util.print_snapp_transaction ~debug zkapp_command ; () @@ -422,20 +455,24 @@ let update_token_symbol = in let fee = Option.value ~default:Flags.default_fee fee in let auth = Util.auth_of_string auth in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in if Currency.Fee.(fee < Flags.min_fee) then failwith (sprintf "Fee must at least be %s" (Currency.Fee.to_mina_string Flags.min_fee) ) ; create_command ~debug ~keyfile ~fee ~nonce ~memo ~snapp_keyfile - ~token_symbol ~auth )) + ~token_symbol ~auth ~genesis_constants ~constraint_constants )) let update_permissions = let create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~snapp_update ~current_auth () = + ~snapp_update ~current_auth ~genesis_constants ~constraint_constants () = let open Deferred.Let_syntax in let%map zkapp_command = update_snapp ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~snapp_update ~current_auth + ~snapp_update ~current_auth ~genesis_constants ~constraint_constants in Util.print_snapp_transaction ~debug zkapp_command ; () @@ -518,21 +555,25 @@ let update_permissions = } in let snapp_update = { Account_update.Update.dummy with permissions } in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in if Currency.Fee.(fee < Flags.min_fee) then failwith (sprintf "Fee must at least be %s" (Currency.Fee.to_mina_string Flags.min_fee) ) ; create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~snapp_update + ~genesis_constants ~constraint_constants ~snapp_update ~current_auth:(Util.auth_of_string current_auth) )) let update_timings = let create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~snapp_update ~current_auth () = + ~snapp_update ~current_auth ~genesis_constants ~constraint_constants () = let open Deferred.Let_syntax in let%map zkapp_command = update_snapp ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~snapp_update ~current_auth + ~snapp_update ~current_auth ~genesis_constants ~constraint_constants in Util.print_snapp_transaction ~debug zkapp_command ; () @@ -586,12 +627,16 @@ let update_timings = : Account_update.Update.Timing_info.value ) in let snapp_update = { Account_update.Update.dummy with timing } in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in + let genesis_constants = Genesis_constants.Compiled.genesis_constants in if Currency.Fee.(fee < Flags.min_fee) then failwith (sprintf "Fee must at least be %s" (Currency.Fee.to_mina_string Flags.min_fee) ) ; create_command ~debug ~keyfile ~fee ~nonce ~memo ~zkapp_keyfile - ~snapp_update + ~snapp_update ~genesis_constants ~constraint_constants ~current_auth:(Util.auth_of_string current_auth) )) let test_zkapp_with_genesis_ledger = diff --git a/src/app/zkapps_examples/test/tokens/tokens.ml b/src/app/zkapps_examples/test/tokens/tokens.ml index fbab323fd0d..f813ced549b 100644 --- a/src/app/zkapps_examples/test/tokens/tokens.ml +++ b/src/app/zkapps_examples/test/tokens/tokens.ml @@ -14,7 +14,7 @@ let gen_keys () = (Public_key.compress kp.public_key, kp.private_key) let fee_to_create n = - Genesis_constants.Constraint_constants.compiled.account_creation_fee + Genesis_constants.For_unit_tests.Constraint_constants.t.account_creation_fee |> Currency.Amount.of_fee |> (fun x -> Currency.Amount.scale x n) |> Option.value_exn diff --git a/src/app/zkapps_examples/tokens/zkapps_tokens.ml b/src/app/zkapps_examples/tokens/zkapps_tokens.ml index 4df6236a5ac..b51ec8af77d 100644 --- a/src/app/zkapps_examples/tokens/zkapps_tokens.ml +++ b/src/app/zkapps_examples/tokens/zkapps_tokens.ml @@ -632,9 +632,6 @@ module Transfer_recursive = struct ~branches:(module Nat.N1) ~max_proofs_verified:(module Nat.N2) ~name:"transfer recurse" - ~constraint_constants: - Genesis_constants.Constraint_constants.( - to_snark_keys_header compiled) ~choices:(fun ~self -> [ Rules.Transfer.Recursive.rule self ]) ) let tag = Lazy.map lazy_compiled ~f:(fun (tag, _, _, _) -> tag) @@ -664,8 +661,6 @@ let lazy_compiled = ~branches:(module Nat.N3) ~max_proofs_verified:(module Nat.N2) ~name:"tokens" - ~constraint_constants: - Genesis_constants.Constraint_constants.(to_snark_keys_header compiled) ~choices:(fun ~self:_ -> [ Rules.Initialize_state.rule ; Rules.Mint.rule diff --git a/src/app/zkapps_examples/zkapps_examples.ml b/src/app/zkapps_examples/zkapps_examples.ml index 4d72a3e1fc6..89a528c9ac9 100644 --- a/src/app/zkapps_examples/zkapps_examples.ml +++ b/src/app/zkapps_examples/zkapps_examples.ml @@ -543,7 +543,7 @@ let compile : -> max_proofs_verified: (module Nat.Add.Intf with type n = max_proofs_verified) -> name:string - -> constraint_constants:_ + -> ?constraint_constants:_ -> choices: ( self: ( Zkapp_statement.Checked.t @@ -586,7 +586,7 @@ let compile : Deferred.t ) H3_2.T(Pickles.Prover).t = fun ?self ?cache ?proof_cache ?disk_keys ?override_wrap_domain ~auxiliary_typ - ~branches ~max_proofs_verified ~name ~constraint_constants ~choices () -> + ~branches ~max_proofs_verified ~name ?constraint_constants ~choices () -> let vk_hash = ref None in let choices ~self = let rec go : @@ -647,7 +647,7 @@ let compile : Pickles.compile_async () ?self ?cache ?proof_cache ?disk_keys ?override_wrap_domain ~public_input:(Output Zkapp_statement.typ) ~auxiliary_typ:Typ.(Prover_value.typ () * auxiliary_typ) - ~branches ~max_proofs_verified ~name ~constraint_constants ~choices + ~branches ~max_proofs_verified ~name ?constraint_constants ~choices in let () = vk_hash := diff --git a/src/config/dev.mlh b/src/config/dev.mlh index c77fc66332a..e7f0323fb70 100644 --- a/src/config/dev.mlh +++ b/src/config/dev.mlh @@ -32,11 +32,6 @@ (*END src/config/scan_state/medium.mlh*) -(*BEGIN src/config/debug_level/some.mlh*) -[%%define cache_exceptions true] -(*END src/config/debug_level/some.mlh*) - - (*BEGIN src/config/proof_level/check.mlh*) [%%define proof_level "check"] (*END src/config/proof_level/check.mlh*) @@ -62,14 +57,6 @@ (*END src/config/amount_defaults/standard.mlh*) -(*BEGIN src/config/protocol_version/current.mlh*) -(* transaction >= 1, network >= 0, patch >= 0 *) -[%%define protocol_version_transaction 3] -[%%define protocol_version_network 0] -[%%define protocol_version_patch 0] -(*END src/config/protocol_version/current.mlh*) - - (*BEGIN src/config/supercharged_coinbase_factor/one.mlh*) [%%define supercharged_coinbase_factor 1] (*END src/config/supercharged_coinbase_factor/one.mlh*) @@ -87,8 +74,6 @@ [%%undef fork_state_hash] [%%undef fork_global_slot_since_genesis] [%%undef zkapp_cmd_limit] -[%%undef slot_tx_end] -[%%undef slot_chain_end] (*END src/config/fork.mlh*) @@ -99,5 +84,3 @@ [%%undef compaction_interval] [%%define vrf_poll_interval 0] [%%undef zkapp_cmd_limit] -[%%undef slot_tx_end] -[%%undef slot_chain_end] \ No newline at end of file diff --git a/src/config/devnet.mlh b/src/config/devnet.mlh index 928ddc7a218..a15553663e1 100644 --- a/src/config/devnet.mlh +++ b/src/config/devnet.mlh @@ -18,11 +18,6 @@ (*END src/config/scan_state/point2tps.mlh*) -(*BEGIN src/config/debug_level/some.mlh*) -[%%define cache_exceptions true] -(*END src/config/debug_level/some.mlh*) - - (*BEGIN src/config/proof_level/full.mlh*) [%%define proof_level "full"] (*END src/config/proof_level/full.mlh*) @@ -48,14 +43,6 @@ (*END src/config/amount_defaults/realistic.mlh*) -(*BEGIN src/config/protocol_version/current.mlh*) -(* transaction >= 1, network >= 0, patch >= 0 *) -[%%define protocol_version_transaction 3] -[%%define protocol_version_network 0] -[%%define protocol_version_patch 0] -(*END src/config/protocol_version/current.mlh*) - - (*BEGIN src/config/supercharged_coinbase_factor/one.mlh*) [%%define supercharged_coinbase_factor 1] (*END src/config/supercharged_coinbase_factor/one.mlh*) @@ -67,7 +54,6 @@ [%%define slots_per_sub_window 7] [%%define sub_windows_per_window 11] [%%define grace_period_slots 2160] -[%%define cache_exceptions false] [%%define plugins false] [%%define genesis_ledger "testnet_postake"] [%%define genesis_state_timestamp "2021-09-24T00:00:00Z"] @@ -81,8 +67,6 @@ [%%undef fork_state_hash] [%%undef fork_global_slot_since_genesis] [%%undef zkapp_cmd_limit] -[%%undef slot_tx_end] -[%%undef slot_chain_end] (*END src/config/fork.mlh*) @@ -94,6 +78,4 @@ [%%define compaction_interval 360000] [%%define vrf_poll_interval 5000] [%%define zkapp_cmd_limit 24] -[%%undef slot_tx_end] -[%%undef slot_chain_end] -[%%undef scan_state_transaction_capacity_log_2] \ No newline at end of file +[%%undef scan_state_transaction_capacity_log_2] diff --git a/src/config/lightnet.mlh b/src/config/lightnet.mlh index 808fd582f4d..87a58d5969c 100644 --- a/src/config/lightnet.mlh +++ b/src/config/lightnet.mlh @@ -18,11 +18,6 @@ (*END src/config/scan_state/medium.mlh*) -(*BEGIN src/config/debug_level/some.mlh*) -[%%define cache_exceptions true] -(*END src/config/debug_level/some.mlh*) - - (*BEGIN src/config/proof_level/none.mlh*) [%%define proof_level "none"] (*END src/config/proof_level/none.mlh*) @@ -48,14 +43,6 @@ (*END src/config/amount_defaults/realistic.mlh*) -(*BEGIN src/config/protocol_version/current.mlh*) -(* transaction >= 1, network >= 0, patch >= 0 *) -[%%define protocol_version_transaction 3] -[%%define protocol_version_network 0] -[%%define protocol_version_patch 0] -(*END src/config/protocol_version/current.mlh*) - - (*BEGIN src/config/supercharged_coinbase_factor/one.mlh*) [%%define supercharged_coinbase_factor 1] (*END src/config/supercharged_coinbase_factor/one.mlh*) @@ -67,7 +54,6 @@ [%%define slots_per_sub_window 7] [%%define sub_windows_per_window 11] [%%define grace_period_slots 200] -[%%define cache_exceptions false] [%%define plugins false] [%%define genesis_ledger "testnet_postake"] [%%define genesis_state_timestamp "2020-09-16 03:15:00-07:00"] @@ -81,8 +67,6 @@ [%%undef fork_state_hash] [%%undef fork_global_slot_since_genesis] [%%undef zkapp_cmd_limit] -[%%undef slot_tx_end] -[%%undef slot_chain_end] (*END src/config/fork.mlh*) @@ -94,5 +78,3 @@ [%%define compaction_interval 360000] [%%define vrf_poll_interval 5000] [%%undef zkapp_cmd_limit] -[%%undef slot_tx_end] -[%%undef slot_chain_end] \ No newline at end of file diff --git a/src/config/mainnet.mlh b/src/config/mainnet.mlh index 54190777cbf..d92617178b8 100644 --- a/src/config/mainnet.mlh +++ b/src/config/mainnet.mlh @@ -18,11 +18,6 @@ (*END src/config/scan_state/point2tps.mlh*) -(*BEGIN src/config/debug_level/some.mlh*) -[%%define cache_exceptions true] -(*END src/config/debug_level/some.mlh*) - - (*BEGIN src/config/proof_level/full.mlh*) [%%define proof_level "full"] (*END src/config/proof_level/full.mlh*) @@ -48,14 +43,6 @@ (*END src/config/amount_defaults/realistic.mlh*) -(*BEGIN src/config/protocol_version/current.mlh*) -(* transaction >= 1, network >= 0, patch >= 0 *) -[%%define protocol_version_transaction 3] -[%%define protocol_version_network 0] -[%%define protocol_version_patch 0] -(*END src/config/protocol_version/current.mlh*) - - (*BEGIN src/config/supercharged_coinbase_factor/one.mlh*) [%%define supercharged_coinbase_factor 1] (*END src/config/supercharged_coinbase_factor/one.mlh*) @@ -67,7 +54,6 @@ [%%define slots_per_sub_window 7] [%%define sub_windows_per_window 11] [%%define grace_period_slots 2160] -[%%define cache_exceptions false] [%%define plugins false] [%%define genesis_ledger "testnet_postake"] [%%define genesis_state_timestamp "2020-09-16 03:15:00-07:00"] @@ -81,8 +67,6 @@ [%%undef fork_state_hash] [%%undef fork_global_slot_since_genesis] [%%undef zkapp_cmd_limit] -[%%undef slot_tx_end] -[%%undef slot_chain_end] (*END src/config/fork.mlh*) @@ -94,6 +78,4 @@ [%%define compaction_interval 360000] [%%define vrf_poll_interval 5000] [%%define zkapp_cmd_limit 24] -[%%undef slot_tx_end] -[%%undef slot_chain_end] -[%%undef scan_state_transaction_capacity_log_2] \ No newline at end of file +[%%undef scan_state_transaction_capacity_log_2] diff --git a/src/dune b/src/dune index 40f079160d6..bdc2e681bd2 100644 --- a/src/dune +++ b/src/dune @@ -5,3 +5,7 @@ (mode promote) (deps config/config.mlh) (action (copy config/config.mlh config.mlh))) + +;; to ensure no trouble arises +;; after switching the branches +(data_only_dirs external) diff --git a/src/dune-project b/src/dune-project index 3c54d84fe1a..0785c1c9142 100644 --- a/src/dune-project +++ b/src/dune-project @@ -92,6 +92,7 @@ (package (name merkle_list_verifier)) (package (name merkle_mask)) (package (name migrate_balances_table)) +(package (name mina_automation)) (package (name mina_base)) (package (name mina_block)) (package (name mina_caqti)) @@ -126,7 +127,6 @@ (package (name network_pool)) (package (name node_addrs_and_ports)) (package (name node_error_service)) -(package (name node_status)) (package (name node_status_service)) (package (name non_zero_curve_point)) (package (name o1trace)) @@ -137,6 +137,7 @@ (package (name parallel)) (package (name parallel_scan)) (package (name participating_state)) +(package (name patch_archive_test)) (package (name pasta_bindings)) (package (name perf_histograms)) (package (name pickles_base)) @@ -151,6 +152,7 @@ (package (name ppx_util)) (package (name ppx_version)) (package (name precomputed_values)) +(package (name precomputed_block)) (package (name promise)) (package (name proof_carrying_data)) (package (name protocol_version)) diff --git a/src/external/README.md b/src/external/README.md deleted file mode 100644 index 47ffbab23c2..00000000000 --- a/src/external/README.md +++ /dev/null @@ -1,2 +0,0 @@ -ocaml-sodium version: 0.6 -libsodium version: 1.0.16 diff --git a/src/external/c-reference-signer b/src/external/c-reference-signer deleted file mode 160000 index b5caef0b7df..00000000000 --- a/src/external/c-reference-signer +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b5caef0b7df105999aad0f2507cbb999b8583d34 diff --git a/src/external/coda_base58/META b/src/external/coda_base58/META deleted file mode 100644 index a59c6c17677..00000000000 --- a/src/external/coda_base58/META +++ /dev/null @@ -1,6 +0,0 @@ -version = "0.1.0" -description = "Base58 encoding library" -requires = "bytes" -archive(byte) = "base58.cma" -archive(native) = "base58.cmxa" -exists_if = "base58.cma" diff --git a/src/external/coda_base58/Makefile b/src/external/coda_base58/Makefile deleted file mode 100644 index f0ebcc2340e..00000000000 --- a/src/external/coda_base58/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -OCB_INC = -I src -I tests -OCB_FLAGS = -OCB = ocamlbuild $(OCB_FLAGS) $(OCB_INC) - -.PHONY: all doc test lib.native lib.byte lib.install lib.uninstall clean - -all: test lib.native lib.byte doc - -lib.native: - $(OCB) base58.cmxa - $(OCB) base58.cmxs - -lib.byte: - $(OCB) base58.cma - -clean: - $(OCB) -clean - -LIB_BUILD =_build/src/ -LIB_INSTALL = META -LIB_INSTALL += $(LIB_BUILD)/b58.mli -LIB_INSTALL += $(LIB_BUILD)/b58.cmi -LIB_INSTALL += $(LIB_BUILD)/b58.annot -LIB_INSTALL += $(LIB_BUILD)/base58.cma - -LIB_INSTALL +=-optional -LIB_INSTALL += $(LIB_BUILD)/b58.cmx -LIB_INSTALL += $(LIB_BUILD)/b58.cmt -LIB_INSTALL += $(LIB_BUILD)/b58.cmti -LIB_INSTALL += $(LIB_BUILD)/base58.cmxs -LIB_INSTALL += $(LIB_BUILD)/base58.a -LIB_INSTALL += $(LIB_BUILD)/base58.cmxa - -lib.install: - ocamlfind install base58 $(LIB_INSTALL) - -lib.uninstall: - ocamlfind remove base58 - -doc: - $(OCB) src/base58.docdir/index.html - -test: - $(OCB) test.native - export OCAMLRUNPARAM="b" && time ./test.native - diff --git a/src/external/coda_base58/README.md b/src/external/coda_base58/README.md deleted file mode 100644 index cc99b2d49d2..00000000000 --- a/src/external/coda_base58/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Base 58 Encoding OCaml library - -This library provide encoding and decoding function for the Base 58 encoding. - -### Install - -```bash -opam install base58 -``` - -### Documentation - -OCamldoc generated doc can be found [here](http://mransan.github.io/base58/). - -### Example - -```OCaml -let () = - let alphabet = B58.make_alphabet "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" in - let data = Bytes.of_string "Hello World" in - let b58 = B58.encode alphabet data in - print_endline @@ Bytes.to_string b58 -``` - -Then to compile: - -```bash -ocamlbuild -use-ocamlfind -pkgs base58 example01.native -``` - diff --git a/src/external/coda_base58/_tags b/src/external/coda_base58/_tags deleted file mode 100644 index 259aa19777a..00000000000 --- a/src/external/coda_base58/_tags +++ /dev/null @@ -1,4 +0,0 @@ -true: bin_annot -true: annot -true: safe_string -true: keep_locs diff --git a/src/external/coda_base58/examples/example01.ml b/src/external/coda_base58/examples/example01.ml deleted file mode 100644 index 7365c549da6..00000000000 --- a/src/external/coda_base58/examples/example01.ml +++ /dev/null @@ -1,8 +0,0 @@ -let () = - let alphabet = - B58.make_alphabet - "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" - in - let data = Bytes.of_string "Hello World" in - let b58 = B58.encode alphabet data in - print_endline @@ Bytes.to_string b58 diff --git a/src/external/coda_base58/opam b/src/external/coda_base58/opam deleted file mode 100644 index e1bce2b611f..00000000000 --- a/src/external/coda_base58/opam +++ /dev/null @@ -1,29 +0,0 @@ -opam-version: "0.1" -name: "base58" -version: "0.1.0" -maintainer: "Maxime Ransan " -authors:[ - "Maxime Ransan " -] -synopsis: "Base58 encoding and decoding" -homepage: "https://github.com/mransan/base58" -bug-reports:"https://github.com/mransan/base58/issues" -dev-repo:"https://github.com/mransan/base58.git" -license: "MIT" -build: [ - [make "lib.byte"] - [make "lib.native"] { ocaml-native } -] -install: [ - [make "lib.install" ] -] -remove: [make "lib.uninstall"] -depends: [ - "ocamlfind" {build} - "ocamlbuild" {build} -] -tags:[ - "base58" - "encoding" -] -available: [ ocaml-version >= "4.02.1" & opam-version >= "1.2" ] diff --git a/src/external/coda_base58/src/b58.ml b/src/external/coda_base58/src/b58.ml deleted file mode 100644 index 6815994286e..00000000000 --- a/src/external/coda_base58/src/b58.ml +++ /dev/null @@ -1,128 +0,0 @@ -(* - The MIT License (MIT) - - Copyright (c) 2016 Maxime Ransan - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -*) - -module Util = struct - let implace_map f bytes = - let rec aux = function - | -1 -> - () - | i -> - Bytes.unsafe_set bytes i (f (Bytes.unsafe_get bytes i)) ; - aux (i - 1) - in - aux (Bytes.length bytes - 1) -end - -(* Util *) - -module Alphabet = struct - exception Invalid - - exception Invalid_base58_character - - type t = string * int array - - let make s = - if String.length s <> 58 then raise Invalid - else - let a = Array.make 256 (-1) in - String.iteri (fun i c -> Array.unsafe_set a (Char.code c) i) s ; - (s, a) - - let value c (_, alphabet_values) = - match Array.unsafe_get alphabet_values (Char.code c) with - | -1 -> - raise Invalid_base58_character - | i -> - i - - let chr i (s, _) = String.unsafe_get s i -end - -(* Alphabet *) - -let zero = Char.unsafe_chr 0 - -let convert inp from_base to_base = - let inp_len = Bytes.length inp in - let inp_beg = - let rec aux = function - | i when i = inp_len || Bytes.get inp i <> zero -> - i - | i -> - aux (i + 1) - in - aux 0 - in - let buf_len = - let inp_len = float_of_int inp_len in - let from_base = float_of_int from_base in - let to_base = float_of_int to_base in - int_of_float @@ (1. +. (inp_len *. log from_base /. log to_base)) - in - let buf = Bytes.make buf_len zero in - let buf_last_index = buf_len - 1 in - let carry = ref 0 in - let buf_end = ref buf_last_index in - for inp_i = inp_beg to inp_len - 1 do - carry := Char.code (Bytes.unsafe_get inp inp_i) ; - let rec iter = function - | buf_i when buf_i > !buf_end || !carry <> 0 -> - carry := - !carry + (from_base * (Bytes.unsafe_get buf buf_i |> Char.code)) ; - Bytes.unsafe_set buf buf_i (Char.unsafe_chr (!carry mod to_base)) ; - carry := !carry / to_base ; - iter (buf_i - 1) - | buf_end -> - buf_end - in - buf_end := iter buf_last_index - done - (* [inp] iteration *) ; - let buf_written_len = buf_len - !buf_end - 1 in - let out_len = inp_beg + buf_written_len in - let out = Bytes.create out_len in - Bytes.fill out 0 inp_beg zero ; - Bytes.blit buf (!buf_end + 1) out inp_beg buf_written_len ; - out - -let encode alphabet bin = - let b58 = convert bin 256 58 in - Bytes.map (fun c -> Alphabet.chr (Char.code c) alphabet) b58 - -let decode alphabet bin = - let bin = - Bytes.map (fun c -> Char.unsafe_chr (Alphabet.value c alphabet)) bin - in - convert bin 58 256 - -(* export public Alphabet functionality *) - -type alphabet = Alphabet.t - -exception Invalid_alphabet = Alphabet.Invalid - -exception Invalid_base58_character = Alphabet.Invalid_base58_character - -let make_alphabet = Alphabet.make diff --git a/src/external/coda_base58/src/b58.mli b/src/external/coda_base58/src/b58.mli deleted file mode 100644 index e732f9b1e2a..00000000000 --- a/src/external/coda_base58/src/b58.mli +++ /dev/null @@ -1,73 +0,0 @@ -(* - The MIT License (MIT) - - Copyright (c) 2016 Maxime Ransan - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - -*) - -(** Base58 encoding functionality - - This module implement both encoding and decoding functionality - for the Base58 encoding. - More information can be found {{:https://en.wikipedia.org/wiki/Base58}here}. - This encoding is well suited to encode large integer values - but not large binary data. - Both encode and decode have a quadratic performance with - respect to the length of the binary data. - *) - -(** {2 Types} *) - -(** An alphabet defines the character associated with a given value - - For instance the binary alphabet would ["01"] while the hexadecimal - one would be ["0123456789ABCDEF"]. - - Since this module only focuses with Base 58 encoding the alphabet must - be created with 58 unique characters. - *) -type alphabet - -exception Invalid_alphabet - -(** {2 Alphabet} *) - -(** [make_alphabet s] creates a base 58 alphabet. - - If [s] length is different than 58 characters then [Invalid_alphabet] - exception is raised. - *) -val make_alphabet : string -> alphabet - -(** {2 Decoding/Encoding} *) - -(** [encode alphabet data] encodes [data] using [alphabet]. - *) -val encode : alphabet -> bytes -> bytes - -exception Invalid_base58_character - -(** [decode alphabet data] decodes [data] using [alphabet]. - - If [data] contains character not included in [alphabet], - [Invalid_base58_character] exception is raised. - *) -val decode : alphabet -> bytes -> bytes diff --git a/src/external/coda_base58/src/base58.mllib b/src/external/coda_base58/src/base58.mllib deleted file mode 100644 index da55b75f9fc..00000000000 --- a/src/external/coda_base58/src/base58.mllib +++ /dev/null @@ -1 +0,0 @@ -B58 diff --git a/src/external/coda_base58/src/base58.odocl b/src/external/coda_base58/src/base58.odocl deleted file mode 100644 index da55b75f9fc..00000000000 --- a/src/external/coda_base58/src/base58.odocl +++ /dev/null @@ -1 +0,0 @@ -B58 diff --git a/src/external/coda_base58/tests/test.ml b/src/external/coda_base58/tests/test.ml deleted file mode 100644 index 9eeb37ae502..00000000000 --- a/src/external/coda_base58/tests/test.ml +++ /dev/null @@ -1,69 +0,0 @@ -let alphabet = - B58.make_alphabet - "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" - -let assert_string_eq got exp = - if got <> exp then failwith (Printf.sprintf "Error: got:%s, exp:%s" got exp) - else () - -let () = - let test_cases = - [ ("", "") - ; ("\000", "1") - ; ("\000\000", "11") - ; ("\001", "2") - ; ("\000\001", "12") - ; ("\000\001\002", "15T") - ; ("\001\002\003", "Ldp") - ; ("\255", "5Q") - ; ("\255\255", "LUv") - ; ("\255\255\000", "2UzCw") - ; ("\255\255\000\000", "7YXVfM") - ; ("This is a test string", "6C3QbYGU2SHs7TronoE7Fb6fH2mgz") - ; ( "gjkdsfh837459028354upo" ^ "j0-29[23 i9c2hjg b,kbf," - ^ "dsbfg kljhp2i4-019=o=-9" ^ "w90382490u3'l'0 i39r83 " - ^ "flkskfsjfg,sdjfhgjksdjt" ^ "04it093274u;lamv,sd[\\]" - ^ "[g[osdfbksm ksjoift8r7t" - , "iJyantJWqZNsVD9FM465t7Q" ^ "fzCHf1TLGaQMBXXFQM8UUzi" - ^ "AeRNMCfeMztFdPXjENS9pgp" ^ "4CJ3j8M8GhWt6LBVN6e3BBM" - ^ "gBw3yoymvnB7HyGD6qSchZi" ^ "K9jM437daWVWWVeg5UDD2Ac" - ^ "dhMnZyxCh7jF5VRNw5GBBXB" ^ "AtHL4DcZGL1UHvzFMt2MGtW" - ^ "YtiLABjNiofWp92s21K2Div" ^ "CTwRXKPJHZ" ) ] - in - let all_encodings = [("alphabet", alphabet)] in - List.iter - (fun (bin, exp) -> - List.iter - (fun (name, alphabet) -> - let got = - let bin = Bytes.of_string bin in - Bytes.to_string @@ B58.encode alphabet bin - in - assert_string_eq got exp ; - let got = - let bin = Bytes.of_string exp in - Bytes.to_string @@ B58.decode alphabet bin - in - assert_string_eq got bin ) - all_encodings ) - test_cases ; - ( match B58.make_alphabet "123" with - | x -> - assert false (* exception expected *) - | exception B58.Invalid_alphabet -> - () ) ; - let invalid_b58 = Bytes.of_string "\001\002" in - ( match B58.decode alphabet invalid_b58 with - | x -> - assert false (* exception expected *) - | exception B58.Invalid_base58_character -> - () ) ; - for i = 0 to 100 do - let s = - Bytes.init (Random.int 1000) (fun _ -> Char.chr @@ Random.int 255) - in - let b58 = B58.encode alphabet s in - let s' = B58.decode alphabet b58 in - assert (s = s') - done ; - () diff --git a/src/external/dune b/src/external/dune deleted file mode 100644 index e315530b026..00000000000 --- a/src/external/dune +++ /dev/null @@ -1,3 +0,0 @@ -(dirs :standard \ async_kernel) - -(vendored_dirs ocaml-rocksdb ocaml-sodium prometheus) diff --git a/src/external/ocaml-rocksdb/.gitignore b/src/external/ocaml-rocksdb/.gitignore deleted file mode 100644 index 5f2b243ef78..00000000000 --- a/src/external/ocaml-rocksdb/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/_build/ -/aname/ -/*.native diff --git a/src/external/ocaml-rocksdb/.ocp-indent b/src/external/ocaml-rocksdb/.ocp-indent deleted file mode 100644 index 42d57bc7e38..00000000000 --- a/src/external/ocaml-rocksdb/.ocp-indent +++ /dev/null @@ -1 +0,0 @@ -strict_with=always,match_clause=2,strict_else=never diff --git a/src/external/ocaml-rocksdb/.travis.yml b/src/external/ocaml-rocksdb/.travis.yml deleted file mode 100644 index a99a617f517..00000000000 --- a/src/external/ocaml-rocksdb/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: c -cache: apt -matrix: - include: - - os: linux - env: OCAML_VERSION=4.02.1 OPAM_VERSION=1.2.2 - -sudo: required -before_install: ./travis.sh before_install -install: ./travis.sh install -script: ./travis.sh script -git: - submodules: false diff --git a/src/external/ocaml-rocksdb/COMPILING.md b/src/external/ocaml-rocksdb/COMPILING.md deleted file mode 100644 index 04f74727577..00000000000 --- a/src/external/ocaml-rocksdb/COMPILING.md +++ /dev/null @@ -1,11 +0,0 @@ -You need some opam packages -``` -opam install ctypes.0.4.0 ctypes-foreign -``` - - -You'll also need to install rocksdb. There's a script that can do this for you, see [install_rocksdb.sh]. -[install_rocksdb.sh]: install_rocksdb.sh - -Afterwards run `make` in the root dir of this repository. -The package can be installed with `make install`. diff --git a/src/external/ocaml-rocksdb/LICENSE b/src/external/ocaml-rocksdb/LICENSE deleted file mode 100644 index fb1c767f747..00000000000 --- a/src/external/ocaml-rocksdb/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Jan Doms - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/external/ocaml-rocksdb/README.md b/src/external/ocaml-rocksdb/README.md deleted file mode 100644 index b796fcf7303..00000000000 --- a/src/external/ocaml-rocksdb/README.md +++ /dev/null @@ -1,11 +0,0 @@ -ORocksDb -======== -[![Build Status](https://travis-ci.org/domsj/orocksdb.svg?branch=master)](https://travis-ci.org/domsj/orocksdb) - -This repository contains some ocaml bindings to the C api of [rocksdb](http://github.com/facebook/rocksdb/). -It is most certainly not complete. Not all available/implemented options have been tested. - -The binding is used as part of https://github.com/openvstorage/alba . - -Feel free to suggest features / report bugs using the issue tracker available on the repo. -Pull requests are definitely welcome too! diff --git a/src/external/ocaml-rocksdb/dune b/src/external/ocaml-rocksdb/dune deleted file mode 100644 index 3525e4c342a..00000000000 --- a/src/external/ocaml-rocksdb/dune +++ /dev/null @@ -1,60 +0,0 @@ -(include ../../dune.linker.inc) - -(library - (name rocks) - (public_name rocks) - (no_dynlink) - (libraries ctypes ctypes.foreign) - (modules (:standard \ rocks_linker_flags_gen rocks_test)) - (c_library_flags (:standard (:include flags.sexp) %{read:dune-linker})) - ) - -(executable - (name rocks_linker_flags_gen) - (modules rocks_linker_flags_gen) - (libraries dune.configurator) - ) - -;; todo: fails with sandbox, since the generated flags are opaque to dune -(rule - (targets flags.sexp) - (deps librocksdb_stubs.a (sandbox none)) - (action (run ./rocks_linker_flags_gen.exe))) - -(rule - (targets librocksdb_stubs.a) - (deps (source_tree rocksdb)) - (action (bash " - NATIVE_ROCKSDB=${MINA_ROCKSDB-/usr/local/lib/librocksdb_coda.a} - if [ -e $NATIVE_ROCKSDB ]; then - cp $NATIVE_ROCKSDB librocksdb_stubs.a - else - if [ ! -d rocksdb ]; then git clone https://github.com/facebook/rocksdb -b v5.17.2 --depth=1; fi - pushd rocksdb - git fetch - git clean -dxf - git checkout v5.17.2 - - case $(uname) in - 'Linux') jobs=$(nproc) ;; - 'Darwin') jobs=2 ;; - *) echo I do not know how to build on $(uname) ; exit 1 - esac - env ROCKSDB_DISABLE_SNAPPY=1 \\ - ROCKSDB_DISABLE_GFLAGS=1 \\ - ROCKSDB_DISABLE_LZ4=1 \\ - ROCKSDB_DISABLE_ZSTD=1 \\ - ROCKSDB_DISABLE_NUMA=1 \\ - ROCKSDB_DISABLE_TBB=1 \\ - ROCKSDB_DISABLE_JEMALLOC=1 \\ - ROCKSDB_DISABLE_TCMALLOC=1 \\ - ROCKSDB_DISABLE_BACKTRACE=1 \\ - PORTABLE=1 \\ - FORCE_SSE42=1 \\ - DISABLE_WARNING_AS_ERROR=1 \\ - make static_lib -j${jobs} - - strip -S librocksdb.a - popd - cp rocksdb/librocksdb.a librocksdb_stubs.a - fi"))) diff --git a/src/external/ocaml-rocksdb/dune-project b/src/external/ocaml-rocksdb/dune-project deleted file mode 100644 index cda95fed59f..00000000000 --- a/src/external/ocaml-rocksdb/dune-project +++ /dev/null @@ -1 +0,0 @@ -(lang dune 3.1) diff --git a/src/external/ocaml-rocksdb/opam b/src/external/ocaml-rocksdb/opam deleted file mode 100644 index 0b08d4cb1b0..00000000000 --- a/src/external/ocaml-rocksdb/opam +++ /dev/null @@ -1,30 +0,0 @@ -opam-version: "2.0" -name: "orocksdb" -version: "0.3.0" -maintainer: "Jan Doms " -authors: "Jan Doms " -homepage: "https://github.com/domsj/orocksdb" -bug-reports: "https://github.com/domsj/orocksdb" -license: "MIT" -dev-repo: "https://github.com/domsj/orocksdb.git" -env: [ OROCKSDB_TAG_VERSION = "0.3.0" - OROCKSDB_GIT_REVISION = "none" - ] -build: [ [ make ] ] -install: [ make "install" ] -remove: [ "ocamlfind" "remove" "rocks" ] -depends: [ - "ocamlfind" {build} - "ocamlbuild" {build} - "ctypes" {>= "0.4.0"} - "ctypes-foreign" {>= "0.4.0"} -] -depopts:[ - [[ "debian" ] [ "g++-4.8" ]] - [[ "ubuntu" ] [ "g++-4.8" ]] -] -depexts:[ - [[ "debian" ] [ "libgflags-dev" "libsnappy-dev" "libbz2-dev" ]] - [[ "ubuntu" ] [ "libgflags-dev" "libsnappy-dev" "libbz2-dev" ]] - [[ "source" "linux" ] [ "https://gist.githubusercontent.com/domsj/a801de01d33233229357413e9816e513/raw/ff3a93775134d8063a955ca8e10860af69687e7f/execute-local-install-rocksdb-script.sh" ]] -] diff --git a/src/external/ocaml-rocksdb/rocks.ml b/src/external/ocaml-rocksdb/rocks.ml deleted file mode 100644 index 3678639f7ae..00000000000 --- a/src/external/ocaml-rocksdb/rocks.ml +++ /dev/null @@ -1,819 +0,0 @@ -open Ctypes -open Foreign -open Rocks_common - -type bigarray = Rocks_intf.bigarray - -module Views = Views - -exception OperationOnInvalidObject = Rocks_common.OperationOnInvalidObject - -module WriteBatch = struct - module C = CreateConstructors_ (struct - let name = "writebatch" - end) - - include C - - let clear = foreign "rocksdb_writebatch_clear" (t @-> returning void) - - let count = foreign "rocksdb_writebatch_count" (t @-> returning int) - - let put_raw = - foreign "rocksdb_writebatch_put" - ( t @-> ptr char @-> Views.int_to_size_t @-> ptr char - @-> Views.int_to_size_t @-> returning void ) - - let put_raw_string = - foreign "rocksdb_writebatch_put" - ( t @-> ocaml_string @-> Views.int_to_size_t @-> ocaml_string - @-> Views.int_to_size_t @-> returning void ) - - let put ?(key_pos = 0) ?key_len ?(value_pos = 0) ?value_len batch key value = - let open Bigarray.Array1 in - let key_len = - match key_len with None -> dim key - key_pos | Some len -> len - in - let value_len = - match value_len with None -> dim value - value_pos | Some len -> len - in - put_raw batch - (bigarray_start array1 key +@ key_pos) - key_len - (bigarray_start array1 value +@ value_pos) - value_len - - let put_string ?(key_pos = 0) ?key_len ?(value_pos = 0) ?value_len batch key - value = - let key_len = - match key_len with - | None -> - String.length key - key_pos - | Some len -> - len - in - let value_len = - match value_len with - | None -> - String.length value - value_pos - | Some len -> - len - in - put_raw_string batch - (ocaml_string_start key +@ key_pos) - key_len - (ocaml_string_start value +@ value_pos) - value_len - - let delete_raw = - foreign "rocksdb_writebatch_delete" - (t @-> ptr char @-> Views.int_to_size_t @-> returning void) - - let delete_raw_string = - foreign "rocksdb_writebatch_delete" - (t @-> ocaml_string @-> Views.int_to_size_t @-> returning void) - - let delete ?(pos = 0) ?len batch key = - let open Bigarray.Array1 in - let len = match len with None -> dim key - pos | Some len -> len in - delete_raw batch (bigarray_start array1 key +@ pos) len - - let delete_string ?(pos = 0) ?len batch key = - let len = - match len with None -> String.length key - pos | Some len -> len - in - delete_raw_string batch (ocaml_string_start key +@ pos) len -end - -module Version = struct - let major = 5 - - let minor = 17 - - let patch = 2 - - let git_revision = "tags/v5.17.2-0-gf438b98e5" - - let summary = (major, minor, patch, git_revision) -end - -let returning_error typ = ptr string_opt @-> returning typ - -let with_err_pointer f = - let err_pointer = allocate string_opt None in - let res = f err_pointer in - match !@err_pointer with None -> res | Some err -> failwith err - -module rec Iterator : (Rocks_intf.ITERATOR with type db := RocksDb.t) = struct - module ReadOptions = Rocks_options.ReadOptions - - type nonrec t = t - - let t = t - - let db = t - - let get_pointer = get_pointer - - exception InvalidIterator - - let create_no_gc = - foreign "rocksdb_create_iterator" (db @-> ReadOptions.t @-> returning t) - - let destroy = - let inner = foreign "rocksdb_iter_destroy" (t @-> returning void) in - fun t -> - inner t ; - t.valid <- false - - let create ?opts db = - let inner opts = - let t = create_no_gc db opts in - Gc.finalise destroy t ; t - in - match opts with - | None -> - ReadOptions.with_t inner - | Some opts -> - inner opts - - let with_t ?opts db ~f = - let inner opts = - let t = create_no_gc db opts in - finalize (fun () -> f t) (fun () -> destroy t) - in - match opts with - | None -> - ReadOptions.with_t inner - | Some opts -> - inner opts - - let is_valid = - foreign "rocksdb_iter_valid" (t @-> returning Views.bool_to_uchar) - - let seek_to_first = - foreign "rocksdb_iter_seek_to_first" (t @-> returning void) - - let seek_to_last = foreign "rocksdb_iter_seek_to_last" (t @-> returning void) - - let seek_raw = - foreign "rocksdb_iter_seek" - (t @-> ptr char @-> Views.int_to_size_t @-> returning void) - - let seek_raw_string = - foreign "rocksdb_iter_seek" - (t @-> ocaml_string @-> Views.int_to_size_t @-> returning void) - - let seek ?(pos = 0) ?len t key = - let open Bigarray.Array1 in - let len = match len with None -> dim key - pos | Some len -> len in - seek_raw t (bigarray_start array1 key +@ pos) len - - let seek_string ?(pos = 0) ?len t key = - let len = - match len with None -> String.length key - pos | Some len -> len - in - seek_raw_string t (ocaml_string_start key +@ pos) len - - let next = foreign "rocksdb_iter_next" (t @-> returning void) - - let prev = foreign "rocksdb_iter_prev" (t @-> returning void) - - let get_key_raw = - let inner = - foreign "rocksdb_iter_key" - (t @-> ptr Views.int_to_size_t @-> returning (ptr char)) - in - fun t size -> if is_valid t then inner t size else raise InvalidIterator - - let get_key t = - let res_size = allocate Views.int_to_size_t 0 in - let res = get_key_raw t res_size in - if to_voidp res = null then - failwith (Printf.sprintf "could not get key, is_valid=%b" (is_valid t)) - else bigarray_of_ptr array1 !@res_size Bigarray.char res - - let get_key_string t = - let res_size = allocate Views.int_to_size_t 0 in - let res = get_key_raw t res_size in - if to_voidp res = null then - failwith (Printf.sprintf "could not get key, is_valid=%b" (is_valid t)) - else string_from_ptr res ~length:!@res_size - - let get_value_raw = - let inner = - foreign "rocksdb_iter_value" - (t @-> ptr Views.int_to_size_t @-> returning (ptr char)) - in - fun t size -> if is_valid t then inner t size else raise InvalidIterator - - let get_value t = - let res_size = allocate Views.int_to_size_t 0 in - let res = get_value_raw t res_size in - if to_voidp res = null then - failwith (Printf.sprintf "could not get value, is_valid=%b" (is_valid t)) - else bigarray_of_ptr array1 !@res_size Bigarray.char res - - let get_value_string t = - let res_size = allocate Views.int_to_size_t 0 in - let res = get_value_raw t res_size in - if to_voidp res = null then - failwith (Printf.sprintf "could not get value, is_valid=%b" (is_valid t)) - else string_from_ptr res ~length:!@res_size - - let get_error_raw = - foreign "rocksdb_iter_get_error" (t @-> ptr string_opt @-> returning void) - - let get_error t = - let err_pointer = allocate string_opt None in - get_error_raw t err_pointer ; - !@err_pointer -end - -and Transaction : - (Rocks_intf.TRANSACTION - with type db := RocksDb.t - and type iter := Iterator.t) = struct - module ReadOptions = Rocks_options.ReadOptions - module WriteOptions = Rocks_options.WriteOptions - module TransactionOptions = Rocks_options.TransactionOptions - module Snapshot = Rocks_options.Snapshot - - let name = "transaction" - - let destructor = "rocksdb_" ^ name ^ "_destroy" - - let db = t - - type nonrec t = t - - let t = t - - let txnbegin_raw = - foreign "rocksdb_transaction_begin" - ( db @-> WriteOptions.t @-> TransactionOptions.t @-> ptr void - @-> returning t ) - - let destroy = make_destroy t destructor - - let txnbegin_no_gc ?wopts ?txnopts db = - let inner wopts txnopts = txnbegin_raw db wopts txnopts null in - match (wopts, txnopts) with - | None, None -> - TransactionOptions.with_t (fun txnopts -> - WriteOptions.with_t (fun wopts -> inner wopts txnopts) ) - | Some wopts, None -> - TransactionOptions.with_t (inner wopts) - | None, Some txnopts -> - WriteOptions.with_t (fun wopts -> inner wopts txnopts) - | Some wopts, Some txnopts -> - inner wopts txnopts - - let txnbegin ?wopts ?txnopts db = - let t = txnbegin_no_gc ?wopts ?txnopts db in - Gc.finalise destroy t ; t - - let commit_raw = - foreign "rocksdb_transaction_commit" (t @-> returning_error void) - - let commit t = with_err_pointer (commit_raw t) - - let rollback_raw = - foreign "rocksdb_transaction_rollback" (t @-> returning_error void) - - let rollback t = with_err_pointer (rollback_raw t) - - let with_t db f = - let t = txnbegin_no_gc db in - finalize (fun () -> f t) (fun () -> destroy t) - - let put_raw = - foreign "rocksdb_transaction_put" - ( t @-> ptr char @-> Views.int_to_size_t @-> ptr char - @-> Views.int_to_size_t @-> returning_error void ) - - let put_raw_string = - foreign "rocksdb_transaction_put" - ( t @-> ocaml_string @-> Views.int_to_size_t @-> ocaml_string - @-> Views.int_to_size_t @-> returning_error void ) - - let put ?(key_pos = 0) ?key_len ?(value_pos = 0) ?value_len ?opts:_ t key - value = - let open Bigarray.Array1 in - let key_len = - match key_len with None -> dim key - key_pos | Some len -> len - in - let value_len = - match value_len with None -> dim value - value_pos | Some len -> len - in - with_err_pointer - (put_raw t - (bigarray_start array1 key +@ key_pos) - key_len - (bigarray_start array1 value +@ value_pos) - value_len) - - let put_string ?(key_pos = 0) ?key_len ?(value_pos = 0) ?value_len ?opts:_ t - key value = - let key_len = - match key_len with - | None -> - String.length key - key_pos - | Some len -> - len - in - let value_len = - match value_len with - | None -> - String.length value - value_pos - | Some len -> - len - in - with_err_pointer - (put_raw_string t - (ocaml_string_start key +@ key_pos) - key_len - (ocaml_string_start value +@ value_pos) - value_len) - - let delete_raw = - foreign "rocksdb_transaction_delete" - (t @-> ptr char @-> Views.int_to_size_t @-> returning_error void) - - let delete_raw_string = - foreign "rocksdb_transaction_delete" - (t @-> ocaml_string @-> Views.int_to_size_t @-> returning_error void) - - let delete ?(pos = 0) ?len ?opts:_ t key = - let open Bigarray.Array1 in - let len = match len with None -> dim key - pos | Some len -> len in - with_err_pointer (delete_raw t (bigarray_start array1 key +@ pos) len) - - let delete_string ?(pos = 0) ?len ?opts:_ t key = - let len = - match len with None -> String.length key - pos | Some len -> len - in - with_err_pointer (delete_raw_string t (ocaml_string_start key +@ pos) len) - - let get_raw = - foreign "rocksdb_transaction_get" - ( t @-> ReadOptions.t @-> ptr char @-> Views.int_to_size_t - @-> ptr Views.int_to_size_t - @-> returning_error (ptr char) ) - - let get_raw_string = - foreign "rocksdb_transaction_get" - ( t @-> ReadOptions.t @-> ocaml_string @-> Views.int_to_size_t - @-> ptr Views.int_to_size_t - @-> returning_error (ptr char) ) - - let get ?(pos = 0) ?len ?opts t key = - let open Bigarray.Array1 in - let len = match len with None -> dim key - pos | Some len -> len in - let inner opts = - let res_size = allocate Views.int_to_size_t 0 in - let res = - with_err_pointer - (get_raw t opts (bigarray_start array1 key +@ pos) len res_size) - in - if to_voidp res = null then None - else - let res' = bigarray_of_ptr array1 !@res_size Bigarray.char res in - Gc.finalise_last (fun () -> free (to_voidp res)) res' ; - Some res' - in - match opts with - | Some opts -> - inner opts - | None -> - ReadOptions.with_t inner - - let get_string ?(pos = 0) ?len ?opts t key = - let len = - match len with None -> String.length key - pos | Some len -> len - in - let inner opts = - let res_size = allocate Views.int_to_size_t 0 in - let res = - with_err_pointer - (get_raw_string t opts (ocaml_string_start key +@ pos) len res_size) - in - if to_voidp res = null then None - else - let res' = string_from_ptr res ~length:!@res_size in - Gc.finalise_last (fun () -> free (to_voidp res)) res' ; - Some res' - in - match opts with - | Some opts -> - inner opts - | None -> - ReadOptions.with_t inner - - let get_snapshot = - foreign "rocksdb_transaction_get_snapshot" (t @-> returning Snapshot.t) - - let free_snapshot = foreign "rocksdb_free" (Snapshot.t @-> returning void) - - let create_iterator_no_gc = - foreign "rocksdb_transaction_create_iterator" - (t @-> ReadOptions.t @-> returning t) - - let destroy_iterator = - let inner = foreign "rocksdb_iter_destroy" (t @-> returning void) in - fun t -> - inner t ; - t.valid <- false - - let create_iterator ?opts txn = - let inner opts = - let t = create_iterator_no_gc txn opts in - Gc.finalise destroy_iterator t ; - t - in - match opts with - | None -> - ReadOptions.with_t inner - | Some opts -> - inner opts - - let with_iterator ?opts txn ~f = - let inner opts = - let t = create_iterator_no_gc txn opts in - finalize (fun () -> f t) (fun () -> destroy_iterator t) - in - match opts with - | None -> - ReadOptions.with_t inner - | Some opts -> - inner opts -end - -and RocksDb : (Rocks_intf.ROCKS with type batch := WriteBatch.t) = struct - module ReadOptions = Rocks_options.ReadOptions - module WriteOptions = Rocks_options.WriteOptions - module FlushOptions = Rocks_options.FlushOptions - module Options = Rocks_options.Options - module Cache = Rocks_options.Cache - module Snapshot = Rocks_options.Snapshot - module BlockBasedTableOptions = Rocks_options.BlockBasedTableOptions - module TransactionDbOptions = Rocks_options.TransactionDbOptions - - type nonrec t = t - - let t = t - - let get_pointer = get_pointer - - let open_db_raw = - foreign "rocksdb_open" - (Options.t @-> string @-> ptr string_opt @-> returning t) - - let open_db_for_read_only_raw = - foreign "rocksdb_open_for_read_only" - ( Options.t @-> string @-> Views.bool_to_uchar @-> ptr string_opt - @-> returning t ) - - let open_transactiondb_raw = - foreign "rocksdb_transactiondb_open" - ( Options.t @-> TransactionDbOptions.t @-> string @-> ptr string_opt - @-> returning t ) - - let open_transactiondb ?opts ?txnopts name = - let inner opts txndbopts = - with_err_pointer (open_transactiondb_raw opts txndbopts name) - in - match (opts, txnopts) with - | None, None -> - TransactionDbOptions.with_t (fun txndbopts -> - Options.with_t (fun opts -> inner opts txndbopts) ) - | Some opts, None -> - TransactionDbOptions.with_t (inner opts) - | None, Some txndbopts -> - Options.with_t (fun opts -> inner opts txndbopts) - | Some opts, Some txndbopts -> - inner opts txndbopts - - let open_db ?opts name = - match opts with - | None -> - Options.with_t (fun options -> - with_err_pointer (open_db_raw options name) ) - | Some opts -> - with_err_pointer (open_db_raw opts name) - - let open_db_for_read_only ?opts name error_if_log_file_exists = - match opts with - | None -> - Options.with_t (fun options -> - with_err_pointer - (open_db_for_read_only_raw options name error_if_log_file_exists) - ) - | Some opts -> - with_err_pointer - (open_db_for_read_only_raw opts name error_if_log_file_exists) - - let close = - let inner = foreign "rocksdb_close" (t @-> returning void) in - fun t -> - inner t ; - t.valid <- false - - let with_db ?opts name ~f = - let db = open_db ?opts name in - finalize (fun () -> f db) (fun () -> close db) - - let put_raw = - foreign "rocksdb_put" - ( t @-> WriteOptions.t @-> ptr char @-> Views.int_to_size_t @-> ptr char - @-> Views.int_to_size_t @-> returning_error void ) - - let put_raw_string = - foreign "rocksdb_put" - ( t @-> WriteOptions.t @-> ocaml_string @-> Views.int_to_size_t - @-> ocaml_string @-> Views.int_to_size_t @-> returning_error void ) - - let put ?(key_pos = 0) ?key_len ?(value_pos = 0) ?value_len ?opts t key value - = - let open Bigarray.Array1 in - let key_len = - match key_len with None -> dim key - key_pos | Some len -> len - in - let value_len = - match value_len with None -> dim value - value_pos | Some len -> len - in - let inner opts = - with_err_pointer - (put_raw t opts - (bigarray_start array1 key +@ key_pos) - key_len - (bigarray_start array1 value +@ value_pos) - value_len) - in - match opts with - | None -> - WriteOptions.with_t inner - | Some opts -> - inner opts - - let put_string ?(key_pos = 0) ?key_len ?(value_pos = 0) ?value_len ?opts t - key value = - let key_len = - match key_len with - | None -> - String.length key - key_pos - | Some len -> - len - in - let value_len = - match value_len with - | None -> - String.length value - value_pos - | Some len -> - len - in - let inner opts = - with_err_pointer - (put_raw_string t opts - (ocaml_string_start key +@ key_pos) - key_len - (ocaml_string_start value +@ value_pos) - value_len) - in - match opts with - | None -> - WriteOptions.with_t inner - | Some opts -> - inner opts - - let delete_raw = - foreign "rocksdb_delete" - ( t @-> WriteOptions.t @-> ptr char @-> Views.int_to_size_t - @-> returning_error void ) - - let delete_raw_string = - foreign "rocksdb_delete" - ( t @-> WriteOptions.t @-> ocaml_string @-> Views.int_to_size_t - @-> returning_error void ) - - let delete ?(pos = 0) ?len ?opts t key = - let open Bigarray.Array1 in - let len = match len with None -> dim key - pos | Some len -> len in - let inner opts = - with_err_pointer - (delete_raw t opts (bigarray_start array1 key +@ pos) len) - in - match opts with - | None -> - WriteOptions.with_t inner - | Some opts -> - inner opts - - let delete_string ?(pos = 0) ?len ?opts t key = - let len = - match len with None -> String.length key - pos | Some len -> len - in - let inner opts = - with_err_pointer - (delete_raw_string t opts (ocaml_string_start key +@ pos) len) - in - match opts with - | None -> - WriteOptions.with_t inner - | Some opts -> - inner opts - - let write_raw = - foreign "rocksdb_write" - (t @-> WriteOptions.t @-> WriteBatch.t @-> returning_error void) - - let write ?opts t wb = - let inner opts = with_err_pointer (write_raw t opts wb) in - match opts with - | None -> - WriteOptions.with_t inner - | Some opts -> - with_err_pointer (write_raw t opts wb) - - let get_raw = - foreign "rocksdb_get" - ( t @-> ReadOptions.t @-> ptr char @-> Views.int_to_size_t - @-> ptr Views.int_to_size_t - @-> returning_error (ptr char) ) - - let get_raw_string = - foreign "rocksdb_get" - ( t @-> ReadOptions.t @-> ocaml_string @-> Views.int_to_size_t - @-> ptr Views.int_to_size_t - @-> returning_error (ptr char) ) - - let get ?(pos = 0) ?len ?opts t key = - let open Bigarray.Array1 in - let len = match len with None -> dim key - pos | Some len -> len in - let inner opts = - let res_size = allocate Views.int_to_size_t 0 in - let res = - with_err_pointer - (get_raw t opts (bigarray_start array1 key +@ pos) len res_size) - in - if to_voidp res = null then None - else - let res' = bigarray_of_ptr array1 !@res_size Bigarray.char res in - Gc.finalise_last (fun () -> free (to_voidp res)) res' ; - Some res' - in - match opts with - | Some opts -> - inner opts - | None -> - ReadOptions.with_t inner - - let get_string ?(pos = 0) ?len ?opts t key = - let len = - match len with None -> String.length key - pos | Some len -> len - in - let inner opts = - let res_size = allocate Views.int_to_size_t 0 in - let res = - with_err_pointer - (get_raw_string t opts (ocaml_string_start key +@ pos) len res_size) - in - if to_voidp res = null then None - else - let res' = string_from_ptr res ~length:!@res_size in - Gc.finalise_last (fun () -> free (to_voidp res)) res' ; - Some res' - in - match opts with - | Some opts -> - inner opts - | None -> - ReadOptions.with_t inner - - let multi_get_raw = - foreign "rocksdb_multi_get" - ( t - @-> ReadOptions.t - @-> Views.int_to_size_t - @-> ptr (ptr char) - @-> ptr size_t - @-> ptr (ptr char) - @-> ptr size_t - @-> ptr (ptr char) - @-> returning void ) - - let multi_get ?opts t keys = - let inner opts = - let cast_array_ptr typ arr = arr |> bigarray_start array1 |> to_voidp |> from_voidp typ in - let count = List.length keys in - (* could optimize this into a single allocation *) - let inputs = Bigarray.(Array1.create Nativeint C_layout) count in - let input_lengths = Bigarray.(Array1.create Nativeint C_layout) count in - let outputs = Bigarray.(Array1.create Nativeint C_layout) count in - let output_lengths = Bigarray.(Array1.create Nativeint C_layout) count in - let errors = Bigarray.(Array1.create Nativeint C_layout) count in - keys |> List.iteri (fun i key -> - Bigarray.Array1.unsafe_set inputs i (bigarray_start array1 key |> to_voidp |> raw_address_of_ptr) ; - Bigarray.Array1.unsafe_set input_lengths i (Bigarray.Array1.dim key |> Nativeint.of_int) ) ; - multi_get_raw t opts count - (cast_array_ptr (ptr char) inputs) - (cast_array_ptr size_t input_lengths) - (cast_array_ptr (ptr char) outputs) - (cast_array_ptr size_t output_lengths) - (cast_array_ptr (ptr char) errors) ; - keep_alive (inputs, input_lengths, keys) ; - let results = ref [] in - for i = count - 1 downto 0 do - let res = - let error_ptr = Bigarray.Array1.unsafe_get errors i |> ptr_of_raw_address in - if is_null error_ptr then ( - let output_length = Nativeint.to_int (Bigarray.Array1.unsafe_get output_lengths i) in - let output_ptr = Bigarray.Array1.unsafe_get outputs i |> ptr_of_raw_address in - if output_ptr = null then None else ( - let output = bigarray_of_ptr array1 output_length Bigarray.char (from_voidp char output_ptr) in - Gc.finalise_last (fun () -> free output_ptr) output ; - Some output )) - else ( - free error_ptr ; - None ) - in - results := res :: !results - done ; - !results - in - match opts with - | Some opts -> - inner opts - | None -> - ReadOptions.with_t inner - - let flush_raw = - foreign "rocksdb_flush" (t @-> FlushOptions.t @-> returning_error void) - - let flush ?opts t = - let inner opts = with_err_pointer (flush_raw t opts) in - match opts with - | None -> - FlushOptions.with_t inner - | Some opts -> - inner opts - - let create_snapshot = - foreign "rocksdb_create_snapshot" (t @-> returning Snapshot.t) - - let release_snapshot = - foreign "rocksdb_release_snapshot" (t @-> Snapshot.t @-> returning void) - - module CheckpointObject = struct - let name = "checkpoint_object" - - let constructor = "rocksdb_" ^ name ^ "_create" - - let destructor = "rocksdb_" ^ name ^ "_destroy" - - let db = t - - let t = t - - let create_no_gc = foreign constructor (db @-> returning t) - - let destroy = make_destroy t destructor - - let with_t db f = - let t = create_no_gc db in - finalize (fun () -> f t) (fun () -> destroy t) - end - - (* log_size_for_flush: if the totoal log file size is equal or - larger than this value, then a flush is triggered for all the - column families. The default value is 0, which means flush is - always triggered. If you move away from the default, the checkpoint - may not contain up-to-date data if WAL writing is not always - enabled.*) - let checkpoint_create db ?log_size_for_flush:(l = 0) ~dir () = - let checkpoint_create_raw = - foreign "rocksdb_checkpoint_create" - ( CheckpointObject.t @-> string @-> Views.int_to_uint64_t - @-> ptr string_opt @-> returning void ) - in - CheckpointObject.with_t db (fun checkpoint_object -> - with_err_pointer - (checkpoint_create_raw checkpoint_object dir l) ) - - let property_value db name = - (* Ugly hack. Is there a better way to retrieve string from C? *) - let get = - foreign "rocksdb_property_value" - (t @-> string @-> returning (ptr_opt char)) - in - let free = foreign "free" (ptr char @-> returning void) in - let strlen = foreign "strlen" (ptr char @-> returning int) in - match get db name with - | Some p -> - let value = string_from_ptr p ~length:(strlen p) in - free p ; Some value - | None -> - None -end - -include RocksDb diff --git a/src/external/ocaml-rocksdb/rocks.mli b/src/external/ocaml-rocksdb/rocks.mli deleted file mode 100644 index f7ea0da7435..00000000000 --- a/src/external/ocaml-rocksdb/rocks.mli +++ /dev/null @@ -1,36 +0,0 @@ -exception OperationOnInvalidObject - -type bigarray = Rocks_intf.bigarray - -module Views : sig - val bool_to_int : bool Ctypes.typ - val bool_to_uchar : bool Ctypes.typ - val int_to_size_t : int Ctypes.typ -end - -module WriteBatch : sig - include Rocks_common.S - - val clear : t -> unit - val count : t -> int - - val put : ?key_pos:int -> ?key_len:int -> ?value_pos:int -> ?value_len:int -> t -> bigarray -> bigarray -> unit - val put_string : ?key_pos:int -> ?key_len:int -> ?value_pos:int -> ?value_len:int -> t -> string -> string -> unit - - val delete : ?pos:int -> ?len:int -> t -> bigarray -> unit - val delete_string : ?pos:int -> ?len:int -> t -> string -> unit -end - -module Version : sig - val major : int - val minor : int - val patch : int - val git_revision : string - val summary : int * int * int * string -end - -include Rocks_intf.ROCKS with type batch := WriteBatch.t - -module Iterator : Rocks_intf.ITERATOR with type db := t -module Transaction : Rocks_intf.TRANSACTION with type db := t and type iter := Iterator.t - diff --git a/src/external/ocaml-rocksdb/rocks.opam b/src/external/ocaml-rocksdb/rocks.opam deleted file mode 100644 index 3f309a68f5b..00000000000 --- a/src/external/ocaml-rocksdb/rocks.opam +++ /dev/null @@ -1,6 +0,0 @@ -opam-version: "1.2" -version: "0.1" -build: [ - ["dune" "build" "--only" "src" "--root" "." "-j" jobs "@install"] -] - diff --git a/src/external/ocaml-rocksdb/rocks_common.ml b/src/external/ocaml-rocksdb/rocks_common.ml deleted file mode 100644 index 85e6929a65f..00000000000 --- a/src/external/ocaml-rocksdb/rocks_common.ml +++ /dev/null @@ -1,159 +0,0 @@ -open Ctypes -open Foreign - -(* Trick taken from Janestreet's core_kernel library. - * This function guarantees `o` will not be garbage collected. - * It is safer than using `ignore` to provide this guarantee, as - * the compiler won't optimize int_of_string away and will not perform - * constant folding on invocations of `keep_alive` *) -let rec keep_alive o = if Sys.opaque_identity (int_of_string "0") <> 0 then keep_alive (Sys.opaque_identity o) - -module Views = struct - open Unsigned - - let bool_to_int = - view - ~read:(fun i -> i <> 0) - ~write:(function true -> 1 | false -> 0) - int - - let bool_to_uchar = - view - ~read:(fun u -> u <> UChar.zero) - ~write:(function true -> UChar.one | false -> UChar.zero) - uchar - - let int_to_size_t = - view - ~read:Size_t.to_int - ~write:Size_t.of_int - size_t - - let int_to_uint_t = - view - ~read:UInt.to_int - ~write:UInt.of_int - uint - - let int_to_uint32_t = - view - ~read:UInt32.to_int - ~write:UInt32.of_int - uint32_t - - let int_to_uint64_t = - view - ~read:UInt64.to_int - ~write:UInt64.of_int - uint64_t -end - -let free = - foreign - "free" - (ptr void @-> returning void) - -module type RocksType = - sig - val name : string - val constructor : string - val destructor : string - val setter_prefix : string - end - -module type RocksType' = - sig - val name : string - end - -type t = { - ptr : unit ptr; - mutable valid : bool; -} - -let get_pointer t = t.ptr - -exception OperationOnInvalidObject - -let t : t typ = - view - ~read:(fun ptr -> { ptr; valid = true; }) - ~write:( - fun { ptr; valid; } -> - if valid - then ptr - else raise OperationOnInvalidObject) - (ptr void) - -let make_destroy t destructor = - let inner = - foreign - destructor - (t @-> returning void) in - fun t -> - inner t; - t.valid <- false - -let finalize f finalizer = - match f () with - | a -> finalizer (); - a - | exception exn -> finalizer (); - raise exn - -module type S = sig - type t - - val t : t Ctypes.typ - val get_pointer : t -> unit Ctypes.ptr - val type_name : string - - val create : unit -> t - val create_no_gc : unit -> t - val destroy : t -> unit - val with_t : (t -> 'a) -> 'a - - val create_setter : string -> 'a Ctypes.typ -> t -> 'a -> unit -end - -module CreateConstructors(T : RocksType) = struct - - type nonrec t = t - let t = t - - let get_pointer = get_pointer - - let type_name = T.name - - let create_no_gc = - foreign - T.constructor - (void @-> returning t) - - let destroy = make_destroy t T.destructor - - let create () = - let t = create_no_gc () in - Gc.finalise destroy t; - t - - let with_t f = - let t = create_no_gc () in - finalize - (fun () -> f t) - (fun () -> destroy t) - - let create_setter property_name property_typ = - foreign - (T.setter_prefix ^ property_name) - (t @-> property_typ @-> returning void) -end - -module CreateConstructors_(T : RocksType') = struct - include CreateConstructors(struct - let name = T.name - let constructor = "rocksdb_" ^ T.name ^ "_create" - let destructor = "rocksdb_" ^ T.name ^ "_destroy" - let setter_prefix = "rocksdb_" ^ T.name ^ "_" - end) -end diff --git a/src/external/ocaml-rocksdb/rocks_intf.ml b/src/external/ocaml-rocksdb/rocks_intf.ml deleted file mode 100644 index 13d87d2b55a..00000000000 --- a/src/external/ocaml-rocksdb/rocks_intf.ml +++ /dev/null @@ -1,118 +0,0 @@ -open Rocks_options - -type bigarray = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t - -module type ITERATOR = sig - module ReadOptions : module type of ReadOptions - - exception InvalidIterator - - type db - type t - - val get_pointer : t -> unit Ctypes.ptr - - val create : ?opts:ReadOptions.t -> db -> t - val with_t : ?opts:ReadOptions.t -> db -> f:(t -> 'a) -> 'a - - val is_valid : t -> bool - - val seek_to_first : t -> unit - val seek_to_last : t -> unit - - val seek : ?pos:int -> ?len:int -> t -> bigarray -> unit - val seek_string : ?pos:int -> ?len:int -> t -> string -> unit - - val next : t -> unit - val prev : t -> unit - - val get_key_string : t -> string - - (** returned buffer is only valid as long as [t] is not modified *) - val get_key : t -> bigarray - - val get_value_string : t -> string - - (** returned buffer is only valid as long as [t] is not modified *) - val get_value : t -> bigarray - - val get_error : t -> string option -end - -module type TRANSACTION = sig - type t - type db - type iter - module ReadOptions : module type of ReadOptions - module WriteOptions : module type of WriteOptions - module TransactionOptions : module type of TransactionOptions - module Snapshot : module type of Snapshot - - val txnbegin : ?wopts:WriteOptions.t -> - ?txnopts:TransactionOptions.t -> db -> t - val txnbegin_no_gc : ?wopts:WriteOptions.t -> - ?txnopts:TransactionOptions.t -> db -> t - val commit : t -> unit - val rollback : t -> unit - val destroy : t -> unit - val with_t : db -> (t -> unit) -> unit - - val get : ?pos:int -> ?len:int -> ?opts:ReadOptions.t -> t -> bigarray -> bigarray option - val get_string : ?pos:int -> ?len:int -> ?opts:ReadOptions.t -> t -> string -> string option - - val put : ?key_pos:int -> ?key_len:int -> ?value_pos:int -> ?value_len:int -> ?opts:WriteOptions.t -> t -> bigarray -> bigarray -> unit - val put_string : ?key_pos:int -> ?key_len:int -> ?value_pos:int -> ?value_len:int -> ?opts:WriteOptions.t -> t -> string -> string -> unit - - val delete : ?pos:int -> ?len:int -> ?opts:WriteOptions.t -> t -> bigarray -> unit - val delete_string : ?pos:int -> ?len:int -> ?opts:WriteOptions.t -> t -> string -> unit - - val get_snapshot : t -> Snapshot.t - val free_snapshot : Snapshot.t -> unit - - val create_iterator: ?opts:ReadOptions.t -> t -> iter - val with_iterator: ?opts:ReadOptions.t -> t -> f:(iter -> 'a) -> 'a -end - -module type ROCKS = sig - module Options : module type of Options - module ReadOptions : module type of ReadOptions - module WriteOptions : module type of WriteOptions - module FlushOptions : module type of FlushOptions - module Cache : module type of Cache - module BlockBasedTableOptions : module type of BlockBasedTableOptions - module Snapshot : module type of Snapshot - module TransactionDbOptions : module type of TransactionDbOptions - - type t - type batch - - val get_pointer : t -> unit Ctypes.ptr - - val open_db : ?opts:Options.t -> string -> t - val open_db_for_read_only : ?opts:Options.t -> string -> bool -> t - val open_transactiondb : ?opts:Options.t -> ?txnopts:TransactionDbOptions.t -> string -> t - val with_db : ?opts:Options.t -> string -> f:(t -> 'a) -> 'a - val close : t -> unit - - val get : ?pos:int -> ?len:int -> ?opts:ReadOptions.t -> t -> bigarray -> bigarray option - val get_string : ?pos:int -> ?len:int -> ?opts:ReadOptions.t -> t -> string -> string option - - (* there are more efficient encodings of this... *) - val multi_get : ?opts:ReadOptions.t -> t -> bigarray list -> bigarray option list - - val put : ?key_pos:int -> ?key_len:int -> ?value_pos:int -> ?value_len:int -> ?opts:WriteOptions.t -> t -> bigarray -> bigarray -> unit - val put_string : ?key_pos:int -> ?key_len:int -> ?value_pos:int -> ?value_len:int -> ?opts:WriteOptions.t -> t -> string -> string -> unit - - val delete : ?pos:int -> ?len:int -> ?opts:WriteOptions.t -> t -> bigarray -> unit - val delete_string : ?pos:int -> ?len:int -> ?opts:WriteOptions.t -> t -> string -> unit - - val write : ?opts:WriteOptions.t -> t -> batch -> unit - - val flush : ?opts:FlushOptions.t -> t -> unit - - val create_snapshot : t -> Snapshot.t - val release_snapshot : t -> Snapshot.t -> unit - - val checkpoint_create : t -> ?log_size_for_flush:int -> dir:string -> unit -> unit - val property_value : t -> string -> string option -end diff --git a/src/external/ocaml-rocksdb/rocks_linker_flags_gen.ml b/src/external/ocaml-rocksdb/rocks_linker_flags_gen.ml deleted file mode 100644 index 3262bd0b24a..00000000000 --- a/src/external/ocaml-rocksdb/rocks_linker_flags_gen.ml +++ /dev/null @@ -1,25 +0,0 @@ -open Printf -module C = Configurator.V1 - -let () = - let cwd = Unix.getcwd () in - let uname_chan = Unix.open_process_in "uname" in - let l = input_line uname_chan in - C.Flags.write_sexp "flags.sexp" - ( match l with - | "Darwin" -> - [ sprintf "-Wl,-force_load,%s/librocksdb_stubs.a" cwd - ; "-lz" - ; "-lbz2" - ; "-lc++abi" - ; "-lc++" ] - | "Linux" -> - [ sprintf "-L%s" cwd - ; "-Wl,--whole-archive" - ; "-lrocksdb_stubs" - ; "-Wl,--no-whole-archive" - ; "-lz" - ; "-lbz2" - ; "-lstdc++" ] - | s -> - failwith (sprintf "don't know how to link on %s yet" s) ) diff --git a/src/external/ocaml-rocksdb/rocks_options.ml b/src/external/ocaml-rocksdb/rocks_options.ml deleted file mode 100644 index 94ea8fb6a1d..00000000000 --- a/src/external/ocaml-rocksdb/rocks_options.ml +++ /dev/null @@ -1,481 +0,0 @@ -open Ctypes -open Foreign -open Rocks_common - -module Cache = - struct - type nonrec t = t - let t = t - - let get_pointer = get_pointer - - let create_no_gc = - (* extern rocksdb_cache_t* rocksdb_cache_create_lru(size_t capacity); *) - foreign - "rocksdb_cache_create_lru" - (Views.int_to_size_t @-> returning t) - - let destroy = - (* extern void rocksdb_cache_destroy(rocksdb_cache_t* cache); *) - make_destroy t "rocksdb_cache_destroy" - - let create capacity = - let t = create_no_gc capacity in - Gc.finalise destroy t; - t - - let with_t capacity f = - let t = create_no_gc capacity in - finalize - (fun () -> f t) - (fun () -> destroy t) - - let create_setter property_name property_typ = - foreign - ("rocksdb_cache_" ^ property_name) - (t @-> property_typ @-> returning void) - - let set_capacity = create_setter "set_capacity" int - end - -module Snapshot = - struct - type nonrec t = t - let t = t - end - -module BlockBasedTableOptions = - struct - include CreateConstructors(struct - let name = "block_based_table_options" - let constructor = "rocksdb_block_based_options_create" - let destructor = "rocksdb_block_based_options_destroy" - let setter_prefix = "rocksdb_block_based_options_" - end) - - (* extern void rocksdb_block_based_options_set_block_size( *) - (* rocksdb_block_based_table_options_t* options, size_t block_size); *) - let set_block_size = - create_setter "set_block_size" Views.int_to_size_t - - (* extern void rocksdb_block_based_options_set_block_size_deviation( *) - (* rocksdb_block_based_table_options_t* options, int block_size_deviation); *) - let set_block_size_deviation = - create_setter "set_block_size_deviation" int - - (* extern void rocksdb_block_based_options_set_block_restart_interval( *) - (* rocksdb_block_based_table_options_t* options, int block_restart_interval); *) - let set_block_restart_interval = - create_setter "set_block_restart_interval" int - - (* extern void rocksdb_block_based_options_set_filter_policy( *) - (* rocksdb_block_based_table_options_t* options, *) - (* rocksdb_filterpolicy_t* filter_policy); *) - (* let set_filter_policy = *) - (* create_setter "set_filter_policy" TODO *) - - (* extern void rocksdb_block_based_options_set_no_block_cache( *) - (* rocksdb_block_based_table_options_t* options, *) - (* unsigned char no_block_cache); *) - let set_no_block_cache = - create_setter "set_no_block_cache" Views.bool_to_uchar - - (* extern void rocksdb_block_based_options_set_block_cache( *) - (* rocksdb_block_based_table_options_t* options, rocksdb_cache_t* block_cache); *) - let set_block_cache = - create_setter "set_block_cache" Cache.t - - (* extern void rocksdb_block_based_options_set_whole_key_filtering( *) - (* rocksdb_block_based_table_options_t*, unsigned char); *) - let set_whole_key_filtering = - create_setter "set_whole_key_filtering" Views.bool_to_uchar - - (* extern void rocksdb_block_based_options_set_format_version( *) - (* rocksdb_block_based_table_options_t*, int); *) - let set_format_version = - create_setter "set_format_version" int - - module IndexType = - struct - type t = int - let binary_search = 0 - let hash_search = 1 - end - (* enum { *) - (* rocksdb_block_based_table_index_type_binary_search = 0, *) - (* rocksdb_block_based_table_index_type_hash_search = 1, *) - (* }; *) - (* extern void rocksdb_block_based_options_set_index_type( *) - (* rocksdb_block_based_table_options_t*, int); // uses one of the above enums *) - let set_index_type = - create_setter "set_index_type" int - - (* extern void rocksdb_block_based_options_set_cache_index_and_filter_blocks( *) - (* rocksdb_block_based_table_options_t*, unsigned char); *) - let set_cache_index_and_filter_blocks = - create_setter "set_cache_index_and_filter_blocks" Views.bool_to_uchar - end - -module Options = struct - module SliceTransform = struct - type t = Rocks_common.t - - let t = Rocks_common.t - - module Noop = struct - include CreateConstructors(struct - let super_name = "slicetransform" - let name = "noop" - let constructor = "rocksdb_" ^ super_name ^ "_create_" ^ name - let destructor = "rocksdb_" ^ super_name ^ "_destroy" - let setter_prefix = "rocksdb_" ^ super_name ^ "_" ^ name ^ "_" - end) - end - end - - (* extern rocksdb_options_t* rocksdb_options_create(); *) - (* extern void rocksdb_options_destroy(rocksdb_options_t*\); *) - module C = CreateConstructors_(struct let name = "options" end) - include C - - (* extern void rocksdb_options_increase_parallelism( *) - (* rocksdb_options_t* opt, int total_threads); *) - let increase_parallelism = create_setter "increase_parallelism" int - - (* extern void rocksdb_options_optimize_for_point_lookup( *) - (* rocksdb_options_t* opt, uint64_t block_cache_size_mb); *) - let optimize_for_point_lookup = - create_setter "optimize_for_point_lookup" Views.int_to_uint64_t - - (* extern void rocksdb_options_optimize_level_style_compaction( *) - (* rocksdb_options_t* opt, uint64_t memtable_memory_budget); *) - let optimize_level_style_compaction = - create_setter "optimize_level_style_compaction" Views.int_to_uint64_t - - (* extern void rocksdb_options_optimize_universal_style_compaction( *) - (* rocksdb_options_t* opt, uint64_t memtable_memory_budget); *) - let optimize_universal_style_compaction = - create_setter "optimize_universal_style_compaction" Views.int_to_uint64_t - - (* extern void rocksdb_options_set_compaction_filter( *) - (* rocksdb_options_t*, *) - (* rocksdb_compactionfilter_t*\); *) - (* extern void rocksdb_options_set_compaction_filter_factory( *) - (* rocksdb_options_t*, rocksdb_compactionfilterfactory_t*\); *) - (* extern void rocksdb_options_set_compaction_filter_factory_v2( *) - (* rocksdb_options_t*, *) - (* rocksdb_compactionfilterfactoryv2_t*\); *) - (* extern void rocksdb_options_set_comparator( *) - (* rocksdb_options_t*, *) - (* rocksdb_comparator_t*\); *) - (* extern void rocksdb_options_set_merge_operator( *) - (* rocksdb_options_t*, *) - (* rocksdb_mergeoperator_t*\); *) - (* extern void rocksdb_options_set_uint64add_merge_operator(rocksdb_options_t*\); *) - - (* extern void rocksdb_options_set_compression_per_level( *) - (* rocksdb_options_t* opt, *) - (* int* level_values, *) - (* size_t num_levels); *) - - (* extern void rocksdb_options_set_create_if_missing( *) - (* rocksdb_options_t*, unsigned char); *) - let set_create_if_missing = create_setter "set_create_if_missing" Views.bool_to_uchar - - (* extern void rocksdb_options_set_create_missing_column_families( *) - (* rocksdb_options_t*, unsigned char); *) - let set_create_missing_column_families = - create_setter "set_create_missing_column_families" Views.bool_to_uchar - - (* extern void rocksdb_options_set_error_if_exists( *) - (* rocksdb_options_t*, unsigned char); *) - let set_error_if_exists = - create_setter "set_error_if_exists" Views.bool_to_uchar - - (* extern void rocksdb_options_set_paranoid_checks( *) - (* rocksdb_options_t*, unsigned char); *) - let set_paranoid_checks = - create_setter "set_paranoid_checks" Views.bool_to_uchar - - (* extern void rocksdb_options_set_env(rocksdb_options_t*, rocksdb_env_t*\); *) - (* extern void rocksdb_options_set_info_log(rocksdb_options_t*, rocksdb_logger_t*\); *) - (* extern void rocksdb_options_set_info_log_level(rocksdb_options_t*, int); *) - - (* extern void rocksdb_options_set_write_buffer_size(rocksdb_options_t*, size_t); *) - let set_write_buffer_size = - create_setter "set_write_buffer_size" Views.int_to_size_t - - (* extern void rocksdb_options_set_max_open_files(rocksdb_options_t*, int); *) - let set_max_open_files = - create_setter "set_max_open_files" int - - (* extern void rocksdb_options_set_max_total_wal_size(rocksdb_options_t* opt, uint64_t n); *) - let set_max_total_wal_size = - create_setter "set_max_total_wal_size" Views.int_to_uint64_t - - (* extern void rocksdb_options_set_compression_options( *) - (* rocksdb_options_t*, int, int, int); *) - - (* extern void rocksdb_options_set_prefix_extractor(rocksdb_options_t* opt, rocksdb_slicetransform_t* trans); *) - let set_prefix_extractor = - create_setter "set_prefix_extractor" SliceTransform.t - - (* extern void rocksdb_options_set_num_levels(rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_level0_file_num_compaction_trigger( *) - (* rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_level0_slowdown_writes_trigger( *) - (* rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_level0_stop_writes_trigger( *) - (* rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_max_mem_compaction_level( *) - (* rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_target_file_size_base( *) - (* rocksdb_options_t*, uint64_t); *) - (* extern void rocksdb_options_set_target_file_size_multiplier( *) - (* rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_max_bytes_for_level_base( *) - (* rocksdb_options_t*, uint64_t); *) - (* extern void rocksdb_options_set_max_bytes_for_level_multiplier( *) - (* rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_expanded_compaction_factor( *) - (* rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_max_grandparent_overlap_factor( *) - (* rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_max_bytes_for_level_multiplier_additional( *) - (* rocksdb_options_t*, int* level_values, size_t num_levels); *) - (* extern void rocksdb_options_enable_statistics(rocksdb_options_t*\); *) - - (* /* returns a pointer to a malloc()-ed, null terminated string */ *) - (* extern char *rocksdb_options_statistics_get_string(rocksdb_options_t *opt); *) - - (* extern void rocksdb_options_set_max_write_buffer_number(rocksdb_options_t*, int); *) - let set_max_write_buffer_number = - create_setter "set_max_write_buffer_number" int - - (* extern void rocksdb_options_set_min_write_buffer_number_to_merge(rocksdb_options_t*, int); *) - let set_min_write_buffer_number_to_merge = - create_setter "set_min_write_buffer_number_to_merge" int - - (* extern void rocksdb_options_set_max_write_buffer_number_to_maintain( *) - (* rocksdb_options_t*, int); *) - let set_max_write_buffer_number_to_maintain = - create_setter "set_max_write_buffer_number_to_maintain" int - - (* extern void rocksdb_options_set_max_background_compactions(rocksdb_options_t*, int); *) - let set_max_background_compactions = - create_setter "set_max_background_compactions" int - - (* extern void rocksdb_options_set_max_background_flushes(rocksdb_options_t*, int); *) - let set_max_background_flushes = - create_setter "set_max_background_flushes" int - - (* extern void rocksdb_options_set_max_log_file_size(rocksdb_options_t*, size_t); *) - let set_max_log_file_size = - create_setter "set_max_log_file_size" Views.int_to_size_t - - (* extern void rocksdb_options_set_log_file_time_to_roll(rocksdb_options_t*, size_t); *) - let set_log_file_time_to_roll = - create_setter "set_log_file_time_to_roll" Views.int_to_size_t - - (* extern void rocksdb_options_set_keep_log_file_num(rocksdb_options_t*, size_t); *) - let set_keep_log_file_num = - create_setter "set_keep_log_file_num" Views.int_to_size_t - - (* extern ROCKSDB_LIBRARY_API void rocksdb_options_set_recycle_log_file_num( *) - (* rocksdb_options_t*, size_t); *) - let set_recycle_log_file_num = - create_setter "set_recycle_log_file_num" Views.int_to_size_t - - (* extern void rocksdb_options_set_max_manifest_file_size( *) - (* rocksdb_options_t*, size_t); *) - let set_max_manifest_file_size = - create_setter "set_max_manifest_file_size" Views.int_to_size_t - - (* extern void rocksdb_options_set_table_cache_numshardbits( *) - (* rocksdb_options_t*, int); *) - let set_table_cache_numshardbits = - create_setter "set_table_cache_numshardbits" int - - (* extern void rocksdb_options_set_arena_block_size( *) - (* rocksdb_options_t*, size_t); *) - let set_arena_block_size = - create_setter "set_arena_block_size" Views.int_to_size_t - - (* extern void rocksdb_options_set_use_fsync( *) - (* rocksdb_options_t*, int); *) - let set_use_fsync = - create_setter "set_use_fsync" Views.bool_to_int - - (* extern void rocksdb_options_set_db_log_dir( *) - (* rocksdb_options_t*, const char*\); *) - (* extern void rocksdb_options_set_wal_dir( *) - (* rocksdb_options_t*, const char*\); *) - - (* extern void rocksdb_options_set_WAL_ttl_seconds( *) - (* rocksdb_options_t*, uint64_t); *) - let set_WAL_ttl_seconds = - create_setter "set_WAL_ttl_seconds" Views.int_to_uint64_t - - (* extern void rocksdb_options_set_WAL_size_limit_MB( *) - (* rocksdb_options_t*, uint64_t); *) - let set_WAL_size_limit_MB = - create_setter "set_WAL_size_limit_MB" Views.int_to_uint64_t - - (* extern void rocksdb_options_set_manifest_preallocation_size( *) - (* rocksdb_options_t*, size_t); *) - let set_manifest_preallocation_size = - create_setter "set_manifest_preallocation_size" Views.int_to_size_t - - (* extern void rocksdb_options_set_use_direct_reads( *) - (* rocksdb_options_t*, unsigned char); *) - let set_use_direct_reads = - create_setter "set_use_direct_reads" Views.bool_to_uchar - - (* extern void rocksdb_options_set_allow_mmap_reads( *) - (* rocksdb_options_t*, unsigned char); *) - let set_allow_mmap_reads = - create_setter "set_allow_mmap_reads" Views.bool_to_uchar - - (* extern void rocksdb_options_set_allow_mmap_writes( *) - (* rocksdb_options_t*, unsigned char); *) - let set_allow_mmap_writes = - create_setter "set_allow_mmap_writes" Views.bool_to_uchar - - (* extern void rocksdb_options_set_is_fd_close_on_exec( *) - (* rocksdb_options_t*, unsigned char); *) - let set_is_fd_close_on_exec = - create_setter "set_is_fd_close_on_exec" Views.bool_to_uchar - - (* extern void rocksdb_options_set_stats_dump_period_sec( *) - (* rocksdb_options_t*, unsigned int); *) - let set_stats_dump_period_sec = - create_setter "set_stats_dump_period_sec" Views.int_to_uint_t - - (* extern void rocksdb_options_set_advise_random_on_open( *) - (* rocksdb_options_t*, unsigned char); *) - let set_advise_random_on_open = - create_setter "set_advise_random_on_open" Views.bool_to_uchar - - (* extern void rocksdb_options_set_access_hint_on_compaction_start( *) - (* rocksdb_options_t*, int); *) - let set_access_hint_on_compaction_start = - create_setter "set_access_hint_on_compaction_start" int - - (* extern void rocksdb_options_set_use_adaptive_mutex( *) - (* rocksdb_options_t*, unsigned char); *) - let set_use_adaptive_mutex = - create_setter "set_use_adaptive_mutex" Views.bool_to_uchar - - (* extern void rocksdb_options_set_bytes_per_sync( *) - (* rocksdb_options_t*, uint64_t); *) - let set_bytes_per_sync = - create_setter "set_bytes_per_sync" Views.int_to_uint64_t - - (* extern void rocksdb_options_set_max_sequential_skip_in_iterations( *) - (* rocksdb_options_t*, uint64_t); *) - let set_max_sequential_skip_in_iterations = - create_setter "set_max_sequential_skip_in_iterations" Views.int_to_uint64_t - - (* extern void rocksdb_options_set_disable_auto_compactions(rocksdb_options_t*, int); *) - let set_disable_auto_compactions = - create_setter "set_disable_auto_compactions" int - - (* extern void rocksdb_options_set_delete_obsolete_files_period_micros( *) - (* rocksdb_options_t*, uint64_t); *) - let set_delete_obsolete_files_period_micros = - create_setter "set_delete_obsolete_files_period_micros" Views.int_to_uint64_t - - (* extern void rocksdb_options_set_max_compaction_bytes( - rocksdb_options_t*, uint64_t); *) - let set_max_compaction_bytes = - create_setter "set_max_compaction_bytes" int - - (* extern void rocksdb_options_prepare_for_bulk_load(rocksdb_options_t*\); *) - (* extern void rocksdb_options_set_memtable_vector_rep(rocksdb_options_t*\); *) - (* extern void rocksdb_options_set_hash_skip_list_rep(rocksdb_options_t*, size_t, int32_t, int32_t); *) - (* extern void rocksdb_options_set_hash_link_list_rep(rocksdb_options_t*, size_t); *) - (* extern void rocksdb_options_set_plain_table_factory(rocksdb_options_t*, uint32_t, int, double, size_t); *) - - (* extern void rocksdb_options_set_min_level_to_compress(rocksdb_options_t* opt, int level); *) - let set_min_level_to_compress = - create_setter "set_min_level_to_compress" int - - (* extern void rocksdb_options_set_max_successive_merges( *) - (* rocksdb_options_t*, size_t); *) - let set_max_successive_merges = - create_setter "set_max_successive_merges" Views.int_to_size_t - - (* extern void rocksdb_options_set_bloom_locality( *) - (* rocksdb_options_t*, uint32_t); *) - let set_bloom_locality = - create_setter "set_bloom_locality" Views.int_to_uint32_t - - (* extern void rocksdb_options_set_inplace_update_support( *) - (* rocksdb_options_t*, unsigned char); *) - let set_inplace_update_support = - create_setter "set_inplace_update_support" Views.bool_to_uchar - - (* extern void rocksdb_options_set_inplace_update_num_locks( *) - (* rocksdb_options_t*, size_t); *) - let set_inplace_update_num_locks = - create_setter "set_inplace_update_num_locks" Views.int_to_size_t - - (* enum { *) - (* rocksdb_no_compression = 0, *) - (* rocksdb_snappy_compression = 1, *) - (* rocksdb_zlib_compression = 2, *) - (* rocksdb_bz2_compression = 3, *) - (* rocksdb_lz4_compression = 4, *) - (* rocksdb_lz4hc_compression = 5 *) - (* }; *) - (* extern void rocksdb_options_set_compression(rocksdb_options_t*, int); *) - - (* enum { *) - (* rocksdb_level_compaction = 0, *) - (* rocksdb_universal_compaction = 1, *) - (* rocksdb_fifo_compaction = 2 *) - (* }; *) - (* extern void rocksdb_options_set_compaction_style(rocksdb_options_t*, int); *) - (* extern void rocksdb_options_set_universal_compaction_options(rocksdb_options_t*, rocksdb_universal_compaction_options_t*\); *) - (* extern void rocksdb_options_set_fifo_compaction_options(rocksdb_options_t* opt, *) - (* rocksdb_fifo_compaction_options_t* fifo); *) - - (* extern void rocksdb_options_set_block_based_table_factory( *) - (* rocksdb_options_t *opt, rocksdb_block_based_table_options_t* table_options); *) - let set_block_based_table_factory = - create_setter "set_block_based_table_factory" BlockBasedTableOptions.t -end - -module WriteOptions = struct - module C = CreateConstructors_(struct let name = "writeoptions" end) - include C - - let set_disable_WAL = create_setter "disable_WAL" Views.bool_to_int - let set_sync = create_setter "set_sync" Views.bool_to_uchar -end - -module ReadOptions = struct - module C = CreateConstructors_(struct let name = "readoptions" end) - include C - - let set_snapshot = create_setter "set_snapshot" Snapshot.t -end - -module FlushOptions = struct - module C = CreateConstructors_(struct let name = "flushoptions" end) - include C - - let set_wait = create_setter "set_wait" Views.bool_to_uchar -end - -module TransactionOptions = struct - module C = CreateConstructors_(struct let name = "transaction_options" end) - include C - - let set_set_snapshot = create_setter "set_set_snapshot" Views.bool_to_uchar -end - -module TransactionDbOptions = struct - module C = CreateConstructors_(struct let name = "transactiondb_options" end) - include C -end diff --git a/src/external/ocaml-rocksdb/rocks_test.ml b/src/external/ocaml-rocksdb/rocks_test.ml deleted file mode 100644 index 35e7583137b..00000000000 --- a/src/external/ocaml-rocksdb/rocks_test.ml +++ /dev/null @@ -1,37 +0,0 @@ -open Rocks - -let main () = - let () = - let open Version in - Printf.printf "version (%i,%i,%i,%S)\n%!" major minor patch git_revision - in - let open_opts = Options.create () in - Options.set_create_if_missing open_opts true; - - let db = open_db ~opts:open_opts "aname" in - - let () = - try let _ = open_db ~opts:open_opts "/dev/jvioxidsod" in - () - with _ -> () - in - - let write_opts = WriteOptions.create () in - put_string ~opts:write_opts db "mykey" "avalue"; - let read_opts = ReadOptions.create () in - let read key = get_string ~opts:read_opts db key in - let print_string_option x = - print_endline - (match x with - | Some v -> "Some(" ^ v ^ ")" - | None -> "None") in - print_string_option (read "mykey"); - print_string_option (read "mykey2"); - close db - -let () = - try main (); - Gc.full_major () - with exn -> - Gc.full_major (); - raise exn diff --git a/src/external/ocaml-rocksdb/travis.sh b/src/external/ocaml-rocksdb/travis.sh deleted file mode 100755 index b0d52c04d3c..00000000000 --- a/src/external/ocaml-rocksdb/travis.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash -xue - -APT_DEPENDS="g++ build-essential" -APT_OCAML_DEPENDS="ocaml ocaml-native-compilers camlp4-extra opam" -OPAM_DEPENDS="ocamlfind ctypes.0.9.2 ctypes-foreign.0.4.0" - -export OPAMYES=1 -export OPAMVERBOSE=1 -export OPAMCOLOR=never - -before_install () { - echo "Running 'before_install' phase" - - echo "Adding PPA" - sudo add-apt-repository --yes ppa:avsm/ocaml42+opam12 - - echo "Updating Apt cache" - sudo apt-get update -qq - - echo "Installing general dependencies" - sudo apt-get install -qq ${APT_DEPENDS} - echo "Installing dependencies" - sudo apt-get install -qq ${APT_OCAML_DEPENDS} - - echo "OCaml versions:" - ocaml -version - ocamlopt -version - - echo "Opam versions:" - opam --version - opam --git-version -} - -install () { - echo "Running 'install' phase" - - opam init - eval `opam config env` - opam update - - opam install ${OPAM_DEPENDS} - - CXX=$(./which_g++.sh ) ./install_rocksdb.sh - - make build test -} - -script () { - echo "Running 'script' phase" - - ./rocks_test.native -} - -case "$1" in - before_install) - before_install - ;; - install) - install - ;; - script) - script - ;; - *) - echo "Usage: $0 {before_install|install|script}" - exit 1 -esac diff --git a/src/external/ocaml-rocksdb/which_g++.sh b/src/external/ocaml-rocksdb/which_g++.sh deleted file mode 100755 index 3cb0e846794..00000000000 --- a/src/external/ocaml-rocksdb/which_g++.sh +++ /dev/null @@ -1,8 +0,0 @@ -for version in 5.2 4.9 4.8; -do - g++-$version --version > /dev/null 2> /dev/null - if [[ $? -eq 0 ]]; - then echo g++-$version ; exit 0 - fi - -done diff --git a/src/external/ocaml-sodium/.gitignore b/src/external/ocaml-sodium/.gitignore deleted file mode 100644 index 473fe21ac4c..00000000000 --- a/src/external/ocaml-sodium/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -_build/ -*.native -*.byte -setup.log -setup.data diff --git a/src/external/ocaml-sodium/.travis.yml b/src/external/ocaml-sodium/.travis.yml deleted file mode 100644 index 41010e72c6c..00000000000 --- a/src/external/ocaml-sodium/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: c -install: wget https://raw.githubusercontent.com/ocaml/ocaml-travisci-skeleton/master/.travis-opam.sh -script: bash -ex .travis-opam.sh -env: - - PACKAGE="sodium" OCAML_VERSION=latest - - PACKAGE="sodium" OCAML_VERSION=4.02 - - PACKAGE="sodium" OCAML_VERSION=4.01 diff --git a/src/external/ocaml-sodium/CHANGES b/src/external/ocaml-sodium/CHANGES deleted file mode 100644 index 1a811db1c3a..00000000000 --- a/src/external/ocaml-sodium/CHANGES +++ /dev/null @@ -1,40 +0,0 @@ -0.6.0 (2017-04-12): -* Now requires libsodium 1.0.9+ -* Now requires ctypes 0.6.0 -* New `Password_hash` module -* New `derive_key` function in `Secret_box`, `Stream`, `Auth`, `Generichash` -* New `Sodium.initialized` value -* Install sodium.cmx - -0.5.0 (2015-07-06): -* Add crypto_generichash binding with streaming support - -0.4.1 (2015-04-01): -* Fix minor Makefile issue - -0.4.0 (2015-03-31): -* Now requires libsodium 0.7.0+, latest libsodium is 1.0.1 -* Now requires ctypes 0.4.0 -* New ed25519 key to curve25519 key convertors `Sign.box_public_key`, - `Sign.box_secret_key`, and `Sign.box_keypair`. -* New `Sign` type `seed` with size constant `Sign.seed_size` -* New seeded signing keypair generator `Sign.seed_keypair` -* New signing key projection `Sign.secret_key_to_seed` -* New signing key projection `Sign.secret_key_to_public_key` - -0.3.0 (2014-11-20): -* Now requires libsodium 0.6.1+, latest libsodium is 1.0.0 -* Dynamic binding replaced with faster and safer cstubs generation (#8) -* crypto_sign_detached functions are now bound (#9) -* FreeBSD support -* Debian, Ubuntu, OS X, and FreeBSD opam depexts - -0.2.1 (2014-08-18): -* Uses safe_string and ctypes' bytes rather than string interfaces - -0.2.0 (2014-06-09): -* Complete bindings thanks to major contributions by whitequark (Peter Zotov) -* Many breaking changes with lots of interface improvements - -0.1.0 (2013-08-11): -* Initial public release. diff --git a/src/external/ocaml-sodium/Makefile b/src/external/ocaml-sodium/Makefile deleted file mode 100644 index 31299134c8e..00000000000 --- a/src/external/ocaml-sodium/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) -CURRENT_DIR := $(dir $(MAKEFILE_PATH)) - -OCAML_LIB_DIR=$(shell ocamlc -where) -include $(OCAML_LIB_DIR)/Makefile.config - -CTYPES_LIB_DIR=$(shell ocamlfind query ctypes) - -ENV=CTYPES_LIB_DIR=$(CTYPES_LIB_DIR) OCAML_LIB_DIR=$(OCAML_LIB_DIR) -OCAMLBUILD=$(ENV) ocamlbuild -use-ocamlfind -classic-display - -all: - $(OCAMLBUILD) lib/sodium.cma lib/sodium.cmxa - -clean: - $(OCAMLBUILD) -clean - -test: _build/lib_test/nacl_runner - CAML_LD_LIBRARY_PATH=$(CURRENT_DIR)_build/lib:$(CAML_LD_LIBRARY_PATH) \ - $(OCAMLBUILD) lib_test/test_sodium.byte -- - $(OCAMLBUILD) lib_test/test_sodium.native -- - -install: - ocamlfind install sodium lib/META \ - $(addprefix _build/lib/,sodium.mli sodium.cmi sodium.cmti \ - sodium.cma sodium.cmx sodium.cmxa \ - sodium$(EXT_LIB) \ - libsodium_stubs$(EXT_LIB)) - -uninstall: - ocamlfind remove sodium - -reinstall: uninstall install - -.PHONY: all clean test install uninstall reinstall - -_build/%: %.c - mkdir -p $$(dirname $@) - $(CC) -Wall -g $(CFLAGS) -lsodium -o $@ $^ diff --git a/src/external/ocaml-sodium/README.md b/src/external/ocaml-sodium/README.md deleted file mode 100644 index 3fc2c1b1a99..00000000000 --- a/src/external/ocaml-sodium/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# ocaml-sodium - -[Ctypes](https://github.com/ocamllabs/ocaml-ctypes) bindings to -[libsodium 1.0.9+](https://github.com/jedisct1/libsodium) which wraps -[NaCl](http://nacl.cr.yp.to/). GNU/Linux, FreeBSD, and OS X operating -systems are supported. OCaml 4.01.0 or later is required to build. - -All original NaCl primitives are wrapped. `crypto_shorthash` is missing. - -``` ocaml -open Sodium -let nonce = Box.random_nonce () in -let (sk, pk ) = Box.random_keypair () in -let (sk',pk') = Box.random_keypair () in -let c = Box.Bytes.box sk pk' "Hello, Spooky World!" nonce in -let m = Box.Bytes.box_open sk' pk c nonce in -print_endline (String.escaped c); -print_endline m -``` - -## Considerations - -Originally described in [*The Security Impact of a New Cryptographic -Library*](http://cryptojedi.org/papers/coolnacl-20111201.pdf), NaCl is a -high-level, performant cryptography library exposing a straightforward -interface. - -**This binding has not been thoroughly and independently audited so your -use case must be able to tolerate this uncertainty.** - -Despite ocaml-sodium's thin interface on top of *libsodium*, it is still -important to be mindful of security invariants. In particular, you -should ensure that nonces used for cryptographic operations are -**never** repeated with the same key set. - -## Tests - -Internal consistency tests may be found in `lib_test`. - -### Salt - -*Salt is very important for the camel. It needs eight times as much salt -as do cattle and sheep. A camel needs 1 kg of salt a week and it is -advisable to leave salt with camels every week.* - --- [UN FAO Manual for Primary Animal Health Care Workers](http://www.fao.org/docrep/t0690e/t0690e09.htm#unit%2061:%20feeding%20and%20watering%20of%20camels) diff --git a/src/external/ocaml-sodium/_tags b/src/external/ocaml-sodium/_tags deleted file mode 100644 index 8d7004a9093..00000000000 --- a/src/external/ocaml-sodium/_tags +++ /dev/null @@ -1,3 +0,0 @@ -true: warn(@5@8@10@11@12@14@23@24@26@29), bin_annot, safe_string - -"lib": include diff --git a/src/external/ocaml-sodium/lib/META b/src/external/ocaml-sodium/lib/META deleted file mode 100644 index 1e911d769f1..00000000000 --- a/src/external/ocaml-sodium/lib/META +++ /dev/null @@ -1,6 +0,0 @@ -version = "0.6.0" -description = "Binding to libsodium, a shared library wrapper for djb's NaCl" -requires = "bigarray bytes ctypes.stubs" -archive(byte) = "sodium.cma" -archive(native) = "sodium.cmxa" -exists_if = "sodium.cma" diff --git a/src/external/ocaml-sodium/lib/_tags b/src/external/ocaml-sodium/lib/_tags deleted file mode 100644 index 8ddabefd951..00000000000 --- a/src/external/ocaml-sodium/lib/_tags +++ /dev/null @@ -1,4 +0,0 @@ -<*.{ml,mli}>: package(bytes), package(bigarray), package(ctypes.stubs) -<*.{cma,cmxa}>: use_sodium_stubs -: use_sodium -<*.c>: use_ctypes, use_sodium diff --git a/src/external/ocaml-sodium/lib/libsodium_stubs.clib b/src/external/ocaml-sodium/lib/libsodium_stubs.clib deleted file mode 100644 index 81b7b214cb9..00000000000 --- a/src/external/ocaml-sodium/lib/libsodium_stubs.clib +++ /dev/null @@ -1 +0,0 @@ -sodium_stubs.o diff --git a/src/external/ocaml-sodium/lib/sodium.ml b/src/external/ocaml-sodium/lib/sodium.ml deleted file mode 100644 index 6b3a03e1df3..00000000000 --- a/src/external/ocaml-sodium/lib/sodium.ml +++ /dev/null @@ -1,1075 +0,0 @@ -(* - * Copyright (c) 2013-2015 David Sheets - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open Ctypes -open Unsigned -module Static = Ctypes_static - -exception Verification_failure -exception Size_mismatch of string -exception Already_finalized of string - -type public -type secret -type channel - -module Storage = Sodium_storage -type bigbytes = Storage.bigbytes - -module C = Sodium_bindings.C(Sodium_generated) -module Type = Sodium_types.C(Sodium_types_detected) -module Sodium_bytes = C.Make(Storage.Bytes) - -let wipe str = - Sodium_bytes.memzero - (Storage.Bytes.to_ptr str) (Storage.Bytes.len_size_t str) - -let memcpy ~dest ~src typ = - let size = sizeof typ in - let cast p = from_voidp (array size uchar) (to_voidp p) in - cast dest <-@ !@(cast src) - -let increment_be_bytes ?(step=1) b = - let b = Bytes.copy b in - let rec incr_byte step byteno = - let res = Char.code (Bytes.get b byteno) + step in - let lo, hi = res land 0xff, res asr 8 in - Bytes.set b byteno (Char.chr lo); - if hi = 0 || byteno = 0 then () - else incr_byte hi (byteno - 1) - in - incr_byte step ((Bytes.length b) - 1); - b - -module Verify = struct - module C = C.Verify - - let equal_fn size = - match size with - | 16 -> fun a b -> (C.verify_16 (Storage.Bytes.to_ptr a) - (Storage.Bytes.to_ptr b)) = 0 - | 32 -> fun a b -> (C.verify_32 (Storage.Bytes.to_ptr a) - (Storage.Bytes.to_ptr b)) = 0 - | 64 -> fun a b -> (C.verify_64 (Storage.Bytes.to_ptr a) - (Storage.Bytes.to_ptr b)) = 0 - | _ -> assert false -end - -module Random = struct - module C = C.Random - - let stir = C.stir - - module type S = sig - type storage - val generate_into : storage -> unit - val generate : int -> storage - end - - module Make(T: Storage.S) = struct - module C = C.Make(T) - type storage = T.t - - let generate_into str = - C.gen (T.to_ptr str) (T.len_size_t str) - - let generate size = - let str = T.create size in - generate_into str; - str - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -module Box = struct - module C = C.Box - let primitive = C.primitive - - let public_key_size = Size_t.to_int (C.publickeybytes ()) - let secret_key_size = Size_t.to_int (C.secretkeybytes ()) - let channel_key_size = Size_t.to_int (C.beforenmbytes ()) - let nonce_size = Size_t.to_int (C.noncebytes ()) - let zero_size = Size_t.to_int (C.zerobytes ()) - let box_zero_size = Size_t.to_int (C.boxzerobytes ()) - - (* Invariant: a key is {public,secret,channel}_key_size bytes long. *) - type 'a key = Bytes.t - type secret_key = secret key - type public_key = public key - type channel_key = channel key - type keypair = secret key * public key - - (* Invariant: a nonce is nonce_size bytes long. *) - type nonce = Bytes.t - - let random_keypair () = - let pk, sk = Storage.Bytes.create public_key_size, - Storage.Bytes.create secret_key_size in - let ret = - C.box_keypair (Storage.Bytes.to_ptr pk) (Storage.Bytes.to_ptr sk) in - assert (ret = 0); (* always returns 0 *) - sk, pk - - let random_nonce () = - Random.Bytes.generate nonce_size - - let wipe_key = wipe - - let equal_public_keys = Verify.equal_fn public_key_size - let equal_secret_keys = Verify.equal_fn secret_key_size - let equal_channel_keys = Verify.equal_fn channel_key_size - let compare_public_keys = Bytes.compare - - let nonce_of_bytes b = - if Bytes.length b <> nonce_size then - raise (Size_mismatch "Box.nonce_of_bytes"); - b - - let increment_nonce = increment_be_bytes - - let precompute skey pkey = - let params = Storage.Bytes.create channel_key_size in - let ret = C.box_beforenm (Storage.Bytes.to_ptr params) - (Storage.Bytes.to_ptr pkey) - (Storage.Bytes.to_ptr skey) in - assert (ret = 0); (* always returns 0 *) - params - - module type S = sig - type storage - - val of_public_key : public key -> storage - val to_public_key : storage -> public key - - val of_secret_key : secret key -> storage - val to_secret_key : storage -> secret key - - val of_channel_key : channel key -> storage - val to_channel_key : storage -> channel key - - val of_nonce : nonce -> storage - val to_nonce : storage -> nonce - - val box : secret key -> public key -> storage -> nonce -> storage - val box_open : secret key -> public key -> storage -> nonce -> storage - - val fast_box : channel key -> storage -> nonce -> storage - val fast_box_open : channel key -> storage -> nonce -> storage - end - - module Make(T: Storage.S) = struct - module C = C.Make(T) - type storage = T.t - - let verify_length str len fn_name = - if T.length str <> len then raise (Size_mismatch fn_name) - - let of_public_key key = - T.of_bytes key - - let to_public_key str = - verify_length str public_key_size "Box.to_public_key"; - T.to_bytes str - - let of_secret_key key = - T.of_bytes key - - let to_secret_key str = - verify_length str secret_key_size "Box.to_secret_key"; - T.to_bytes str - - let of_channel_key key = - T.of_bytes key - - let to_channel_key str = - verify_length str channel_key_size "Box.to_channel_key"; - T.to_bytes str - - let of_nonce nonce = - T.of_bytes nonce - - let to_nonce str = - verify_length str nonce_size "Box.to_nonce"; - T.to_bytes str - - let pad a apad bpad f = - let a' = T.create (apad + T.length a) in - let b' = T.create (T.length a') in - T.zero a' 0 apad; - T.blit a 0 a' apad (T.length a); - f a' b'; - T.sub b' bpad ((T.length b') - bpad) - - let box skey pkey message nonce = - pad message zero_size box_zero_size (fun cleartext ciphertext -> - let ret = C.box (T.to_ptr ciphertext) (T.to_ptr cleartext) - (T.len_ullong cleartext) - (Storage.Bytes.to_ptr nonce) - (Storage.Bytes.to_ptr pkey) - (Storage.Bytes.to_ptr skey) in - assert (ret = 0) (* always returns 0 *)) - - let box_open skey pkey ciphertext nonce = - pad ciphertext box_zero_size zero_size (fun ciphertext cleartext -> - let ret = C.box_open (T.to_ptr cleartext) (T.to_ptr ciphertext) - (T.len_ullong ciphertext) - (Storage.Bytes.to_ptr nonce) - (Storage.Bytes.to_ptr pkey) - (Storage.Bytes.to_ptr skey) in - if ret <> 0 then raise Verification_failure) - - let fast_box params message nonce = - pad message zero_size box_zero_size (fun cleartext ciphertext -> - let ret = C.box_afternm (T.to_ptr ciphertext) (T.to_ptr cleartext) - (T.len_ullong cleartext) - (Storage.Bytes.to_ptr nonce) - (Storage.Bytes.to_ptr params) in - assert (ret = 0) (* always returns 0 *)) - - let fast_box_open params ciphertext nonce = - pad ciphertext box_zero_size zero_size (fun ciphertext cleartext -> - let ret = C.box_open_afternm (T.to_ptr cleartext) (T.to_ptr ciphertext) - (T.len_ullong ciphertext) - (Storage.Bytes.to_ptr nonce) - (Storage.Bytes.to_ptr params) in - if ret <> 0 then raise Verification_failure) - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -module Sign = struct - module C = C.Sign - let primitive = C.primitive - - let public_key_size = Size_t.to_int (C.publickeybytes ()) - let secret_key_size = Size_t.to_int (C.secretkeybytes ()) - let reserved_size = Size_t.to_int (C.bytes ()) - let signature_size = Size_t.to_int (C.bytes ()) - let seed_size = Size_t.to_int (C.seedbytes ()) - - (* Invariant: a key is {public,secret}_key_size bytes long. *) - type 'a key = Bytes.t - type secret_key = secret key - type public_key = public key - type keypair = secret key * public key - - (* Invariant: a signature is signature_size bytes long. *) - type signature = Bytes.t - - (* Invariant: a seed is seed_size bytes long. *) - type seed = Bytes.t - - let random_keypair () = - let pk, sk = Storage.Bytes.create public_key_size, - Storage.Bytes.create secret_key_size in - let ret = - C.sign_keypair (Storage.Bytes.to_ptr pk) (Storage.Bytes.to_ptr sk) in - assert (ret = 0); (* always returns 0 *) - sk, pk - - let seed_keypair seed = - let pk, sk = Storage.Bytes.create public_key_size, - Storage.Bytes.create secret_key_size in - let ret = - C.sign_seed_keypair (Storage.Bytes.to_ptr pk) (Storage.Bytes.to_ptr sk) - (Storage.Bytes.to_ptr seed) in - assert (ret = 0); - sk, pk - - let secret_key_to_seed sk = - let seed = Storage.Bytes.create seed_size in - let ret = - C.sign_sk_to_seed (Storage.Bytes.to_ptr seed) (Storage.Bytes.to_ptr sk) in - assert (ret = 0); - seed - - let secret_key_to_public_key sk = - let pk = Storage.Bytes.create public_key_size in - let ret = - C.sign_sk_to_pk (Storage.Bytes.to_ptr pk) (Storage.Bytes.to_ptr sk) in - assert (ret = 0); - pk - - let wipe_key = wipe - - let equal_public_keys = Verify.equal_fn public_key_size - let equal_secret_keys = Verify.equal_fn secret_key_size - let compare_public_keys = Bytes.compare - - let box_public_key pk = - let pk' = Bytes.create Box.public_key_size in - let ret = C.sign_pk_to_curve25519 - (Storage.Bytes.to_ptr pk') (Storage.Bytes.to_ptr pk) in - assert (ret = 0); - pk' - - let box_secret_key sk = - let sk' = Bytes.create Box.secret_key_size in - let ret = C.sign_sk_to_curve25519 - (Storage.Bytes.to_ptr sk') (Storage.Bytes.to_ptr sk) in - assert (ret = 0); - sk' - - let box_keypair (sk, pk) = (box_secret_key sk, box_public_key pk) - - module type S = sig - type storage - - val of_public_key : public key -> storage - val to_public_key : storage -> public key - - val of_secret_key : secret key -> storage - val to_secret_key : storage -> secret key - - val of_signature : signature -> storage - val to_signature : storage -> signature - - val of_seed : seed -> storage - val to_seed : storage -> seed - - val sign : secret key -> storage -> storage - val sign_open : public key -> storage -> storage - - val sign_detached : secret key -> storage -> signature - val verify : public key -> signature -> storage -> unit - end - - module Make(T: Storage.S) = struct - module C = C.Make(T) - type storage = T.t - - let verify_length str len fn_name = - if T.length str <> len then raise (Size_mismatch fn_name) - - let of_public_key key = - T.of_bytes key - - let to_public_key str = - verify_length str public_key_size "Sign.to_public_key"; - T.to_bytes str - - let of_secret_key key = - T.of_bytes key - - let to_secret_key str = - verify_length str secret_key_size "Sign.to_secret_key"; - T.to_bytes str - - let of_signature sign = - T.of_bytes sign - - let to_signature str = - verify_length str signature_size "Sign.to_signature"; - T.to_bytes str - - let of_seed seed = - T.of_bytes seed - - let to_seed str = - verify_length str seed_size "Sign.to_seed"; - T.to_bytes str - - let sign skey message = - let signed_msg = T.create ((T.length message) + reserved_size) in - let signed_len = allocate ullong (Unsigned.ULLong.of_int 0) in - let ret = C.sign (T.to_ptr signed_msg) signed_len - (T.to_ptr message) (T.len_ullong message) - (Storage.Bytes.to_ptr skey) in - assert (ret = 0); (* always returns 0 *) - T.sub signed_msg 0 (Unsigned.ULLong.to_int (!@ signed_len)) - - let sign_open pkey signed_msg = - let message = T.create (T.length signed_msg) in - let msg_len = allocate ullong (Unsigned.ULLong.of_int 0) in - let ret = C.sign_open (T.to_ptr message) msg_len - (T.to_ptr signed_msg) (T.len_ullong signed_msg) - (Storage.Bytes.to_ptr pkey) in - if ret <> 0 then raise Verification_failure; - T.sub message 0 (Unsigned.ULLong.to_int (!@ msg_len)) - - let sign_detached skey message = - let signature = T.create signature_size in - let ret = C.sign_detached (T.to_ptr signature) None - (T.to_ptr message) (T.len_ullong message) - (Storage.Bytes.to_ptr skey) in - assert (ret = 0); (* always returns 0 *) - T.to_bytes signature - - let verify pkey (signature:signature) message = - let ret = C.sign_verify (Storage.Bytes.to_ptr signature) (T.to_ptr message) - (T.len_ullong message) (Storage.Bytes.to_ptr pkey) in - if ret <> 0 then raise Verification_failure - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -module Scalar_mult = struct - module C = C.Scalar_mult - let primitive = C.primitive - - let group_elt_size = Size_t.to_int (C.bytes ()) - let integer_size = Size_t.to_int (C.scalarbytes ()) - - (* Invariant: a group element is group_elt_size bytes long. *) - type group_elt = Bytes.t - - (* Invariant: an integer is integer_size bytes long. *) - type integer = Bytes.t - - let equal_group_elt = Verify.equal_fn group_elt_size - let equal_integer = Verify.equal_fn integer_size - - let mult scalar elem = - let elem' = Storage.Bytes.create group_elt_size in - let ret = Storage.Bytes.(C.scalarmult (to_ptr elem') (to_ptr scalar) - (to_ptr elem)) in - assert (ret = 0); (* always returns 0 *) - elem' - - let base scalar = - let elem = Storage.Bytes.create group_elt_size in - let ret = Storage.Bytes.(C.scalarmult_base (to_ptr elem) (to_ptr scalar)) in - assert (ret = 0); (* always returns 0 *) - elem - - module type S = sig - type storage - - val of_group_elt : group_elt -> storage - val to_group_elt : storage -> group_elt - - val of_integer : integer -> storage - val to_integer : storage -> integer - end - - module Make(T: Storage.S) = struct - type storage = T.t - - let of_group_elt str = - T.of_bytes str - - let to_group_elt str = - if T.length str <> group_elt_size then - raise (Size_mismatch "Scalar_mult.to_group_elt"); - T.to_bytes str - - let of_integer str = - T.of_bytes str - - let to_integer str = - if T.length str <> integer_size then - raise (Size_mismatch "Scalar_mult.to_integer"); - T.to_bytes str - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -module Password_hash = struct - module Sodium = C - module C = C.Password_hash - let primitive = C.primitive - - let salt_size = Size_t.to_int (C.saltbytes ()) - let password_hash_size = Size_t.to_int (C.strbytes ()) - - (* Invariant: a salt is salt_size bytes long. *) - type salt = Bytes.t - type password = Bytes.t - - type difficulty = { - mem_limit : int64; - ops_limit : int; - } - - let interactive = - let mem_limit = Size_t.to_int64 (C.memlimit_interactive ()) in - let ops_limit = C.opslimit_interactive () in - { mem_limit; ops_limit; } - - let moderate = - let mem_limit = Size_t.to_int64 (C.memlimit_moderate ()) in - let ops_limit = C.opslimit_moderate () in - { mem_limit; ops_limit; } - - let sensitive = - let mem_limit = Size_t.to_int64 (C.memlimit_sensitive ()) in - let ops_limit = C.opslimit_sensitive () in - { mem_limit; ops_limit; } - - let wipe_password = wipe - - let random_salt () = - Random.Bytes.generate salt_size - - let salt_of_bytes b = - if Bytes.length b <> salt_size then - raise (Size_mismatch "Password_hash.salt_of_bytes"); - b - - let derive_key key_size { ops_limit; mem_limit; } pw salt = - let key = Bytes.create key_size in - let ret = - C.derive - (Storage.Bytes.to_ptr key) (ULLong.of_int key_size) - (Storage.Bytes.to_ptr pw) (Storage.Bytes.len_ullong pw) - (Storage.Bytes.to_ptr salt) - (ULLong.of_int ops_limit) (Size_t.of_int64 mem_limit) - (C.alg ()) in - assert (ret = 0); (* always returns 0 *) - key - - module type S = sig - type storage - - val of_salt : salt -> storage - val to_salt : storage -> salt - - val wipe_to_password : storage -> password - - val hash_password : difficulty -> password -> storage - val verify_password_hash : storage -> password -> bool - end - - module Make(T: Storage.S) = struct - module C = C.Make(T) - module Sodium = Sodium.Make(T) - type storage = T.t - - let of_salt salt = - T.of_bytes salt - - let to_salt str = - if T.length str <> salt_size then - raise (Size_mismatch "Password_hash.to_salt"); - T.to_bytes str - - let wipe_to_password str = - let res = T.to_bytes str in - Sodium.memzero (T.to_ptr str) (T.len_size_t str); - res - - let hash_password { ops_limit; mem_limit; } pw = - let str = T.create password_hash_size in - let ret = - C.hash - (T.to_ptr str) - (Storage.Bytes.to_ptr pw) (Storage.Bytes.len_ullong pw) - (ULLong.of_int ops_limit) (Size_t.of_int64 mem_limit) in - assert (ret = 0); (* always returns 0 *) - str - - let verify_password_hash str pw = - let ret = - C.verify - (T.to_ptr str) - (Storage.Bytes.to_ptr pw) (Storage.Bytes.len_ullong pw) in - ret = 0 - - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -module Secret_box = struct - module C = C.Secret_box - let primitive = C.primitive - - let key_size = Size_t.to_int (C.keybytes ()) - let nonce_size = Size_t.to_int (C.noncebytes ()) - let zero_size = Size_t.to_int (C.zerobytes ()) - let box_zero_size = Size_t.to_int (C.boxzerobytes ()) - - (* Invariant: a key is key_size bytes long. *) - type 'a key = Bytes.t - type secret_key = secret key - - (* Invariant: a nonce is nonce_size bytes long. *) - type nonce = Bytes.t - - let random_key () = - Random.Bytes.generate key_size - - let derive_key = Password_hash.derive_key key_size - - let random_nonce = - if nonce_size > 8 then - fun () -> Random.Bytes.generate nonce_size - else - fun () -> - raise (Failure - "Randomly generated nonces 8 bytes long or less are unsafe" - ) - - let nonce_of_bytes b = - if Bytes.length b <> nonce_size then - raise (Size_mismatch "Secret_box.nonce_of_bytes"); - b - - let increment_nonce = increment_be_bytes - - let wipe_key = wipe - - let equal_keys = Verify.equal_fn key_size - - module type S = sig - type storage - - val of_key : secret key -> storage - val to_key : storage -> secret key - - val of_nonce : nonce -> storage - val to_nonce : storage -> nonce - - val secret_box : secret key -> storage -> nonce -> storage - val secret_box_open : secret key -> storage -> nonce -> storage - end - - module Make(T: Storage.S) = struct - module C = C.Make(T) - type storage = T.t - - let verify_length str len fn_name = - if T.length str <> len then raise (Size_mismatch fn_name) - - let of_key key = - T.of_bytes key - - let to_key str = - verify_length str key_size "Secret_box.to_key"; - T.to_bytes str - - let of_nonce nonce = - T.of_bytes nonce - - let to_nonce str = - verify_length str nonce_size "Secret_box.to_nonce"; - T.to_bytes str - - let pad a apad bpad f = - let a' = T.create (apad + T.length a) in - let b' = T.create (T.length a') in - T.zero a' 0 apad; - T.blit a 0 a' apad (T.length a); - f a' b'; - T.sub b' bpad ((T.length b') - bpad) - - let secret_box key message nonce = - pad message zero_size box_zero_size (fun cleartext ciphertext -> - let ret = C.secretbox (T.to_ptr ciphertext) (T.to_ptr cleartext) - (T.len_ullong cleartext) - (Storage.Bytes.to_ptr nonce) - (Storage.Bytes.to_ptr key) in - assert (ret = 0) (* always returns 0 *)) - - let secret_box_open key ciphertext nonce = - pad ciphertext box_zero_size zero_size (fun ciphertext cleartext -> - let ret = C.secretbox_open (T.to_ptr cleartext) (T.to_ptr ciphertext) - (T.len_ullong ciphertext) - (Storage.Bytes.to_ptr nonce) - (Storage.Bytes.to_ptr key) in - if ret <> 0 then raise Verification_failure) - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -module Stream = struct - module C = C.Stream - let primitive = C.primitive - - let key_size = Size_t.to_int (C.keybytes ()) - let nonce_size = Size_t.to_int (C.noncebytes ()) - - (* Invariant: a key is key_size bytes long. *) - type 'a key = Bytes.t - type secret_key = secret key - - (* Invariant: a nonce is nonce_size bytes long. *) - type nonce = Bytes.t - - let random_key () = - Random.Bytes.generate key_size - - let derive_key = Password_hash.derive_key key_size - - let random_nonce = - if nonce_size > 8 then - fun () -> Random.Bytes.generate nonce_size - else - fun () -> - raise (Failure - "Randomly generated nonces 8 bytes long or less are unsafe" - ) - - let nonce_of_bytes b = - if Bytes.length b <> nonce_size then - raise (Size_mismatch "Stream.nonce_of_bytes"); - b - - let increment_nonce = increment_be_bytes - - let wipe_key = wipe - - let equal_keys = Verify.equal_fn key_size - - module type S = sig - type storage - - val of_key : secret key -> storage - val to_key : storage -> secret key - - val of_nonce : nonce -> storage - val to_nonce : storage -> nonce - - val stream : secret key -> int -> nonce -> storage - val stream_xor : secret key -> storage -> nonce -> storage - end - - module Make(T: Storage.S) = struct - module C = C.Make(T) - type storage = T.t - - let verify_length str len fn_name = - if T.length str <> len then raise (Size_mismatch fn_name) - - let of_key key = - T.of_bytes key - - let to_key str = - verify_length str key_size "Stream.to_key"; - T.to_bytes str - - let of_nonce nonce = - T.of_bytes nonce - - let to_nonce str = - verify_length str nonce_size "Stream.to_nonce"; - T.to_bytes str - - let stream key len nonce = - let stream = T.create len in - let ret = C.stream (T.to_ptr stream) (T.len_ullong stream) - (Storage.Bytes.to_ptr nonce) - (Storage.Bytes.to_ptr key) in - assert (ret = 0); (* always returns 0 *) - stream - - let stream_xor key message nonce = - let ciphertext = T.create (T.length message) in - let ret = C.stream_xor (T.to_ptr ciphertext) - (T.to_ptr message) (T.len_ullong message) - (Storage.Bytes.to_ptr nonce) - (Storage.Bytes.to_ptr key) in - assert (ret = 0); (* always returns 0 *) - ciphertext - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -module Gen_auth(M: sig - val scope : string - val primitive : string - val name : string -end) = struct - module C = C.Gen_auth(M) - let primitive = M.primitive - - let key_size = Size_t.to_int (C.keybytes ()) - let auth_size = Size_t.to_int (C.bytes ()) - - (* Invariant: a key is key_size bytes long. *) - type 'a key = Bytes.t - type secret_key = secret key - - (* Invariant: an auth is auth_size bytes long. *) - type auth = Bytes.t - - let random_key () = - Random.Bytes.generate key_size - - let derive_key = Password_hash.derive_key key_size - - let wipe_key = wipe - - let equal_keys = Verify.equal_fn key_size - - module type S = sig - type storage - - val of_key : secret key -> storage - val to_key : storage -> secret key - - val of_auth : auth -> storage - val to_auth : storage -> auth - - val auth : secret key -> storage -> auth - val verify : secret key -> auth -> storage -> unit - end - - module Make(T: Storage.S) = struct - module C = C.Make(T) - type storage = T.t - - let verify_length str len fn_name = - if T.length str <> len then raise (Size_mismatch fn_name) - - let of_key key = - T.of_bytes key - - let to_key = - let fn_name = M.name^".to_key" in fun str -> - verify_length str key_size fn_name; - T.to_bytes str - - let of_auth auth = - T.of_bytes auth - - let to_auth = - let fn_name = M.name^".to_auth" in fun str -> - verify_length str auth_size fn_name; - T.to_bytes str - - let auth key message = - let auth = Storage.Bytes.create auth_size in - let ret = C.auth (Storage.Bytes.to_ptr auth) - (T.to_ptr message) (T.len_ullong message) - (Storage.Bytes.to_ptr key) in - assert (ret = 0); (* always returns 0 *) - auth - - let verify key auth message = - let ret = C.auth_verify (Storage.Bytes.to_ptr auth) - (T.to_ptr message) (T.len_ullong message) - (Storage.Bytes.to_ptr key) in - if ret <> 0 then raise Verification_failure - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -module Auth = Gen_auth(struct - let scope = "auth" - let primitive = "hmacsha512256" - let name = "Auth" -end) - -module One_time_auth = Gen_auth(struct - let scope = "onetimeauth" - let primitive = "poly1305" - let name = "One_time_auth" -end) - -module Hash = struct - module C = C.Hash - let primitive = C.primitive - - let size = Size_t.to_int (C.hashbytes ()) - - (* Invariant: a hash is size bytes long. *) - type hash = Bytes.t - - let equal = Verify.equal_fn size - - module type S = sig - type storage - - val of_hash : hash -> storage - val to_hash : storage -> hash - - val digest : storage -> hash - end - - module Make(T: Storage.S) = struct - module C = C.Make(T) - type storage = T.t - - let of_hash str = - T.of_bytes str - - let to_hash str = - if T.length str <> size then - raise (Size_mismatch "Hash.to_hash"); - T.to_bytes str - - let digest str = - let hash = Storage.Bytes.create size in - let ret = C.hash (Storage.Bytes.to_ptr hash) (T.to_ptr str) - (T.len_ullong str) in - assert (ret = 0); (* always returns 0 *) - hash - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -module Generichash = struct - module C = C.Generichash - let primitive = C.primitive - - type 'a key = Bytes.t - type secret_key = secret key - - let wipe_key = wipe - - let size_default = Size_t.to_int (C.hashbytes ()) - let size_min = Size_t.to_int (C.hashbytesmin ()) - let size_max = Size_t.to_int (C.hashbytesmax ()) - let size_of_hash h = Bytes.length h - - let compare = Bytes.compare - - let key_size_default = Size_t.to_int (C.keybytes ()) - let key_size_min = Size_t.to_int (C.keybytesmin ()) - let key_size_max = Size_t.to_int (C.keybytesmax ()) - let size_of_key k = Bytes.length k - - let random_key () = - Random.Bytes.generate key_size_default - - let derive_key key_size = - if key_size < key_size_min || key_size > key_size_max then - raise (Size_mismatch "Generichash.derive_key"); - Password_hash.derive_key key_size - - type hash = Bytes.t - type state = { - ptr : Type.Generichash.state Static.structure ptr; - size : int; - mutable final : bool; - } - - let init ?(key=Bytes.of_string "") ?(size=size_default) () = - if size < size_min || size > size_max then - raise (Size_mismatch "Generichash.init"); - let ptr = allocate_n Type.Generichash.state ~count:1 in - let ret = C.init - ptr - (Storage.Bytes.to_ptr key) - (Size_t.of_int (size_of_key key)) - (Size_t.of_int size) - in - assert (ret = 0); (* always returns 0 *) - { ptr; size; final = false } - - let copy state = - let ptr = allocate_n Type.Generichash.state ~count:1 in - memcpy ~src:state.ptr ~dest:ptr Type.Generichash.state; - { state with ptr } - - let final state = - if state.final then raise (Already_finalized "Generichash.final") - else - let hash = Storage.Bytes.create state.size in - let ret = C.final - state.ptr (Storage.Bytes.to_ptr hash) (Size_t.of_int state.size) - in - assert (ret = 0); (* always returns 0 *) - state.final <- true; - hash - - module type S = sig - type storage - - val of_hash : hash -> storage - val to_hash : storage -> hash - - val of_key : secret key -> storage - val to_key : storage -> secret key - - val digest : ?size:int -> storage -> hash - val digest_with_key : secret key -> ?size:int -> storage -> hash - - val update : state -> storage -> unit - end - - module Make(T: Storage.S) = struct - module C = C.Make(T) - type storage = T.t - - let of_hash str = - T.of_bytes str - - let to_hash str = - let len = T.length str in - if len < size_min || len > size_max then - raise (Size_mismatch "Generichash.to_hash"); - T.to_bytes str - - let of_key str = - T.of_bytes str - - let to_key str = - let len = T.length str in - if len < key_size_min || len > key_size_max then - raise (Size_mismatch "Generichash.to_key"); - T.to_bytes str - - let digest_internal size key str = - let hash = Storage.Bytes.create size in - let ret = C.hash - (Storage.Bytes.to_ptr hash) (Size_t.of_int size) - (T.to_ptr str) (T.len_ullong str) - (Storage.Bytes.to_ptr key) (Size_t.of_int (size_of_key key)) - in - assert (ret = 0); (* always returns 0 *) - hash - - let digest_with_key key ?(size=size_default) str = - if size < size_min || size > size_max then - raise (Size_mismatch "Generichash.digest_with_key"); - digest_internal size key str - - let digest ?(size=size_default) str = - if size < size_min || size > size_max then - raise (Size_mismatch "Generichash.digest"); - (* TODO: The key should be NULL here but we can't represent that - with ctypes yet without giving up zero-copy passing. - See . - *) - digest_internal size (Bytes.create 0) str - - let update state str = - if state.final then raise (Already_finalized "Generichash.update") - else - let ret = C.update state.ptr (T.to_ptr str) (T.len_ullong str) in - assert (ret = 0); (* always returns 0 *) - () - end - - module Bytes = Make(Storage.Bytes) - module Bigbytes = Make(Storage.Bigbytes) -end - -let initialized = match C.init () with - | 0 | 1 -> true - | -1 -> false - | _ -> failwith "libsodium initialization failed unexpectedly" diff --git a/src/external/ocaml-sodium/lib/sodium.mldylib b/src/external/ocaml-sodium/lib/sodium.mldylib deleted file mode 100644 index f8a5d026655..00000000000 --- a/src/external/ocaml-sodium/lib/sodium.mldylib +++ /dev/null @@ -1,6 +0,0 @@ -Sodium -Sodium_storage -Sodium_bindings -Sodium_generated -Sodium_types -Sodium_types_detected diff --git a/src/external/ocaml-sodium/lib/sodium.mli b/src/external/ocaml-sodium/lib/sodium.mli deleted file mode 100644 index 46a5e0c0cdd..00000000000 --- a/src/external/ocaml-sodium/lib/sodium.mli +++ /dev/null @@ -1,860 +0,0 @@ -(* - * Copyright (c) 2013-2015 David Sheets - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -(** A binding to {{: https://github.com/jedisct1/libsodium } libsodium} - which wraps {{: http://nacl.cr.yp.to/ } NaCl} *) - -(** Raised when message authentication fails. *) -exception Verification_failure - -(** Raised when attempting to deserialize a malformed key, nonce, or - attempting to use a bad hash length. *) -exception Size_mismatch of string - -(** Raised when attempting to finalize an already finalized stream state. *) -exception Already_finalized of string - -(** Phantom type indicating that the key is public. *) -type public - -(** Phantom type indicating that the key is secret. *) -type secret - -(** Phantom type indicating that the key is composed of a secret key and - a public key. Such a key must be treated as a secret key. *) -type channel - -type bigbytes = - (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t - -module Random : sig - val stir : unit -> unit - - module type S = sig - type storage - - val generate_into : storage -> unit - val generate : int -> storage - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -module Box : sig - type 'a key - type secret_key = secret key - type public_key = public key - type channel_key = channel key - type keypair = secret key * public key - type nonce - - (** Primitive used by this implementation. - Currently ["curve25519xsalsa20poly1305"]. *) - val primitive : string - - (** Size of public keys, in bytes. *) - val public_key_size : int - - (** Size of secret keys, in bytes. *) - val secret_key_size : int - - (** Size of channel keys, in bytes. *) - val channel_key_size : int - - (** Size of nonces, in bytes. *) - val nonce_size : int - - (** [random_keypair ()] generates a random key pair. *) - val random_keypair : unit -> keypair - - (** [random_nonce ()] generates a random nonce. *) - val random_nonce : unit -> nonce - - (** [nonce_of_bytes b] creates a nonce out of bytes [b]. - - @raise Size_mismatch if [b] is not {!nonce_size} bytes long *) - val nonce_of_bytes : Bytes.t -> nonce - - (** [increment_nonce ?step n] interprets nonce [n] as a big-endian - number and returns the sum of [n] and [step] with wrap-around. - The default [step] is 1. *) - val increment_nonce : ?step:int -> nonce -> nonce - - (** [wipe_key k] overwrites [k] with zeroes. *) - val wipe_key : 'a key -> unit - - (** [precompute sk pk] precomputes the channel key for the secret key [sk] - and the public key [pk], which can be used to speed up processing - of any number of messages. *) - val precompute : secret key -> public key -> channel key - - (** [equal_public_keys a b] checks [a] and [b] for equality in constant - time. *) - val equal_public_keys : public key -> public key -> bool - - (** [equal_secret_keys a b] checks [a] and [b] for equality in constant - time. *) - val equal_secret_keys : secret key -> secret key -> bool - - (** [equal_channel_keys a b] checks [a] and [b] for equality in constant - time. *) - val equal_channel_keys : channel key -> channel key -> bool - - (** [compare_public_keys a b] compares [a] and [b]. *) - val compare_public_keys : public key -> public key -> int - - module type S = sig - type storage - - (** [of_public_key k] converts [k] to type [storage]. The result - is {!public_key_size} bytes long. *) - val of_public_key : public key -> storage - - (** [to_public_key s] converts [s] to a public key. - - @raise Size_mismatch if [s] is not {!public_key_size} bytes long *) - val to_public_key : storage -> public key - - (** [of_secret_key k] converts [k] to {!storage}. The result is - {!secret_key_size} bytes long. *) - val of_secret_key : secret key -> storage - - (** [to_secret_key s] converts [s] to a secret key. - - @raise Size_mismatch if [s] is not {!secret_key_size} bytes long *) - val to_secret_key : storage -> secret key - - (** [of_channel_key k] converts [k] to {!storage}. The result is - {!channel_key_size} bytes long. *) - val of_channel_key : channel key -> storage - - (** [to_channel_key s] converts [s] to a channel key. - - @raise Size_mismatch if [s] is not {!channel_key_size} bytes long *) - val to_channel_key : storage -> channel key - - (** [of_nonce n] converts [n] to {!storage}. The result is - {!nonce_size} bytes long. *) - val of_nonce : nonce -> storage - - (** [to_nonce s] converts [s] to a nonce. - - @raise Size_mismatch if [s] is not {!nonce_size} bytes long *) - val to_nonce : storage -> nonce - - (** [box sk pk m n] encrypts and authenticates a message [m] using - the sender's secret key [sk], the receiver's public key [pk], and - a nonce [n]. *) - val box : secret key -> public key -> storage -> nonce -> storage - - (** [box_open sk pk c n] verifies and decrypts a ciphertext [c] using - the receiver's secret key [sk], the sender's public key [pk], and - a nonce [n]. - - @raise Verification_failure if authenticity of message cannot - be verified *) - val box_open : secret key -> public key -> storage -> nonce -> storage - - (** [fast_box ck m n] encrypts and authenticates a message [m] using - the channel key [ck] precomputed from sender's secret key - and the receiver's public key, and a nonce [n]. *) - val fast_box : channel key -> storage -> nonce -> storage - - (** [fast_box_open ck c n] verifies and decrypts a ciphertext [c] using - the channel key [ck] precomputed from receiver's secret key - and the sender's public key, and a nonce [n]. - - @raise Verification_failure if authenticity of message cannot - be verified *) - val fast_box_open : channel key -> storage -> nonce -> storage - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -module Scalar_mult : sig - type group_elt - type integer - - (** Primitive used by this implementation. Currently ["curve25519"]. *) - val primitive : string - - (** Size of group elements, in bytes. *) - val group_elt_size : int - - (** Size of integers, in bytes. *) - val integer_size : int - - (** [equal_group_elt a b] checks [a] and [b] for equality in constant time. *) - val equal_group_elt : group_elt -> group_elt -> bool - - (** [equal_integer a b] checks [a] and [b] for equality in constant time. *) - val equal_integer : integer -> integer -> bool - - (** [mult n p] multiplies a group element [p] by an integer [n]. *) - val mult : integer -> group_elt -> group_elt - - (** [base n] computes the scalar product of a standard group - element and an integer [n]. *) - val base : integer -> group_elt - - module type S = sig - type storage - - (** [of_group_elt ge] converts [ge] to {!storage}. The result - is {!group_elt_size} bytes long. *) - val of_group_elt : group_elt -> storage - - (** [to_group_elt s] converts [s] to a group_elt. - - @raise Size_mismatch if [s] is not {!group_elt_size} bytes long *) - val to_group_elt : storage -> group_elt - - (** [of_integer i] converts [i] to {!storage}. The result - is {!integer_size} bytes long. *) - val of_integer : integer -> storage - - (** [to_integer s] converts [s] to a integer. - - @raise Size_mismatch if [s] is not {!integer_size} bytes long *) - val to_integer : storage -> integer - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -module Sign : sig - type 'a key - type secret_key = secret key - type public_key = public key - type keypair = secret key * public key - type signature - type seed - - (** Primitive used by this implementation. Currently ["ed25519"]. *) - val primitive : string - - (** Size of public keys, in bytes. *) - val public_key_size : int - - (** Size of secret keys, in bytes. *) - val secret_key_size : int - - (** Size of signatures, in bytes. *) - val signature_size : int - - (** Size of signing key seeds, in bytes. *) - val seed_size : int - - (** [random_keypair ()] generates a random key pair. *) - val random_keypair : unit -> keypair - - (** [seed_keypair seed] generates a key pair from secret [seed]. *) - val seed_keypair : seed -> keypair - - (** [secret_key_to_seed sk] extracts the secret key [sk]'s {!seed}. *) - val secret_key_to_seed : secret key -> seed - - (** [secret_key_to_public_key sk] extract the secret key [sk]'s - {!public_key}. *) - val secret_key_to_public_key : secret key -> public key - - (** [wipe_key k] overwrites [k] with zeroes. *) - val wipe_key : 'a key -> unit - - (** [equal_public_keys a b] checks [a] and [b] for equality in constant - time. *) - val equal_public_keys : public key -> public key -> bool - - (** [equal_secret_keys a b] checks [a] and [b] for equality in constant - time. *) - val equal_secret_keys : secret key -> secret key -> bool - - (** [compare_public_keys a b] compares [a] and [b]. *) - val compare_public_keys : public key -> public key -> int - - (** [box_keypair kp] is the {!Box.keypair} extracted from [kp]. *) - val box_keypair : keypair -> Box.keypair - - (** [box_public_key k] is the {!Box.public_key} extracted from [k]. *) - val box_public_key : public key -> Box.public_key - - (** [box_secret_key k] is the {!Box.secret_key} extracted from [k]. *) - val box_secret_key : secret key -> Box.secret_key - - module type S = sig - type storage - - (** [of_public_key k] converts [k] to {!storage}. The result is - {!public_key_size} bytes long. *) - val of_public_key : public key -> storage - - (** [to_public_key s] converts [s] to a public key. - - @raise Size_mismatch if [s] is not {!public_key_size} bytes - long *) - val to_public_key : storage -> public key - - (** [of_secret_key k] converts [k] to {!storage}. The result is - {!secret_key_size} bytes long. *) - val of_secret_key : secret key -> storage - - (** [to_secret_key s] converts [s] to a secret key. - - @raise Size_mismatch if [s] is not {!secret_key_size} bytes - long *) - val to_secret_key : storage -> secret key - - (** [of_signature a] converts [a] to {!storage}. The result is - {!signature_size} bytes long. *) - val of_signature : signature -> storage - - (** [to_signature s] converts [s] to a signature. - - @raise Size_mismatch if [s] is not {!signature_size} bytes long *) - val to_signature : storage -> signature - - (** [of_seed s] converts [s] to type {!storage}. The result is - {!seed_size} bytes long. *) - val of_seed : seed -> storage - - (** [to_seed s] converts [s] to a seed. - - @raise Size_mismatch if [s] is not {!seed_size} bytes long *) - val to_seed : storage -> seed - - (** [sign sk m] signs a message [m] using the signer's secret key [sk], - and returns the resulting signed message. *) - val sign : secret key -> storage -> storage - - (** [sign_open pk sm] verifies the signature in [sm] using the signer's - public key [pk], and returns the message. - - @raise Verification_failure if authenticity of message cannot - be verified *) - val sign_open : public key -> storage -> storage - - (** [sign_detached sk m] signs a message [m] using the signer's secret - key [sk], and returns the signature. *) - val sign_detached : secret key -> storage -> signature - - (** [verify pk s m] checks that [s] is a correct signature of a message - [m] under the public key [pk]. - - @raise Verification_failure if [s] is not a correct signature - of [m] under [pk] *) - val verify : public key -> signature -> storage -> unit - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -module Password_hash : sig - type salt - type password - - (** Primitive used by this implementation. Currently ["argon2i"]. *) - val primitive : string - - (** Size of password hashes, in bytes. *) - val password_hash_size : int - - (** Size of salts, in bytes. *) - val salt_size : int - - (** Parameters of the {!primitive} algorithm used to derive secret - keys and hash passwords. This algorithm generates data (the - secret key or the hash) from a human chosen password and a salt - using a time and memory consuming algorithm to prevent - bruteforce attacks. *) - type difficulty = { - mem_limit : int64; (** The amount of memory used by the algorithm. - The more memory the better. *) - ops_limit : int; (** The number of passes of the algorithm over - the memory. The more passes the better, to - be adjusted to the type of application. *) - } - - (** The base line of difficulty, for online, interactive - applications. Currently 3 passes over 32MiB. *) - val interactive : difficulty - - (** Currently 6 passes and 128MiB. *) - val moderate : difficulty - - (** For highly sensitive data and non-interactive operations. - Currently 8 passes over 512MiB. Takes about 3.5 seconds on a 2.8 - Ghz Core i7 CPU. *) - val sensitive : difficulty - - (** [wipe_password pw] overwrites [pw] with zeroes. *) - val wipe_password : password -> unit - - (** [random_salt ()] generates a random salt. *) - val random_salt : unit -> salt - - (** [salt_of_bytes b] creates a salt out of bytes [b]. - - @raise Size_mismatch if [b] is not {!salt_size} bytes long *) - val salt_of_bytes : Bytes.t -> salt - - module type S = sig - type storage - - (** [of_salt s] converts [s] to {!storage}. The result is - {!salt_size} bytes long. *) - val of_salt : salt -> storage - - (** [to_salt s] converts [s] to a salt. - - @raise Size_mismatch if [s] is not {!salt_size} bytes long *) - val to_salt : storage -> salt - - (** [wipe_to_password s] copies a password [s] from {!storage} and - wipes [s]. *) - val wipe_to_password : storage -> password - - (** [hash_password d pw] uses the key derivation algorithm to - create a safely storable hash of the password of size - {!password_hash_size}. It randomly generates a salt, and - stores the result of the derivation, along with the salt and - parameters [d], so that {!verify_password} can later verify - the hash. *) - val hash_password : difficulty -> password -> storage - - (** [verify_password_hash h p] uses the key derivation algorithm to - check that a safely storable password hash [h] actually matches - the password [p]. - - @raise Size_mismatch if [h] is not {!password_hash_size} bytes long *) - val verify_password_hash : storage -> password -> bool - - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -module Secret_box : sig - type 'a key - type secret_key = secret key - type nonce - - (** Primitive used by this implementation. Currently ["xsalsa20poly1305"]. *) - val primitive : string - - (** Size of keys, in bytes. *) - val key_size : int - - (** Size of nonces, in bytes. *) - val nonce_size : int - - (** [random_key ()] generates a random secret key . *) - val random_key : unit -> secret key - - (** [derive_key difficulty pw salt] derives a key from a human - generated password. Since the derivation depends on both - [difficulty] and [salt], it is necessary to store them alongside - the ciphertext. Using a constant salt is insecure because it - increases the effectiveness of rainbow tables. Generate the salt - with a function like {!Password_hash.random_salt} instead. *) - val derive_key : - Password_hash.difficulty -> - Password_hash.password -> - Password_hash.salt -> - secret_key - - (** [random_nonce ()] generates a random nonce. *) - val random_nonce : unit -> nonce - - (** [nonce_of_bytes b] creates a nonce out of bytes [b]. - - @raise Size_mismatch if [b] is not {!nonce_size} bytes long *) - val nonce_of_bytes : Bytes.t -> nonce - - (** [increment_nonce ?step n] interprets nonce [n] as a big-endian - number and returns the sum of [n] and [step] with wrap-around. - The default [step] is 1. *) - val increment_nonce : ?step:int -> nonce -> nonce - - (** [wipe_key k] overwrites [k] with zeroes. *) - val wipe_key : secret key -> unit - - (** [equal_keys a b] checks [a] and [b] for equality in constant time. *) - val equal_keys : secret key -> secret key -> bool - - module type S = sig - type storage - - (** [of_key k] converts [k] to {!storage}. The result is - {!key_size} bytes long. *) - val of_key : secret key -> storage - - (** [to_key s] converts [s] to a secret key. - - @raise Size_mismatch if [s] is not {!key_size} bytes long *) - val to_key : storage -> secret key - - (** [of_nonce n] converts [n] to {!storage}. The result is - {!nonce_size} bytes long. *) - val of_nonce : nonce -> storage - - (** [to_nonce s] converts [s] to a nonce. - - @raise Size_mismatch if [s] is not {!nonce_size} bytes long *) - val to_nonce : storage -> nonce - - (** [secret_box k m n] encrypts and authenticates a message [m] using - a secret key [k] and a nonce [n], and returns the resulting - ciphertext. *) - val secret_box : secret key -> storage -> nonce -> storage - - (** [secret_box_open k c n] verifies and decrypts a ciphertext [c] using - a secret key [k] and a nonce [n], and returns the resulting plaintext - [m]. - - @raise Verification_failure if authenticity of message cannot - be verified *) - val secret_box_open : secret key -> storage -> nonce -> storage - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -module Stream : sig - type 'a key - type secret_key = secret key - type nonce - - (** Primitive used by this implementation. Currently ["xsalsa20"]. *) - val primitive : string - - (** Size of keys, in bytes. *) - val key_size : int - - (** Size of nonces, in bytes. *) - val nonce_size : int - - (** [random_key ()] generates a random secret key. *) - val random_key : unit -> secret key - - (** [derive_key difficulty pw salt] derives a key from a human - generated password. Since the derivation depends on both - [difficulty] and [salt], it is necessary to store them alongside - the ciphertext. Using a constant salt is insecure because it - increases the effectiveness of rainbow tables. Generate the salt - with a function like {!Password_hash.random_salt} instead. *) - val derive_key : - Password_hash.difficulty -> - Password_hash.password -> - Password_hash.salt -> - secret_key - - (** [random_nonce ()] generates a random nonce. *) - val random_nonce : unit -> nonce - - (** [nonce_of_bytes b] creates a nonce out of bytes [b]. - - @raise Size_mismatch if [b] is not {!nonce_size} bytes long *) - val nonce_of_bytes : Bytes.t -> nonce - - (** [increment_nonce ?step n] interprets nonce [n] as a big-endian - number and returns the sum of [n] and [step] with wrap-around. - The default [step] is 1. *) - val increment_nonce : ?step:int -> nonce -> nonce - - (** [wipe_key k] overwrites [k] with zeroes. *) - val wipe_key : secret key -> unit - - (** [equal_keys a b] checks [a] and [b] for equality in constant time. *) - val equal_keys : secret key -> secret key -> bool - - module type S = sig - type storage - - (** [of_key k] converts [k] to {!storage}. The result is - {!key_size} bytes long. *) - val of_key : secret key -> storage - - (** [to_key s] converts [s] to a secret key. - - @raise Size_mismatch if [s] is not {!key_size} bytes long *) - val to_key : storage -> secret key - - (** [of_nonce n] converts [n] to {!storage}. The result is - {!nonce_size} bytes long. *) - val of_nonce : nonce -> storage - - (** [to_nonce s] converts [s] to a nonce. - - @raise Size_mismatch if [s] is not {!nonce_size} bytes long *) - val to_nonce : storage -> nonce - - (** [stream k len n] produces a [len]-byte stream [c] as a function of - a secret key [k] and a nonce [n]. *) - val stream : secret key -> int -> nonce -> storage - - (** [stream_xor k m n] encrypts or decrypts a message [m] using - a secret key [k] and a nonce [n]. *) - val stream_xor : secret key -> storage -> nonce -> storage - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -module Auth : sig - type 'a key - type secret_key = secret key - type auth - - (** Primitive used by this implementation. Currently ["hmacsha512256"]. *) - val primitive : string - - (** Size of keys, in bytes. *) - val key_size : int - - (** Size of authenticators, in bytes. *) - val auth_size : int - - (** [random_key ()] generates a random secret key . *) - val random_key : unit -> secret key - - (** [derive_key difficulty pw salt] derives a key from a human - generated password. Since the derivation depends on both - [difficulty] and [salt], it is necessary to store them alongside - the authenticator. Using a constant salt is insecure because it - increases the effectiveness of rainbow tables. Generate the salt - with a function like {!Password_hash.random_salt} instead. *) - val derive_key : - Password_hash.difficulty -> - Password_hash.password -> - Password_hash.salt -> - secret_key - - (** [wipe_key k] overwrites [k] with zeroes. *) - val wipe_key : secret key -> unit - - (** [equal_keys a b] checks [a] and [b] for equality in constant time. *) - val equal_keys : secret key -> secret key -> bool - - module type S = sig - type storage - - (** [of_key k] converts [k] to {!storage}. The result is - {!key_size} bytes long. *) - val of_key : secret key -> storage - - (** [to_key s] converts [s] to a secret key. - - @raise Size_mismatch if [s] is not {!key_size} bytes long *) - val to_key : storage -> secret key - - (** [of_auth a] converts [a] to {!storage}. The result is - {!auth_size} bytes long. *) - val of_auth : auth -> storage - - (** [to_auth s] converts [s] to an authenticator. - - @raise Size_mismatch if [s] is not {!auth_size} bytes long *) - val to_auth : storage -> auth - - (** [auth k m] authenticates a message [m] using a secret key [k], - and returns an authenticator [a]. *) - val auth : secret key -> storage -> auth - - (** [verify k a m] checks that [a] is a correct authenticator - of a message [m] under the secret key [k]. - - @raise Verification_failure if [a] is not a correct authenticator - of [m] under [k] *) - val verify : secret key -> auth -> storage -> unit - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -module One_time_auth : sig - include module type of Auth - - (** Primitive used by this implementation. Currently ["poly1305"]. *) - val primitive : string -end - -module Hash : sig - type hash - - (** Primitive used by this implementation. Currently ["sha512"]. *) - val primitive : string - - (** Size of hashes, in bytes. *) - val size : int - - (** [equal a b] checks [a] and [b] for equality in constant time. *) - val equal : hash -> hash -> bool - - module type S = sig - type storage - - (** [of_hash h] converts [h] to {!storage}. The result is {!size} - bytes long. *) - val of_hash : hash -> storage - - (** [to_hash s] converts [s] to a hash. - - @raise Size_mismatch if [s] is not {!size} bytes long *) - val to_hash : storage -> hash - - (** [digest m] computes a hash for message [m]. *) - val digest : storage -> hash - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -module Generichash : sig - type hash - type state - type 'a key - type secret_key = secret key - - (** Primitive used by this implementation. Currently ["blake2b"]. *) - val primitive : string - - (** [wipe_key k] overwrites [k] with zeroes. *) - val wipe_key : secret key -> unit - - (** Default recommended output size, in bytes. *) - val size_default : int - - (** Minimum supported output size, in bytes. *) - val size_min : int - - (** Maximum supported output size, in bytes. *) - val size_max : int - - (** [size_of_hash hash] is the size, in bytes, of the {!hash} [hash]. *) - val size_of_hash : hash -> int - - (** [compare h h'] is 0 if [h] and [h'] are equal, a negative - integer if [h] is less than [h'], and a positive integer if [h] - is greater than [h']. [compare] {i {b is not constant time}}. *) - val compare : hash -> hash -> int - - (** Default recommended key size, in bytes. *) - val key_size_default : int - - (** Minimum supported key size, in bytes. *) - val key_size_min : int - - (** Maximum supported key size, in bytes. *) - val key_size_max : int - - (** [size_of_key key] is the size, in bytes, of the {!key} [key]. *) - val size_of_key : secret key -> int - - (** [random_key ()] generates a random secret key of - {!key_size_default} bytes. *) - val random_key : unit -> secret key - - (** [derive_key key_size difficulty pw salt] derives a key of length - [key_size] from a human generated password. Since the derivation - depends on both [difficulty] and [salt], it is necessary to - store them alongside the hash. Using a constant salt is insecure - because it increases the effectiveness of rainbow - tables. Generate the salt with a function like - {!Password_hash.random_salt} instead. - - @raise Size_mismatch if [key_size] is greater than {!key_size_max} or - less than {!key_size_min} *) - val derive_key : - int -> - Password_hash.difficulty -> - Password_hash.password -> - Password_hash.salt -> - secret_key - - (** [init ?key ?size ()] is a streaming hash state keyed with [key] - if supplied and computing a hash of size [size] (default - {!size_default}). - - @raise Size_mismatch if [size] is greater than {!size_max} or - less than {!size_min} *) - val init : ?key:secret key -> ?size:int -> unit -> state - - (** [copy state] is a copy of the {!state} [state] which can diverge - from the original (including finalization). *) - val copy : state -> state - - (** [final state] is the final hash of the inputs collected in - [state]. - - @raise Already_finalized if [state] has already had [final] - applied to it *) - val final : state -> hash - - module type S = sig - type storage - - (** [of_hash h] converts [h] to {!storage}. The result - is [size_of_hash h] bytes long. *) - val of_hash : hash -> storage - - (** [to_hash s] converts [s] to a hash. - - @raise Size_mismatch if [s] is greater than {!size_max} or - less than {!size_min} bytes long *) - val to_hash : storage -> hash - - (** [of_key k] converts key [k] to {!storage}. The result is - [size_of_key k] bytes long. *) - val of_key : secret key -> storage - - (** [to_key s] converts [s] to a {!secret} {!key}. - - @raise Size_mismatch if [s] is greater than {!key_size_max} or - less than {!key_size_min} bytes long *) - val to_key : storage -> secret key - - (** [digest ?size m] computes a hash of size [size] (default - {!size_default}) for message [m]. *) - val digest : ?size:int -> storage -> hash - - (** [digest_with_key key m] computes a hash of size [size] - (default {!size_default} keyed by [key] for message [m]. *) - val digest_with_key : secret key -> ?size:int -> storage -> hash - - (** [update state m] updates the {!state} [state] with input [m]. - - @raise Already_finalized if [state] has already had {!final} - applied to it *) - val update : state -> storage -> unit - end - - module Bytes : S with type storage = Bytes.t - module Bigbytes : S with type storage = bigbytes -end - -val initialized : bool diff --git a/src/external/ocaml-sodium/lib/sodium.mllib b/src/external/ocaml-sodium/lib/sodium.mllib deleted file mode 100644 index f8a5d026655..00000000000 --- a/src/external/ocaml-sodium/lib/sodium.mllib +++ /dev/null @@ -1,6 +0,0 @@ -Sodium -Sodium_storage -Sodium_bindings -Sodium_generated -Sodium_types -Sodium_types_detected diff --git a/src/external/ocaml-sodium/lib/sodium_storage.ml b/src/external/ocaml-sodium/lib/sodium_storage.ml deleted file mode 100644 index eaa6d1a48e7..00000000000 --- a/src/external/ocaml-sodium/lib/sodium_storage.ml +++ /dev/null @@ -1,73 +0,0 @@ -open Ctypes - -type bigbytes = - (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t - -module type S = sig - type t - type ctype - - val ctype : ctype typ - - val create : int -> t - val zero : t -> int -> int -> unit - val blit : t -> int -> t -> int -> int -> unit - val sub : t -> int -> int -> t - val length : t -> int - val len_size_t : t -> PosixTypes.size_t - val len_ullong : t -> Unsigned.ullong - val to_ptr : t -> ctype - val to_bytes : t -> Bytes.t - val of_bytes : Bytes.t -> t -end - -module Bigbytes = struct - type t = bigbytes - type ctype = char ptr - - let ctype = ptr char - - open Bigarray - - let create len = (Array1.create char c_layout len) - let length str = Array1.dim str - let len_size_t str = Unsigned.Size_t.of_int (Array1.dim str) - let len_ullong str = Unsigned.ULLong.of_int (Array1.dim str) - let to_ptr str = bigarray_start array1 str - let zero str pos len = (Array1.fill (Array1.sub str pos len) '\x00') - - let to_bytes str = - let str' = Bytes.create (Array1.dim str) in - Bytes.iteri (fun i _ -> Bytes.set str' i (Array1.unsafe_get str i)) str'; - str' - - let of_bytes str = - let str' = create (Bytes.length str) in - Bytes.iteri (Array1.unsafe_set str') str; - str' - - let sub = Array1.sub - - let blit src srcoff dst dstoff len = - Array1.blit (Array1.sub src srcoff len) - (Array1.sub dst dstoff len) -end - -module Bytes = struct - type t = Bytes.t - type ctype = Bytes.t ocaml - - let ctype = ocaml_bytes - - let create len = Bytes.create len - let length byt = Bytes.length byt - let len_size_t byt = Unsigned.Size_t.of_int (Bytes.length byt) - let len_ullong byt = Unsigned.ULLong.of_int (Bytes.length byt) - let to_ptr byt = ocaml_bytes_start byt - let zero byt pos len = Bytes.fill byt pos len '\x00' - - let to_bytes byt = Bytes.copy byt - let of_bytes byt = Bytes.copy byt - let sub = Bytes.sub - let blit = Bytes.blit -end diff --git a/src/external/ocaml-sodium/lib_gen/_tags b/src/external/ocaml-sodium/lib_gen/_tags deleted file mode 100644 index 7a7e632ae8b..00000000000 --- a/src/external/ocaml-sodium/lib_gen/_tags +++ /dev/null @@ -1 +0,0 @@ -<*.{ml,byte,native}>: package(ctypes.stubs) diff --git a/src/external/ocaml-sodium/lib_gen/sodium_bindgen.ml b/src/external/ocaml-sodium/lib_gen/sodium_bindgen.ml deleted file mode 100644 index c0640919481..00000000000 --- a/src/external/ocaml-sodium/lib_gen/sodium_bindgen.ml +++ /dev/null @@ -1,39 +0,0 @@ -open Ctypes - -module BindStorage(T: functor(S: Sodium_storage.S) -> sig end) = struct - module Bytes = T(Sodium_storage.Bytes) - module Bigbytes = T(Sodium_storage.Bigbytes) -end - -module Bind(F: Cstubs.FOREIGN) = struct - include Sodium_bindings.C(F) - module Sodium' = BindStorage(Make) - module Random' = BindStorage(Random.Make) - module Box' = BindStorage(Box.Make) - module Sign' = BindStorage(Sign.Make) - module Password_hash' = BindStorage(Password_hash.Make) - module Secret_box' = BindStorage(Secret_box.Make) - module Stream' = BindStorage(Stream.Make) - module Hash' = BindStorage(Hash.Make) - module Generichash' = BindStorage(Generichash.Make) - - module Auth = Gen_auth(struct - let scope = "auth" - let primitive = "hmacsha512256" - end) - module Auth' = BindStorage(Auth.Make) - - module One_time_auth = Gen_auth(struct - let scope = "onetimeauth" - let primitive = "poly1305" - end) - module One_time_auth' = BindStorage(One_time_auth.Make) -end - -let () = - let fmt = Format.formatter_of_out_channel (open_out "lib/sodium_stubs.c") in - Format.fprintf fmt "#include @."; - Cstubs.write_c fmt ~prefix:"caml_" (module Bind); - - let fmt = Format.formatter_of_out_channel (open_out "lib/sodium_generated.ml") in - Cstubs.write_ml fmt ~prefix:"caml_" (module Bind) diff --git a/src/external/ocaml-sodium/lib_gen/sodium_bindings.ml b/src/external/ocaml-sodium/lib_gen/sodium_bindings.ml deleted file mode 100644 index 43273b556d4..00000000000 --- a/src/external/ocaml-sodium/lib_gen/sodium_bindings.ml +++ /dev/null @@ -1,310 +0,0 @@ -(* - * Copyright (c) 2013-2015 David Sheets - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open Ctypes - -module Type = Sodium_types.C(Sodium_types_detected) - -module C(F: Cstubs.FOREIGN) = struct - let prefix = "sodium" - - let init = F.(foreign (prefix^"_init") (void @-> returning int)) - let memcmp = F.(foreign (prefix^"_memcmp") (ocaml_bytes @-> ocaml_bytes @-> size_t @-> returning int)) - - module Make(T: Sodium_storage.S) = struct - let memzero = - F.(foreign (prefix^"_memzero") (T.ctype @-> size_t @-> returning void)) - end - - module Verify = struct - let verify_type = F.(ocaml_bytes @-> ocaml_bytes @-> returning int) - let verify_16 = F.foreign "crypto_verify_16" verify_type - let verify_32 = F.foreign "crypto_verify_32" verify_type - let verify_64 = F.foreign "crypto_verify_64" verify_type - end - - module Random = struct - let stir = F.(foreign "randombytes_stir" (void @-> returning void)) - - module Make(T: Sodium_storage.S) = struct - let gen = F.(foreign "randombytes_buf" (T.ctype @-> size_t @-> returning void)) - end - end - - module Box = struct - let primitive = "curve25519xsalsa20poly1305" - let prefix = "crypto_box_"^primitive - - let sz_query_type = F.(void @-> returning size_t) - let publickeybytes = F.foreign (prefix^"_publickeybytes") sz_query_type - let secretkeybytes = F.foreign (prefix^"_secretkeybytes") sz_query_type - let beforenmbytes = F.foreign (prefix^"_beforenmbytes") sz_query_type - let noncebytes = F.foreign (prefix^"_noncebytes") sz_query_type - let zerobytes = F.foreign (prefix^"_zerobytes") sz_query_type - let boxzerobytes = F.foreign (prefix^"_boxzerobytes") sz_query_type - - let box_keypair = F.(foreign (prefix^"_keypair") - (ocaml_bytes @-> ocaml_bytes @-> returning int)) - - let box_beforenm = F.(foreign (prefix^"_beforenm") - (ocaml_bytes @-> ocaml_bytes @-> ocaml_bytes - @-> returning int)) - - module Make(T: Sodium_storage.S) = struct - let box_fn_type = F.(T.ctype @-> T.ctype @-> ullong - @-> ocaml_bytes @-> ocaml_bytes @-> ocaml_bytes - @-> returning int) - - let box = F.foreign (prefix) box_fn_type - let box_open = F.foreign (prefix^"_open") box_fn_type - - let box_afternm_type = F.(T.ctype @-> T.ctype @-> ullong - @-> ocaml_bytes @-> ocaml_bytes @-> returning int) - - let box_afternm = F.foreign (prefix^"_afternm") box_afternm_type - let box_open_afternm = F.foreign (prefix^"_open_afternm") box_afternm_type - end - end - - module Sign = struct - let primitive = "ed25519" - let prefix = "crypto_sign_"^primitive - - let sz_query_type = F.(void @-> returning size_t) - let publickeybytes = F.foreign (prefix^"_publickeybytes") sz_query_type - let secretkeybytes = F.foreign (prefix^"_secretkeybytes") sz_query_type - let bytes = F.foreign (prefix^"_bytes") sz_query_type - let seedbytes = F.foreign (prefix^"_seedbytes") sz_query_type - - let sign_keypair = F.(foreign (prefix^"_keypair") - (ocaml_bytes @-> ocaml_bytes - @-> returning int)) - let sign_seed_keypair = F.(foreign (prefix^"_seed_keypair") - (ocaml_bytes @-> ocaml_bytes @-> ocaml_bytes - @-> returning int)) - - let sign_sk_to_seed = F.(foreign (prefix^"_sk_to_seed") - (ocaml_bytes @-> ocaml_bytes - @-> returning int)) - let sign_sk_to_pk = F.(foreign (prefix^"_sk_to_pk") - (ocaml_bytes @-> ocaml_bytes - @-> returning int)) - - let to_curve_25519_type = F.(ocaml_bytes @-> ocaml_bytes @-> returning int) - let sign_pk_to_curve25519 = F.foreign (prefix^"_pk_to_curve25519") - to_curve_25519_type - let sign_sk_to_curve25519 = F.foreign (prefix^"_sk_to_curve25519") - to_curve_25519_type - - module Make(T: Sodium_storage.S) = struct - let sign_fn_type = F.(T.ctype @-> ptr ullong @-> T.ctype - @-> ullong @-> ocaml_bytes @-> returning int) - - let sign = F.foreign (prefix) sign_fn_type - let sign_open = F.foreign (prefix^"_open") sign_fn_type - - let sign_detached_type = F.(T.ctype @-> ptr_opt ullong @-> T.ctype - @-> ullong @-> ocaml_bytes @-> returning int) - - let sign_detached = F.foreign (prefix^"_detached") sign_detached_type - - let verify_type = F.(ocaml_bytes @-> T.ctype @-> ullong - @-> ocaml_bytes @-> returning int) - - let sign_verify = F.foreign (prefix^"_verify_detached") verify_type - end - end - - module Scalar_mult = struct - let primitive = "curve25519" - let prefix = "crypto_scalarmult_"^primitive - - let sz_query_type = F.(void @-> returning size_t) - let bytes = F.foreign (prefix^"_bytes") sz_query_type - let scalarbytes = F.foreign (prefix^"_scalarbytes") sz_query_type - - let scalarmult = F.(foreign (prefix) - (ocaml_bytes @-> ocaml_bytes @-> ocaml_bytes - @-> returning int)) - let scalarmult_base = F.(foreign (prefix^"_base") - (ocaml_bytes @-> ocaml_bytes @-> returning int)) - end - - module Password_hash = struct - let primitive = "argon2i" - let prefix = "crypto_pwhash_"^primitive - - let sz_query_type = F.(void @-> returning size_t) - let saltbytes = F.foreign (prefix^"_saltbytes") sz_query_type - let strbytes = F.foreign (prefix^"_strbytes") sz_query_type - - let query_memlimit name = - F.foreign (prefix^"_memlimit_"^name) sz_query_type - - let memlimit_interactive = query_memlimit "interactive" - let memlimit_moderate = query_memlimit "moderate" - let memlimit_sensitive = query_memlimit "sensitive" - - let query_opslimit name = - F.foreign (prefix^"_opslimit_"^name) F.(void @-> returning int) - - let opslimit_interactive = query_opslimit "interactive" - let opslimit_moderate = query_opslimit "moderate" - let opslimit_sensitive = query_opslimit "sensitive" - - let alg = F.foreign (prefix^"_alg_argon2i13") F.(void @-> returning int) - - module Make(T: Sodium_storage.S) = struct - - let hash = F.foreign (prefix^"_str") - F.(T.ctype @-> (* hash *) - ocaml_bytes @-> ullong @-> (* passwd, passwdlen *) - ullong @-> size_t @-> (* opslimit, memlimit *) - returning int) - - let verify = F.foreign (prefix^"_str_verify") - F.(T.ctype @-> (* hash *) - ocaml_bytes @-> ullong @-> (* passwd, passwdlen *) - returning int) - end - - let derive = F.foreign prefix - F.(ocaml_bytes @-> ullong @-> (* out, outlen *) - ocaml_bytes @-> ullong @-> (* passwd, passwdlen *) - ocaml_bytes @-> (* salt *) - ullong @-> size_t @-> (* opslimit, memlimit *) - int @-> (* alg *) - returning int) - end - - module Secret_box = struct - let primitive = "xsalsa20poly1305" - let prefix = "crypto_secretbox_"^primitive - - let sz_query_type = F.(void @-> returning size_t) - let keybytes = F.foreign (prefix^"_keybytes") sz_query_type - let noncebytes = F.foreign (prefix^"_noncebytes") sz_query_type - let zerobytes = F.foreign (prefix^"_zerobytes") sz_query_type - let boxzerobytes = F.foreign (prefix^"_boxzerobytes") sz_query_type - - module Make(T: Sodium_storage.S) = struct - let secretbox_fn_ty = F.(T.ctype @-> T.ctype @-> ullong - @-> ocaml_bytes @-> ocaml_bytes @-> returning int) - - let secretbox = F.foreign (prefix) secretbox_fn_ty - let secretbox_open = F.foreign (prefix^"_open") secretbox_fn_ty - end - end - - module Stream = struct - let primitive = "xsalsa20" - let prefix = "crypto_stream_"^primitive - - let sz_query_type = F.(void @-> returning size_t) - let keybytes = F.foreign (prefix^"_keybytes") sz_query_type - let noncebytes = F.foreign (prefix^"_noncebytes") sz_query_type - - module Make(T: Sodium_storage.S) = struct - let stream = F.(foreign (prefix) - (T.ctype @-> ullong @-> ocaml_bytes - @-> ocaml_bytes @-> returning int)) - let stream_xor = F.(foreign (prefix^"_xor") - (T.ctype @-> T.ctype @-> ullong - @-> ocaml_bytes @-> ocaml_bytes @-> returning int)) - end - end - - module Gen_auth(M: sig - val scope : string - val primitive : string - end) = struct - let primitive = M.primitive - let prefix = "crypto_"^M.scope^"_"^primitive - - let sz_query_type = F.(void @-> returning size_t) - let keybytes = F.foreign (prefix^"_keybytes") sz_query_type - let bytes = F.foreign (prefix^"_bytes") sz_query_type - - module Make(T: Sodium_storage.S) = struct - let auth_fn_type = F.(ocaml_bytes @-> T.ctype @-> ullong - @-> ocaml_bytes @-> returning int) - - let auth = F.foreign (prefix) auth_fn_type - let auth_verify = F.foreign (prefix^"_verify") auth_fn_type - end - end - - module Hash = struct - let primitive = "sha512" - let prefix = "crypto_hash_"^primitive - - let sz_query_type = F.(void @-> returning size_t) - let hashbytes = F.foreign (prefix^"_bytes") sz_query_type - - module Make(T: Sodium_storage.S) = struct - let hash = F.(foreign (prefix) - (ocaml_bytes @-> T.ctype @-> ullong @-> returning int)) - end - end - - module Generichash = struct - let primitive = "blake2b" - let prefix = "crypto_generichash_"^primitive - - let sz_query_type = F.(void @-> returning size_t) - - let hashbytes = F.foreign (prefix^"_bytes") sz_query_type - let hashbytesmin = F.foreign (prefix^"_bytes_min") sz_query_type - let hashbytesmax = F.foreign (prefix^"_bytes_max") sz_query_type - - let keybytes = F.foreign (prefix^"_keybytes") sz_query_type - let keybytesmin = F.foreign (prefix^"_keybytes_min") sz_query_type - let keybytesmax = F.foreign (prefix^"_keybytes_max") sz_query_type - - let init = F.(foreign (prefix^"_init") - ( ptr Type.Generichash.state - @-> ocaml_bytes - @-> size_t - @-> size_t - @-> returning int)) - - let final = F.(foreign (prefix^"_final") - ( ptr Type.Generichash.state - @-> ocaml_bytes - @-> size_t - @-> returning int)) - - module Make(T: Sodium_storage.S) = struct - let hash = F.(foreign (prefix) - ( ocaml_bytes (* uchar* out *) - @-> size_t (* size_t out_len *) - @-> T.ctype (* uchar* in *) - @-> ullong (* unsigned long long in_len *) - @-> ocaml_bytes (* uchar* key *) - @-> size_t (* size_t keylen *) - @-> returning int)) - - let update = F.(foreign (prefix^"_update") - ( ptr Type.Generichash.state - @-> T.ctype - @-> ullong - @-> returning int)) - end - end - -end diff --git a/src/external/ocaml-sodium/lib_gen/sodium_typegen.ml b/src/external/ocaml-sodium/lib_gen/sodium_typegen.ml deleted file mode 100644 index 335b5e73445..00000000000 --- a/src/external/ocaml-sodium/lib_gen/sodium_typegen.ml +++ /dev/null @@ -1,8 +0,0 @@ -open Ctypes - -let () = - let type_oc = open_out "lib_gen/sodium_types_detect.c" in - let fmt = Format.formatter_of_out_channel type_oc in - Format.fprintf fmt "#include @."; - Cstubs.Types.write_c fmt (module Sodium_types.C); - close_out type_oc; diff --git a/src/external/ocaml-sodium/lib_gen/sodium_types.ml b/src/external/ocaml-sodium/lib_gen/sodium_types.ml deleted file mode 100644 index 8c54fb28047..00000000000 --- a/src/external/ocaml-sodium/lib_gen/sodium_types.ml +++ /dev/null @@ -1,30 +0,0 @@ -(* - * Copyright (c) 2015 David Sheets - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -module Static = Ctypes_static - -module C(F: Cstubs.Types.TYPE) = struct - - module Generichash = struct - type state - let state : state Static.structure F.typ = - F.structure "crypto_generichash_blake2b_state" - - let () = F.seal state - end - -end diff --git a/src/external/ocaml-sodium/lib_test/_tags b/src/external/ocaml-sodium/lib_test/_tags deleted file mode 100644 index c9aee86a7d3..00000000000 --- a/src/external/ocaml-sodium/lib_test/_tags +++ /dev/null @@ -1 +0,0 @@ -<*.{ml,byte,native}>: debug, package(bigarray), package(bytes), package(ctypes.stubs), package(oUnit), use_sodium_stubs diff --git a/src/external/ocaml-sodium/lib_test/nacl_runner.c b/src/external/ocaml-sodium/lib_test/nacl_runner.c deleted file mode 100644 index 9e67e62fc67..00000000000 --- a/src/external/ocaml-sodium/lib_test/nacl_runner.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) 2013 David Sheets - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ - -// WARNING: THIS FUNCTIONAL TEST HARNESS IS NOT GENERALLY SAFE OR SECURE -// *** DO NOT USE EXCEPT IN SPECIAL TRUSTED ENVIRONMENTS *** - -#include -#include -#include -#include - -typedef unsigned char uchar; - -void bin2hex(char *hex,const uchar *bin,unsigned int blen) { - char *halpha = "0123456789abcdef"; - int i; - for (i=0; i> 4 ]; - hex[i*2 + 1] = halpha[ bin[i] & 15 ]; - } -} - -uchar hexc2uchar(uchar hexc) { - switch (hexc) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - return hexc - 0x30; - case 'A': case 'B': case 'C': - case 'D': case 'E': case 'F': - return hexc - 0x41 + 10; - case 'a': case 'b': case 'c': - case 'd': case 'e': case 'f': - return hexc - 0x61 + 10; - default: - fprintf(stderr,"'%c' not valid hex character\nexit(2)\n",hexc); exit(2); - } -} - -void hex2bin(uchar *bin,const char *hex,unsigned int hlen) { - int i; - for (i=0; i> 1 ] = (hexc2uchar(hex[i]) << 4) | hexc2uchar(hex[i + 1]); - } -} - -void box(int argc, char *argv[]) { - int r; - uchar n[crypto_box_NONCEBYTES], - pk[crypto_box_PUBLICKEYBYTES], - sk[crypto_box_SECRETKEYBYTES]; - size_t mlen = strlen(argv[0]) / 2 + crypto_box_ZEROBYTES; - size_t clen = mlen - crypto_box_BOXZEROBYTES; - uchar *m, *c; - char *h; - m = calloc(mlen, sizeof(uchar)); - c = calloc(mlen, sizeof(uchar)); - h = calloc(clen * 2 + 1, sizeof(char)); - - hex2bin(m + crypto_box_ZEROBYTES,argv[0],strlen(argv[0])); - hex2bin(n,argv[1],strlen(argv[1])); - hex2bin(pk,argv[2],strlen(argv[2])); - hex2bin(sk,argv[3],strlen(argv[3])); - - r = crypto_box(c,m,mlen,n,pk,sk); - - bin2hex(h,c + crypto_box_BOXZEROBYTES,clen); - h[ clen * 2 ] = 0; - - if (r == 0) printf("%s",h); - else fprintf(stderr,"error in crypto_box\n"); - - free(m); - free(c); - free(h); -} - -void box_open(int argc, char *argv[]) { - int r; - uchar n[crypto_box_NONCEBYTES], - pk[crypto_box_PUBLICKEYBYTES], - sk[crypto_box_SECRETKEYBYTES]; - size_t clen = strlen(argv[0]) / 2 + crypto_box_BOXZEROBYTES; - size_t mlen = clen - crypto_box_ZEROBYTES; - uchar *m, *c; - char *h; - m = calloc(clen, sizeof(uchar)); - c = calloc(clen, sizeof(uchar)); - h = calloc(mlen * 2 + 1, sizeof(char)); - - hex2bin(c + crypto_box_BOXZEROBYTES,argv[0],strlen(argv[0])); - hex2bin(n,argv[1],strlen(argv[1])); - hex2bin(pk,argv[2],strlen(argv[2])); - hex2bin(sk,argv[3],strlen(argv[3])); - - r = crypto_box_open(m,c,clen,n,pk,sk); - - bin2hex(h,m + crypto_box_ZEROBYTES,mlen); - h[ mlen * 2 ] = 0; - - if (r == 0) printf("%s",h); - else fprintf(stderr,"error in crypto_box_open\n"); - - free(m); - free(c); - free(h); -} - -void box_beforenm(int argc, char *argv[]) { - int r; - uchar k[crypto_box_BEFORENMBYTES], - pk[crypto_box_PUBLICKEYBYTES], - sk[crypto_box_SECRETKEYBYTES]; - char h[crypto_box_BEFORENMBYTES * 2 + 1]; - - hex2bin(pk,argv[0],strlen(argv[0])); - hex2bin(sk,argv[1],strlen(argv[1])); - - r = crypto_box_beforenm(k,pk,sk); - - bin2hex(h,k,crypto_box_BEFORENMBYTES); - h[ crypto_box_BEFORENMBYTES * 2 ] = 0; - - if (r == 0) printf("%s",h); - else fprintf(stderr,"error in crypto_box_beforenm\n"); -} - -void box_afternm(int argc, char *argv[]) { - int r; - uchar n[crypto_box_NONCEBYTES], - k[crypto_box_BEFORENMBYTES]; - size_t mlen = strlen(argv[0]) / 2 + crypto_box_ZEROBYTES; - size_t clen = mlen - crypto_box_BOXZEROBYTES; - uchar *m, *c; - char *h; - m = calloc(mlen, sizeof(uchar)); - c = calloc(mlen, sizeof(uchar)); - h = calloc(clen * 2 + 1, sizeof(char)); - - hex2bin(m + crypto_box_ZEROBYTES,argv[0],strlen(argv[0])); - hex2bin(n,argv[1],strlen(argv[1])); - hex2bin(k,argv[2],strlen(argv[2])); - - r = crypto_box_afternm(c,m,mlen,n,k); - - bin2hex(h,c + crypto_box_BOXZEROBYTES,clen); - h[ clen * 2 ] = 0; - - if (r == 0) printf("%s",h); - else fprintf(stderr,"error in crypto_box_afternm\n"); - - free(m); - free(c); - free(h); -} - -void box_open_afternm(int argc, char *argv[]) { - int r; - uchar n[crypto_box_NONCEBYTES], - k[crypto_box_BEFORENMBYTES]; - size_t clen = strlen(argv[0]) / 2 + crypto_box_BOXZEROBYTES; - size_t mlen = clen - crypto_box_ZEROBYTES; - uchar *m, *c; - char *h; - m = calloc(clen, sizeof(uchar)); - c = calloc(clen, sizeof(uchar)); - h = calloc(mlen * 2 + 1, sizeof(char)); - - hex2bin(c + crypto_box_BOXZEROBYTES,argv[0],strlen(argv[0])); - hex2bin(n,argv[1],strlen(argv[1])); - hex2bin(k,argv[2],strlen(argv[2])); - - r = crypto_box_open_afternm(m,c,clen,n,k); - - bin2hex(h,m + crypto_box_ZEROBYTES,mlen); - h[ mlen * 2 ] = 0; - - if (r == 0) printf("%s",h); - else fprintf(stderr,"error in crypto_box_open_afternm\n"); - - free(m); - free(c); - free(h); -} - -int main(int argc, char *argv[]) { - if (argc < 2) { fprintf(stderr,"must provide function\n"); exit(1); } - - if (strcmp(argv[1],"box")==0) box (argc,argv+2); - else if (strcmp(argv[1],"box_open")==0) box_open (argc,argv+2); - else if (strcmp(argv[1],"box_beforenm")==0) box_beforenm (argc,argv+2); - else if (strcmp(argv[1],"box_afternm")==0) box_afternm (argc,argv+2); - else if (strcmp(argv[1],"box_open_afternm")==0) box_open_afternm(argc,argv+2); - else { fprintf(stderr,"unknown function '%s'\nexit(1)\n",argv[1]); exit(1); } - - return 0; -} diff --git a/src/external/ocaml-sodium/lib_test/test_auth.ml b/src/external/ocaml-sodium/lib_test/test_auth.ml deleted file mode 100644 index 765f7bb29f4..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_auth.ml +++ /dev/null @@ -1,76 +0,0 @@ -(* - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 -open Sodium - -let add_byte b = Bytes.concat (Bytes.of_string "") [b; Bytes.of_string "\x00"] - -module Test(A: sig include module type of Auth val name : string end) = struct - let test_equal_keys ctxt = - let sk = Bytes.make (A.key_size) 'A' in - let sk' = Bytes.of_string ("B" ^ (String.make (A.key_size - 1) 'A')) in - let sk'' = Bytes.of_string ((String.make (A.key_size - 1) 'A') ^ "B") in - assert_bool "=" (A.equal_keys (A.Bytes.to_key sk) - (A.Bytes.to_key sk)); - assert_bool "<>" (not (A.equal_keys (A.Bytes.to_key sk) - (A.Bytes.to_key sk'))); - assert_bool "<>" (not (A.equal_keys (A.Bytes.to_key sk) - (A.Bytes.to_key sk''))) - - let test_permute ctxt = - let k = A.random_key () in - assert_raises (Size_mismatch (A.name^".to_key")) - (fun () -> (A.Bytes.to_key (add_byte (A.Bytes.of_key k)))); - assert_raises (Size_mismatch (A.name^".to_auth")) - (fun () -> (A.Bytes.to_auth (Bytes.of_string "\x00"))) - - let setup () = - A.random_key (), Bytes.of_string "wild wild fox" - - let test_auth_verify ctxt = - let k, msg = setup () in - let auth = A.Bytes.auth k msg in - A.Bytes.verify k auth msg - - let test_auth_verify_fail_permute ctxt = - let k, msg = setup () in - let auth = A.Bytes.auth k msg in - let auth = let s = A.Bytes.of_auth auth in Bytes.set s 10 'a'; A.Bytes.to_auth s in - assert_raises Verification_failure - (fun () -> A.Bytes.verify k auth msg) - - let test_auth_verify_fail_key ctxt = - let k, msg = setup () in - let auth = A.Bytes.auth k msg in - let k' = A.random_key () in - assert_raises Verification_failure - (fun () -> A.Bytes.verify k' auth msg) - - let suite = A.name >::: [ - "test_equal_keys" >:: test_equal_keys; - "test_permute" >:: test_permute; - "test_auth_verify" >:: test_auth_verify; - "test_auth_verify_fail_permute" >:: test_auth_verify_fail_permute; - "test_auth_verify_fail_key" >:: test_auth_verify_fail_key; - ] -end - -let suite = "*auth" >::: [ - (let module M = Test(struct include Auth let name = "Auth" end) in M.suite); - (let module M = Test(struct include One_time_auth let name = "One_time_auth" end) in M.suite); - ] diff --git a/src/external/ocaml-sodium/lib_test/test_box.ml b/src/external/ocaml-sodium/lib_test/test_box.ml deleted file mode 100644 index b562ff80f43..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_box.ml +++ /dev/null @@ -1,362 +0,0 @@ -(* - * Copyright (c) 2013 David Sheets - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 - -module type IO = sig - include Sodium.Box.S - - val ts : string -> storage - val st : storage -> string -end - -module Test(In : IO)(Out : IO) = struct - module Box = Sodium.Box - - let oi x = Out.ts (In.st x) - - let setup () = - (Box.random_keypair (), Box.random_keypair (), - "The rooster crows at midnight.", Box.random_nonce ()) - - let drop_byte s = String.sub s 0 ((String.length s)-1) - let add_byte s = s^"\000" - let inv_byte s = - let s = Bytes.of_string s in - Bytes.set s 0 (char_of_int (0xff lxor (int_of_char (Bytes.get s 0)))); - Bytes.to_string s - - let as_b fn = (fun b -> Bytes.of_string (fn (Bytes.to_string b))) - - let test_right_inverse ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - assert_equal message - (Out.st (Out.box_open sk' pk (oi (In.box sk pk' (In.ts message) nonce)) nonce)) - - let test_right_inverse_fail_sk ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let perturb_sk sk fn = - Box.Bytes.to_secret_key ((as_b fn) (Box.Bytes.of_secret_key sk)) in - assert_raises (Sodium.Size_mismatch "Box.to_secret_key") (fun () -> - Out.box_open (perturb_sk sk' drop_byte) pk - (oi (In.box sk pk' (In.ts message) nonce)) nonce); - assert_raises (Sodium.Size_mismatch "Box.to_secret_key") (fun () -> - Out.box_open (perturb_sk sk' add_byte) pk - (oi (In.box sk pk' (In.ts message) nonce)) nonce); - assert_raises Sodium.Verification_failure (fun () -> - Out.box_open (perturb_sk sk' inv_byte) pk - (oi (In.box sk pk' (In.ts message) nonce)) nonce); - () - - let test_right_inverse_fail_pk ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let perturb_pk pk fn = - Box.Bytes.to_public_key ((as_b fn) (Box.Bytes.of_public_key pk)) in - assert_raises (Sodium.Size_mismatch "Box.to_public_key") (fun () -> - Out.box_open sk' pk (oi (In.box sk (perturb_pk pk' drop_byte) - (In.ts message) nonce)) nonce); - assert_raises (Sodium.Size_mismatch "Box.to_public_key") (fun () -> - Out.box_open sk' pk (oi (In.box sk (perturb_pk pk' add_byte) - (In.ts message) nonce)) nonce); - assert_raises Sodium.Verification_failure (fun () -> - Out.box_open sk' pk (oi (In.box sk (perturb_pk pk' inv_byte) - (In.ts message) nonce)) nonce); - () - - let test_right_inverse_fail_ciphertext ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let perturb_ciphertext ct fn = - Out.ts (fn (In.st ct)) in - assert_raises Sodium.Verification_failure (fun () -> - Out.box_open sk' pk - (perturb_ciphertext (In.box sk pk' (In.ts message) nonce) drop_byte) nonce); - assert_raises Sodium.Verification_failure (fun () -> - Out.box_open sk' pk - (perturb_ciphertext (In.box sk pk' (In.ts message) nonce) add_byte) nonce); - assert_raises Sodium.Verification_failure (fun () -> - Out.box_open sk' pk - (perturb_ciphertext (In.box sk pk' (In.ts message) nonce) inv_byte) nonce); - () - - let test_right_inverse_fail_nonce ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let perturb_nonce n fn = - Box.Bytes.to_nonce ((as_b fn) (Box.Bytes.of_nonce n)) in - assert_raises (Sodium.Size_mismatch "Box.to_nonce") (fun () -> - Out.box_open sk' pk (oi (In.box sk pk' (In.ts message) nonce)) - (perturb_nonce nonce drop_byte)); - assert_raises (Sodium.Size_mismatch "Box.to_nonce") (fun () -> - Out.box_open sk' pk (oi (In.box sk pk' (In.ts message) nonce)) - (perturb_nonce nonce add_byte)); - assert_raises Sodium.Verification_failure (fun () -> - Out.box_open sk' pk (oi (In.box sk pk' (In.ts message) nonce)) - (perturb_nonce nonce inv_byte)); - () - - let test_channel_key_eq ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - assert_equal (Box.precompute sk pk') - (Box.precompute sk' pk) - - let test_right_inverse_channel_key ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let ck = Box.precompute sk pk' in - let ck'= Box.precompute sk' pk in - assert_equal message - (Out.st (Out.fast_box_open ck' - (oi (In.fast_box ck (In.ts message) nonce)) nonce)) - - let test_right_inverse_channel_key_fail ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let ck = Box.precompute sk pk' in - let ck'= Box.precompute sk' pk in - let perturb_ciphertext ct fn = - Out.ts (fn (In.st ct)) in - assert_raises Sodium.Verification_failure (fun () -> - Out.fast_box_open ck' - (perturb_ciphertext (In.fast_box ck (In.ts message) nonce) drop_byte) nonce); - assert_raises Sodium.Verification_failure (fun () -> - Out.fast_box_open ck' - (perturb_ciphertext (In.fast_box ck (In.ts message) nonce) add_byte) nonce); - assert_raises Sodium.Verification_failure (fun () -> - Out.fast_box_open ck' - (perturb_ciphertext (In.fast_box ck (In.ts message) nonce) inv_byte) nonce); - () - - let invariants = "invariants" >::: [ - "test_right_inverse" >:: test_right_inverse; - "test_right_inverse_fail_sk" >:: test_right_inverse_fail_sk; - "test_right_inverse_fail_pk" >:: test_right_inverse_fail_pk; - "test_right_inverse_fail_ciphertext" >:: test_right_inverse_fail_ciphertext; - "test_right_inverse_fail_nonce" >:: test_right_inverse_fail_nonce; - "test_channel_key_eq" >:: test_channel_key_eq; - "test_right_inverse_channel_key" >:: test_right_inverse_channel_key; - "test_right_inverse_channel_key_fail" >:: test_right_inverse_channel_key_fail; - ] - - let test_effective_wipe ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let ck = Box.precompute sk pk' in - let cct = oi (In.fast_box ck (In.ts message) nonce) in - let ct = oi (In.box sk pk' (In.ts message) nonce) in - assert_equal message (Out.st (Out.box_open sk' pk ct nonce)); - assert_equal message (Out.st (Out.fast_box_open ck cct nonce)); - Box.wipe_key sk'; - assert_raises Sodium.Verification_failure (fun () -> - assert_equal message (Out.st (Out.box_open sk' pk ct nonce))); - Box.wipe_key ck; - assert_raises Sodium.Verification_failure (fun () -> - assert_equal message (Out.st (Out.fast_box_open ck cct nonce))); - () - - let test_equal_public_keys ctxt = - let pk = Bytes.of_string (String.make (Box.public_key_size) 'A') in - let pk' = Bytes.of_string ("B" ^ (String.make (Box.public_key_size - 1) 'A')) in - let pk'' = Bytes.of_string ((String.make (Box.public_key_size - 1) 'A') ^ "B") in - assert_bool "=" (Box.equal_public_keys (Box.Bytes.to_public_key pk) - (Box.Bytes.to_public_key pk)); - assert_bool "<>" (not (Box.equal_public_keys (Box.Bytes.to_public_key pk) - (Box.Bytes.to_public_key pk'))); - assert_bool "<>" (not (Box.equal_public_keys (Box.Bytes.to_public_key pk) - (Box.Bytes.to_public_key pk''))); - () - - let test_equal_secret_keys ctxt = - let sk = Bytes.of_string (String.make (Box.secret_key_size) 'A') in - let sk' = Bytes.of_string ("B" ^ (String.make (Box.secret_key_size - 1) 'A')) in - let sk'' = Bytes.of_string ((String.make (Box.secret_key_size - 1) 'A') ^ "B") in - assert_bool "=" (Box.equal_secret_keys (Box.Bytes.to_secret_key sk) - (Box.Bytes.to_secret_key sk)); - assert_bool "<>" (not (Box.equal_secret_keys (Box.Bytes.to_secret_key sk) - (Box.Bytes.to_secret_key sk'))); - assert_bool "<>" (not (Box.equal_secret_keys (Box.Bytes.to_secret_key sk) - (Box.Bytes.to_secret_key sk''))); - () - - let test_equal_channel_keys ctxt = - let ck = Bytes.of_string (String.make (Box.channel_key_size) 'A') in - let ck' = Bytes.of_string ("B" ^ (String.make (Box.channel_key_size - 1) 'A')) in - let ck'' = Bytes.of_string ((String.make (Box.channel_key_size - 1) 'A') ^ "B") in - assert_bool "=" (Box.equal_channel_keys (Box.Bytes.to_channel_key ck) - (Box.Bytes.to_channel_key ck)); - assert_bool "<>" (not (Box.equal_channel_keys (Box.Bytes.to_channel_key ck) - (Box.Bytes.to_channel_key ck'))); - assert_bool "<>" (not (Box.equal_channel_keys (Box.Bytes.to_channel_key ck) - (Box.Bytes.to_channel_key ck''))); - () - - let test_compare_public_keys ctxt = - let pk = Bytes.of_string (String.make (Box.public_key_size) 'A') in - let pk' = Bytes.of_string ((String.make (Box.public_key_size - 1) 'A') ^ "0") in - let pk'' = Bytes.of_string ("B" ^ (String.make (Box.public_key_size - 1) 'A')) in - assert_equal 0 (Box.compare_public_keys (Box.Bytes.to_public_key pk) - (Box.Bytes.to_public_key pk)); - assert_equal 1 (Box.compare_public_keys (Box.Bytes.to_public_key pk) - (Box.Bytes.to_public_key pk')); - assert_equal (-1) (Box.compare_public_keys (Box.Bytes.to_public_key pk) - (Box.Bytes.to_public_key pk'')); - () - - let test_nonce_operations ctxt = - let n = Bytes.of_string (String.make Box.nonce_size '\x00') in - let n' = Bytes.of_string ((String.make (Box.nonce_size - 1) '\x00') ^ "\x01") in - let n'' = Bytes.of_string ((String.make (Box.nonce_size - 1) '\x00') ^ "\x02") in - let n''' = Bytes.of_string ((String.make (Box.nonce_size - 3) '\x00') ^ "\x02\x00\x00") in - let n'''' = Bytes.of_string (String.make Box.nonce_size '\xff') in - assert_bool "=" ((Box.nonce_of_bytes n) = (Box.nonce_of_bytes n)); - assert_bool "<>" ((Box.nonce_of_bytes n) <> (Box.nonce_of_bytes n')); - assert_raises (Sodium.Size_mismatch "Box.nonce_of_bytes") - (fun () -> Box.nonce_of_bytes ((as_b add_byte) n)); - assert_equal (Box.nonce_of_bytes n') - (Box.increment_nonce (Box.nonce_of_bytes n)); - assert_equal (Box.nonce_of_bytes n'') - (Box.increment_nonce ~step:2 (Box.nonce_of_bytes n)); - assert_equal (Box.nonce_of_bytes n''') - (Box.increment_nonce ~step:0x20000 (Box.nonce_of_bytes n)); - assert_equal (Box.nonce_of_bytes n'''') - (Box.increment_nonce ~step:(-1) (Box.nonce_of_bytes n)) - - let convenience = "convenience" >::: [ - "test_wipe" >:: test_effective_wipe; - "test_equal_public_keys" >:: test_equal_public_keys; - "test_equal_secret_keys" >:: test_equal_secret_keys; - "test_equal_channel_keys" >:: test_equal_channel_keys; - "test_compare_public_keys" >:: test_compare_public_keys; - "test_nonce_operations" >:: test_nonce_operations; - ] - - let rec hex_of_str = function - | "" -> "" - | s -> (Printf.sprintf "%02x" (int_of_char s.[0])) - ^(hex_of_str (String.sub s 1 ((String.length s) - 1))) - - let rec str_of_hex = function - | "" -> "" - | h -> Scanf.sscanf h "%2x" - (fun i -> (String.make 1 (char_of_int i)) - ^(str_of_hex (String.sub h 2 ((String.length h) - 2)))) - - let str_of_stream s = - let rec read p = - try read (p^(String.make 1 (Stream.next s))) - with Stream.Failure -> p - in read "" - - let check_nacl v out = assert_equal (str_of_hex (str_of_stream out)) v - - let nacl_runner = "_build/lib_test/nacl_runner" - let test_nacl_box ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let cs = In.st (In.box sk' pk (In.ts message) nonce) in - let args = [ - "box"; - hex_of_str message; - hex_of_str (Bytes.to_string (Box.Bytes.of_nonce nonce)); - hex_of_str (Bytes.to_string (Box.Bytes.of_public_key pk)); - hex_of_str (Bytes.to_string (Box.Bytes.of_secret_key sk')); - ] in - assert_command ~ctxt - ~foutput:(check_nacl cs) nacl_runner args - - let test_nacl_box_open ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let c = In.box sk' pk (In.ts message) nonce in - assert_command ~ctxt - ~foutput:(check_nacl (Out.st (Out.box_open sk pk' (oi c) nonce))) - nacl_runner - ["box_open"; - hex_of_str (In.st c); - hex_of_str (Bytes.to_string (Box.Bytes.of_nonce nonce)); - hex_of_str (Bytes.to_string (Box.Bytes.of_public_key pk')); - hex_of_str (Bytes.to_string (Box.Bytes.of_secret_key sk))] - - let test_nacl_box_beforenm ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - assert_command ~ctxt - ~foutput:(check_nacl (Bytes.to_string (Box.Bytes.of_channel_key (Box.precompute sk' pk)))) - nacl_runner - ["box_beforenm"; - hex_of_str (Bytes.to_string (Box.Bytes.of_public_key pk)); - hex_of_str (Bytes.to_string (Box.Bytes.of_secret_key sk'))] - - let test_nacl_box_afternm ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let ck = Box.precompute sk' pk in - assert_command ~ctxt - ~foutput:(check_nacl (Out.st (Out.fast_box ck (Out.ts message) nonce))) - nacl_runner - ["box_afternm"; - hex_of_str message; - hex_of_str (Bytes.to_string (Box.Bytes.of_nonce nonce)); - hex_of_str (Bytes.to_string (Box.Bytes.of_channel_key ck))] - - let test_nacl_box_open_afternm ctxt = - let ((sk,pk),(sk',pk'),message,nonce) = setup () in - let ck = Box.precompute sk' pk in - let c = In.fast_box ck (In.ts message) nonce in - assert_command ~ctxt - ~foutput:(check_nacl (Out.st (Out.fast_box_open ck (oi c) nonce))) - nacl_runner - ["box_open_afternm"; - hex_of_str (In.st c); - hex_of_str (Bytes.to_string (Box.Bytes.of_nonce nonce)); - hex_of_str (Bytes.to_string (Box.Bytes.of_channel_key ck))] - - let nacl = "nacl" >::: [ - "test_box" >:: test_nacl_box; - "test_box_open" >:: test_nacl_box_open; - "test_box_beforenm" >:: test_nacl_box_beforenm; - "test_box_afternm" >:: test_nacl_box_afternm; - "test_box_open_afternm" >:: test_nacl_box_open_afternm; - ] - - let suite = [ - invariants; - convenience; - nacl; - ] -end - -module IO_bigbytes = struct - include Sodium.Box.Bigbytes - - let ts s = - let len = String.length s in - let t = Bigarray.(Array1.create char c_layout len) in - for i = 0 to len - 1 do t.{i} <- s.[i] done; - t - let st t = - let len = Bigarray.Array1.dim t in - let b = Bytes.create len in - for i = 0 to len - 1 do Bytes.set b i t.{i} done; - Bytes.to_string b -end - -module IO_bytes = struct - include Sodium.Box.Bytes - - let ts s = Bytes.of_string s - let st t = Bytes.to_string t -end - -let suite = "Box" >::: [ - "Bytes -> Bytes" >::: (let module M = Test(IO_bytes)(IO_bytes) in M.suite); - "Bigbytes -> Bytes" >::: (let module M = Test(IO_bigbytes)(IO_bytes) in M.suite); - "Bytes -> Bigbytes" >::: (let module M = Test(IO_bytes)(IO_bigbytes) in M.suite); - "Bigbytes -> Bigbytes" >::: (let module M = Test(IO_bigbytes)(IO_bigbytes) in M.suite); - ] diff --git a/src/external/ocaml-sodium/lib_test/test_generichash.ml b/src/external/ocaml-sodium/lib_test/test_generichash.ml deleted file mode 100644 index eac0c43d727..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_generichash.ml +++ /dev/null @@ -1,146 +0,0 @@ -(* - * Copyright (c) 2014 Peter Zotov - * Copyright (c) 2015 David Sheets - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 -open Sodium - -let add_byte b = Bytes.concat (Bytes.of_string "") [b; Bytes.of_string "\x00"] - -let message = Bytes.of_string "The quick brown fox jumps over the lazy dog" - -let test_digest ctxt = - assert (Generichash.primitive = "blake2b"); - let hash = Generichash.Bytes.digest message in - let hash' = "\001q\140\2365\205=ym\208\000 \224\191\236\180s\173#E}"^ - "\006;u\239\242\156\015\250.X\169" in - assert_equal (Bytes.of_string hash') (Generichash.Bytes.of_hash hash); - let hash = Generichash.(Bytes.digest ~size:size_min message) in - let hash' = "$\157\249\164\159Q}\220\211\127\\\137v \236s" in - assert_equal (Bytes.of_string hash') (Generichash.Bytes.of_hash hash); - let hash = Generichash.(Bytes.digest ~size:size_max message) in - let hash' = "\168\173\212\189\221\253\147\228\135}'F\230(\023\177"^ - "\0226J\031\167\188\020\141\149\t\011\1993;6s\248$\001"^ - "\207z\162\228\203\030\205\144)n?\020\203T\019\248\237"^ - "w\190s\004[\019\145L\220\214\169\024" in - assert_equal (Bytes.of_string hash') (Generichash.Bytes.of_hash hash); - - let key = Generichash.Bytes.to_key (Bytes.of_string "SUPER SECRET KEY") in - let hash = Generichash.Bytes.digest_with_key key message in - let hash' = "\174m\018\173\1916\138\b`\227,\184QS\178 ZT\004\213\216"^ - "\171\227\152\ty\127\158\139\166\206\240" in - assert_equal (Bytes.of_string hash') (Generichash.Bytes.of_hash hash); - - let key = Generichash.Bytes.to_key (Bytes.of_string "DUPER SECRET KEY") in - let hash = Generichash.Bytes.digest_with_key key message in - let hash' = "C\2120-\239R\003\243\233X\207M\187\242\244?\164\130\219"^ - ">\206QTR\031\230\188\252\167\027%\136" in - assert_equal (Bytes.of_string hash') (Generichash.Bytes.of_hash hash) - -let test_serialize ctxt = - let hash = Generichash.Bytes.digest message in - assert_equal (Generichash.Bytes.to_hash (Generichash.Bytes.of_hash hash)) hash; - assert_equal - (Generichash.Bigbytes.to_hash (Generichash.Bigbytes.of_hash hash)) hash - -let test_equal ctxt = - let size = Generichash.size_default in - let h = Bytes.of_string (String.make size 'A') in - let h' = Bytes.of_string ("B" ^ (String.make (size - 1) 'A')) in - let h'' = Bytes.of_string ((String.make (size - 1) 'A') ^ "B") in - assert_bool "=" (0 = Generichash.compare - (Generichash.Bytes.to_hash h) - (Generichash.Bytes.to_hash h)); - assert_bool "<>" (0 <> Generichash.compare - (Generichash.Bytes.to_hash h) - (Generichash.Bytes.to_hash h')); - assert_bool "<>" (0 <> Generichash.compare - (Generichash.Bytes.to_hash h) - (Generichash.Bytes.to_hash h'')) - -let test_exn ctxt = - let too_small = Bytes.create (Generichash.size_min - 1) in - assert_raises (Size_mismatch "Generichash.to_hash") - (fun () -> Generichash.Bytes.to_hash too_small); - let too_big = Bytes.create (Generichash.size_max + 1) in - assert_raises (Size_mismatch "Generichash.to_hash") - (fun () -> Generichash.Bytes.to_hash too_big); - let too_small = Bytes.create (Generichash.key_size_min - 1) in - assert_raises (Size_mismatch "Generichash.to_key") - (fun () -> Generichash.Bytes.to_key too_small); - let too_big = Bytes.create (Generichash.key_size_max + 1) in - assert_raises (Size_mismatch "Generichash.to_key") - (fun () -> Generichash.Bytes.to_key too_big); - assert_raises (Size_mismatch "Generichash.init") - (fun () -> Generichash.(init ~size:(size_min - 1) ())); - assert_raises (Size_mismatch "Generichash.init") - (fun () -> Generichash.(init ~size:(size_max + 1) ())) - -let test_streaming ctxt = - let empty = Bytes.of_string "" in - - let direct_hash = Generichash.Bytes.digest empty in - let state = Generichash.init () in - let staged_hash = Generichash.final state in - assert_bool "simple staged" (0 = Generichash.compare direct_hash staged_hash); - - let key = Generichash.Bytes.to_key (Bytes.of_string "SUPER SECRET KEY") in - let direct_hash = Generichash.Bytes.digest_with_key key empty in - let state = Generichash.init ~key () in - let staged_hash = Generichash.final state in - assert_bool "keyed staged" (0 = Generichash.compare direct_hash staged_hash); - - assert_raises (Already_finalized "Generichash.final") - (fun () -> Generichash.final state); - - assert_raises (Already_finalized "Generichash.update") - (fun () -> Generichash.Bytes.update state (Bytes.of_string "lalala")); - - let direct_hash = Generichash.(Bytes.digest ~size:size_max empty) in - let state = Generichash.(init ~size:size_max ()) in - let staged_hash = Generichash.final state in - assert_bool "size_max staged" - (0 = Generichash.compare direct_hash staged_hash); - - let direct_hash = Generichash.(Bytes.digest message) in - let state = Generichash.init () in - let () = Generichash.Bytes.update state message in - let staged_hash = Generichash.final state in - assert_bool "message staged" - (0 = Generichash.compare direct_hash staged_hash); - - let hstate = Generichash.init () in - let hello = Bytes.of_string "hello" in - let () = Generichash.Bytes.update hstate hello in - let hwstate = Generichash.copy hstate in - let world = Bytes.of_string " world" in - let hello_world = Bytes.cat hello world in - let () = Generichash.Bytes.update hwstate world in - let h = Generichash.final hstate in - let hw = Generichash.final hwstate in - assert_bool "copy stream 1" - (0 = Generichash.compare (Generichash.Bytes.digest hello) h); - assert_bool "copy stream 2" - (0 = Generichash.compare (Generichash.Bytes.digest hello_world) hw) - -let suite = "Generichash" >::: [ - "test_digest" >:: test_digest; - "test_serialize" >:: test_serialize; - "test_equal" >:: test_equal; - "test_exn" >:: test_exn; - "test_streaming" >:: test_streaming; - ] diff --git a/src/external/ocaml-sodium/lib_test/test_hash.ml b/src/external/ocaml-sodium/lib_test/test_hash.ml deleted file mode 100644 index 8ff22f75c25..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_hash.ml +++ /dev/null @@ -1,58 +0,0 @@ -(* - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 -open Sodium - -let add_byte b = Bytes.concat (Bytes.of_string "") [b; Bytes.of_string "\x00"] - -let test_digest ctxt = - assert (Hash.primitive = "sha512"); - let hash = Hash.Bytes.digest (Bytes.of_string "The quick brown fox jumps over the lazy dog") in - let hash' = "\x07\xe5\x47\xd9\x58\x6f\x6a\x73\xf7\x3f\xba\xc0\x43\x5e\xd7\x69\x51"^ - "\x21\x8f\xb7\xd0\xc8\xd7\x88\xa3\x09\xd7\x85\x43\x6b\xbb\x64\x2e\x93"^ - "\xa2\x52\xa9\x54\xf2\x39\x12\x54\x7d\x1e\x8a\x3b\x5e\xd6\xe1\xbf\xd7"^ - "\x09\x78\x21\x23\x3f\xa0\x53\x8f\x3d\xb8\x54\xfe\xe6" in - assert_equal (Bytes.of_string hash') (Hash.Bytes.of_hash hash) - -let test_serialize ctxt = - let hash = Hash.Bytes.digest (Bytes.of_string "The quick brown fox jumps over the lazy dog") in - assert_equal (Hash.Bytes.to_hash (Hash.Bytes.of_hash hash)) hash; - assert_equal (Hash.Bigbytes.to_hash (Hash.Bigbytes.of_hash hash)) hash - -let test_equal ctxt = - let h = Bytes.of_string (String.make (Hash.size) 'A') in - let h' = Bytes.of_string ("B" ^ (String.make (Hash.size - 1) 'A')) in - let h'' = Bytes.of_string ((String.make (Hash.size - 1) 'A') ^ "B") in - assert_bool "=" (Hash.equal (Hash.Bytes.to_hash h) - (Hash.Bytes.to_hash h)); - assert_bool "<>" (not (Hash.equal (Hash.Bytes.to_hash h) - (Hash.Bytes.to_hash h'))); - assert_bool "<>" (not (Hash.equal (Hash.Bytes.to_hash h) - (Hash.Bytes.to_hash h''))) - -let test_permute ctxt = - let hash = Hash.Bytes.digest (Bytes.of_string "The quick brown fox jumps over the lazy dog") in - assert_raises (Size_mismatch "Hash.to_hash") - (fun () -> (Hash.Bytes.to_hash (add_byte (Hash.Bytes.of_hash hash)))) - -let suite = "Hash" >::: [ - "test_digest" >:: test_digest; - "test_serialize" >:: test_serialize; - "test_equal" >:: test_equal; - "test_permute" >:: test_permute; - ] diff --git a/src/external/ocaml-sodium/lib_test/test_password_hash.ml b/src/external/ocaml-sodium/lib_test/test_password_hash.ml deleted file mode 100644 index 914f3baf2ae..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_password_hash.ml +++ /dev/null @@ -1,58 +0,0 @@ -(* - * Copyright (c) 2016 Benjamin Canou - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 -open Sodium - -let password str = - Password_hash.Bytes.wipe_to_password (Bytes.of_string str) - -let test_derive_secret_box_keys ctxt = - let pw = password "Correct Horse Battery Staple" in - let pw' = password "Correct Battery Horse Staple" in - let n = Password_hash.random_salt () in - let n' = Password_hash.random_salt () in - let derive_interactive = Secret_box.derive_key Password_hash.interactive in - let derive_moderate = Secret_box.derive_key Password_hash.moderate in - let sk = derive_interactive pw n in - let sk2 = derive_interactive pw n in - let sk' = derive_interactive pw n' in - let sk'2 = derive_interactive pw n' in - let sk'' = derive_moderate pw n in - let sk''2 = derive_moderate pw n in - let sk''' = derive_interactive pw' n in - let sk'''2 = derive_interactive pw' n in - assert_bool "=" (Secret_box.equal_keys sk sk); - assert_bool "=" (Secret_box.equal_keys sk sk2); - assert_bool "=" (Secret_box.equal_keys sk' sk'2); - assert_bool "=" (Secret_box.equal_keys sk'' sk''2); - assert_bool "=" (Secret_box.equal_keys sk''' sk'''2); - assert_bool "<>" (not (Secret_box.equal_keys sk sk')); - assert_bool "<>" (not (Secret_box.equal_keys sk sk'')); - assert_bool "<>" (not (Secret_box.equal_keys sk sk''')) - -let test_password_hashing ctxt = - let pw = password "Correct Horse Battery Staple" in - let pw' = password "Correct Battery Horse Staple" in - let h = Password_hash.Bytes.hash_password Password_hash.interactive pw in - assert_bool "=" (Password_hash.Bytes.verify_password_hash h pw); - assert_bool "<>" (not (Password_hash.Bytes.verify_password_hash h pw')) - -let suite = "Password_hash" >::: [ - "test_password_hashing" >:: test_password_hashing; - "test_derive_secret_box_keys" >:: test_derive_secret_box_keys; - ] diff --git a/src/external/ocaml-sodium/lib_test/test_random.ml b/src/external/ocaml-sodium/lib_test/test_random.ml deleted file mode 100644 index 6a58df002f4..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_random.ml +++ /dev/null @@ -1,46 +0,0 @@ -(* - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 - -let test_stir ctxt = - Sodium.Random.stir () - -let test_generate ctxt = - let rnd = Sodium.Random.Bytes.generate 42 in - assert_equal ~printer:string_of_int 42 (Bytes.length rnd); - - let rnd = Sodium.Random.Bigbytes.generate 42 in - assert_equal ~printer:string_of_int 42 (Bigarray.Array1.dim rnd) - -let test_generate_into ctxt = - let str = Bytes.of_string "AAAABBBB" in - Sodium.Random.Bytes.generate_into str; - assert_bool "changes contents" ((Bytes.of_string "AAAABBBB") <> str); - - let arr = Bigarray.(Array1.create char c_layout 10) in - Bigarray.Array1.fill arr 'A'; - let arr' = Bigarray.(Array1.create char c_layout 10) in - Bigarray.Array1.blit arr arr'; - Sodium.Random.Bigbytes.generate_into arr'; - assert_bool "changes contents" (arr <> arr') - -let suite = "Random" >::: [ - "test_stir" >:: test_stir; - "test_generate" >:: test_generate; - "test_generate_into" >:: test_generate_into; - ] diff --git a/src/external/ocaml-sodium/lib_test/test_scalar_mult.ml b/src/external/ocaml-sodium/lib_test/test_scalar_mult.ml deleted file mode 100644 index d8e149c5abd..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_scalar_mult.ml +++ /dev/null @@ -1,130 +0,0 @@ -(* Derived from: - * https://chromium.googlesource.com/experimental/chromium/src/+/lkgr/crypto/curve25519_unittest.cc - * - * Original license: - * - * Copyright 2014 The Chromium Authors. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - *) - -open OUnit2 -open Sodium - -(* Test that the basic shared key exchange identity holds: that both zkapp_command end - up with the same shared key. This test starts with a fixed private key for - two zkapp_command: alice and bob. Runs ScalarBaseMult and ScalarMult to compute - public key and shared key for alice and bob. It asserts that alice and bob - have the same shared key. *) -let test_scalarmult ctxt = - assert (Scalar_mult.primitive = "curve25519") ; - - let sk = - "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - ^ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - ^ "\x00\x00\x00\x00\x00\x00\x00\x00" - in - let sk = Scalar_mult.Bytes.to_integer (Bytes.of_string sk) in - let sk' = - "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - ^ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - ^ "\x00\x00\x00\x00\x00\x00\x00\x00" - in - let sk' = Scalar_mult.Bytes.to_integer (Bytes.of_string sk') in - (* Get public key for alice and bob. *) - let pk = Scalar_mult.base sk in - let pk' = Scalar_mult.base sk' in - (* Get the shared key for alice, by using alice's private key and bob's - public key. *) - let ck = Scalar_mult.mult sk' pk in - (* Get the shared key for bob, by using bob's private key and alice's public - key. *) - let ck' = Scalar_mult.mult sk pk' in - (* Computed shared key of alice and bob should be the same. *) - assert_equal - ~printer:(fun g -> - Printf.sprintf "%S" (Bytes.to_string (Scalar_mult.Bytes.of_group_elt g)) - ) - ck ck' ; - () - -let test_permute ctxt = - assert_raises (Size_mismatch "Scalar_mult.to_integer") (fun () -> - Scalar_mult.Bytes.to_integer (Bytes.of_string "\x03") ) ; - assert_raises (Size_mismatch "Scalar_mult.to_group_elt") (fun () -> - Scalar_mult.Bytes.to_group_elt (Bytes.of_string "\x03") ) - -let test_equal ctxt = - let sk = Bytes.of_string (String.make Scalar_mult.integer_size 'A') in - let sk' = - Bytes.of_string ("B" ^ String.make (Scalar_mult.integer_size - 1) 'A') - in - let sk'' = - Bytes.of_string (String.make (Scalar_mult.integer_size - 1) 'A' ^ "B") - in - assert_bool "=" - (Scalar_mult.equal_integer - (Scalar_mult.Bytes.to_integer sk) - (Scalar_mult.Bytes.to_integer sk) ) ; - assert_bool "<>" - (not - (Scalar_mult.equal_integer - (Scalar_mult.Bytes.to_integer sk) - (Scalar_mult.Bytes.to_integer sk') ) ) ; - assert_bool "<>" - (not - (Scalar_mult.equal_integer - (Scalar_mult.Bytes.to_integer sk) - (Scalar_mult.Bytes.to_integer sk'') ) ) ; - let pk = Bytes.of_string (String.make Scalar_mult.group_elt_size 'A') in - let pk' = - Bytes.of_string ("B" ^ String.make (Scalar_mult.group_elt_size - 1) 'A') - in - let pk'' = - Bytes.of_string (String.make (Scalar_mult.group_elt_size - 1) 'A' ^ "B") - in - assert_bool "=" - (Scalar_mult.equal_group_elt - (Scalar_mult.Bytes.to_group_elt pk) - (Scalar_mult.Bytes.to_group_elt pk) ) ; - assert_bool "<>" - (not - (Scalar_mult.equal_group_elt - (Scalar_mult.Bytes.to_group_elt pk) - (Scalar_mult.Bytes.to_group_elt pk') ) ) ; - assert_bool "<>" - (not - (Scalar_mult.equal_group_elt - (Scalar_mult.Bytes.to_group_elt pk) - (Scalar_mult.Bytes.to_group_elt pk'') ) ) - -let suite = - "Scalarmult" - >::: [ "test_scalarmult" >:: test_scalarmult - ; "test_permute" >:: test_permute - ; "test_equal" >:: test_equal - ] diff --git a/src/external/ocaml-sodium/lib_test/test_secret_box.ml b/src/external/ocaml-sodium/lib_test/test_secret_box.ml deleted file mode 100644 index 66e702c13ed..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_secret_box.ml +++ /dev/null @@ -1,88 +0,0 @@ -(* - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 -open Sodium - -let add_byte b = Bytes.concat (Bytes.of_string "") [b; Bytes.of_string "\x00"] - -let test_equal_keys ctxt = - let sk = Bytes.of_string (String.make (Secret_box.key_size) 'A') in - let sk' = Bytes.of_string ("B" ^ (String.make (Secret_box.key_size - 1) 'A')) in - let sk'' = Bytes.of_string ((String.make (Secret_box.key_size - 1) 'A') ^ "B") in - assert_bool "=" (Secret_box.equal_keys (Secret_box.Bytes.to_key sk) - (Secret_box.Bytes.to_key sk)); - assert_bool "<>" (not (Secret_box.equal_keys (Secret_box.Bytes.to_key sk) - (Secret_box.Bytes.to_key sk'))); - assert_bool "<>" (not (Secret_box.equal_keys (Secret_box.Bytes.to_key sk) - (Secret_box.Bytes.to_key sk''))) - -let test_permute ctxt = - let k = Secret_box.random_key () in - assert_raises (Size_mismatch "Secret_box.to_key") - (fun () -> (Secret_box.Bytes.to_key (add_byte (Secret_box.Bytes.of_key k)))) - -let test_nonce_operations ctxt = - let n = Bytes.of_string (String.make Secret_box.nonce_size '\x00') in - let n' = Bytes.of_string ((String.make (Secret_box.nonce_size - 1) '\x00') ^ "\x01") in - let n'' = Bytes.of_string ((String.make (Secret_box.nonce_size - 1) '\x00') ^ "\x02") in - let n''' = Bytes.of_string ((String.make (Secret_box.nonce_size - 3) '\x00') ^ "\x02\x00\x00") in - let n'''' = Bytes.of_string (String.make Secret_box.nonce_size '\xff') in - assert_bool "=" ((Secret_box.nonce_of_bytes n) = (Secret_box.nonce_of_bytes n)); - assert_bool "<>" ((Secret_box.nonce_of_bytes n) <> (Secret_box.nonce_of_bytes n')); - assert_raises (Sodium.Size_mismatch "Secret_box.nonce_of_bytes") - (fun () -> Secret_box.nonce_of_bytes (add_byte n)); - assert_equal (Secret_box.nonce_of_bytes n') - (Secret_box.increment_nonce (Secret_box.nonce_of_bytes n)); - assert_equal (Secret_box.nonce_of_bytes n'') - (Secret_box.increment_nonce ~step:2 (Secret_box.nonce_of_bytes n)); - assert_equal (Secret_box.nonce_of_bytes n''') - (Secret_box.increment_nonce ~step:0x20000 (Secret_box.nonce_of_bytes n)); - assert_equal (Secret_box.nonce_of_bytes n'''') - (Secret_box.increment_nonce ~step:(-1) (Secret_box.nonce_of_bytes n)) - -let setup () = - Secret_box.random_key (), Bytes.of_string "wild wild fox", Secret_box.random_nonce () - -let test_secret_box ctxt = - let k, msg, nonce = setup () in - let cmsg = Secret_box.Bytes.secret_box k msg nonce in - let msg' = Secret_box.Bytes.secret_box_open k cmsg nonce in - assert_equal msg msg' - -let test_secret_box_fail_permute ctxt = - let k, msg, nonce = setup () in - let cmsg = Secret_box.Bytes.secret_box k msg nonce in - Bytes.set cmsg 10 'a'; - assert_raises Verification_failure - (fun () -> ignore (Secret_box.Bytes.secret_box_open k cmsg nonce)) - -let test_secret_box_fail_key ctxt = - let k, msg, nonce = setup () in - let k' = Secret_box.random_key () in - let cmsg = Secret_box.Bytes.secret_box k msg nonce in - assert_raises Verification_failure - (fun () -> ignore (Secret_box.Bytes.secret_box_open k' cmsg nonce)) - -let suite = "Secret_box" >::: [ - "test_equal_keys" >:: test_equal_keys; - "test_nonce_operations" >:: test_nonce_operations; - "test_permute" >:: test_permute; - "test_secret_box" >:: test_secret_box; - "test_secret_box_fail_permute" >:: test_secret_box_fail_permute; - "test_secret_box_fail_key" >:: test_secret_box_fail_key; - ] diff --git a/src/external/ocaml-sodium/lib_test/test_sign.ml b/src/external/ocaml-sodium/lib_test/test_sign.ml deleted file mode 100644 index 59d11b13e34..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_sign.ml +++ /dev/null @@ -1,157 +0,0 @@ -(* - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 -open Sodium - -let add_byte b = Bytes.concat (Bytes.of_string "") [b; Bytes.of_string "\x00"] - -let test_equal_public_keys ctxt = - let pk = Bytes.of_string (String.make (Sign.public_key_size) 'A') in - let pk' = Bytes.of_string ("B" ^ (String.make (Sign.public_key_size - 1) 'A')) in - let pk'' = Bytes.of_string ((String.make (Sign.public_key_size - 1) 'A') ^ "B") in - assert_bool "=" (Sign.equal_public_keys (Sign.Bytes.to_public_key pk) - (Sign.Bytes.to_public_key pk)); - assert_bool "<>" (not (Sign.equal_public_keys (Sign.Bytes.to_public_key pk) - (Sign.Bytes.to_public_key pk'))); - assert_bool "<>" (not (Sign.equal_public_keys (Sign.Bytes.to_public_key pk) - (Sign.Bytes.to_public_key pk''))) - -let test_equal_secret_keys ctxt = - let sk = Bytes.of_string (String.make (Sign.secret_key_size) 'A') in - let sk' = Bytes.of_string ("B" ^ (String.make (Sign.secret_key_size - 1) 'A')) in - let sk'' = Bytes.of_string ((String.make (Sign.secret_key_size - 1) 'A') ^ "B") in - assert_bool "=" (Sign.equal_secret_keys (Sign.Bytes.to_secret_key sk) - (Sign.Bytes.to_secret_key sk)); - assert_bool "<>" (not (Sign.equal_secret_keys (Sign.Bytes.to_secret_key sk) - (Sign.Bytes.to_secret_key sk'))); - assert_bool "<>" (not (Sign.equal_secret_keys (Sign.Bytes.to_secret_key sk) - (Sign.Bytes.to_secret_key sk''))) - -let test_compare_public_keys ctxt = - let pk = Bytes.of_string (String.make (Sign.public_key_size) 'A') in - let pk' = Bytes.of_string ((String.make (Sign.public_key_size - 1) 'A') ^ "0") in - let pk'' = Bytes.of_string ("B" ^ (String.make (Sign.public_key_size - 1) 'A')) in - assert_equal 0 (Sign.compare_public_keys (Sign.Bytes.to_public_key pk) - (Sign.Bytes.to_public_key pk)); - assert_equal 1 (Sign.compare_public_keys (Sign.Bytes.to_public_key pk) - (Sign.Bytes.to_public_key pk')); - assert_equal (-1) (Sign.compare_public_keys (Sign.Bytes.to_public_key pk) - (Sign.Bytes.to_public_key pk'')); - () - -let test_permute ctxt = - let (sk, pk) = Sign.random_keypair () in - assert_raises (Size_mismatch "Sign.to_public_key") - (fun () -> (Sign.Bytes.to_public_key (add_byte (Sign.Bytes.of_public_key pk)))); - assert_raises (Size_mismatch "Sign.to_secret_key") - (fun () -> (Sign.Bytes.to_secret_key (add_byte (Sign.Bytes.of_secret_key sk)))) - -let secret_message = - Bytes.of_string "The cock flies with a mistaken DMCA takedown notice." - -let setup () = - Sign.random_keypair (), secret_message - -let test_sign ctxt = - let (sk, pk), msg = setup () in - let smsg = Sign.Bytes.sign sk msg in - let msg' = Sign.Bytes.sign_open pk smsg in - assert_equal msg msg' - -let test_sign_fail_permute ctxt = - let (sk, pk), msg = setup () in - let smsg = Sign.Bytes.sign sk msg in - Bytes.set smsg 10 'a'; - assert_raises Verification_failure - (fun () -> ignore (Sign.Bytes.sign_open pk smsg)) - -let test_sign_fail_key ctxt = - let (sk, pk), msg = setup () in - let (sk',pk') = Sign.random_keypair () in - let smsg = Sign.Bytes.sign sk msg in - assert_raises Verification_failure - (fun () -> ignore (Sign.Bytes.sign_open pk' smsg)) - -let test_sign_detached ctxt = - let (sk, pk), msg = setup () in - let sign = Sign.Bytes.sign_detached sk msg in - Sign.Bytes.verify pk sign msg - -let test_sign_detached_fail_permute ctxt = - let (sk, pk), msg = setup () in - let sign = Sign.Bytes.sign_detached sk msg in - let sign' = Sign.Bytes.of_signature sign in - Bytes.set sign' 10 'a'; - let sign = Sign.Bytes.to_signature sign' in - assert_raises Verification_failure - (fun () -> ignore (Sign.Bytes.verify pk sign msg)) - -let test_sign_detached_fail_permute_msg ctxt = - let (sk, pk), msg = setup () in - let sign = Sign.Bytes.sign_detached sk msg in - Bytes.set msg 10 'a'; - assert_raises Verification_failure - (fun () -> ignore (Sign.Bytes.verify pk sign msg)) - -let test_sign_detached_fail_key ctxt = - let (sk, pk), msg = setup () in - let (sk',pk') = Sign.random_keypair () in - let sign = Sign.Bytes.sign_detached sk msg in - assert_raises Verification_failure - (fun () -> ignore (Sign.Bytes.verify pk' sign msg)) - -let test_box_keypair ctxt = - let (sk, pk), msg = setup () in - let (sk', pk'), _ = setup () in - let (bsk, bpk) = Sign.box_keypair (sk, pk) in - let bsk' = Sign.box_secret_key sk' in - let bpk' = Sign.box_public_key pk' in - let nonce = Box.random_nonce () in - let cmsg = Box.Bytes.box bsk bpk' msg nonce in - let msg' = Box.Bytes.box_open bsk' bpk cmsg nonce in - assert_equal msg msg' - -let test_sign_seed ctxt = - let seed_str = Random.Bytes.generate Sign.seed_size in - let seed = Sign.Bytes.to_seed seed_str in - let (sk, pk) = Sign.seed_keypair seed in - (* In actual use, we would probably zero both seed values here. *) - let smsg = Sign.Bytes.sign sk secret_message in - let msg' = Sign.Bytes.sign_open pk smsg in - assert_equal secret_message msg'; - let seed' = Sign.secret_key_to_seed sk in - let seed_str' = Sign.Bytes.of_seed seed' in - assert_equal seed_str seed_str'; - let pk' = Sign.secret_key_to_public_key sk in - assert_bool "=" (Sign.equal_public_keys pk pk') - -let suite = "Sign" >::: [ - "test_equal_public_keys" >:: test_equal_public_keys; - "test_equal_secret_keys" >:: test_equal_secret_keys; - "test_compare_public_keys" >:: test_compare_public_keys; - "test_permute" >:: test_permute; - "test_sign" >:: test_sign; - "test_sign_fail_permute" >:: test_sign_fail_permute; - "test_sign_fail_key" >:: test_sign_fail_key; - "test_sign_detached" >:: test_sign_detached; - "test_sign_detached_fail_permute" >:: test_sign_detached_fail_permute; - "test_sign_detached_fail_permute_msg" >:: test_sign_detached_fail_permute_msg; - "test_sign_detached_fail_key" >:: test_sign_detached_fail_key; - "test_box_keypair" >:: test_box_keypair; - "test_sign_seed" >:: test_sign_seed; - ] diff --git a/src/external/ocaml-sodium/lib_test/test_sodium.ml b/src/external/ocaml-sodium/lib_test/test_sodium.ml deleted file mode 100644 index 3909914f1b2..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_sodium.ml +++ /dev/null @@ -1,34 +0,0 @@ -(* - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 - -let suite = "Sodium" >::: [ - Test_random.suite; - Test_box.suite; - Test_scalar_mult.suite; - Test_sign.suite; - Test_password_hash.suite; - Test_secret_box.suite; - Test_stream.suite; - Test_auth.suite; - Test_hash.suite; - Test_generichash.suite; - ] - -let _ = - run_test_tt_main suite diff --git a/src/external/ocaml-sodium/lib_test/test_stream.ml b/src/external/ocaml-sodium/lib_test/test_stream.ml deleted file mode 100644 index ea248747042..00000000000 --- a/src/external/ocaml-sodium/lib_test/test_stream.ml +++ /dev/null @@ -1,80 +0,0 @@ -(* - * Copyright (c) 2014 Peter Zotov - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - *) - -open OUnit2 -open Sodium - -let add_byte b = Bytes.concat (Bytes.of_string "") [b; Bytes.of_string "\x00"] - -let test_equal_keys ctxt = - let sk = Bytes.of_string (String.make (Stream.key_size) 'A') in - let sk' = Bytes.of_string ("B" ^ (String.make (Stream.key_size - 1) 'A')) in - let sk'' = Bytes.of_string ((String.make (Stream.key_size - 1) 'A') ^ "B") in - assert_bool "=" (Stream.equal_keys (Stream.Bytes.to_key sk) - (Stream.Bytes.to_key sk)); - assert_bool "<>" (not (Stream.equal_keys (Stream.Bytes.to_key sk) - (Stream.Bytes.to_key sk'))); - assert_bool "<>" (not (Stream.equal_keys (Stream.Bytes.to_key sk) - (Stream.Bytes.to_key sk''))) - -let test_permute ctxt = - let k = Stream.random_key () in - assert_raises (Size_mismatch "Stream.to_key") - (fun () -> (Stream.Bytes.to_key (add_byte (Stream.Bytes.of_key k)))) - -let test_nonce_operations ctxt = - let n = Bytes.of_string (String.make Stream.nonce_size '\x00') in - let n' = Bytes.of_string ((String.make (Stream.nonce_size - 1) '\x00') ^ "\x01") in - let n'' = Bytes.of_string ((String.make (Stream.nonce_size - 1) '\x00') ^ "\x02") in - let n''' = Bytes.of_string ((String.make (Stream.nonce_size - 3) '\x00') ^ "\x02\x00\x00") in - let n'''' = Bytes.of_string (String.make Stream.nonce_size '\xff') in - assert_bool "=" ((Stream.nonce_of_bytes n) = (Stream.nonce_of_bytes n)); - assert_bool "<>" ((Stream.nonce_of_bytes n) <> (Stream.nonce_of_bytes n')); - assert_raises (Sodium.Size_mismatch "Stream.nonce_of_bytes") - (fun () -> Stream.nonce_of_bytes (add_byte n)); - assert_equal (Stream.nonce_of_bytes n') - (Stream.increment_nonce (Stream.nonce_of_bytes n)); - assert_equal (Stream.nonce_of_bytes n'') - (Stream.increment_nonce ~step:2 (Stream.nonce_of_bytes n)); - assert_equal (Stream.nonce_of_bytes n''') - (Stream.increment_nonce ~step:0x20000 (Stream.nonce_of_bytes n)); - assert_equal (Stream.nonce_of_bytes n'''') - (Stream.increment_nonce ~step:(-1) (Stream.nonce_of_bytes n)) - -let setup () = - Stream.random_key (), Bytes.of_string "wild wild fox", Stream.random_nonce () - -let test_stream ctxt = - let k, msg, nonce = setup () in - let nonce' = Stream.random_nonce () in - let cmsg = Stream.Bytes.stream k 10 nonce in - let cmsg' = Stream.Bytes.stream k 10 nonce' in - assert_bool "not equal" (cmsg <> cmsg') - -let test_stream_xor ctxt = - let k, msg, nonce = setup () in - let cmsg = Stream.Bytes.stream_xor k msg nonce in - let msg' = Stream.Bytes.stream_xor k cmsg nonce in - assert_equal msg msg' - -let suite = "Stream" >::: [ - "test_equal_keys" >:: test_equal_keys; - "test_nonce_operations" >:: test_nonce_operations; - "test_permute" >:: test_permute; - "test_stream" >:: test_stream; - "test_stream_xor" >:: test_stream_xor; - ] diff --git a/src/external/ocaml-sodium/myocamlbuild.ml b/src/external/ocaml-sodium/myocamlbuild.ml deleted file mode 100644 index 2014bffd6ea..00000000000 --- a/src/external/ocaml-sodium/myocamlbuild.ml +++ /dev/null @@ -1,98 +0,0 @@ -open Ocamlbuild_plugin;; -open Ocamlbuild_pack;; - -let ctypes_libdir = Sys.getenv "CTYPES_LIB_DIR" in -let ocaml_libdir = Sys.getenv "OCAML_LIB_DIR" in -let lsodium = - let cwd = Unix.getcwd () in - let uname_chan = Unix.open_process_in "uname" in - let l = input_line uname_chan in - match l with - | "Darwin" -> [A "-cclib"; A "-lsodium"] - | "Linux" -> - [ A "-cclib" - ; A "-Wl,--push-state,-Bstatic" - ; A "-cclib" - ; A "-lsodium" - ; A "-cclib" - ; A "-Wl,--pop-state" ] - | s -> failwith (Printf.sprintf "don't know how to link on %s yet" s) -in -dispatch begin - function - | After_rules -> - - rule "cstubs: lib_gen/x_types_detect.c -> x_types_detect" - ~prods:["lib_gen/%_types_detect"] - ~deps:["lib_gen/%_types_detect.c"] - (fun env build -> - Cmd (S[A"cc"; - A("-I"); A ctypes_libdir; - A("-I"); A ocaml_libdir; - A"-o"; - A(env "lib_gen/%_types_detect"); - A(env "lib_gen/%_types_detect.c"); - ])); - - rule "cstubs: lib_gen/x_types_detect -> lib/x_types_detected.ml" - ~prods:["lib/%_types_detected.ml"] - ~deps:["lib_gen/%_types_detect"] - (fun env build -> - Cmd (S[A(env "lib_gen/%_types_detect"); - Sh">"; - A(env "lib/%_types_detected.ml"); - ])); - - rule "cstubs: lib_gen/x_types.ml -> x_types_detect.c" - ~prods:["lib_gen/%_types_detect.c"] - ~deps: ["lib_gen/%_typegen.byte"] - (fun env build -> - Cmd (A(env "lib_gen/%_typegen.byte"))); - - copy_rule "cstubs: lib_gen/x_types.ml -> lib/x_types.ml" - "lib_gen/%_types.ml" "lib/%_types.ml"; - - rule "cstubs: lib/x_bindings.ml -> x_stubs.c, x_stubs.ml" - ~prods:["lib/%_stubs.c"; "lib/%_generated.ml"] - ~deps: ["lib_gen/%_bindgen.byte"] - (fun env build -> - Cmd (A(env "lib_gen/%_bindgen.byte"))); - - copy_rule "cstubs: lib_gen/x_bindings.ml -> lib/x_bindings.ml" - "lib_gen/%_bindings.ml" "lib/%_bindings.ml"; - - flag ["c"; "compile"] & S[A"-ccopt"; A"-I/usr/local/include"]; - flag ["c"; "ocamlmklib"] & A"-L/usr/local/lib"; - flag ["ocaml"; "link"; "native"; "program"] & - S[A"-cclib"; A"-L/usr/local/lib"]; - - (* Linking cstubs *) - flag ["c"; "compile"; "use_ctypes"] & S[A"-I"; A ctypes_libdir]; - flag ["c"; "compile"; "debug"] & A"-g"; - - (* Linking sodium *) - flag ["c"; "compile"; "use_sodium"] & - S[A"-ccopt"; A"--std=c99 -Wall -pedantic -Werror -Wno-pointer-sign"]; - flag ["c"; "ocamlmklib"; "use_sodium"] & S lsodium; - - (* Linking generated stubs *) - dep ["ocaml"; "link"; "byte"; "library"; "use_sodium_stubs"] - ["lib/dllsodium_stubs"-.-(!Options.ext_dll)]; - flag ["ocaml"; "link"; "byte"; "library"; "use_sodium_stubs"] & - S[A"-dllib"; A"-lsodium_stubs"]; - - dep ["ocaml"; "link"; "native"; "library"; "use_sodium_stubs"] - ["lib/libsodium_stubs"-.-(!Options.ext_lib)]; - flag ["ocaml"; "link"; "native"; "library"; "use_sodium_stubs"] & - S (List.append [A"-cclib"; A"-lsodium_stubs"] lsodium); - - (* Linking tests *) - flag ["ocaml"; "link"; "byte"; "program"; "use_sodium_stubs"] & - S[A"-dllib"; A"-lsodium_stubs"]; - dep ["ocaml"; "link"; "native"; "program"; "use_sodium_stubs"] - ["lib/libsodium_stubs"-.-(!Options.ext_lib)]; - flag ["ocaml"; "link"; "native"; "program"; "use_sodium_stubs"] & - S lsodium; - - | _ -> () -end;; diff --git a/src/external/ocaml-sodium/opam b/src/external/ocaml-sodium/opam deleted file mode 100644 index 911738bb096..00000000000 --- a/src/external/ocaml-sodium/opam +++ /dev/null @@ -1,49 +0,0 @@ -opam-version: "1.2" -name: "sodium" -version: "dev" -maintainer: "sheets@alum.mit.edu" -authors: [ - "David Sheets " - "Peter Zotov " - "Benjamin Canou " -] -homepage: "https://github.com/dsheets/ocaml-sodium/" -bug-reports: "https://github.com/dsheets/ocaml-sodium/issues/" -dev-repo: "https://github.com/dsheets/ocaml-sodium.git" -tags: ["org:mirage"] -build: [ - [make] { os != "freebsd" } - [make "CFLAGS=-I/usr/local/include -L/usr/local/lib"] { os = "freebsd" } -] -install: [ - [make "PREFIX=%{prefix}%" "install"] -] -build-test: [ - [make "test"] { os != "freebsd" } - [make "CFLAGS=-I/usr/local/include -L/usr/local/lib" "test"] { os = "freebsd" } -] -remove: [["ocamlfind" "remove" "sodium"]] -depends: [ - "base-bigarray" - "base-bytes" - "ocamlfind" {build} - "ocamlbuild" {build} - "ctypes" {>= "0.6.0"} -] -depexts: [ - [ ["debian"] ["libsodium-dev"] ] - [ ["ubuntu"] ["libsodium-dev"] ] - [ ["freebsd"] ["security/libsodium"] ] - [ ["osx" "homebrew"] ["libsodium"] ] -] -post-messages: [ - "This package requires installation of libsodium-dev (>= 1.0.9)" - { failure & os = "debian" } - "This package requires installation of libsodium-dev (>= 1.0.9)" - { failure & os = "ubuntu" } - "This package requires installation of security/libsodium (>= 1.0.9)" - { failure & os = "freebsd" } - "This package requires installation of libsodium (>= 1.0.9)" - { failure & os = "osx" } -] -available: [ocaml-version >= "4.01.0"] diff --git a/src/external/ppx_optcomp b/src/external/ppx_optcomp deleted file mode 160000 index 2dfcf8104b1..00000000000 --- a/src/external/ppx_optcomp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2dfcf8104b1afee1a9ed0393d1f9f734c707e5c5 diff --git a/src/external/prometheus b/src/external/prometheus deleted file mode 160000 index f899ec0ad67..00000000000 --- a/src/external/prometheus +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f899ec0ad67b404dc541d0276481f6542a4eabbb diff --git a/src/lib/block_producer/block_producer.ml b/src/lib/block_producer/block_producer.ml index 834b4a4a65f..367b6080629 100644 --- a/src/lib/block_producer/block_producer.ml +++ b/src/lib/block_producer/block_producer.ml @@ -700,11 +700,10 @@ let run ~context:(module Context : CONTEXT) ~vrf_evaluator ~prover ~verifier [%log info] "Pausing block production while bootstrapping" in let slot_tx_end = - Runtime_config.slot_tx_end_or_default precomputed_values.runtime_config + Runtime_config.slot_tx_end precomputed_values.runtime_config in let slot_chain_end = - Runtime_config.slot_chain_end_or_default - precomputed_values.runtime_config + Runtime_config.slot_chain_end precomputed_values.runtime_config in let module Breadcrumb = Transition_frontier.Breadcrumb in let produce ivar (scheduled_time, block_data, winner_pubkey) = diff --git a/src/lib/bootstrap_controller/bootstrap_controller.ml b/src/lib/bootstrap_controller/bootstrap_controller.ml index 6fb9683cd82..7d4aac346e1 100644 --- a/src/lib/bootstrap_controller/bootstrap_controller.ml +++ b/src/lib/bootstrap_controller/bootstrap_controller.ml @@ -694,7 +694,7 @@ let%test_module "Bootstrap_controller tests" = open Pipe_lib let max_frontier_length = - Transition_frontier.global_max_length Genesis_constants.compiled + Transition_frontier.global_max_length Genesis_constants.For_unit_tests.t let logger = Logger.create () @@ -718,7 +718,7 @@ let%test_module "Bootstrap_controller tests" = let precomputed_values = precomputed_values let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t let consensus_constants = precomputed_values.consensus_constants end @@ -806,7 +806,7 @@ let%test_module "Bootstrap_controller tests" = let sync_deferred = sync_ledger bootstrap ~root_sync_ledger ~transition_graph ~preferred:[] ~sync_ledger_reader - ~genesis_constants:Genesis_constants.compiled + ~genesis_constants:Genesis_constants.For_unit_tests.t in let%bind () = Deferred.List.iter branch ~f:(fun breadcrumb -> diff --git a/src/lib/cache_dir/fake/cache_dir.ml b/src/lib/cache_dir/fake/cache_dir.ml index fe607a422e7..96c21eb6ff9 100644 --- a/src/lib/cache_dir/fake/cache_dir.ml +++ b/src/lib/cache_dir/fake/cache_dir.ml @@ -6,7 +6,7 @@ let autogen_path = "/tmp/coda_cache_dir" let s3_install_path = "/tmp/s3_cache_dir" let s3_keys_bucket_prefix = - "https://s3-us-west-2.amazonaws.com/snark-keys.o1test.net" + "https://s3-us-west-2.amazonaws.com/snark-keys-ro.o1test.net" let manual_install_path = "/var/lib/coda" diff --git a/src/lib/cache_dir/native/cache_dir.ml b/src/lib/cache_dir/native/cache_dir.ml index dd8f21a49eb..8450d40bfd7 100644 --- a/src/lib/cache_dir/native/cache_dir.ml +++ b/src/lib/cache_dir/native/cache_dir.ml @@ -8,7 +8,7 @@ let s3_install_path = "/tmp/s3_cache_dir" let s3_keys_bucket_prefix = Option.value (Sys.getenv "MINA_LEDGER_S3_BUCKET") - ~default:"https://s3-us-west-2.amazonaws.com/snark-keys.o1test.net" + ~default:"https://s3-us-west-2.amazonaws.com/snark-keys-ro.o1test.net" let manual_install_path = "/var/lib/coda" diff --git a/src/lib/cache_lib/cache_lib.ml b/src/lib/cache_lib/cache_lib.ml index daacf19d4f4..4b58a45de8e 100644 --- a/src/lib/cache_lib/cache_lib.ml +++ b/src/lib/cache_lib/cache_lib.ml @@ -4,8 +4,8 @@ module Intf = Intf include Impl.Make (struct let msg = sprintf "cached item was not consumed (cache name = \"%s\")" - let handle_unconsumed_cache_item ~logger ~cache_name = - if Node_config.cache_exceptions then + let handle_unconsumed_cache_item ~logger ~cache_exceptions ~cache_name = + if cache_exceptions then let open Error in raise (of_string (msg cache_name)) else diff --git a/src/lib/cache_lib/dune b/src/lib/cache_lib/dune index 90062d8aa83..74a0248f957 100644 --- a/src/lib/cache_lib/dune +++ b/src/lib/cache_lib/dune @@ -12,7 +12,6 @@ ppx_inline_test.config ;; local libraries logger - mina_node_config ) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_mina ppx_version ppx_base ppx_let ppx_custom_printf ppx_inline_test))) diff --git a/src/lib/cache_lib/impl.ml b/src/lib/cache_lib/impl.ml index ce2f9faad4f..2bc26715c77 100644 --- a/src/lib/cache_lib/impl.ml +++ b/src/lib/cache_lib/impl.ml @@ -3,7 +3,7 @@ open Core_kernel module type Inputs_intf = sig val handle_unconsumed_cache_item : - logger:Logger.t -> cache_name:string -> unit + logger:Logger.t -> cache_exceptions:bool -> cache_name:string -> unit end module Make (Inputs : Inputs_intf) : Intf.Main.S = struct @@ -13,6 +13,8 @@ module Make (Inputs : Inputs_intf) : Intf.Main.S = struct val logger : _ t -> Logger.t + val cache_exceptions : _ t -> bool + val remove : 'elt t -> [ `Consumed | `Unconsumed | `Failure ] -> 'elt -> unit end = struct @@ -23,17 +25,28 @@ module Make (Inputs : Inputs_intf) : Intf.Main.S = struct ; element_to_string : 'a -> string ; set : ('a, 'a Intf.final_state) Hashtbl.t ; logger : Logger.t + ; cache_exceptions : bool } let name { name; _ } = name let logger { logger; _ } = logger - let create (type elt) ~name ~logger ~on_add ~on_remove ~element_to_string - (module Elt : Hashtbl.Key_plain with type t = elt) : elt t = + let cache_exceptions { cache_exceptions; _ } = cache_exceptions + + let create (type elt) ~name ~logger ~cache_exceptions ~on_add ~on_remove + ~element_to_string (module Elt : Hashtbl.Key_plain with type t = elt) : + elt t = let set = Hashtbl.create ~growth_allowed:true ?size:None (module Elt) in let logger = Logger.extend logger [ ("cache", `String name) ] in - { name; on_add; on_remove; element_to_string; set; logger } + { name + ; on_add + ; on_remove + ; element_to_string + ; set + ; logger + ; cache_exceptions + } let final_state t x = Hashtbl.find t.set x @@ -164,6 +177,7 @@ module Make (Inputs : Inputs_intf) : Intf.Main.S = struct let cache = cache t in Cache.remove cache `Unconsumed (original t) ; Inputs.handle_unconsumed_cache_item ~logger:(Cache.logger cache) + ~cache_exceptions:(Cache.cache_exceptions cache) ~cache_name:(Cache.name cache) ) ) ; t @@ -279,7 +293,8 @@ let%test_module "cache_lib test instance" = let dropped_cache_items = ref 0 include Make (struct - let handle_unconsumed_cache_item ~logger:_ ~cache_name:_ = + let handle_unconsumed_cache_item ~logger:_ ~cache_exceptions:_ + ~cache_name:_ = incr dropped_cache_items end) @@ -290,8 +305,8 @@ let%test_module "cache_lib test instance" = |> String.map ~f:(fun _ -> Char.of_int_exn (Random.bits () land 0xff)) |> f - let with_cache ~logger ~f = - Cache.create ~name:"test" ~logger ~on_add:ignore + let with_cache ~logger ~cache_exceptions ~f = + Cache.create ~name:"test" ~logger ~cache_exceptions ~on_add:ignore ~on_remove:(fun _ _ -> ()) ~element_to_string:Fn.id (module String) @@ -301,7 +316,7 @@ let%test_module "cache_lib test instance" = invalidated" = setup () ; let logger = Logger.null () in - with_cache ~logger ~f:(fun cache -> + with_cache ~logger ~cache_exceptions:false ~f:(fun cache -> with_item ~f:(fun data -> let x = Cache.register_exn cache data in ignore (Cached.invalidate_with_success x : string) ) ; @@ -312,7 +327,7 @@ let%test_module "cache_lib test instance" = = setup () ; let logger = Logger.null () in - with_cache ~logger ~f:(fun cache -> + with_cache ~logger ~cache_exceptions:false ~f:(fun cache -> with_item ~f:(fun data -> ignore (Cache.register_exn cache data : (string, string) Cached.t) ) ; Gc.full_major () ; @@ -322,7 +337,7 @@ let%test_module "cache_lib test instance" = setup () ; let logger = Logger.null () in with_item ~f:(fun data -> - with_cache ~logger ~f:(fun cache -> + with_cache ~logger ~cache_exceptions:false ~f:(fun cache -> ignore (Cache.register_exn cache data : (string, string) Cached.t) ) ; Gc.full_major () ; assert (!dropped_cache_items = 1) ) @@ -330,7 +345,7 @@ let%test_module "cache_lib test instance" = let%test_unit "cached objects are not unexpectedly garbage collected" = setup () ; let logger = Logger.null () in - with_cache ~logger ~f:(fun cache -> + with_cache ~logger ~cache_exceptions:false ~f:(fun cache -> with_item ~f:(fun data -> let cached = Cache.register_exn cache data in Gc.full_major () ; @@ -343,7 +358,7 @@ let%test_module "cache_lib test instance" = unconsumption handler for parents" = setup () ; let logger = Logger.null () in - with_cache ~logger ~f:(fun cache -> + with_cache ~logger ~cache_exceptions:false ~f:(fun cache -> with_item ~f:(fun data -> ignore ( Cache.register_exn cache data @@ -357,7 +372,7 @@ let%test_module "cache_lib test instance" = any unconsumption handler calls" = setup () ; let logger = Logger.null () in - with_cache ~logger ~f:(fun cache -> + with_cache ~logger ~cache_exceptions:false ~f:(fun cache -> with_item ~f:(fun data -> Cache.register_exn cache data |> Cached.transform ~f:(Fn.const 5) @@ -370,7 +385,7 @@ let%test_module "cache_lib test instance" = derived cached object" = setup () ; let logger = Logger.null () in - with_cache ~logger ~f:(fun cache -> + with_cache ~logger ~cache_exceptions:false ~f:(fun cache -> with_item ~f:(fun data -> let src = Cache.register_exn cache data in let _der = @@ -384,7 +399,8 @@ let%test_module "cache_lib test instance" = let%test_unit "deriving a cached object inhabits its parent's final_state" = setup () ; - with_cache ~logger:(Logger.null ()) ~f:(fun cache -> + with_cache ~logger:(Logger.null ()) ~cache_exceptions:false + ~f:(fun cache -> with_item ~f:(fun data -> let src = Cache.register_exn cache data in let der = Cached.transform src ~f:(Fn.const 5) in diff --git a/src/lib/cache_lib/intf.ml b/src/lib/cache_lib/intf.ml index 14af83dcda4..bd6b18dd5d6 100644 --- a/src/lib/cache_lib/intf.ml +++ b/src/lib/cache_lib/intf.ml @@ -110,6 +110,7 @@ module Cache = struct val create : name:string -> logger:Logger.t + -> cache_exceptions:bool -> on_add:('elt -> unit) -> on_remove:([ `Consumed | `Unconsumed | `Failure ] -> 'elt -> unit) -> element_to_string:('elt -> string) @@ -171,7 +172,7 @@ module Transmuter_cache = struct type t = target Cache.t - val create : logger:Logger.t -> t + val create : logger:Logger.t -> cache_exceptions:bool -> t val register_exn : t -> source -> (source, target) Cached.t diff --git a/src/lib/cli_lib/commands.ml b/src/lib/cli_lib/commands.ml index 26818099ac5..b82a7fa20a5 100644 --- a/src/lib/cli_lib/commands.ml +++ b/src/lib/cli_lib/commands.ml @@ -8,21 +8,19 @@ open Async let generate_keypair = Command.async ~summary:"Generate a new public, private keypair" - (let open Command.Let_syntax in - let%map_open privkey_path = Flag.privkey_write_path in - Exceptions.handle_nicely - @@ fun () -> - let env = Secrets.Keypair.env in - if Option.is_some (Sys.getenv env) then - eprintf "Using password from environment variable %s\n" env ; - let open Deferred.Let_syntax in - let kp = Keypair.create () in - let%bind () = Secrets.Keypair.Terminal_stdin.write_exn kp ~privkey_path in - printf "Keypair generated\nPublic key: %s\nRaw public key: %s\n" - ( kp.public_key |> Public_key.compress - |> Public_key.Compressed.to_base58_check ) - (Rosetta_coding.Coding.of_public_key kp.public_key) ; - exit 0) + (let%map_open.Command privkey_path = Flag.privkey_write_path in + Exceptions.handle_nicely + @@ fun () -> + let env = Secrets.Keypair.env in + if Option.is_some (Sys.getenv env) then + eprintf "Using password from environment variable %s\n" env ; + let kp = Keypair.create () in + let%bind () = Secrets.Keypair.Terminal_stdin.write_exn kp ~privkey_path in + printf "Keypair generated\nPublic key: %s\nRaw public key: %s\n" + ( kp.public_key |> Public_key.compress + |> Public_key.Compressed.to_base58_check ) + (Rosetta_coding.Coding.of_public_key kp.public_key) ; + exit 0 ) let validate_keypair = Command.async ~summary:"Validate a public, private keypair" @@ -191,13 +189,13 @@ module Vrf = struct Exceptions.handle_nicely @@ fun () -> let env = Secrets.Keypair.env in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in if Option.is_some (Sys.getenv env) then eprintf "Using password from environment variable %s\n" env ; let open Deferred.Let_syntax in (* TODO-someday: constraint constants from config file. *) - let constraint_constants = - Genesis_constants.Constraint_constants.compiled - in let%bind () = let password = lazy @@ -257,14 +255,14 @@ module Vrf = struct let%map_open privkey_path = Flag.privkey_read_path in Exceptions.handle_nicely @@ fun () -> + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in let env = Secrets.Keypair.env in if Option.is_some (Sys.getenv env) then eprintf "Using password from environment variable %s\n" env ; let open Deferred.Let_syntax in (* TODO-someday: constraint constants from config file. *) - let constraint_constants = - Genesis_constants.Constraint_constants.compiled - in let%bind () = let password = lazy @@ -322,10 +320,10 @@ module Vrf = struct ( Command.Param.return @@ Exceptions.handle_nicely @@ fun () -> let open Deferred.Let_syntax in - (* TODO-someday: constraint constants from config file. *) let constraint_constants = - Genesis_constants.Constraint_constants.compiled + Genesis_constants.Compiled.constraint_constants in + (* TODO-someday: constraint constants from config file. *) let lexbuf = Lexing.from_channel In_channel.stdin in let lexer = Yojson.init_lexer () in let%bind () = diff --git a/src/lib/cli_lib/dune b/src/lib/cli_lib/dune index 58424cee0b9..7be35a03912 100644 --- a/src/lib/cli_lib/dune +++ b/src/lib/cli_lib/dune @@ -37,7 +37,6 @@ rosetta_coding logger interpolator_lib - mina_compile_config snark_params pickles.backend consensus.vrf diff --git a/src/lib/cli_lib/flag.ml b/src/lib/cli_lib/flag.ml index c7e6d88c5eb..c96200feb9e 100644 --- a/src/lib/cli_lib/flag.ml +++ b/src/lib/cli_lib/flag.ml @@ -334,6 +334,11 @@ module Log = struct %d)" Default.file_log_rotations ) (optional_with_default Default.file_log_rotations int) + + let file = + let open Command.Param in + flag "--log-file" ~aliases:[ "log-file" ] + ~doc:"FILE Set log file (stores JSON)" (optional string) end type signed_command_common = @@ -343,22 +348,27 @@ type signed_command_common = ; memo : string option } -let signed_command_common : signed_command_common Command.Param.t = +let fee_common ~default_transaction_fee ~minimum_user_command_fee : + Currency.Fee.t Command.Param.t = + Command.Param.flag "--fee" ~aliases:[ "fee" ] + ~doc: + (Printf.sprintf + "FEE Amount you are willing to pay to process the transaction \ + (default: %s) (minimum: %s)" + (Currency.Fee.to_mina_string default_transaction_fee) + (Currency.Fee.to_mina_string minimum_user_command_fee) ) + (Command.Param.optional_with_default default_transaction_fee + Arg_type.txn_fee ) + +let signed_command_common ~default_transaction_fee ~minimum_user_command_fee : + signed_command_common Command.Param.t = let open Command.Let_syntax in let open Arg_type in let%map_open sender = flag "--sender" ~aliases:[ "sender" ] (required public_key_compressed) ~doc:"PUBLICKEY Public key from which you want to send the transaction" - and fee = - flag "--fee" ~aliases:[ "fee" ] - ~doc: - (Printf.sprintf - "FEE Amount you are willing to pay to process the transaction \ - (default: %s) (minimum: %s)" - (Currency.Fee.to_mina_string Currency.Fee.default_transaction_fee) - (Currency.Fee.to_mina_string Mina_base.Signed_command.minimum_fee) ) - (optional txn_fee) + and fee = fee_common ~default_transaction_fee ~minimum_user_command_fee and nonce = flag "--nonce" ~aliases:[ "nonce" ] ~doc: @@ -370,11 +380,7 @@ let signed_command_common : signed_command_common Command.Param.t = flag "--memo" ~aliases:[ "memo" ] ~doc:"STRING Memo accompanying the transaction" (optional string) in - { sender - ; fee = Option.value fee ~default:Currency.Fee.default_transaction_fee - ; nonce - ; memo - } + { sender; fee; nonce; memo } module Signed_command = struct open Arg_type @@ -395,15 +401,15 @@ module Signed_command = struct flag "--amount" ~aliases:[ "amount" ] ~doc:"VALUE Payment amount you want to send" (required txn_amount) - let fee = + let fee ~default_transaction_fee ~minimum_user_command_fee = let open Command.Param in flag "--fee" ~aliases:[ "fee" ] ~doc: (Printf.sprintf "FEE Amount you are willing to pay to process the transaction \ (default: %s) (minimum: %s)" - (Currency.Fee.to_mina_string Currency.Fee.default_transaction_fee) - (Currency.Fee.to_mina_string Mina_base.Signed_command.minimum_fee) ) + (Currency.Fee.to_mina_string default_transaction_fee) + (Currency.Fee.to_mina_string minimum_user_command_fee) ) (optional txn_fee) let valid_until = diff --git a/src/lib/cli_lib/flag.mli b/src/lib/cli_lib/flag.mli index 0c0e0fa3b33..69ff38f86f3 100644 --- a/src/lib/cli_lib/flag.mli +++ b/src/lib/cli_lib/flag.mli @@ -74,6 +74,8 @@ module Log : sig val file_log_level : Logger.Level.t Command.Param.t + val file : string option Command.Param.t + val file_log_rotations : int Command.Param.t end @@ -84,7 +86,15 @@ type signed_command_common = ; memo : string option } -val signed_command_common : signed_command_common Command.Param.t +val fee_common : + default_transaction_fee:Currency.Fee.t + -> minimum_user_command_fee:Currency.Fee.t + -> Currency.Fee.t Command.Param.t + +val signed_command_common : + default_transaction_fee:Currency.Fee.t + -> minimum_user_command_fee:Currency.Fee.t + -> signed_command_common Command.Param.t module Signed_command : sig val hd_index : Mina_numbers.Hd_index.t Command.Param.t @@ -93,7 +103,10 @@ module Signed_command : sig val amount : Currency.Amount.t Command.Param.t - val fee : Currency.Fee.t option Command.Param.t + val fee : + default_transaction_fee:Currency.Fee.t + -> minimum_user_command_fee:Currency.Fee.t + -> Currency.Fee.t option Command.Param.t val valid_until : Mina_numbers.Global_slot_since_genesis.t option Command.Param.t diff --git a/src/lib/cli_lib/stdout_log.ml b/src/lib/cli_lib/stdout_log.ml index df8ea411521..8886ffd5032 100644 --- a/src/lib/cli_lib/stdout_log.ml +++ b/src/lib/cli_lib/stdout_log.ml @@ -1,4 +1,4 @@ -let setup log_json log_level = +let setup ?commit_id log_json log_level = let stdout_log_processor = if log_json then Logger.Processor.raw ~log_level () else @@ -9,6 +9,7 @@ let setup log_json log_level = ; pretty_print = true } in - Logger.Consumer_registry.register ~id:"default" + Logger.Consumer_registry.register ?commit_id ~id:"default" ~processor:stdout_log_processor ~transport:(Logger.Transport.stdout ()) + () diff --git a/src/lib/consensus/constants.ml b/src/lib/consensus/constants.ml index c2e800f850a..3f7cdc5f287 100644 --- a/src/lib/consensus/constants.ml +++ b/src/lib/consensus/constants.ml @@ -306,8 +306,8 @@ let for_unit_tests = lazy (create ~constraint_constants: - Genesis_constants.Constraint_constants.for_unit_tests - ~protocol_constants:Genesis_constants.for_unit_tests.protocol ) + Genesis_constants.For_unit_tests.Constraint_constants.t + ~protocol_constants:Genesis_constants.For_unit_tests.t.protocol ) let to_protocol_constants ({ k @@ -454,9 +454,9 @@ end let%test_unit "checked = unchecked" = let open Mina_base in - let for_unit_tests = Genesis_constants.for_unit_tests.protocol in + let for_unit_tests = Genesis_constants.For_unit_tests.t.protocol in let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let test = Test_util.test_equal Protocol_constants_checked.typ typ diff --git a/src/lib/consensus/proof_of_stake.ml b/src/lib/consensus/proof_of_stake.ml index e805d685d9a..0bf85ad3691 100644 --- a/src/lib/consensus/proof_of_stake.ml +++ b/src/lib/consensus/proof_of_stake.ml @@ -3104,7 +3104,7 @@ module Make_str (A : Wire_types.Concrete) = struct let logger = Logger.create () let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t let consensus_constants = Lazy.force Constants.for_unit_tests end in @@ -3126,7 +3126,7 @@ module Make_str (A : Wire_types.Concrete) = struct Consensus_state.negative_one ~genesis_ledger ~genesis_epoch_data ~constants ~constraint_constants: - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let curr_epoch, curr_slot = Consensus_state.curr_epoch_and_slot negative_one @@ -3149,7 +3149,7 @@ module Make_str (A : Wire_types.Concrete) = struct Consensus_state.negative_one ~genesis_ledger ~genesis_epoch_data ~constants ~constraint_constants: - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let start_time = Epoch.start_time ~constants epoch in let ((curr_epoch, curr_slot) as curr) = @@ -3419,7 +3419,7 @@ module Make_str (A : Wire_types.Concrete) = struct open Consensus_state let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t let constants = Lazy.force Constants.for_unit_tests @@ -3573,7 +3573,7 @@ module Make_str (A : Wire_types.Concrete) = struct ~compute: (As_prover.return (Mina_base.Protocol_constants_checked.value_of_t - Genesis_constants.for_unit_tests.protocol ) ) + Genesis_constants.For_unit_tests.t.protocol ) ) in let result = update_var previous_state transition_data @@ -3655,7 +3655,7 @@ module Make_str (A : Wire_types.Concrete) = struct let%test_unit "vrf win rate" = let constants = Lazy.force Constants.for_unit_tests in let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let previous_protocol_state_hash = Mina_base.State_hash.(of_hash zero) @@ -3781,7 +3781,7 @@ module Make_str (A : Wire_types.Concrete) = struct let open Quickcheck.Generator.Let_syntax in let constants = Lazy.force Constants.for_unit_tests in let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let gen_sub_window_density = gen_num_blocks_in_slots ~slot_fill_rate ~slot_fill_rate_delta @@ -3801,7 +3801,7 @@ module Make_str (A : Wire_types.Concrete) = struct (* Computes currency at height, assuming every block contains coinbase (ignoring inflation scheduling). *) let currency_at_height ~genesis_currency height = let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in Option.value_exn Amount.( diff --git a/src/lib/consensus/vrf/consensus_vrf.ml b/src/lib/consensus/vrf/consensus_vrf.ml index 9350357f984..67bb080a893 100644 --- a/src/lib/consensus/vrf/consensus_vrf.ml +++ b/src/lib/consensus/vrf/consensus_vrf.ml @@ -282,7 +282,7 @@ module Output = struct let%test_unit "hash unchecked vs. checked equality" = let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let gen_inner_curve_point = let open Quickcheck.Generator.Let_syntax in @@ -634,7 +634,9 @@ module Layout = struct end let%test_unit "Standalone and integrates vrfs are consistent" = - let constraint_constants = Genesis_constants.Constraint_constants.compiled in + let constraint_constants = + Genesis_constants.For_unit_tests.Constraint_constants.t + in let module Standalone = Standalone (struct let constraint_constants = constraint_constants end) in diff --git a/src/lib/crypto/kimchi_backend/common/dune b/src/lib/crypto/kimchi_backend/common/dune index 39a758925ac..df75aac9016 100644 --- a/src/lib/crypto/kimchi_backend/common/dune +++ b/src/lib/crypto/kimchi_backend/common/dune @@ -29,7 +29,6 @@ base.base_internalhash_types ;; local libraries tuple_lib - snarky.backendless key_cache pickles_types hex @@ -41,6 +40,6 @@ snarky.intf promise logger - internal_tracing.context_logger + logger.context_logger ppx_version.runtime bounded_types)) \ No newline at end of file diff --git a/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml b/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml index 1bc9852812a..13981f109e0 100644 --- a/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml +++ b/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml @@ -535,7 +535,7 @@ module Make (Inputs : Inputs_intf) = struct let batch_verify' (conv : 'a -> Fq.t array) (ts : (Verifier_index.t * with_public_evals * 'a * message option) list) = - let logger = Internal_tracing_context_logger.get () in + let logger = Context_logger.get () in [%log internal] "Batch_verify_backend_convert_inputs" ; let vks_and_v = Array.of_list_map ts ~f:(fun (vk, t, xs, m) -> diff --git a/src/lib/crypto/kimchi_backend/dune b/src/lib/crypto/kimchi_backend/dune index bd1feae4efe..7cd8d420d4a 100644 --- a/src/lib/crypto/kimchi_backend/dune +++ b/src/lib/crypto/kimchi_backend/dune @@ -20,7 +20,6 @@ kimchi_types pasta_bindings snarkette - snarky.backendless key_cache hex kimchi_backend_common diff --git a/src/lib/crypto/snarky_tests/snarky_tests.ml b/src/lib/crypto/snarky_tests/snarky_tests.ml index 0310a6811f3..51db1241b6d 100644 --- a/src/lib/crypto/snarky_tests/snarky_tests.ml +++ b/src/lib/crypto/snarky_tests/snarky_tests.ml @@ -602,8 +602,9 @@ end (* Tests that check that the hashes of the protocol circuits remain the same *) module Protocol_circuits = struct (* Full because we want to be sure nothing changes *) - let proof_level, constraint_constants = - Genesis_constants.(Proof_level.Full, Constraint_constants.compiled) + let proof_level = Genesis_constants.Proof_level.Full + + let constraint_constants = Genesis_constants.Compiled.constraint_constants let print_hash print expected digest : unit = if print then ( diff --git a/src/lib/currency/currency.ml b/src/lib/currency/currency.ml index 79f0687f918..9160c57ef42 100644 --- a/src/lib/currency/currency.ml +++ b/src/lib/currency/currency.ml @@ -916,15 +916,6 @@ module Make_str (A : Wire_types.Concrete) = struct end] let (_ : (Signed.t, (t, Sgn.t) Signed_poly.t) Type_equal.t) = Type_equal.T - - let minimum_user_command_fee = - of_mina_string_exn Mina_compile_config.minimum_user_command_fee_string - - let default_transaction_fee = - of_mina_string_exn Mina_compile_config.default_transaction_fee_string - - let default_snark_worker_fee = - of_mina_string_exn Mina_compile_config.default_snark_worker_fee_string end module Amount = struct diff --git a/src/lib/currency/dune b/src/lib/currency/dune index 525274e741b..15d83534664 100644 --- a/src/lib/currency/dune +++ b/src/lib/currency/dune @@ -22,7 +22,6 @@ codable test_util unsigned_extended - mina_compile_config mina_numbers snark_bits sgn diff --git a/src/lib/currency/intf.ml b/src/lib/currency/intf.ml index c967e8a5de3..107f88fd316 100644 --- a/src/lib/currency/intf.ml +++ b/src/lib/currency/intf.ml @@ -286,12 +286,6 @@ module type Full = sig include Codable.S with type t := t - val minimum_user_command_fee : t - - val default_transaction_fee : t - - val default_snark_worker_fee : t - (* TODO: Get rid of signed fee, use signed amount *) module Signed : Signed_intf diff --git a/src/lib/daemon_rpcs/client.ml b/src/lib/daemon_rpcs/client.ml index 8684b7b5080..1c95b95a6bc 100644 --- a/src/lib/daemon_rpcs/client.ml +++ b/src/lib/daemon_rpcs/client.ml @@ -14,15 +14,19 @@ let dispatch rpc query (host_and_port : Host_and_port.t) = match%bind Rpc.Connection.create ~handshake_timeout: - (Time.Span.of_sec Mina_compile_config.rpc_handshake_timeout_sec) + (Time.Span.of_sec + Node_config_unconfigurable_constants + .rpc_handshake_timeout_sec ) ~heartbeat_config: (Rpc.Connection.Heartbeat_config.create ~timeout: (Time_ns.Span.of_sec - Mina_compile_config.rpc_heartbeat_timeout_sec ) + Node_config_unconfigurable_constants + .rpc_heartbeat_timeout_sec ) ~send_every: (Time_ns.Span.of_sec - Mina_compile_config.rpc_heartbeat_send_every_sec ) + Node_config_unconfigurable_constants + .rpc_heartbeat_send_every_sec ) () ) r w ~connection_state:(fun _ -> ()) diff --git a/src/lib/daemon_rpcs/daemon_rpcs.ml b/src/lib/daemon_rpcs/daemon_rpcs.ml index 5338b3e142c..fae68afc136 100644 --- a/src/lib/daemon_rpcs/daemon_rpcs.ml +++ b/src/lib/daemon_rpcs/daemon_rpcs.ml @@ -330,9 +330,7 @@ end module Get_node_status = struct type query = Mina_net2.Multiaddr.t list option [@@deriving bin_io_unversioned] - type response = - Mina_networking.Rpcs.Get_node_status.Node_status.Stable.Latest.t Or_error.t - list + type response = Mina_networking.Node_status.Stable.Latest.t Or_error.t list [@@deriving bin_io_unversioned] let rpc : (query, response) Rpc.Rpc.t = diff --git a/src/lib/daemon_rpcs/dune b/src/lib/daemon_rpcs/dune index 0cad841a826..86876a493e8 100644 --- a/src/lib/daemon_rpcs/dune +++ b/src/lib/daemon_rpcs/dune @@ -36,7 +36,7 @@ perf_histograms sync_status node_addrs_and_ports - mina_compile_config + mina_node_config.unconfigurable_constants logger network_pool data_hash_lib diff --git a/src/lib/fake_network/fake_network.ml b/src/lib/fake_network/fake_network.ml index 44dce57651c..eb6080b6025 100644 --- a/src/lib/fake_network/fake_network.ml +++ b/src/lib/fake_network/fake_network.ml @@ -1,6 +1,5 @@ open Async open Core -open Mina_base module Sync_ledger = Mina_ledger.Sync_ledger open Gadt_lib open Signature_lib @@ -24,47 +23,7 @@ type 'n num_peers = 'n Peano.gt_1 type peer_state = { frontier : Transition_frontier.t ; consensus_local_state : Consensus.Data.Local_state.t - ; get_staged_ledger_aux_and_pending_coinbases_at_hash : - Pasta_bindings.Fp.t Envelope.Incoming.t - -> ( Staged_ledger.Scan_state.t - * Pasta_bindings.Fp.t - * Pending_coinbase.t - * Mina_state.Protocol_state.value list ) - option - Deferred.t - ; get_some_initial_peers : unit Envelope.Incoming.t -> Peer.t list Deferred.t - ; answer_sync_ledger_query : - (Pasta_bindings.Fp.t * Sync_ledger.Query.t) Envelope.Incoming.t - -> (Sync_ledger.Answer.t, Error.t) result Deferred.t - ; get_ancestry : - ( Consensus.Data.Consensus_state.Value.t - , Pasta_bindings.Fp.t ) - With_hash.t - Envelope.Incoming.t - -> ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) - Proof_carrying_data.t - option - Deferred.t - ; get_best_tip : - unit Envelope.Incoming.t - -> ( Mina_block.t - , Pasta_bindings.Fp.t list * Mina_block.t ) - Proof_carrying_data.t - option - Deferred.t - ; get_node_status : - unit Envelope.Incoming.t - -> (Mina_networking.Rpcs.Get_node_status.Node_status.t, Error.t) result - Deferred.t - ; get_transition_knowledge : - unit Envelope.Incoming.t -> Pasta_bindings.Fp.t list Deferred.t - ; get_transition_chain_proof : - Pasta_bindings.Fp.t Envelope.Incoming.t - -> (Pasta_bindings.Fp.t * Pasta_bindings.Fp.t list) option Deferred.t - ; get_transition_chain : - Pasta_bindings.Fp.t list Envelope.Incoming.t - -> Mina_block.t list option Deferred.t + ; rpc_mocks : Gossip_net.Fake.rpc_mocks } type peer_network = @@ -107,28 +66,29 @@ let setup (type n) ~context:(module Context : CONTEXT) let fake_gossip_network = Gossip_net.Fake.create_network (Vect.to_list peers) in - let config peer consensus_local_state = - let trust_system = Trust_system.null () in + let context trust_system consensus_local_state : + (module Mina_networking.CONTEXT) = + ( module struct + include Context + + let trust_system = trust_system + + let time_controller = time_controller + + let consensus_local_state = consensus_local_state + end ) + in + let config rpc_mocks peer = let open Mina_networking.Config in - don't_wait_for - (Pipe_lib.Strict_pipe.Reader.iter - (Trust_system.upcall_pipe trust_system) - ~f:(const Deferred.unit) ) ; - { logger - ; trust_system - ; time_controller - ; consensus_local_state - ; is_seed = Vect.is_empty peers + { is_seed = Vect.is_empty peers ; genesis_ledger_hash = Mina_ledger.Ledger.merkle_root (Lazy.force (Precomputed_values.genesis_ledger precomputed_values)) - ; constraint_constants = precomputed_values.constraint_constants - ; consensus_constants = precomputed_values.consensus_constants - ; precomputed_values ; creatable_gossip_net = Gossip_net.Any.Creatable ( (module Gossip_net.Fake) - , Gossip_net.Fake.create_instance fake_gossip_network peer ) + , Gossip_net.Fake.create_instance ~network:fake_gossip_network + ~rpc_mocks ~local_ip:peer ) ; log_gossip_heard = { snark_pool_diff = true ; transaction_pool_diff = true @@ -136,32 +96,106 @@ let setup (type n) ~context:(module Context : CONTEXT) } } in + let get_node_status _ = failwith "unimplemented" in let peer_networks = Vect.map2 peers states ~f:(fun peer state -> + let trust_system = Trust_system.null () in + don't_wait_for + (Pipe_lib.Strict_pipe.Reader.iter + Trust_system.(upcall_pipe trust_system) + ~f:(const Deferred.unit) ) ; let network = Thread_safe.block_on_async_exn (fun () -> - (* TODO: merge implementations with mina_lib *) Mina_networking.create - (config peer state.consensus_local_state) + (context trust_system state.consensus_local_state) + (config state.rpc_mocks peer) ~sinks: ( Transition_handler.Block_sink.void , Network_pool.Transaction_pool.Remote_sink.void , Network_pool.Snark_pool.Remote_sink.void ) - ~get_staged_ledger_aux_and_pending_coinbases_at_hash: - state.get_staged_ledger_aux_and_pending_coinbases_at_hash - ~get_some_initial_peers:state.get_some_initial_peers - ~answer_sync_ledger_query:state.answer_sync_ledger_query - ~get_ancestry:state.get_ancestry - ~get_best_tip:state.get_best_tip - ~get_node_status:state.get_node_status - ~get_transition_knowledge:state.get_transition_knowledge - ~get_transition_chain_proof:state.get_transition_chain_proof - ~get_transition_chain:state.get_transition_chain ) + ~get_transition_frontier:(Fn.const (Some state.frontier)) + ~get_node_status ) in { peer; state; network } ) in { fake_gossip_network; peer_networks } +include struct + open Mina_networking + + type 'a fn_with_mocks = + ?get_some_initial_peers: + ( Rpcs.Get_some_initial_peers.query + , Rpcs.Get_some_initial_peers.response ) + Gossip_net.Fake.rpc_mock + -> ?get_staged_ledger_aux_and_pending_coinbases_at_hash: + ( Rpcs.Get_staged_ledger_aux_and_pending_coinbases_at_hash.query + , Rpcs.Get_staged_ledger_aux_and_pending_coinbases_at_hash.response ) + Gossip_net.Fake.rpc_mock + -> ?answer_sync_ledger_query: + ( Rpcs.Answer_sync_ledger_query.query + , Rpcs.Answer_sync_ledger_query.response ) + Gossip_net.Fake.rpc_mock + -> ?get_transition_chain: + ( Rpcs.Get_transition_chain.query + , Rpcs.Get_transition_chain.response ) + Gossip_net.Fake.rpc_mock + -> ?get_transition_knowledge: + ( Rpcs.Get_transition_knowledge.query + , Rpcs.Get_transition_knowledge.response ) + Gossip_net.Fake.rpc_mock + -> ?get_transition_chain_proof: + ( Rpcs.Get_transition_chain_proof.query + , Rpcs.Get_transition_chain_proof.response ) + Gossip_net.Fake.rpc_mock + -> ?get_ancestry: + ( Rpcs.Get_ancestry.query + , Rpcs.Get_ancestry.response ) + Gossip_net.Fake.rpc_mock + -> ?get_best_tip: + ( Rpcs.Get_best_tip.query + , Rpcs.Get_best_tip.response ) + Gossip_net.Fake.rpc_mock + -> 'a + + let make_peer_state : + ( frontier:Transition_frontier.t + -> consensus_local_state:Consensus.Data.Local_state.t + -> peer_state ) + fn_with_mocks = + fun ?get_some_initial_peers + ?get_staged_ledger_aux_and_pending_coinbases_at_hash + ?answer_sync_ledger_query ?get_transition_chain ?get_transition_knowledge + ?get_transition_chain_proof ?get_ancestry ?get_best_tip ~frontier + ~consensus_local_state -> + let rpc_mocks : Gossip_net.Fake.rpc_mocks = + let get_mock (type q r) (rpc : (q, r) Rpcs.rpc) : + (q, r) Gossip_net.Fake.rpc_mock option = + match rpc with + | Get_some_initial_peers -> + get_some_initial_peers + | Get_staged_ledger_aux_and_pending_coinbases_at_hash -> + get_staged_ledger_aux_and_pending_coinbases_at_hash + | Answer_sync_ledger_query -> + answer_sync_ledger_query + | Get_transition_chain -> + get_transition_chain + | Get_transition_knowledge -> + get_transition_knowledge + | Get_transition_chain_proof -> + get_transition_chain_proof + | Get_ancestry -> + get_ancestry + | Ban_notify -> + None + | Get_best_tip -> + get_best_tip + in + { get_mock } + in + { frontier; consensus_local_state; rpc_mocks } +end + module Generator = struct open Quickcheck open Generator.Let_syntax @@ -173,129 +207,10 @@ module Generator = struct -> use_super_catchup:bool -> peer_state Generator.t - let make_peer_state ?get_staged_ledger_aux_and_pending_coinbases_at_hash - ?get_some_initial_peers ?answer_sync_ledger_query ?get_ancestry - ?get_best_tip ?get_node_status ?get_transition_knowledge - ?get_transition_chain_proof ?get_transition_chain ~frontier - ~consensus_local_state ~context:(module Context : CONTEXT) = - let open Context in - { frontier - ; consensus_local_state - ; get_staged_ledger_aux_and_pending_coinbases_at_hash = - ( match get_staged_ledger_aux_and_pending_coinbases_at_hash with - | Some f -> - f - | None -> - fun query_env -> - let input = Envelope.Incoming.data query_env in - Deferred.return - (let open Option.Let_syntax in - let%map ( scan_state - , expected_merkle_root - , pending_coinbases - , protocol_states ) = - Sync_handler - .get_staged_ledger_aux_and_pending_coinbases_at_hash ~frontier - input - in - let staged_ledger_hash = - Staged_ledger_hash.of_aux_ledger_and_coinbase_hash - (Staged_ledger.Scan_state.hash scan_state) - expected_merkle_root pending_coinbases - in - [%log debug] - ~metadata: - [ ( "staged_ledger_hash" - , Staged_ledger_hash.to_yojson staged_ledger_hash ) - ] - "sending scan state and pending coinbase" ; - ( scan_state - , expected_merkle_root - , pending_coinbases - , protocol_states )) ) - ; get_some_initial_peers = - ( match get_some_initial_peers with - | Some f -> - f - | None -> - fun _ -> Deferred.return [] ) - ; answer_sync_ledger_query = - ( match answer_sync_ledger_query with - | Some f -> - f - | None -> - fun query_env -> - let ledger_hash, _ = Envelope.Incoming.data query_env in - Sync_handler.answer_query ~frontier ledger_hash - (Envelope.Incoming.map ~f:Tuple2.get2 query_env) - ~logger:(Logger.create ()) ~trust_system:(Trust_system.null ()) - |> Deferred.map - (* begin error string prefix so we can pattern-match *) - ~f: - (Result.of_option - ~error: - (Error.createf - !"%s for ledger_hash: %{sexp:Ledger_hash.t}" - Mina_networking.refused_answer_query_string - ledger_hash ) ) ) - ; get_ancestry = - ( match get_ancestry with - | Some f -> - f - | None -> - fun query_env -> - Deferred.return - (Sync_handler.Root.prove - ~context:(module Context) - ~frontier - ( Envelope.Incoming.data query_env - |> With_hash.map_hash ~f:(fun state_hash -> - { State_hash.State_hashes.state_hash - ; state_body_hash = None - } ) ) ) ) - ; get_best_tip = - ( match get_best_tip with - | Some f -> - f - | None -> - fun _ -> failwith "Get_best_tip unimplemented" ) - ; get_node_status = - ( match get_node_status with - | Some f -> - f - | None -> - fun _ -> failwith "Get_node_status unimplemented" ) - ; get_transition_knowledge = - ( match get_transition_knowledge with - | Some f -> - f - | None -> - fun _query -> Deferred.return (Sync_handler.best_tip_path ~frontier) - ) - ; get_transition_chain_proof = - ( match get_transition_chain_proof with - | Some f -> - f - | None -> - fun query_env -> - Deferred.return - (Transition_chain_prover.prove ~frontier - (Envelope.Incoming.data query_env) ) ) - ; get_transition_chain = - ( match get_transition_chain with - | Some f -> - f - | None -> - fun query_env -> - Deferred.return - (Sync_handler.get_transition_chain ~frontier - (Envelope.Incoming.data query_env) ) ) - } - - let fresh_peer_custom_rpc ?get_staged_ledger_aux_and_pending_coinbases_at_hash - ?get_some_initial_peers ?answer_sync_ledger_query ?get_ancestry - ?get_best_tip ?get_node_status ?get_transition_knowledge - ?get_transition_chain_proof ?get_transition_chain + let fresh_peer_custom_rpc ?get_some_initial_peers + ?get_staged_ledger_aux_and_pending_coinbases_at_hash + ?answer_sync_ledger_query ?get_transition_chain ?get_transition_knowledge + ?get_transition_chain_proof ?get_ancestry ?get_best_tip ~context:(module Context : CONTEXT) ~verifier ~max_frontier_length ~use_super_catchup = let open Context in @@ -319,28 +234,25 @@ module Generator = struct ~use_super_catchup () in make_peer_state ~frontier ~consensus_local_state - ~context:(module Context) ?get_staged_ledger_aux_and_pending_coinbases_at_hash ?get_some_initial_peers ?answer_sync_ledger_query ?get_ancestry - ?get_best_tip ?get_node_status ?get_transition_knowledge - ?get_transition_chain_proof ?get_transition_chain + ?get_best_tip ?get_transition_knowledge ?get_transition_chain_proof + ?get_transition_chain let fresh_peer ~context:(module Context : CONTEXT) ~verifier ~max_frontier_length ~use_super_catchup = fresh_peer_custom_rpc ?get_staged_ledger_aux_and_pending_coinbases_at_hash:None ?get_some_initial_peers:None ?answer_sync_ledger_query:None - ?get_ancestry:None ?get_best_tip:None ?get_node_status:None - ?get_transition_knowledge:None ?get_transition_chain_proof:None - ?get_transition_chain:None + ?get_ancestry:None ?get_best_tip:None ?get_transition_knowledge:None + ?get_transition_chain_proof:None ?get_transition_chain:None ~context:(module Context) ~verifier ~max_frontier_length ~use_super_catchup - let peer_with_branch_custom_rpc ~frontier_branch_size + let peer_with_branch_custom_rpc ~frontier_branch_size ?get_some_initial_peers ?get_staged_ledger_aux_and_pending_coinbases_at_hash - ?get_some_initial_peers ?answer_sync_ledger_query ?get_ancestry - ?get_best_tip ?get_node_status ?get_transition_knowledge - ?get_transition_chain_proof ?get_transition_chain + ?answer_sync_ledger_query ?get_transition_chain ?get_transition_knowledge + ?get_transition_chain_proof ?get_ancestry ?get_best_tip ~context:(module Context : CONTEXT) ~verifier ~max_frontier_length ~use_super_catchup = let open Context in @@ -369,20 +281,18 @@ module Generator = struct ~f:(Transition_frontier.add_breadcrumb_exn frontier) ) ; make_peer_state ~frontier ~consensus_local_state - ~context:(module Context) ?get_staged_ledger_aux_and_pending_coinbases_at_hash ?get_some_initial_peers ?answer_sync_ledger_query ?get_ancestry - ?get_best_tip ?get_node_status ?get_transition_knowledge - ?get_transition_chain_proof ?get_transition_chain + ?get_best_tip ?get_transition_knowledge ?get_transition_chain_proof + ?get_transition_chain let peer_with_branch ~frontier_branch_size ~context:(module Context : CONTEXT) ~verifier ~max_frontier_length ~use_super_catchup = peer_with_branch_custom_rpc ~frontier_branch_size ?get_staged_ledger_aux_and_pending_coinbases_at_hash:None ?get_some_initial_peers:None ?answer_sync_ledger_query:None - ?get_ancestry:None ?get_best_tip:None ?get_node_status:None - ?get_transition_knowledge:None ?get_transition_chain_proof:None - ?get_transition_chain:None + ?get_ancestry:None ?get_best_tip:None ?get_transition_knowledge:None + ?get_transition_chain_proof:None ?get_transition_chain:None ~context:(module Context) ~verifier ~max_frontier_length ~use_super_catchup diff --git a/src/lib/fake_network/fake_network.mli b/src/lib/fake_network/fake_network.mli index 3705020cbc4..cee6df672f8 100644 --- a/src/lib/fake_network/fake_network.mli +++ b/src/lib/fake_network/fake_network.mli @@ -1,8 +1,5 @@ -open Async open Core open Gadt_lib -open Network_peer -open Mina_base module Sync_ledger = Mina_ledger.Sync_ledger module type CONTEXT = sig @@ -21,47 +18,7 @@ type 'n num_peers = 'n Peano.gt_1 type peer_state = { frontier : Transition_frontier.t ; consensus_local_state : Consensus.Data.Local_state.t - ; get_staged_ledger_aux_and_pending_coinbases_at_hash : - Pasta_bindings.Fp.t Envelope.Incoming.t - -> ( Staged_ledger.Scan_state.t - * Pasta_bindings.Fp.t - * Pending_coinbase.t - * Mina_state.Protocol_state.value list ) - option - Deferred.t - ; get_some_initial_peers : unit Envelope.Incoming.t -> Peer.t list Deferred.t - ; answer_sync_ledger_query : - (Pasta_bindings.Fp.t * Sync_ledger.Query.t) Envelope.Incoming.t - -> (Sync_ledger.Answer.t, Error.t) result Deferred.t - ; get_ancestry : - ( Consensus.Data.Consensus_state.Value.t - , Pasta_bindings.Fp.t ) - With_hash.t - Envelope.Incoming.t - -> ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) - Proof_carrying_data.t - option - Deferred.t - ; get_best_tip : - unit Envelope.Incoming.t - -> ( Mina_block.t - , Pasta_bindings.Fp.t list * Mina_block.t ) - Proof_carrying_data.t - option - Deferred.t - ; get_node_status : - unit Envelope.Incoming.t - -> (Mina_networking.Rpcs.Get_node_status.Node_status.t, Error.t) result - Deferred.t - ; get_transition_knowledge : - unit Envelope.Incoming.t -> Pasta_bindings.Fp.t list Deferred.t - ; get_transition_chain_proof : - Pasta_bindings.Fp.t Envelope.Incoming.t - -> (Pasta_bindings.Fp.t * Pasta_bindings.Fp.t list) option Deferred.t - ; get_transition_chain : - Pasta_bindings.Fp.t list Envelope.Incoming.t - -> Mina_block.t list option Deferred.t + ; rpc_mocks : Mina_networking.Gossip_net.Fake.rpc_mocks } type peer_network = @@ -76,6 +33,45 @@ type nonrec 'n t = } constraint 'n = _ num_peers +include sig + open Mina_networking + + type 'a fn_with_mocks = + ?get_some_initial_peers: + ( Rpcs.Get_some_initial_peers.query + , Rpcs.Get_some_initial_peers.response ) + Gossip_net.Fake.rpc_mock + -> ?get_staged_ledger_aux_and_pending_coinbases_at_hash: + ( Rpcs.Get_staged_ledger_aux_and_pending_coinbases_at_hash.query + , Rpcs.Get_staged_ledger_aux_and_pending_coinbases_at_hash.response ) + Gossip_net.Fake.rpc_mock + -> ?answer_sync_ledger_query: + ( Rpcs.Answer_sync_ledger_query.query + , Rpcs.Answer_sync_ledger_query.response ) + Gossip_net.Fake.rpc_mock + -> ?get_transition_chain: + ( Rpcs.Get_transition_chain.query + , Rpcs.Get_transition_chain.response ) + Gossip_net.Fake.rpc_mock + -> ?get_transition_knowledge: + ( Rpcs.Get_transition_knowledge.query + , Rpcs.Get_transition_knowledge.response ) + Gossip_net.Fake.rpc_mock + -> ?get_transition_chain_proof: + ( Rpcs.Get_transition_chain_proof.query + , Rpcs.Get_transition_chain_proof.response ) + Gossip_net.Fake.rpc_mock + -> ?get_ancestry: + ( Rpcs.Get_ancestry.query + , Rpcs.Get_ancestry.response ) + Gossip_net.Fake.rpc_mock + -> ?get_best_tip: + ( Rpcs.Get_best_tip.query + , Rpcs.Get_best_tip.response ) + Gossip_net.Fake.rpc_mock + -> 'a +end + module Generator : sig open Quickcheck @@ -86,104 +82,12 @@ module Generator : sig -> use_super_catchup:bool -> peer_state Generator.t - val fresh_peer_custom_rpc : - ?get_staged_ledger_aux_and_pending_coinbases_at_hash: - ( Pasta_bindings.Fp.t Envelope.Incoming.t - -> ( Staged_ledger.Scan_state.t - * Pasta_bindings.Fp.t - * Pending_coinbase.t - * Mina_state.Protocol_state.value list ) - option - Deferred.t ) - -> ?get_some_initial_peers: - (unit Envelope.Incoming.t -> Peer.t list Deferred.t) - -> ?answer_sync_ledger_query: - ( (Pasta_bindings.Fp.t * Sync_ledger.Query.t) Envelope.Incoming.t - -> (Sync_ledger.Answer.t, Error.t) result Deferred.t ) - -> ?get_ancestry: - ( ( Consensus.Data.Consensus_state.Value.t - , Pasta_bindings.Fp.t ) - With_hash.t - Envelope.Incoming.t - -> ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) - Proof_carrying_data.t - option - Deferred.t ) - -> ?get_best_tip: - ( unit Envelope.Incoming.t - -> ( Mina_block.t - , Pasta_bindings.Fp.t list * Mina_block.t ) - Proof_carrying_data.t - option - Deferred.t ) - -> ?get_node_status: - ( unit Envelope.Incoming.t - -> ( Mina_networking.Rpcs.Get_node_status.Node_status.t - , Error.t ) - result - Deferred.t ) - -> ?get_transition_knowledge: - (unit Envelope.Incoming.t -> Pasta_bindings.Fp.t list Deferred.t) - -> ?get_transition_chain_proof: - ( Pasta_bindings.Fp.t Envelope.Incoming.t - -> (Pasta_bindings.Fp.t * Pasta_bindings.Fp.t list) option Deferred.t - ) - -> ?get_transition_chain: - ( Pasta_bindings.Fp.t list Envelope.Incoming.t - -> Mina_block.t list option Deferred.t ) - -> peer_config + val fresh_peer_custom_rpc : peer_config fn_with_mocks val fresh_peer : peer_config val peer_with_branch_custom_rpc : - frontier_branch_size:int - -> ?get_staged_ledger_aux_and_pending_coinbases_at_hash: - ( Pasta_bindings.Fp.t Envelope.Incoming.t - -> ( Staged_ledger.Scan_state.t - * Pasta_bindings.Fp.t - * Pending_coinbase.t - * Mina_state.Protocol_state.value list ) - option - Deferred.t ) - -> ?get_some_initial_peers: - (unit Envelope.Incoming.t -> Peer.t list Deferred.t) - -> ?answer_sync_ledger_query: - ( (Pasta_bindings.Fp.t * Sync_ledger.Query.t) Envelope.Incoming.t - -> (Sync_ledger.Answer.t, Error.t) result Deferred.t ) - -> ?get_ancestry: - ( ( Consensus.Data.Consensus_state.Value.t - , Pasta_bindings.Fp.t ) - With_hash.t - Envelope.Incoming.t - -> ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) - Proof_carrying_data.t - option - Deferred.t ) - -> ?get_best_tip: - ( unit Envelope.Incoming.t - -> ( Mina_block.t - , Pasta_bindings.Fp.t list * Mina_block.t ) - Proof_carrying_data.t - option - Deferred.t ) - -> ?get_node_status: - ( unit Envelope.Incoming.t - -> ( Mina_networking.Rpcs.Get_node_status.Node_status.t - , Error.t ) - result - Deferred.t ) - -> ?get_transition_knowledge: - (unit Envelope.Incoming.t -> Pasta_bindings.Fp.t list Deferred.t) - -> ?get_transition_chain_proof: - ( Pasta_bindings.Fp.t Envelope.Incoming.t - -> (Pasta_bindings.Fp.t * Pasta_bindings.Fp.t list) option Deferred.t - ) - -> ?get_transition_chain: - ( Pasta_bindings.Fp.t list Envelope.Incoming.t - -> Mina_block.t list option Deferred.t ) - -> peer_config + frontier_branch_size:int -> peer_config fn_with_mocks val peer_with_branch : frontier_branch_size:int -> peer_config diff --git a/src/lib/genesis_constants/dune b/src/lib/genesis_constants/dune index 401361fcc60..175e6734300 100644 --- a/src/lib/genesis_constants/dune +++ b/src/lib/genesis_constants/dune @@ -13,6 +13,8 @@ sexplib0 integers ;; local libraries + mina_node_config.intf + mina_node_config.for_unit_tests mina_node_config mina_wire_types unsigned_extended @@ -21,7 +23,6 @@ currency blake2 data_hash_lib - mina_compile_config pickles.backend snark_keys_header kimchi_pasta diff --git a/src/lib/genesis_constants/genesis_constants.ml b/src/lib/genesis_constants/genesis_constants.ml index 28e10867bc6..35259dd34ba 100644 --- a/src/lib/genesis_constants/genesis_constants.ml +++ b/src/lib/genesis_constants/genesis_constants.ml @@ -14,10 +14,6 @@ module Proof_level = struct None | s -> failwithf "unrecognised proof level %s" s () - - let compiled = of_string Node_config.proof_level - - let for_unit_tests = Check end module Fork_constants = struct @@ -30,13 +26,6 @@ module Fork_constants = struct [@@deriving bin_io_unversioned, sexp, equal, compare, yojson] end -(** Constants that affect the constraint systems for proofs (and thus also key - generation). - - Care must be taken to ensure that these match against the proving/ - verification keys when [proof_level=Full], otherwise generated proofs will - be invalid. -*) module Constraint_constants = struct type t = { sub_windows_per_window : int @@ -76,118 +65,46 @@ module Constraint_constants = struct | None -> None ) } +end - (* Generate the compile-time constraint constants, using a signature to hide - the optcomp constants that we import. - *) - include ( - struct - (** All the proofs before the last [work_delay] blocks must be - completed to add transactions. [work_delay] is the minimum number - of blocks and will increase if the throughput is less. - - If [work_delay = 0], all the work that was added to the scan - state in the previous block is expected to be completed and - included in the current block if any transactions/coinbase are to - be included. - - [work_delay >= 1] means that there's at least two block times for - completing the proofs. - *) - - let transaction_capacity_log_2 = - match - ( Node_config.scan_state_with_tps_goal - , Node_config.scan_state_tps_goal_x10 ) - with - | true, Some tps_goal_x10 -> - let max_coinbases = 2 in - - (* block_window_duration is in milliseconds, so divide by 1000 divide - by 10 again because we have tps * 10 - *) - let max_user_commands_per_block = - tps_goal_x10 * Node_config.block_window_duration / (1000 * 10) - in - - (* Log of the capacity of transactions per transition. - - 1 will only work if we don't have prover fees. - - 2 will work with prover fees, but not if we want a transaction - included in every block. - - At least 3 ensures a transaction per block and the staged-ledger - unit tests pass. - *) - 1 - + Core_kernel.Int.ceil_log2 - (max_user_commands_per_block + max_coinbases) - | _ -> ( - match Node_config.scan_state_transaction_capacity_log_2 with - | Some a -> - a - | None -> - failwith - "scan_state_transaction_capacity_log_2 must be set if \ - scan_state_with_tps_goal is false" ) - - let supercharged_coinbase_factor = - Node_config.supercharged_coinbase_factor - - let pending_coinbase_depth = - Core_kernel.Int.ceil_log2 - ( (transaction_capacity_log_2 + 1) - * (Node_config.scan_state_work_delay + 1) - + 1 ) - - let compiled = - { sub_windows_per_window = Node_config.sub_windows_per_window - ; ledger_depth = Node_config.ledger_depth - ; work_delay = Node_config.scan_state_work_delay - ; block_window_duration_ms = Node_config.block_window_duration - ; transaction_capacity_log_2 - ; pending_coinbase_depth - ; coinbase_amount = - Currency.Amount.of_mina_string_exn Node_config.coinbase - ; supercharged_coinbase_factor - ; account_creation_fee = - Currency.Fee.of_mina_string_exn Node_config.account_creation_fee_int - ; fork = None - } - end : - sig - val compiled : t - end ) - - let for_unit_tests = compiled +module Helpers = struct + (*Constants that can be specified for generating the base proof (that are not required for key-generation) in runtime_genesis_ledger.exe and that can be configured at runtime. + The types are defined such that this module doesn't depend on any of the coda libraries (except blake2 and module_version) to avoid dependency cycles. + TODO: #4659 move key generation to runtime_genesis_ledger.exe to include scan_state constants, consensus constants (c and block_window_duration) and ledger depth here*) + + let genesis_timestamp_of_string str = + let default_zone = Time.Zone.of_utc_offset ~hours:(-8) in + Time.of_string_gen + ~find_zone:(fun _ -> assert false) + ~default_zone:(fun () -> default_zone) + str + + let of_time t = + Time.to_span_since_epoch t |> Time.Span.to_ms |> Int64.of_float + + let to_time t = + t |> Int64.to_float |> Time.Span.of_ms |> Time.of_span_since_epoch + + let validate_time time_str = + match + Result.try_with (fun () -> + Option.value_map ~default:(Time.now ()) ~f:genesis_timestamp_of_string + time_str ) + with + | Ok time -> + Ok (of_time time) + | Error _ -> + Error + "Invalid timestamp. Please specify timestamp in \"%Y-%m-%d \ + %H:%M:%S%z\". For example, \"2019-01-30 12:00:00-0800\" for \ + UTC-08:00 timezone" + + let genesis_timestamp_to_string time = + Int64.to_float time |> Time.Span.of_ms |> Time.of_span_since_epoch + |> Time.to_string_iso8601_basic ~zone:(Time.Zone.of_utc_offset ~hours:(-8)) end -(*Constants that can be specified for generating the base proof (that are not required for key-generation) in runtime_genesis_ledger.exe and that can be configured at runtime. - The types are defined such that this module doesn't depend on any of the coda libraries (except blake2 and module_version) to avoid dependency cycles. - TODO: #4659 move key generation to runtime_genesis_ledger.exe to include scan_state constants, consensus constants (c and block_window_duration) and ledger depth here*) - -let genesis_timestamp_of_string str = - let default_zone = Time.Zone.of_utc_offset ~hours:(-8) in - Time.of_string_gen - ~find_zone:(fun _ -> assert false) - ~default_zone:(fun () -> default_zone) - str - -let of_time t = Time.to_span_since_epoch t |> Time.Span.to_ms |> Int64.of_float - -let validate_time time_str = - match - Result.try_with (fun () -> - Option.value_map ~default:(Time.now ()) ~f:genesis_timestamp_of_string - time_str ) - with - | Ok time -> - Ok (of_time time) - | Error _ -> - Error - "Invalid timestamp. Please specify timestamp in \"%Y-%m-%d \ - %H:%M:%S%z\". For example, \"2019-01-30 12:00:00-0800\" for UTC-08:00 \ - timezone" - -let genesis_timestamp_to_string time = - Int64.to_float time |> Time.Span.of_ms |> Time.of_span_since_epoch - |> Time.to_string_iso8601_basic ~zone:(Time.Zone.of_utc_offset ~hours:(-8)) +include Helpers (*Protocol constants required for consensus and snarks. Consensus constants is generated using these*) module Protocol = struct @@ -299,6 +216,7 @@ module T = struct ; max_event_elements : int ; max_action_elements : int ; zkapp_cmd_limit_hardcap : int + ; minimum_user_command_fee : Currency.Fee.Stable.Latest.t } [@@deriving to_yojson, sexp_of, bin_io_unversioned] @@ -324,42 +242,210 @@ end include T -let genesis_state_timestamp_string = Node_config.genesis_state_timestamp - -let k = Node_config.k - -let slots_per_epoch = Node_config.slots_per_epoch - -let slots_per_sub_window = Node_config.slots_per_sub_window - -let grace_period_slots = Node_config.grace_period_slots - -let delta = Node_config.delta - -let pool_max_size = Node_config.pool_max_size - -let compiled : t = - { protocol = - { k - ; slots_per_epoch - ; slots_per_sub_window - ; grace_period_slots - ; delta - ; genesis_state_timestamp = - genesis_timestamp_of_string genesis_state_timestamp_string |> of_time - } - ; txpool_max_size = pool_max_size - ; num_accounts = None - ; zkapp_proof_update_cost = Mina_compile_config.zkapp_proof_update_cost - ; zkapp_signed_single_update_cost = - Mina_compile_config.zkapp_signed_single_update_cost - ; zkapp_signed_pair_update_cost = - Mina_compile_config.zkapp_signed_pair_update_cost - ; zkapp_transaction_cost_limit = - Mina_compile_config.zkapp_transaction_cost_limit - ; max_event_elements = Mina_compile_config.max_event_elements - ; max_action_elements = Mina_compile_config.max_action_elements - ; zkapp_cmd_limit_hardcap = Mina_compile_config.zkapp_cmd_limit_hardcap - } - -let for_unit_tests = compiled +module type S = sig + module Proof_level : sig + include module type of Proof_level with type t = Proof_level.t + + val t : t + end + + module Fork_constants = Fork_constants + + module Constraint_constants : sig + include + module type of Constraint_constants with type t = Constraint_constants.t + + val t : t + end + + val genesis_timestamp_of_string : string -> Time.t + + val of_time : Time.t -> int64 + + val to_time : int64 -> Time.t + + val validate_time : string option -> (int64, string) result + + val genesis_timestamp_to_string : int64 -> string + + module Protocol = Protocol + + include module type of T with type t = T.t + + val genesis_state_timestamp_string : string + + val k : int + + val slots_per_epoch : int + + val slots_per_sub_window : int + + val grace_period_slots : int + + val delta : int + + val pool_max_size : int + + val t : t +end + +module Make (Node_config : Node_config_intf.S) : S = struct + module Proof_level = struct + include Proof_level + + let t = of_string Node_config.proof_level + end + + module Fork_constants = Fork_constants + + (** Constants that affect the constraint systems for proofs (and thus also key + generation). + + Care must be taken to ensure that these match against the proving/ + verification keys when [proof_level=Full], otherwise generated proofs will + be invalid. + *) + module Constraint_constants = struct + include Constraint_constants + + (* Generate the compile-time constraint constants, using a signature to hide + the optcomp constants that we import. + *) + include ( + struct + (** All the proofs before the last [work_delay] blocks must be + completed to add transactions. [work_delay] is the minimum number + of blocks and will increase if the throughput is less. + - If [work_delay = 0], all the work that was added to the scan + state in the previous block is expected to be completed and + included in the current block if any transactions/coinbase are to + be included. + - [work_delay >= 1] means that there's at least two block times for + completing the proofs. + *) + + let transaction_capacity_log_2 = + match + ( Node_config.scan_state_with_tps_goal + , Node_config.scan_state_tps_goal_x10 ) + with + | true, Some tps_goal_x10 -> + let max_coinbases = 2 in + + (* block_window_duration is in milliseconds, so divide by 1000 divide + by 10 again because we have tps * 10 + *) + let max_user_commands_per_block = + tps_goal_x10 * Node_config.block_window_duration / (1000 * 10) + in + + (* Log of the capacity of transactions per transition. + - 1 will only work if we don't have prover fees. + - 2 will work with prover fees, but not if we want a transaction + included in every block. + - At least 3 ensures a transaction per block and the staged-ledger + unit tests pass. + *) + 1 + + Core_kernel.Int.ceil_log2 + (max_user_commands_per_block + max_coinbases) + | _ -> ( + match Node_config.scan_state_transaction_capacity_log_2 with + | Some a -> + a + | None -> + failwith + "scan_state_transaction_capacity_log_2 must be set if \ + scan_state_with_tps_goal is false" ) + + let supercharged_coinbase_factor = + Node_config.supercharged_coinbase_factor + + let pending_coinbase_depth = + Core_kernel.Int.ceil_log2 + ( (transaction_capacity_log_2 + 1) + * (Node_config.scan_state_work_delay + 1) + + 1 ) + + let t = + { sub_windows_per_window = Node_config.sub_windows_per_window + ; ledger_depth = Node_config.ledger_depth + ; work_delay = Node_config.scan_state_work_delay + ; block_window_duration_ms = Node_config.block_window_duration + ; transaction_capacity_log_2 + ; pending_coinbase_depth + ; coinbase_amount = + Currency.Amount.of_mina_string_exn Node_config.coinbase + ; supercharged_coinbase_factor + ; account_creation_fee = + Currency.Fee.of_mina_string_exn + Node_config.account_creation_fee_int + ; fork = None + } + end : + sig + val t : t + end ) + end + + include Helpers + module Protocol = Protocol + include T + + let genesis_state_timestamp_string = Node_config.genesis_state_timestamp + + let k = Node_config.k + + let slots_per_epoch = Node_config.slots_per_epoch + + let slots_per_sub_window = Node_config.slots_per_sub_window + + let grace_period_slots = Node_config.grace_period_slots + + let delta = Node_config.delta + + let pool_max_size = Node_config.pool_max_size + + let t : t = + { protocol = + { k + ; slots_per_epoch + ; slots_per_sub_window + ; grace_period_slots + ; delta + ; genesis_state_timestamp = + genesis_timestamp_of_string genesis_state_timestamp_string + |> of_time + } + ; txpool_max_size = pool_max_size + ; num_accounts = None + ; zkapp_proof_update_cost = Node_config.zkapp_proof_update_cost + ; zkapp_signed_single_update_cost = + Node_config.zkapp_signed_single_update_cost + ; zkapp_signed_pair_update_cost = Node_config.zkapp_signed_pair_update_cost + ; zkapp_transaction_cost_limit = Node_config.zkapp_transaction_cost_limit + ; max_event_elements = Node_config.max_event_elements + ; max_action_elements = Node_config.max_action_elements + ; zkapp_cmd_limit_hardcap = Node_config.zkapp_cmd_limit_hardcap + ; minimum_user_command_fee = + Currency.Fee.of_mina_string_exn Node_config.minimum_user_command_fee + } +end + +module For_unit_tests = Make (Node_config_for_unit_tests) + +module Compiled : sig + val genesis_constants : t + + val constraint_constants : Constraint_constants.t + + val proof_level : Proof_level.t +end = struct + include Make (Node_config) + + let genesis_constants = t + + let constraint_constants = Constraint_constants.t + + let proof_level = Proof_level.t +end diff --git a/src/lib/genesis_ledger/fake_accounts.ml b/src/lib/genesis_ledger/fake_accounts.ml deleted file mode 100644 index 87aaefd250e..00000000000 --- a/src/lib/genesis_ledger/fake_accounts.ml +++ /dev/null @@ -1,15 +0,0 @@ -(* fake_accounts.ml -- generate fake accounts for testnet *) - -open Core_kernel -open Signature_lib - -let make_account pk balance = - Intf.Public_accounts.{ pk; balance; delegate = None; timing = Untimed } - -let balance_gen = Quickcheck.Generator.of_list (List.range 10 500) - -let gen = - let open Quickcheck.Let_syntax in - let%bind balance = balance_gen in - let%map pk = Public_key.Compressed.gen in - make_account pk balance diff --git a/src/lib/genesis_ledger/genesis_ledger.ml b/src/lib/genesis_ledger/genesis_ledger.ml index ab65fe1a2f2..018ac968091 100644 --- a/src/lib/genesis_ledger/genesis_ledger.ml +++ b/src/lib/genesis_ledger/genesis_ledger.ml @@ -39,19 +39,6 @@ module Private_accounts (Accounts : Intf.Private_accounts.S) = struct (Some sk, account_with_timing account_id balance timing) ) end -module Public_accounts (Accounts : Intf.Public_accounts.S) = struct - include Accounts - - let accounts = - let open Lazy.Let_syntax in - let%map accounts = Accounts.accounts in - List.map accounts ~f:(fun { pk; balance; delegate; timing } -> - let account_id = Account_id.create pk Token_id.default in - let balance = Balance.of_nanomina_int_exn balance in - let base_acct = account_with_timing account_id balance timing in - (None, { base_acct with delegate = Option.value ~default:pk delegate }) ) -end - (** Generate a ledger using the sample keypairs from [Mina_base] with the given balances. *) @@ -85,7 +72,7 @@ module Utils = struct let private_key = Option.value_exn private_key ~message:sk_error_msg in let public_key = Option.value_exn - (Public_key.decompress account.Poly.Stable.Latest.public_key) + (Public_key.decompress account.public_key) ~message:pk_error_msg in { Keypair.public_key; private_key } @@ -222,7 +209,7 @@ end) : Intf.S = struct in Memo.unit (fun () -> List.max_elt (Lazy.force accounts) ~compare:(fun (_, a) (_, b) -> - Balance.compare a.Account.Poly.balance b.Account.Poly.balance ) + Balance.compare a.Account.balance b.Account.balance ) |> Option.value_exn ?here:None ?error:None ~message:error_msg ) let largest_account_id_exn = @@ -273,7 +260,8 @@ module Unit_test_ledger = Make (struct let directory = `Ephemeral - let depth = Genesis_constants.Constraint_constants.for_unit_tests.ledger_depth + let depth = + Genesis_constants.For_unit_tests.Constraint_constants.t.ledger_depth end) let for_unit_tests : Packed.t = (module Unit_test_ledger) diff --git a/src/lib/genesis_ledger/intf.ml b/src/lib/genesis_ledger/intf.ml index d7d4cfa754a..1520d177a9a 100644 --- a/src/lib/genesis_ledger/intf.ml +++ b/src/lib/genesis_ledger/intf.ml @@ -27,21 +27,6 @@ module Timing = struct } end -module Public_accounts = struct - type account_data = - { pk : Public_key.Compressed.t - ; balance : int - ; delegate : Public_key.Compressed.t option - ; timing : Timing.t - } - - module type S = sig - val name : string - - val accounts : account_data list Lazy.t - end -end - module Private_accounts = struct type account_data = { pk : Public_key.Compressed.t diff --git a/src/lib/genesis_ledger_helper/dune b/src/lib/genesis_ledger_helper/dune index 7c2b6e44580..66a7769661b 100644 --- a/src/lib/genesis_ledger_helper/dune +++ b/src/lib/genesis_ledger_helper/dune @@ -39,7 +39,6 @@ snark_params unsigned_extended consensus - mina_compile_config pickles logger mina_base.import diff --git a/src/lib/genesis_ledger_helper/genesis_ledger_helper.ml b/src/lib/genesis_ledger_helper/genesis_ledger_helper.ml index f0361bc70f4..29aab4f6b9a 100644 --- a/src/lib/genesis_ledger_helper/genesis_ledger_helper.ml +++ b/src/lib/genesis_ledger_helper/genesis_ledger_helper.ml @@ -320,7 +320,7 @@ module Ledger = struct | Some version -> List.map accounts_with_keys ~f:(fun (key, account) -> let patched_account = - Mina_base.Account.Poly. + Mina_base.Account. { account with permissions = Mina_base.Permissions.Poly. @@ -728,183 +728,6 @@ module Genesis_proof = struct let id_to_json x = `String (Sexp.to_string (Pickles.Verification_key.Id.sexp_of_t x)) - let load_or_generate ~genesis_dir ~logger (inputs : Genesis_proof.Inputs.t) = - let proof_needed = - match inputs.proof_level with Full -> true | _ -> false - in - let b, id = - match (inputs.blockchain_proof_system_id, inputs.proof_level) with - | Some id, _ -> - (None, Deferred.return id) - | None, Full -> - let ((_, (module B)) as b) = - Genesis_proof.blockchain_snark_state inputs - in - (Some b, Lazy.force B.Proof.id) - | _ -> - (None, Deferred.return @@ Pickles.Verification_key.Id.dummy ()) - in - let%bind id = id in - let base_hash = - Base_hash.create ~id - ~state_hash: - (State_hash.With_state_hashes.state_hash - inputs.protocol_state_with_hashes ) - in - let use_precomputed_values base_hash = - match Precomputed_values.compiled with - | Some _ when not proof_needed -> - true - | Some compiled -> ( - let compiled = Lazy.force compiled in - match compiled.proof_data with - | Some proof_data -> - let compiled_base_hash = - Base_hash.create ~id:proof_data.blockchain_proof_system_id - ~state_hash: - (State_hash.With_state_hashes.state_hash - compiled.protocol_state_with_hashes ) - in - Base_hash.equal base_hash compiled_base_hash - | None -> - false ) - | None -> - false - in - let%bind found_proof = - match%bind find_file ~logger ~base_hash ~genesis_dir with - | Some file -> ( - match%bind load file with - | Ok genesis_proof -> - let b = - lazy - ( match b with - | Some b -> - b - | None -> - Genesis_proof.blockchain_snark_state inputs ) - in - let constraint_system_digests = - match inputs.constraint_system_digests with - | Some digests -> - lazy digests - | None -> - lazy - (let (module T), (module B) = Lazy.force b in - Lazy.force @@ Genesis_proof.digests (module T) (module B) - ) - in - let%map blockchain_proof_system_id = - match inputs.blockchain_proof_system_id with - | Some id -> - Deferred.return id - | None -> - let _, (module B) = Lazy.force b in - Lazy.force B.Proof.id - in - Some - ( { Genesis_proof.runtime_config = inputs.runtime_config - ; constraint_constants = inputs.constraint_constants - ; proof_level = inputs.proof_level - ; genesis_constants = inputs.genesis_constants - ; genesis_ledger = inputs.genesis_ledger - ; genesis_epoch_data = inputs.genesis_epoch_data - ; consensus_constants = inputs.consensus_constants - ; protocol_state_with_hashes = - inputs.protocol_state_with_hashes - ; constraint_system_digests - ; proof_data = - Some { blockchain_proof_system_id; genesis_proof } - ; genesis_body_reference = inputs.genesis_body_reference - } - , file ) - | Error err -> - [%log error] "Could not load genesis proof from $path: $error" - ~metadata: - [ ("path", `String file) - ; ("error", Error_json.error_to_yojson err) - ] ; - return None ) - | None -> - return None - in - match found_proof with - | Some found_proof -> - return (Ok found_proof) - | None when use_precomputed_values base_hash -> - let compiled = - Lazy.force (Option.value_exn Precomputed_values.compiled) - in - let proof_data = Option.value_exn compiled.proof_data in - let compiled_base_hash = - Base_hash.create ~id:proof_data.blockchain_proof_system_id - ~state_hash: - (State_hash.With_state_hashes.state_hash - compiled.protocol_state_with_hashes ) - in - [%log info] - "Base hash $computed_hash matches compile-time $compiled_hash, using \ - precomputed genesis proof" - ~metadata: - [ ("computed_hash", Base_hash.to_yojson base_hash) - ; ("compiled_hash", Base_hash.to_yojson compiled_base_hash) - ] ; - let filename = genesis_dir ^/ filename ~base_hash in - let values = - { Genesis_proof.runtime_config = inputs.runtime_config - ; constraint_constants = inputs.constraint_constants - ; proof_level = inputs.proof_level - ; genesis_constants = inputs.genesis_constants - ; genesis_ledger = inputs.genesis_ledger - ; genesis_epoch_data = inputs.genesis_epoch_data - ; consensus_constants = inputs.consensus_constants - ; protocol_state_with_hashes = inputs.protocol_state_with_hashes - ; constraint_system_digests = compiled.constraint_system_digests - ; proof_data = Some proof_data - ; genesis_body_reference = inputs.genesis_body_reference - } - in - let%map () = - match%map store ~filename proof_data.genesis_proof with - | Ok () -> - [%log info] "Compile-time genesis proof written to $path" - ~metadata:[ ("path", `String filename) ] - | Error err -> - [%log warn] - "Compile-time genesis proof could not be written to $path: \ - $error" - ~metadata: - [ ("path", `String filename) - ; ("error", Error_json.error_to_yojson err) - ] - in - Ok (values, filename) - | None -> - [%log info] - "No genesis proof file was found for $base_hash, generating a new \ - genesis proof" - ~metadata:[ ("base_hash", Base_hash.to_yojson base_hash) ] ; - let%bind values = generate inputs in - let filename = genesis_dir ^/ filename ~base_hash in - let%map () = - match values.proof_data with - | None -> - return () - | Some proof_data -> ( - match%map store ~filename proof_data.genesis_proof with - | Ok () -> - [%log info] "New genesis proof written to $path" - ~metadata:[ ("path", `String filename) ] - | Error err -> - [%log warn] - "Genesis proof could not be written to $path: $error" - ~metadata: - [ ("path", `String filename) - ; ("error", Error_json.error_to_yojson err) - ] ) - in - Ok (values, filename) - let create_values_no_proof = Genesis_proof.create_values_no_proof end @@ -952,13 +775,15 @@ let print_config ~logger config = ~metadata let inputs_from_config_file ?(genesis_dir = Cache_dir.autogen_path) ~logger - ~proof_level ?overwrite_version (config : Runtime_config.t) = + ~cli_proof_level ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) + ~proof_level:compiled_proof_level ?overwrite_version + (config : Runtime_config.t) = print_config ~logger config ; let open Deferred.Or_error.Let_syntax in - let genesis_constants = Genesis_constants.compiled in let proof_level = List.find_map_exn ~f:Fn.id - [ proof_level + [ cli_proof_level ; Option.Let_syntax.( let%bind proof = config.proof in match%map proof.level with @@ -968,15 +793,14 @@ let inputs_from_config_file ?(genesis_dir = Cache_dir.autogen_path) ~logger Check | None -> None) - ; Some Genesis_constants.Proof_level.compiled + ; Some compiled_proof_level ] in let constraint_constants, blockchain_proof_system_id = match config.proof with | None -> [%log info] "Using the compiled constraint constants" ; - ( Genesis_constants.Constraint_constants.compiled - , Some (Pickles.Verification_key.Id.dummy ()) ) + (constraint_constants, Some (Pickles.Verification_key.Id.dummy ())) | Some config -> [%log info] "Using the constraint constants from the configuration file" ; let blockchain_proof_system_id = @@ -989,12 +813,11 @@ let inputs_from_config_file ?(genesis_dir = Cache_dir.autogen_path) ~logger *) None in - ( make_constraint_constants - ~default:Genesis_constants.Constraint_constants.compiled config + ( make_constraint_constants ~default:constraint_constants config , blockchain_proof_system_id ) in let%bind () = - match (proof_level, Genesis_constants.Proof_level.compiled) with + match (proof_level, compiled_proof_level) with | _, Full | (Check | None), _ -> return () | Full, ((Check | None) as compiled) -> @@ -1043,13 +866,14 @@ let inputs_from_config_file ?(genesis_dir = Cache_dir.autogen_path) ~logger in (proof_inputs, config) -let init_from_config_file ?genesis_dir ~logger ~proof_level ?overwrite_version +let init_from_config_file ?genesis_dir ~cli_proof_level ~genesis_constants + ~constraint_constants ~logger ~proof_level ?overwrite_version (config : Runtime_config.t) : (Precomputed_values.t * Runtime_config.t) Deferred.Or_error.t = let open Deferred.Or_error.Let_syntax in let%map inputs, config = - inputs_from_config_file ?genesis_dir ~logger ~proof_level ?overwrite_version - config + inputs_from_config_file ?genesis_dir ~cli_proof_level ~genesis_constants + ~constraint_constants ~logger ~proof_level ?overwrite_version config in let values = Genesis_proof.create_values_no_proof inputs in (values, config) diff --git a/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml b/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml index 6438ba26eba..5316b65a7f3 100644 --- a/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml +++ b/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml @@ -589,6 +589,9 @@ let make_genesis_constants ~logger ~(default : Genesis_constants.t) ; zkapp_cmd_limit_hardcap = Option.value ~default:default.zkapp_cmd_limit_hardcap (config.daemon >>= fun cfg -> cfg.zkapp_cmd_limit_hardcap) + ; minimum_user_command_fee = + Option.value ~default:default.minimum_user_command_fee + (config.daemon >>= fun cfg -> cfg.minimum_user_command_fee) } let runtime_config_of_genesis_constants (genesis_constants : Genesis_constants.t) @@ -634,6 +637,8 @@ let runtime_config_of_precomputed_values (precomputed_values : Genesis_proof.t) Some precomputed_values.genesis_constants.zkapp_cmd_limit_hardcap ; slot_tx_end = None ; slot_chain_end = None + ; minimum_user_command_fee = + Some precomputed_values.genesis_constants.minimum_user_command_fee ; network_id = None } ; genesis = diff --git a/src/lib/genesis_proof/genesis_proof.ml b/src/lib/genesis_proof/genesis_proof.ml index a7bfe26c634..9d3c74d6a18 100644 --- a/src/lib/genesis_proof/genesis_proof.ml +++ b/src/lib/genesis_proof/genesis_proof.ml @@ -218,25 +218,6 @@ let blockchain_snark_state (inputs : Inputs.t) : end) in ((module T), (module B)) -let create_values txn b (t : Inputs.t) = - let%bind.Async.Deferred (), (), genesis_proof = base_proof b t in - let%map.Async.Deferred blockchain_proof_system_id = - let (module B) = b in - Lazy.force B.Proof.id - in - { runtime_config = t.runtime_config - ; constraint_constants = t.constraint_constants - ; proof_level = t.proof_level - ; genesis_constants = t.genesis_constants - ; genesis_ledger = t.genesis_ledger - ; genesis_epoch_data = t.genesis_epoch_data - ; genesis_body_reference = t.genesis_body_reference - ; consensus_constants = t.consensus_constants - ; protocol_state_with_hashes = t.protocol_state_with_hashes - ; constraint_system_digests = digests txn b - ; proof_data = Some { blockchain_proof_system_id; genesis_proof } - } - let create_values_no_proof (t : Inputs.t) = { runtime_config = t.runtime_config ; constraint_constants = t.constraint_constants diff --git a/src/lib/gossip_net/any.ml b/src/lib/gossip_net/any.ml index 9f7c520844b..f86fbe51175 100644 --- a/src/lib/gossip_net/any.ml +++ b/src/lib/gossip_net/any.ml @@ -1,41 +1,40 @@ open Async_kernel +open Intf module type S = sig - module Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf + module Rpc_interface : RPC_INTERFACE - module type Implementation_intf = - Intf.Gossip_net_intf with module Rpc_intf := Rpc_intf + module type IMPLEMENTATION = + GOSSIP_NET with module Rpc_interface := Rpc_interface - type 't implementation = (module Implementation_intf with type t = 't) + type 't implementation = (module IMPLEMENTATION with type t = 't) type t = Any : 't implementation * 't -> t - include Intf.Gossip_net_intf with module Rpc_intf := Rpc_intf and type t := t + include IMPLEMENTATION with type t := t - type 't creator = Rpc_intf.rpc_handler list -> Message.sinks -> 't Deferred.t + type 't creator = Rpc_interface.ctx -> Message.sinks -> 't Deferred.t type creatable = Creatable : 't implementation * 't creator -> creatable val create : creatable -> t creator end -module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : - S with module Rpc_intf := Rpc_intf = struct - open Rpc_intf +module Make (Rpc_interface : RPC_INTERFACE) : + S with module Rpc_interface := Rpc_interface = struct + module type IMPLEMENTATION = + GOSSIP_NET with module Rpc_interface := Rpc_interface - module type Implementation_intf = - Intf.Gossip_net_intf with module Rpc_intf := Rpc_intf - - type 't implementation = (module Implementation_intf with type t = 't) + type 't implementation = (module IMPLEMENTATION with type t = 't) type t = Any : 't implementation * 't -> t - type 't creator = rpc_handler list -> Message.sinks -> 't Deferred.t + type 't creator = Rpc_interface.ctx -> Message.sinks -> 't Deferred.t type creatable = Creatable : 't implementation * 't creator -> creatable - let create (Creatable ((module M), creator)) impls sinks = - let%map gossip_net = creator impls sinks in + let create (Creatable ((module M), creator)) ctx sinks = + let%map gossip_net = creator ctx sinks in Any ((module M), gossip_net) let peers (Any ((module M), t)) = M.peers t diff --git a/src/lib/gossip_net/fake.ml b/src/lib/gossip_net/fake.ml index c438a2712d3..efbcd0faeed 100644 --- a/src/lib/gossip_net/fake.ml +++ b/src/lib/gossip_net/fake.ml @@ -2,38 +2,47 @@ open Async_kernel open Core open Pipe_lib open Network_peer +open Intf (* TODO: Implement RPC version translations (documented in Async_rpc_kernel). * This code currently only supports the latest version of RPCs. *) module type S = sig - include Intf.Gossip_net_intf + include GOSSIP_NET type network + type ('q, 'r) rpc_mock = 'q Envelope.Incoming.t -> 'r Deferred.t + + type rpc_mocks = + { get_mock : 'q 'r. ('q, 'r) Rpc_interface.rpc -> ('q, 'r) rpc_mock option } + val create_network : Peer.t list -> network val create_instance : - network - -> Peer.t - -> Rpc_intf.rpc_handler list + network:network + -> rpc_mocks:rpc_mocks + -> local_ip:Peer.t + -> Rpc_interface.ctx -> Message.sinks -> t Deferred.t end -module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : - S with module Rpc_intf := Rpc_intf = struct - open Intf - open Rpc_intf +module Make (Rpc_interface : RPC_INTERFACE) : + S with module Rpc_interface := Rpc_interface = struct + type ('q, 'r) rpc_mock = 'q Envelope.Incoming.t -> 'r Deferred.t + + type rpc_mocks = + { get_mock : 'q 'r. ('q, 'r) Rpc_interface.rpc -> ('q, 'r) rpc_mock option } module Network = struct type rpc_hook = { hook : 'q 'r. Peer.Id.t - -> ('q, 'r) rpc + -> ('q, 'r) Rpc_interface.rpc -> 'q - -> 'r Network_peer.Rpc_intf.rpc_response Deferred.t + -> 'r rpc_response Deferred.t } type network_interface = { sinks : Message.sinks; rpc_hook : rpc_hook } @@ -103,9 +112,9 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : -> _ -> sender_id:Peer.Id.t -> responder_id:Peer.Id.t - -> (q, r) rpc + -> (q, r) Rpc_interface.rpc -> q - -> r Network_peer.Rpc_intf.rpc_response Deferred.t = + -> r rpc_response Deferred.t = fun t peer_table ~sender_id ~responder_id rpc query -> let responder = Option.value_exn @@ -117,56 +126,56 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : | Ok intf -> intf.rpc_hook.hook sender_id rpc query | Error e -> - Deferred.return (Network_peer.Rpc_intf.Failed_to_connect e) + Deferred.return (Failed_to_connect e) end module Instance = struct type t = - { network : Network.t - ; me : Peer.t - ; rpc_handlers : rpc_handler list + { time_controller : Block_time.Controller.t + ; network : Network.t + ; local_ip : Peer.t ; peer_table : (Peer.Id.t, Peer.t) Hashtbl.t ; initial_peers : Peer.t list ; connection_gating : Mina_net2.connection_gating ref ; ban_notification_reader : ban_notification Linear_pipe.Reader.t ; ban_notification_writer : ban_notification Linear_pipe.Writer.t - ; time_controller : Block_time.Controller.t } - let rpc_hook t rpc_handlers = + let rpc_hook ~rpc_mocks ctx t = let hook : type q r. Peer.Id.t - -> (q, r) rpc + -> (q, r) Rpc_interface.rpc -> q - -> r Network_peer.Rpc_intf.rpc_response Deferred.t = + -> r rpc_response Deferred.t = fun peer rpc query -> - let (module Impl) = implementation_of_rpc rpc in - let latest_version = - (* this is assumed safe since there should always be at least one version *) - Int.Set.max_elt (Impl.versions ()) - |> Option.value_exn ~error:(Error.of_string "no versions?") - in let sender = Hashtbl.find t.peer_table peer |> Option.value_exn ~error:(Error.createf "cannot find peer %s" peer) in - match - List.find_map rpc_handlers ~f:(fun handler -> - match_handler handler rpc ~do_:(fun f -> - f sender ~version:latest_version query ) ) - with - | None -> - failwith "fake gossip net error: rpc not implemented" - | Some deferred -> - let%map response = deferred in - Network_peer.Rpc_intf.Connected - (Envelope.Incoming.wrap_peer ~data:(Ok response) ~sender) + let query_env = Envelope.Incoming.wrap_peer ~data:query ~sender in + let%map response = + match rpc_mocks.get_mock rpc with + | Some f -> + f query_env + | None -> + let (module Impl) = Rpc_interface.implementation rpc in + let latest_version = + (* this is assumed safe since there should always be at least one version *) + Int.Set.max_elt (Impl.versions ()) + |> Option.value_exn ~error:(Error.of_string "no versions?") + in + Impl.handle_request ctx ~version:latest_version query_env + in + let response_env = + Envelope.Incoming.wrap_peer ~data:(Ok response) ~sender:t.local_ip + in + Connected response_env in Network.{ hook } - let create network me rpc_handlers sinks = - let initial_peers = Network.get_initial_peers network me.Peer.host in + let create ~network ~rpc_mocks ~(local_ip : Peer.t) ctx sinks = + let initial_peers = Network.get_initial_peers network local_ip.host in let peer_table = Hashtbl.create (module Peer.Id) in List.iter initial_peers ~f:(fun peer -> Hashtbl.add_exn peer_table ~key:peer.peer_id ~data:peer ) ; @@ -179,8 +188,7 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : in let t = { network - ; me - ; rpc_handlers + ; local_ip ; peer_table ; initial_peers ; connection_gating = @@ -193,9 +201,9 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : } in Network.( - attach_interface network me - { sinks; rpc_hook = rpc_hook t rpc_handlers }) ; - t + attach_interface network local_ip + { sinks; rpc_hook = rpc_hook ~rpc_mocks ctx t }) ; + return t let peers { peer_table; _ } = Hashtbl.data peer_table |> Deferred.return @@ -235,7 +243,7 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : ban_notification_reader let query_peer ?heartbeat_timeout:_ ?timeout:_ t peer rpc query = - Network.call_rpc t.network t.peer_table ~sender_id:t.me.peer_id + Network.call_rpc t.network t.peer_table ~sender_id:t.local_ip.peer_id ~responder_id:peer rpc query let query_peer' ?how ?heartbeat_timeout ?timeout t peer rpc qs = @@ -249,7 +257,7 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : | Connected x -> x.data | Failed_to_connect e -> - return (Network_peer.Rpc_intf.Failed_to_connect e) ) + return (Failed_to_connect e) ) |> Or_error.all in let sender = @@ -263,7 +271,7 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : let broadcast_state ?origin_topic t state = ignore origin_topic ; - Network.broadcast t.network ~sender:t.me state + Network.broadcast t.network ~sender:t.local_ip state (fun (Any_sinks (sinksM, (sink_block, _, _))) (env, vc) -> let time = Block_time.now t.time_controller in let module M = (val sinksM) in @@ -273,7 +281,7 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : let broadcast_snark_pool_diff ?origin_topic ?nonce t diff = ignore origin_topic ; ignore nonce ; - Network.broadcast t.network ~sender:t.me diff + Network.broadcast t.network ~sender:t.local_ip diff (fun (Any_sinks (sinksM, (_, _, sink_snark_work))) -> let module M = (val sinksM) in M.Snark_sink.push sink_snark_work ) @@ -281,7 +289,7 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : let broadcast_transaction_pool_diff ?origin_topic ?nonce t diff = ignore origin_topic ; ignore nonce ; - Network.broadcast t.network ~sender:t.me diff + Network.broadcast t.network ~sender:t.local_ip diff (fun (Any_sinks (sinksM, (_, sink_tx, _))) -> let module M = (val sinksM) in M.Tx_sink.push sink_tx ) @@ -301,6 +309,5 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : let create_network = Network.create - let create_instance network local_ip impls sinks = - Deferred.return (Instance.create network local_ip impls sinks) + let create_instance = Instance.create end diff --git a/src/lib/gossip_net/gossip_net.ml b/src/lib/gossip_net/gossip_net.ml index 943798692cc..f2dcc294a37 100644 --- a/src/lib/gossip_net/gossip_net.ml +++ b/src/lib/gossip_net/gossip_net.ml @@ -4,24 +4,24 @@ module Libp2p = Libp2p module Fake = Fake module type S = sig - module Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf + module Rpc_interface : RPC_INTERFACE include module type of Intf module Message : module type of Message - module Any : Any.S with module Rpc_intf := Rpc_intf + module Any : Any.S with module Rpc_interface := Rpc_interface - module Libp2p : Libp2p.S with module Rpc_intf := Rpc_intf + module Libp2p : Libp2p.S with module Rpc_interface := Rpc_interface - module Fake : Fake.S with module Rpc_intf := Rpc_intf + module Fake : Fake.S with module Rpc_interface := Rpc_interface end -module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : - S with module Rpc_intf := Rpc_intf = struct +module Make (Rpc_interface : RPC_INTERFACE) : + S with module Rpc_interface := Rpc_interface = struct include Intf module Message = Message - module Any = Any.Make (Rpc_intf) - module Fake = Fake.Make (Rpc_intf) - module Libp2p = Libp2p.Make (Rpc_intf) + module Any = Any.Make (Rpc_interface) + module Fake = Fake.Make (Rpc_interface) + module Libp2p = Libp2p.Make (Rpc_interface) end diff --git a/src/lib/gossip_net/intf.ml b/src/lib/gossip_net/intf.ml index d4568aab422..d3337ec93e1 100644 --- a/src/lib/gossip_net/intf.ml +++ b/src/lib/gossip_net/intf.ml @@ -2,17 +2,86 @@ open Async open Core_kernel open Network_peer open Pipe_lib -open Network_peer.Rpc_intf type ban_creator = { banned_peer : Peer.t; banned_until : Time.t } [@@deriving fields] type ban_notification = { banned_peer : Peer.t; banned_until : Time.t } -module type Gossip_net_intf = sig +type ('query, 'response) rpc_fn = + version:int -> 'query Envelope.Incoming.t -> 'response Deferred.t + +type 'r rpc_response = + | Failed_to_connect of Error.t + | Connected of 'r Or_error.t Envelope.Incoming.t +[@@deriving sexp] + +module type RPC_IMPLEMENTATION = sig + type ctx + + type query + + type response + + val name : string + + val versions : unit -> Int.Set.t + + val sent_counter : Mina_metrics.Counter.t * Mina_metrics.Gauge.t + + val received_counter : Mina_metrics.Counter.t * Mina_metrics.Gauge.t + + val failed_request_counter : Mina_metrics.Counter.t + + val failed_response_counter : Mina_metrics.Counter.t + + val implement_multi : + ?log_not_previously_seen_version:(name:string -> int -> unit) + -> (Peer.t -> version:int -> query -> response Deferred.t) + -> Peer.t Rpc.Implementation.t list + + val dispatch_multi : + Versioned_rpc.Connection_with_menu.t + -> query + -> response Deferred.Or_error.t + + val log_request_received : logger:Logger.t -> sender:Peer.t -> query -> unit + + val receipt_trust_action_message : + query -> string * (string, Yojson.Safe.t) List.Assoc.t + + val handle_request : ctx -> (query, response) rpc_fn + + val response_is_successful : response -> bool + + val rate_limit_cost : query -> int + + val rate_limit_budget : int * [ `Per of Time.Span.t ] +end + +type ('ctx, 'query, 'response) rpc_implementation = + (module RPC_IMPLEMENTATION + with type ctx = 'ctx + and type query = 'query + and type response = 'response ) + +module type RPC_INTERFACE = sig + type ctx + + type ('query, 'response) rpc + + type any_rpc = Rpc : ('query, 'response) rpc -> any_rpc + + val all_rpcs : any_rpc list + + val implementation : + ('query, 'response) rpc -> (ctx, 'query, 'response) rpc_implementation +end + +module type GOSSIP_NET = sig type t - module Rpc_intf : Rpc_interface_intf + module Rpc_interface : RPC_INTERFACE val restart_helper : t -> unit @@ -50,7 +119,7 @@ module type Gossip_net_intf = sig -> ?timeout:Time.Span.t -> t -> Peer.Id.t - -> ('q, 'r) Rpc_intf.rpc + -> ('q, 'r) Rpc_interface.rpc -> 'q list -> 'r list rpc_response Deferred.t @@ -59,14 +128,14 @@ module type Gossip_net_intf = sig -> ?timeout:Time.Span.t -> t -> Peer.Id.t - -> ('q, 'r) Rpc_intf.rpc + -> ('q, 'r) Rpc_interface.rpc -> 'q -> 'r rpc_response Deferred.t val query_random_peers : t -> int - -> ('q, 'r) Rpc_intf.rpc + -> ('q, 'r) Rpc_interface.rpc -> 'q -> 'r rpc_response Deferred.t List.t Deferred.t diff --git a/src/lib/gossip_net/libp2p.ml b/src/lib/gossip_net/libp2p.ml index 476bb33ff74..a99ad2bc5c1 100644 --- a/src/lib/gossip_net/libp2p.ml +++ b/src/lib/gossip_net/libp2p.ml @@ -2,7 +2,7 @@ open Core open Async open Network_peer open Pipe_lib -open Network_peer.Rpc_intf +open Intf type ('q, 'r) dispatch = Versioned_rpc.Connection_with_menu.t -> 'q -> 'r Deferred.Or_error.t @@ -57,13 +57,13 @@ module Config = struct end module type S = sig - include Intf.Gossip_net_intf + include GOSSIP_NET val create : ?allow_multiple_instances:bool -> Config.t -> pids:Child_processes.Termination.t - -> Rpc_intf.rpc_handler list + -> Rpc_interface.ctx -> Message.sinks -> t Deferred.t end @@ -121,10 +121,8 @@ let on_gossip_decode_failure (config : Config.t) envelope (err : Error.t) = |> don't_wait_for ; () -module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : - S with module Rpc_intf := Rpc_intf = struct - open Rpc_intf - +module Make (Rpc_interface : RPC_INTERFACE) : + S with module Rpc_interface := Rpc_interface = struct module T = struct type t = { config : Config.t @@ -137,28 +135,29 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : ; restart_helper : unit -> unit } - let create_rpc_implementations - (Rpc_handler { rpc; f = handler; cost; budget }) = - let (module Impl) = implementation_of_rpc rpc in - let logger = Logger.create () in + (* TODO: should we share this with the Fake network impl? *) + let setup_rpc (type query response) ctx logger trust_system + (rpc : (query, response) Rpc_interface.rpc) = + let (module Impl) = Rpc_interface.implementation rpc in let log_rate_limiter_occasionally rl = let t = Time.Span.of_min 1. in every t (fun () -> - [%log' debug logger] + [%log debug] ~metadata: [ ("rate_limiter", Network_pool.Rate_limiter.summary rl) ] !"%s $rate_limiter" Impl.name ) in - let rl = Network_pool.Rate_limiter.create ~capacity:budget in + let rl = + Network_pool.Rate_limiter.create ~capacity:Impl.rate_limit_budget + in log_rate_limiter_occasionally rl ; - let handler (peer : Network_peer.Peer.t) ~version q = + let handler (peer : Network_peer.Peer.t) ~version request = Mina_metrics.(Counter.inc_one Network.rpc_requests_received) ; Mina_metrics.(Counter.inc_one @@ fst Impl.received_counter) ; Mina_metrics.(Gauge.inc_one @@ snd Impl.received_counter) ; - let score = cost q in match Network_pool.Rate_limiter.add rl (Remote peer) ~now:(Time.now ()) - ~score + ~score:(Impl.rate_limit_cost request) with | `Capacity_exceeded -> failwithf "peer exceeded capacity: %s" @@ -166,7 +165,24 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : () | `Within_capacity -> O1trace.thread (Printf.sprintf "handle_rpc_%s" Impl.name) (fun () -> - handler peer ~version q ) + Impl.log_request_received ~logger ~sender:peer request ; + let request_env = + Envelope.Incoming.wrap_peer ~data:request ~sender:peer + in + let sender = Envelope.Incoming.sender request_env in + let%bind () = + let msg = Impl.receipt_trust_action_message request in + (* TODO: kill trust system (#11723) *) + Trust_system.( + record_envelope_sender trust_system logger sender + Actions.(Made_request, Some msg)) + in + let%map response = + Impl.handle_request ctx ~version request_env + in + if not (Impl.response_is_successful response) then + Mina_metrics.Counter.inc_one Impl.failed_response_counter ; + response ) in Impl.implement_multi handler @@ -200,7 +216,7 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : (* Creates just the helper, making sure to register everything BEFORE we start listening/advertise ourselves for discovery. *) let create_libp2p ?(allow_multiple_instances = false) (config : Config.t) - rpc_handlers first_peer_ivar high_connectivity_ivar ~added_seeds ~pids + ctx first_peer_ivar high_connectivity_ivar ~added_seeds ~pids ~on_unexpected_termination ~sinks: (Message.Any_sinks (sinksM, (sink_block, sink_tx, sink_snark_work))) = @@ -334,7 +350,8 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : ~topic_config:[ [ v0_topic ]; v1_topics ] in let implementation_list = - List.bind rpc_handlers ~f:create_rpc_implementations + List.bind Rpc_interface.all_rpcs ~f:(fun (Rpc rpc) -> + setup_rpc ctx config.logger config.trust_system rpc ) in let implementations = let handle_unknown_rpc conn_state ~rpc_tag ~version = @@ -865,11 +882,11 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : -> t -> Peer.t -> _ - -> (q, r) rpc + -> (q, r) Rpc_interface.rpc -> q -> r Deferred.Or_error.t = fun ?heartbeat_timeout ?timeout t peer transport rpc query -> - let (module Impl) = implementation_of_rpc rpc in + let (module Impl) = Rpc_interface.implementation rpc in try_call_rpc_with_dispatch ?heartbeat_timeout ?timeout ~rpc_counter:Impl.sent_counter ~rpc_failed_counter:Impl.failed_request_counter ~rpc_name:Impl.name t @@ -893,7 +910,7 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : return (Failed_to_connect e) let query_peer' (type q r) ?how ?heartbeat_timeout ?timeout t - (peer_id : Peer.Id.t) (rpc : (q, r) rpc) (qs : q list) = + (peer_id : Peer.Id.t) (rpc : (q, r) Rpc_interface.rpc) (qs : q list) = let%bind net2 = !(t.net2) in match%bind Mina_net2.open_stream net2 ~protocol:rpc_transport_proto ~peer:peer_id @@ -901,7 +918,7 @@ module Make (Rpc_intf : Network_peer.Rpc_intf.Rpc_interface_intf) : | Ok stream -> let peer = Mina_net2.Libp2p_stream.remote_peer stream in let transport = prepare_stream_transport stream in - let (module Impl) = implementation_of_rpc rpc in + let (module Impl) = Rpc_interface.implementation rpc in try_call_rpc_with_dispatch ?heartbeat_timeout ?timeout ~rpc_counter:Impl.sent_counter ~rpc_failed_counter:Impl.failed_request_counter ~rpc_name:Impl.name diff --git a/src/lib/graphql_lib/transaction/graphql_scalars.ml b/src/lib/graphql_lib/transaction/graphql_scalars.ml index d3de12bb0a8..c4ac1536fd5 100644 --- a/src/lib/graphql_lib/transaction/graphql_scalars.ml +++ b/src/lib/graphql_lib/transaction/graphql_scalars.ml @@ -38,7 +38,7 @@ let%test_module "Roundtrip tests" = let gen = Mina_base.Coinbase.Gen.gen ~constraint_constants: - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t |> Quickcheck.Generator.map ~f:(fun (coinbase, _) -> hash_coinbase coinbase ) end diff --git a/src/lib/integration_test_cloud_engine/kubernetes_network.ml b/src/lib/integration_test_cloud_engine/kubernetes_network.ml index b5961f304b3..3c98508ea1c 100644 --- a/src/lib/integration_test_cloud_engine/kubernetes_network.ml +++ b/src/lib/integration_test_cloud_engine/kubernetes_network.ml @@ -346,9 +346,9 @@ type t = let constants { constants; _ } = constants -let constraint_constants { constants; _ } = constants.constraints +let constraint_constants { constants; _ } = constants.constraint_constants -let genesis_constants { constants; _ } = constants.genesis +let genesis_constants { constants; _ } = constants.genesis_constants let seeds { seeds; _ } = seeds diff --git a/src/lib/integration_test_cloud_engine/mina_automation.ml b/src/lib/integration_test_cloud_engine/mina_automation.ml index e1bff26b17b..1c8d094466b 100644 --- a/src/lib/integration_test_cloud_engine/mina_automation.ml +++ b/src/lib/integration_test_cloud_engine/mina_automation.ml @@ -109,8 +109,8 @@ module Network_config = struct assoc let expand ~logger ~test_name ~(cli_inputs : Cli_inputs.t) ~(debug : bool) - ~(test_config : Test_config.t) ~(images : Test_config.Container_images.t) - = + ~(images : Test_config.Container_images.t) ~test_config + ~(constants : Test_config.constants) = let ({ requires_graphql ; genesis_ledger ; epoch_data @@ -130,6 +130,7 @@ module Network_config = struct ; slot_tx_end ; slot_chain_end ; network_id + ; _ } : Test_config.t ) = test_config @@ -220,7 +221,7 @@ module Network_config = struct (* DAEMON CONFIG *) let constraint_constants = Genesis_ledger_helper.make_constraint_constants - ~default:Genesis_constants.Constraint_constants.compiled proof_config + ~default:constants.constraint_constants proof_config in let ledger_is_prefix ledger1 ledger2 = List.is_prefix ledger2 ~prefix:ledger1 @@ -243,6 +244,7 @@ module Network_config = struct ; zkapp_cmd_limit_hardcap = None ; slot_tx_end ; slot_chain_end + ; minimum_user_command_fee = None ; network_id } ; genesis = @@ -376,10 +378,10 @@ module Network_config = struct let genesis_constants = Or_error.ok_exn (Genesis_ledger_helper.make_genesis_constants ~logger - ~default:Genesis_constants.compiled runtime_config ) + ~default:constants.genesis_constants runtime_config ) in let constants : Test_config.constants = - { constraints = constraint_constants; genesis = genesis_constants } + { constraint_constants; genesis_constants } in (* BLOCK PRODUCER CONFIG *) let mk_net_keypair keypair_name (pk, sk) = diff --git a/src/lib/integration_test_lib/intf.ml b/src/lib/integration_test_lib/intf.ml index 2d21597dfd2..e95a8709144 100644 --- a/src/lib/integration_test_lib/intf.ml +++ b/src/lib/integration_test_lib/intf.ml @@ -37,8 +37,9 @@ module Engine = struct -> test_name:string -> cli_inputs:Cli_inputs.t -> debug:bool - -> test_config:Test_config.t -> images:Test_config.Container_images.t + -> test_config:Test_config.t + -> constants:Test_config.constants -> t end @@ -340,7 +341,7 @@ module Test = struct type dsl - val config : Test_config.t + val config : constants:Test_config.constants -> Test_config.t val run : network -> dsl -> unit Malleable_error.t end diff --git a/src/lib/integration_test_lib/network_time_span.ml b/src/lib/integration_test_lib/network_time_span.ml index c7f66830f1b..20f13ff8ca5 100644 --- a/src/lib/integration_test_lib/network_time_span.ml +++ b/src/lib/integration_test_lib/network_time_span.ml @@ -6,11 +6,13 @@ let to_span t ~(constants : Test_config.constants) = let open Int64 in let slots n = Time.Span.of_ms - (to_float (n * of_int constants.constraints.block_window_duration_ms)) + (to_float + (n * of_int constants.constraint_constants.block_window_duration_ms) ) in match t with | Epochs n -> - slots (of_int n * of_int constants.genesis.protocol.slots_per_epoch) + slots + (of_int n * of_int constants.genesis_constants.protocol.slots_per_epoch) | Slots n -> slots (of_int n) | Literal span -> diff --git a/src/lib/integration_test_lib/test_config.ml b/src/lib/integration_test_lib/test_config.ml index 017a517e25a..9f35b3d1782 100644 --- a/src/lib/integration_test_lib/test_config.ml +++ b/src/lib/integration_test_lib/test_config.ml @@ -52,8 +52,8 @@ module Snark_coordinator_node = struct end type constants = - { constraints : Genesis_constants.Constraint_constants.t - ; genesis : Genesis_constants.t + { constraint_constants : Genesis_constants.Constraint_constants.t + ; genesis_constants : Genesis_constants.t } [@@deriving to_yojson] @@ -81,6 +81,8 @@ type t = ; slot_tx_end : int option ; slot_chain_end : int option ; network_id : string option + ; block_window_duration_ms : int + ; transaction_capacity_log_2 : int } let proof_config_default : Runtime_config.Proof_keys.t = @@ -109,7 +111,8 @@ let log_filter_of_event_type ev_existential = [] (* TODO: Do we need this? *) -let default = +let default ~(constants : constants) = + let { constraint_constants; genesis_constants } = constants in { requires_graphql = true (* require_graphql maybe should just be phased out, because it always needs to be enable. Now with the graphql polling engine, everything will definitely fail if graphql is not enabled. But even before that, most tests relied on some sort of graphql interaction *) @@ -123,30 +126,29 @@ let default = ; start_filtered_logs = List.bind ~f:log_filter_of_event_type Event_type.all_event_types ; proof_config = proof_config_default - ; k = 20 - ; slots_per_epoch = 3 * 8 * 20 - ; slots_per_sub_window = 2 - ; grace_period_slots = 140 - ; delta = 0 - ; txpool_max_size = 3000 + ; k = genesis_constants.protocol.k + ; slots_per_epoch = genesis_constants.protocol.slots_per_epoch + ; slots_per_sub_window = genesis_constants.protocol.slots_per_sub_window + ; grace_period_slots = genesis_constants.protocol.grace_period_slots + ; delta = genesis_constants.protocol.delta + ; txpool_max_size = genesis_constants.txpool_max_size ; slot_tx_end = None ; slot_chain_end = None ; network_id = None + ; block_window_duration_ms = constraint_constants.block_window_duration_ms + ; transaction_capacity_log_2 = constraint_constants.transaction_capacity_log_2 } let transaction_capacity_log_2 (config : t) = match config.proof_config.transaction_capacity with | None -> - Genesis_constants.Constraint_constants.compiled.transaction_capacity_log_2 + config.transaction_capacity_log_2 | Some (Log_2 i) -> i | Some (Txns_per_second_x10 tps_goal_x10) -> let max_coinbases = 2 in let block_window_duration_ms = - Option.value - ~default: - Genesis_constants.Constraint_constants.compiled - .block_window_duration_ms + Option.value ~default:config.block_window_duration_ms config.proof_config.block_window_duration_ms in let max_user_commands_per_block = @@ -170,8 +172,7 @@ let transaction_capacity config = let blocks_for_first_ledger_proof (config : t) = let work_delay = - Option.value - ~default:Genesis_constants.Constraint_constants.compiled.work_delay + Option.value ~default:config.block_window_duration_ms config.proof_config.work_delay in let transaction_capacity_log_2 = transaction_capacity_log_2 config in diff --git a/src/lib/integration_test_lib/util.ml b/src/lib/integration_test_lib/util.ml index deef6d87f66..c1f03bfc943 100644 --- a/src/lib/integration_test_lib/util.ml +++ b/src/lib/integration_test_lib/util.ml @@ -2,11 +2,21 @@ open Core open Async module Timeout = Timeout_lib.Core_time -let run_cmd dir prog args = +let run_cmd dir prog args ?env () = + let envs = + match env with + | Some (`Extend list) -> + List.map list ~f:(fun (key, value) -> `String (key ^ "=" ^ value)) + | _ -> + [] + in [%log' spam (Logger.create ())] "Running command (from %s): $command" dir - ~metadata:[ ("command", `String (String.concat (prog :: args) ~sep:" ")) ] ; - Process.create_exn ~working_dir:dir ~prog ~args () + ~metadata: + [ ("command", `String (String.concat (prog :: args) ~sep:" ")) + ; ("envs", `List envs) + ] ; + Process.create_exn ~working_dir:dir ~prog ~args ?env () >>= Process.collect_output_and_wait let check_cmd_output ~prog ~args output = @@ -59,19 +69,19 @@ let run_cmd_or_error_timeout ~timeout_seconds dir prog args = in res -let run_cmd_or_error dir prog args = - let%bind output = run_cmd dir prog args in +let run_cmd_or_error ?env dir prog args = + let%bind output = run_cmd dir prog args ?env () in check_cmd_output ~prog ~args output -let run_cmd_exn dir prog args = - match%map run_cmd_or_error dir prog args with +let run_cmd_exn ?env dir prog args = + match%map run_cmd_or_error ?env dir prog args with | Ok output -> output | Error error -> Error.raise error -let run_cmd_or_hard_error ?exit_code dir prog args = - let%bind output = run_cmd dir prog args in +let run_cmd_or_hard_error ?exit_code ?env dir prog args = + let%bind output = run_cmd dir prog args ?env () in Deferred.bind ~f:(Malleable_error.or_hard_error ?exit_code) (check_cmd_output ~prog ~args output) diff --git a/src/lib/integration_test_local_engine/docker_network.ml b/src/lib/integration_test_local_engine/docker_network.ml index 72522fcd031..b12e3b4a4be 100644 --- a/src/lib/integration_test_local_engine/docker_network.ml +++ b/src/lib/integration_test_local_engine/docker_network.ml @@ -281,9 +281,9 @@ type t = let constants { constants; _ } = constants -let constraint_constants { constants; _ } = constants.constraints +let constraint_constants { constants; _ } = constants.constraint_constants -let genesis_constants { constants; _ } = constants.genesis +let genesis_constants { constants; _ } = constants.genesis_constants let seeds { seeds; _ } = seeds diff --git a/src/lib/integration_test_local_engine/mina_docker.ml b/src/lib/integration_test_local_engine/mina_docker.ml index 4834b7bcdd2..f0447021246 100644 --- a/src/lib/integration_test_local_engine/mina_docker.ml +++ b/src/lib/integration_test_local_engine/mina_docker.ml @@ -47,8 +47,8 @@ module Network_config = struct [@@deriving to_yojson] let expand ~logger ~test_name ~(cli_inputs : Cli_inputs.t) ~(debug : bool) - ~(test_config : Test_config.t) ~(images : Test_config.Container_images.t) - = + ~(images : Test_config.Container_images.t) ~(test_config : Test_config.t) + ~(constants : Test_config.constants) = let _ = cli_inputs in let ({ genesis_ledger ; epoch_data @@ -144,7 +144,7 @@ module Network_config = struct let genesis_ledger_accounts = add_accounts genesis_accounts_and_keys in let constraint_constants = Genesis_ledger_helper.make_constraint_constants - ~default:Genesis_constants.Constraint_constants.compiled proof_config + ~default:constants.constraint_constants proof_config in let ledger_is_prefix ledger1 ledger2 = List.is_prefix ledger2 ~prefix:ledger1 @@ -167,6 +167,7 @@ module Network_config = struct ; zkapp_cmd_limit_hardcap = None ; slot_tx_end ; slot_chain_end + ; minimum_user_command_fee = None ; network_id } ; genesis = @@ -280,10 +281,10 @@ module Network_config = struct let genesis_constants = Or_error.ok_exn (Genesis_ledger_helper.make_genesis_constants ~logger - ~default:Genesis_constants.compiled runtime_config ) + ~default:constants.genesis_constants runtime_config ) in let constants : Test_config.constants = - { constraints = constraint_constants; genesis = genesis_constants } + { constraint_constants; genesis_constants } in let mk_net_keypair keypair_name (pk, sk) = let keypair = diff --git a/src/lib/internal_tracing/dune b/src/lib/internal_tracing/dune index 6d463f27c43..f580ce4aeaf 100644 --- a/src/lib/internal_tracing/dune +++ b/src/lib/internal_tracing/dune @@ -16,7 +16,7 @@ mina_base mina_numbers internal_tracing.context_call - internal_tracing.context_logger + logger.context_logger ) (preprocess (pps ppx_jane ppx_mina ppx_version ppx_deriving_yojson)) diff --git a/src/lib/internal_tracing/internal_tracing.ml b/src/lib/internal_tracing/internal_tracing.ml index fb036179d21..9f6f752641d 100644 --- a/src/lib/internal_tracing/internal_tracing.ml +++ b/src/lib/internal_tracing/internal_tracing.ml @@ -252,5 +252,4 @@ module For_itn_logger = struct else [] end -module Context_logger = Internal_tracing_context_logger module Context_call = Internal_tracing_context_call diff --git a/src/lib/internal_tracing/internal_tracing.mli b/src/lib/internal_tracing/internal_tracing.mli index 110b9f5a975..c8d354e0a26 100644 --- a/src/lib/internal_tracing/internal_tracing.mli +++ b/src/lib/internal_tracing/internal_tracing.mli @@ -158,6 +158,4 @@ module For_itn_logger : sig -> (Core.Time.t * string * (string * Yojson.Safe.t) list) list end -module Context_logger : module type of Internal_tracing_context_logger - module Context_call : module type of Internal_tracing_context_call diff --git a/src/lib/itn_logger/dune b/src/lib/itn_logger/dune index 5b9db9a5954..bf9a03dbc9d 100644 --- a/src/lib/itn_logger/dune +++ b/src/lib/itn_logger/dune @@ -15,7 +15,7 @@ core_kernel yojson ;; local libraries - mina_compile_config + mina_node_config.unconfigurable_constants ) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_version ppx_mina ppx_jane))) diff --git a/src/lib/itn_logger/itn_logger.ml b/src/lib/itn_logger/itn_logger.ml index d89e67eeeff..11e5f50c997 100644 --- a/src/lib/itn_logger/itn_logger.ml +++ b/src/lib/itn_logger/itn_logger.ml @@ -81,15 +81,18 @@ let dispatch_remote_log log = let%map res = Async.Rpc.Connection.with_client ~handshake_timeout: - (Time.Span.of_sec Mina_compile_config.rpc_handshake_timeout_sec) + (Time.Span.of_sec + Node_config_unconfigurable_constants.rpc_handshake_timeout_sec ) ~heartbeat_config: (Async.Rpc.Connection.Heartbeat_config.create ~timeout: (Time_ns.Span.of_sec - Mina_compile_config.rpc_heartbeat_timeout_sec ) + Node_config_unconfigurable_constants + .rpc_heartbeat_timeout_sec ) ~send_every: (Time_ns.Span.of_sec - Mina_compile_config.rpc_heartbeat_send_every_sec ) + Node_config_unconfigurable_constants + .rpc_heartbeat_send_every_sec ) () ) where_to_connect (fun conn -> Async.Rpc.Rpc.dispatch rpc conn log) diff --git a/src/lib/ledger_catchup/ledger_catchup.ml b/src/lib/ledger_catchup/ledger_catchup.ml index 3f8f816a6fc..5e452ab565e 100644 --- a/src/lib/ledger_catchup/ledger_catchup.ml +++ b/src/lib/ledger_catchup/ledger_catchup.ml @@ -14,7 +14,7 @@ end let run ~context:(module Context : CONTEXT) ~trust_system ~verifier ~network ~frontier ~catchup_job_reader ~catchup_breadcrumbs_writer ~unprocessed_transition_cache : unit = - match Transition_frontier.catchup_tree frontier with + match Transition_frontier.catchup_state frontier with | Hash _ -> Normal_catchup.run ~context:(module Context) diff --git a/src/lib/ledger_catchup/normal_catchup.ml b/src/lib/ledger_catchup/normal_catchup.ml index 928fdd7002d..feaa2067f92 100644 --- a/src/lib/ledger_catchup/normal_catchup.ml +++ b/src/lib/ledger_catchup/normal_catchup.ml @@ -529,10 +529,10 @@ let verify_transitions_and_build_breadcrumbs ~context:(module Context : CONTEXT) ] "verification of proofs complete" ; let slot_tx_end = - Runtime_config.slot_tx_end_or_default precomputed_values.runtime_config + Runtime_config.slot_tx_end precomputed_values.runtime_config in let slot_chain_end = - Runtime_config.slot_chain_end_or_default precomputed_values.runtime_config + Runtime_config.slot_chain_end precomputed_values.runtime_config in fold_until (List.rev tvs) ~init:[] ~f:(fun acc transition -> @@ -647,7 +647,7 @@ let run ~context:(module Context : CONTEXT) ~trust_system ~verifier ~network ~unprocessed_transition_cache : unit = let open Context in let hash_tree = - match Transition_frontier.catchup_tree frontier with + match Transition_frontier.catchup_state frontier with | Hash t -> t | Full _ -> @@ -949,6 +949,7 @@ let%test_module "Ledger_catchup tests" = in let unprocessed_transition_cache = Transition_handler.Unprocessed_transition_cache.create ~logger + ~cache_exceptions:true in run ~context:(module Context) diff --git a/src/lib/ledger_catchup/super_catchup.ml b/src/lib/ledger_catchup/super_catchup.ml index 46d621f0042..5113501827f 100644 --- a/src/lib/ledger_catchup/super_catchup.ml +++ b/src/lib/ledger_catchup/super_catchup.ml @@ -646,10 +646,10 @@ let initial_validate ~context:(module Context : CONTEXT) ~trust_system ] "initial_validate: verification of proofs complete" ; let slot_tx_end = - Runtime_config.slot_tx_end_or_default precomputed_values.runtime_config + Runtime_config.slot_tx_end precomputed_values.runtime_config in let slot_chain_end = - Runtime_config.slot_chain_end_or_default precomputed_values.runtime_config + Runtime_config.slot_chain_end precomputed_values.runtime_config in verify_transition ~context:(module Context) @@ -1081,13 +1081,13 @@ let run_catchup ~context:(module Context : CONTEXT) ~trust_system ~verifier Strict_pipe.Writer.t ) = let open Context in let t = - match Transition_frontier.catchup_tree frontier with + match Transition_frontier.catchup_state frontier with | Full t -> t | Hash _ -> failwith "If super catchup is running, the frontier should have a full \ - catchup tree" + catchup state" in let stop = Transition_frontier.closed frontier in upon stop (fun () -> tear_down t) ; @@ -1493,6 +1493,7 @@ let%test_module "Ledger_catchup tests" = in let unprocessed_transition_cache = Transition_handler.Unprocessed_transition_cache.create ~logger + ~cache_exceptions:true in run ~context:(module Context) @@ -1754,21 +1755,21 @@ let%test_module "Ledger_catchup tests" = ~frontier_branch_size:(max_frontier_length / 2) ?get_staged_ledger_aux_and_pending_coinbases_at_hash:None ?get_some_initial_peers:None ?answer_sync_ledger_query:None - ?get_ancestry:None ?get_best_tip:None ?get_node_status:None + ?get_ancestry:None ?get_best_tip:None ?get_transition_knowledge:None ?get_transition_chain_proof:None ?get_transition_chain:(Some impl_rpc) ; peer_with_branch_custom_rpc ~frontier_branch_size:(max_frontier_length / 2) ?get_staged_ledger_aux_and_pending_coinbases_at_hash:None ?get_some_initial_peers:None ?answer_sync_ledger_query:None - ?get_ancestry:None ?get_best_tip:None ?get_node_status:None + ?get_ancestry:None ?get_best_tip:None ?get_transition_knowledge:None ?get_transition_chain_proof:None ?get_transition_chain:(Some impl_rpc) ; peer_with_branch_custom_rpc ~frontier_branch_size:(max_frontier_length / 2) ?get_staged_ledger_aux_and_pending_coinbases_at_hash:None ?get_some_initial_peers:None ?answer_sync_ledger_query:None - ?get_ancestry:None ?get_best_tip:None ?get_node_status:None + ?get_ancestry:None ?get_best_tip:None ?get_transition_knowledge:None ?get_transition_chain_proof:None ?get_transition_chain:(Some impl_rpc) ]) @@ -1815,26 +1816,27 @@ let%test_module "Ledger_catchup tests" = | `Success _ -> failwith "final state should be at `Failed" | `Failed -> - let catchup_tree = + let catchup_state = match - Transition_frontier.catchup_tree my_net.state.frontier + Transition_frontier.catchup_state + my_net.state.frontier with | Full tr -> tr | Hash _ -> failwith - "in super catchup unit tests, the catchup tree \ + "in super catchup unit tests, the catchup state \ should always be Full_catchup_tree, but it is \ Catchup_hash_tree for some reason" in - let catchup_tree_node_list = - State_hash.Table.data catchup_tree.nodes + let catchup_state_node_list = + State_hash.Table.data catchup_state.nodes in - let catchup_tree_node = - List.hd_exn catchup_tree_node_list + let catchup_state_node = + List.hd_exn catchup_state_node_list in let num_attempts = - Peer.Map.length catchup_tree_node.attempts + Peer.Map.length catchup_state_node.attempts in if num_attempts < 2 then let failstring = @@ -1844,317 +1846,8 @@ let%test_module "Ledger_catchup tests" = attempts= %d. length of catchup_tree_node_list= \ %d" num_attempts - (List.length catchup_tree_node_list) + (List.length catchup_state_node_list) in failwith failstring else () ) ) ) - - (* let%test_unit "when initial validation of a blocks fails (except for the \ - verifier_unreachable case), then catchup will cancel the \ - block's children's catchup job" = - Quickcheck.test ~trials:1 - Fake_network.Generator.( - gen ~precomputed_values ~verifier ~max_frontier_length - ~use_super_catchup - [ fresh_peer - ; broken_rpc_peer_branch - ~frontier_branch_size:(max_frontier_length / 2) - ~get_transition_chain_impl_option:None - (* TODO: write some kind of mock that makes validation fail, and thus make the test pass *) - ]) - ~f:(fun network -> - let open Fake_network in - let [ my_net; peer_net ] = network.peer_networks in - let target_best_tip_path = - Transition_frontier.best_tip_path peer_net.state.frontier - in - let open Fake_network in - let target_breadcrumb_child = List.last_exn target_best_tip_path in - let target_breadcrumb_child_hash = - Transition_frontier.Breadcrumb.state_hash target_breadcrumb_child - in - let target_breadcrumb_parent = - List.nth_exn target_best_tip_path - (List.length target_best_tip_path - 2) - in - let test = - setup_catchup_pipes ~network:my_net.network - ~frontier:my_net.state.frontier - in - let parent_hash = - Transition_frontier.Breadcrumb.parent_hash target_breadcrumb_parent - in - let target_transition_parent = - Transition_handler.Unprocessed_transition_cache.register_exn - test.cache - (downcast_breadcrumb target_breadcrumb_parent) - in - let target_transition_child = - Transition_handler.Unprocessed_transition_cache.register_exn - test.cache - (downcast_breadcrumb target_breadcrumb_child) - in - [%log info] "validation fails unit test" ; - Strict_pipe.Writer.write test.job_writer - ( parent_hash - , [ Rose_tree.T - ( target_transition_parent - , [ Rose_tree.T (target_transition_child, []) ] ) - ] ) ; - Thread_safe.block_on_async_exn (fun () -> - let final = - Cache_lib.Cached.final_state target_transition_parent - in - match%map - Deferred.any - [ (Ivar.read final >>| fun x -> `Catchup_failed x) - ; Strict_pipe.Reader.read test.breadcrumbs_reader - >>| const `Catchup_success - ] - with - | `Catchup_success -> - [%log info] - "validation fails unit test: somehow incorrectly succeeded" ; - - failwith - "target transition should've been invalidated with a \ - failure" - | `Catchup_failed fnl -> ( - match fnl with - | `Success _ -> - [%log info] - "validation fails unit test: somehow incorrectly \ - succeeded" ; - failwith "final state should be at `Failed" - | `Failed -> - [%log info] - "validation fails unit test: correctly failed, running \ - checks" ; - - let catchup_tree = - match - Transition_frontier.catchup_tree my_net.state.frontier - with - | Full tr -> - tr - | Hash _ -> - failwith - "in super catchup unit tests, the catchup tree \ - should always be Full_catchup_tree, but it is \ - Catchup_hash_tree for some reason" - in - let catchup_tree_node_list = - State_hash.Table.data catchup_tree.nodes - in - List.iter catchup_tree_node_list ~f:(fun catchup_node -> - let hash = catchup_node.state_hash in - if - Marlin_plonk_bindings_pasta_fp.equal hash - target_breadcrumb_child_hash - then - failwith - "the catchup job associated with \ - target_breadcrumb_child_hash should have been \ - cancelled and thus removed from the catchup \ - tree, but it is still here" - else ()) ))) *) - - (* let%test_unit "when verification of a blocks fails, catchup will cancel \ - its children's catchup job and remove the failed-to-verify \ - block from the cache" = - Quickcheck.test ~trials:1 - Fake_network.Generator.( - gen ~precomputed_values ~verifier ~max_frontier_length - ~use_super_catchup - [ fresh_peer - ; broken_rpc_peer_branch - ~frontier_branch_size:(max_frontier_length / 2) - ~get_transition_chain_impl_option:None - (* TODO: write some kind of mock that makes verification fail, and thus make the test pass *) - ]) - ~f:(fun network -> - let open Fake_network in - let [ my_net; peer_net ] = network.peer_networks in - let target_best_tip_path = - Transition_frontier.best_tip_path peer_net.state.frontier - in - let open Fake_network in - let target_breadcrumb_child = List.last_exn target_best_tip_path in - let target_breadcrumb_child_hash = - Transition_frontier.Breadcrumb.state_hash target_breadcrumb_child - in - let target_breadcrumb_parent = - List.nth_exn target_best_tip_path - (List.length target_best_tip_path - 2) - in - let test = - setup_catchup_pipes ~network:my_net.network - ~frontier:my_net.state.frontier - in - let parent_hash = - Transition_frontier.Breadcrumb.parent_hash target_breadcrumb_parent - in - let target_transition_parent = - Transition_handler.Unprocessed_transition_cache.register_exn - test.cache - (downcast_breadcrumb target_breadcrumb_parent) - in - let target_transition_child = - Transition_handler.Unprocessed_transition_cache.register_exn - test.cache - (downcast_breadcrumb target_breadcrumb_child) - in - Strict_pipe.Writer.write test.job_writer - ( parent_hash - , [ Rose_tree.T - ( target_transition_parent - , [ Rose_tree.T (target_transition_child, []) ] ) - ] ) ; - Thread_safe.block_on_async_exn (fun () -> - let final = - Cache_lib.Cached.final_state target_transition_parent - in - match%map - Deferred.any - [ (Ivar.read final >>| fun x -> `Catchup_failed x) - ; Strict_pipe.Reader.read test.breadcrumbs_reader - >>| const `Catchup_success - ] - with - | `Catchup_success -> - failwith - "target transition should've been invalidated with a \ - failure" - | `Catchup_failed fnl -> ( - match fnl with - | `Success _ -> - failwith "final state should be at `Failed" - | `Failed -> - let catchup_tree = - match - Transition_frontier.catchup_tree my_net.state.frontier - with - | Full tr -> - tr - | Hash _ -> - failwith - "in super catchup unit tests, the catchup tree \ - should always be Full_catchup_tree, but it is \ - Catchup_hash_tree for some reason" - in - let catchup_tree_node_list = - State_hash.Table.data catchup_tree.nodes - in - List.iter catchup_tree_node_list ~f:(fun catchup_node -> - let hash = catchup_node.state_hash in - if - Marlin_plonk_bindings_pasta_fp.equal hash - target_breadcrumb_child_hash - then - failwith - "the catchup job associated with \ - target_breadcrumb_child_hash should have been \ - cancelled and thus removed from the catchup \ - tree, but it is still here" - else ()) ))) *) - - (* let%test_unit "when building a breadcrumb fails, catchup will cancel its \ - children's catchup job and remove the failed-to-build block \ - from the cache" = - Quickcheck.test ~trials:1 - Fake_network.Generator.( - gen ~precomputed_values ~verifier ~max_frontier_length - ~use_super_catchup - [ fresh_peer - ; broken_rpc_peer_branch - ~frontier_branch_size:(max_frontier_length / 2) - ~get_transition_chain_impl_option:None - ]) - ~f:(fun network -> - let open Fake_network in - let [ my_net; peer_net ] = network.peer_networks in - let target_best_tip_path = - Transition_frontier.best_tip_path peer_net.state.frontier - in - let open Fake_network in - let target_breadcrumb_child = List.last_exn target_best_tip_path in - let target_breadcrumb_child_hash = - Transition_frontier.Breadcrumb.state_hash target_breadcrumb_child - in - let target_breadcrumb_parent = - List.nth_exn target_best_tip_path - (List.length target_best_tip_path - 2) - in - let test = - setup_catchup_pipes ~network:my_net.network - ~frontier:my_net.state.frontier - (* setup_catchup_pipes_fail_build_breadcrumb ~network:my_net.network - ~frontier:my_net.state.frontier *) - in - let parent_hash = - Transition_frontier.Breadcrumb.parent_hash target_breadcrumb_parent - in - let target_transition_parent = - Transition_handler.Unprocessed_transition_cache.register_exn - test.cache - (downcast_breadcrumb target_breadcrumb_parent) - in - let target_transition_child = - Transition_handler.Unprocessed_transition_cache.register_exn - test.cache - (downcast_breadcrumb target_breadcrumb_child) - in - Strict_pipe.Writer.write test.job_writer - ( parent_hash - , [ Rose_tree.T - ( target_transition_parent - , [ Rose_tree.T (target_transition_child, []) ] ) - ] ) ; - Thread_safe.block_on_async_exn (fun () -> - let final = - Cache_lib.Cached.final_state target_transition_parent - in - match%map - Deferred.any - [ (Ivar.read final >>| fun x -> `Catchup_failed x) - ; Strict_pipe.Reader.read test.breadcrumbs_reader - >>| const `Catchup_success - ] - with - | `Catchup_success -> - failwith - "target transition should've been invalidated with a \ - failure" - | `Catchup_failed fnl -> ( - match fnl with - | `Success _ -> - failwith "final state should be at `Failed" - | `Failed -> - let catchup_tree = - match - Transition_frontier.catchup_tree my_net.state.frontier - with - | Full tr -> - tr - | Hash _ -> - failwith - "in super catchup unit tests, the catchup tree \ - should always be Full_catchup_tree, but it is \ - Catchup_hash_tree for some reason" - in - let catchup_tree_node_list = - State_hash.Table.data catchup_tree.nodes - in - List.iter catchup_tree_node_list ~f:(fun catchup_node -> - let hash = catchup_node.state_hash in - if - Marlin_plonk_bindings_pasta_fp.equal hash - target_breadcrumb_child_hash - then - failwith - "the catchup job associated with \ - target_breadcrumb_child_hash should have been \ - cancelled and thus removed from the catchup \ - tree, but it is still here" - else ()) ))) *) end ) diff --git a/src/lib/internal_tracing/context_logger/internal_tracing_context_logger.ml b/src/lib/logger/context_logger/context_logger.ml similarity index 100% rename from src/lib/internal_tracing/context_logger/internal_tracing_context_logger.ml rename to src/lib/logger/context_logger/context_logger.ml diff --git a/src/lib/internal_tracing/context_logger/internal_tracing_context_logger.mli b/src/lib/logger/context_logger/context_logger.mli similarity index 100% rename from src/lib/internal_tracing/context_logger/internal_tracing_context_logger.mli rename to src/lib/logger/context_logger/context_logger.mli diff --git a/src/lib/internal_tracing/context_logger/dune b/src/lib/logger/context_logger/dune similarity index 69% rename from src/lib/internal_tracing/context_logger/dune rename to src/lib/logger/context_logger/dune index 5ffb8cd8063..8b61d1756b9 100644 --- a/src/lib/internal_tracing/context_logger/dune +++ b/src/lib/logger/context_logger/dune @@ -1,6 +1,6 @@ (library - (name internal_tracing_context_logger) - (public_name internal_tracing.context_logger) + (name context_logger) + (public_name logger.context_logger) (library_flags -linkall) (inline_tests (flags -verbose -show-counts)) (libraries @@ -15,4 +15,4 @@ (pps ppx_jane ppx_mina ppx_version ppx_deriving_yojson)) (instrumentation (backend bisect_ppx)) - (synopsis "Internal tracing context logger helper")) + (synopsis "Context logger: useful for passing logger down the deep callstacks")) diff --git a/src/lib/logger/fake/logger.ml b/src/lib/logger/fake/logger.ml index f44ba270cde..cdc97f1b0ed 100644 --- a/src/lib/logger/fake/logger.ml +++ b/src/lib/logger/fake/logger.ml @@ -127,7 +127,7 @@ end module Consumer_registry = struct type id = string - let register ~id:_ ~processor:_ ~transport:_ = not_implemented () + let register ?commit_id:_ ~id:_ ~processor:_ ~transport:_ = not_implemented end [%%versioned diff --git a/src/lib/logger/file_system/logger_file_system.ml b/src/lib/logger/file_system/logger_file_system.ml index 327be0ca470..5b7fed7f9b2 100644 --- a/src/lib/logger/file_system/logger_file_system.ml +++ b/src/lib/logger/file_system/logger_file_system.ml @@ -1,10 +1,10 @@ open Core +let log_perm = 0o644 + module Dumb_logrotate = struct open Core.Unix - let log_perm = 0o644 - type t = { directory : string ; log_filename : string @@ -68,6 +68,20 @@ let dumb_logrotate ~directory ~log_filename ~max_size ~num_rotate = (module Dumb_logrotate) (Dumb_logrotate.create ~directory ~log_filename ~max_size ~num_rotate) +let evergrowing ~log_filename = + let open Unix in + Logger.Transport.create + ( module struct + type t = File_descr.t + + let transport t str = + let str = str ^ "\n" in + let len = String.length str in + if write t ~buf:(Bytes.of_string str) ~len <> len then + printf "unexpected error writing to log" + end ) + (openfile ~perm:log_perm ~mode:[ O_RDWR; O_APPEND; O_CREAT ] log_filename) + let time_pretty_to_string timestamp = Time.format timestamp "%Y-%m-%d %H:%M:%S UTC" ~zone:Time.Zone.utc diff --git a/src/lib/logger/file_system/logger_file_system.mli b/src/lib/logger/file_system/logger_file_system.mli index c450e816104..3868bffc8c9 100644 --- a/src/lib/logger/file_system/logger_file_system.mli +++ b/src/lib/logger/file_system/logger_file_system.mli @@ -11,6 +11,8 @@ val dumb_logrotate : -> num_rotate:int -> Logger.Transport.t +val evergrowing : log_filename:string -> Logger.Transport.t + (** Pretty printer for time, in "%Y-%m-%d %H:%M:%S UTC" format. On linking this library, this is used to override the JS-safe diff --git a/src/lib/logger/logger.mli b/src/lib/logger/logger.mli index 92457c2f520..e1bb7a7e78c 100644 --- a/src/lib/logger/logger.mli +++ b/src/lib/logger/logger.mli @@ -122,7 +122,13 @@ end module Consumer_registry : sig type id = string - val register : id:id -> processor:Processor.t -> transport:Transport.t -> unit + val register : + ?commit_id:string + -> id:id + -> processor:Processor.t + -> transport:Transport.t + -> unit + -> unit end type 'a log_function = diff --git a/src/lib/logger/native/logger.ml b/src/lib/logger/native/logger.ml index c3dfffec55b..4d5f117916c 100644 --- a/src/lib/logger/native/logger.ml +++ b/src/lib/logger/native/logger.ml @@ -255,10 +255,18 @@ module Transport = struct end module Consumer_registry = struct - type consumer = { processor : Processor.t; transport : Transport.t } + type consumer = + { processor : Processor.t + ; transport : Transport.t + ; commit_id : string option + } let default_consumer = - lazy { processor = Processor.raw (); transport = Transport.stdout () } + lazy + { processor = Processor.raw () + ; transport = Transport.stdout () + ; commit_id = None + } module Consumer_tbl = Hashtbl.Make (String) @@ -268,8 +276,8 @@ module Consumer_registry = struct type id = string - let register ~(id : id) ~processor ~transport = - Consumer_tbl.add_multi t ~key:id ~data:{ processor; transport } + let register ?commit_id ~(id : id) ~processor ~transport () = + Consumer_tbl.add_multi t ~key:id ~data:{ processor; transport; commit_id } let rec broadcast_log_message ~id msg = let consumers = @@ -282,9 +290,21 @@ module Consumer_registry = struct List.iter consumers ~f:(fun consumer -> let { processor = Processor.T ((module Processor), processor) ; transport = Transport.T ((module Transport), transport) + ; commit_id } = consumer in + let commit_id' = + if Level.compare msg.Message.level Warn >= 0 then commit_id else None + in + let msg = + Option.value_map ~default:msg commit_id' ~f:(fun cid -> + let metadata = + String.Map.set ~key:"commit_id" ~data:(`String cid) + msg.Message.metadata + in + { msg with metadata } ) + in match Processor.process processor msg with | Some str -> if diff --git a/src/lib/logger/test/logger_test.ml b/src/lib/logger/test/logger_test.ml index 700ec699f82..d333f092050 100644 --- a/src/lib/logger/test/logger_test.ml +++ b/src/lib/logger/test/logger_test.ml @@ -32,7 +32,8 @@ let%test_unit "Logger.Dumb_logrotate rotates logs when expected" = ~processor:(Logger.Processor.raw ()) ~transport: (Logger_file_system.dumb_logrotate ~directory ~log_filename ~max_size - ~num_rotate ) ; + ~num_rotate ) + () ; run_test ~last_size:0 ~rotations:0 ~rotation_expected:false with exn -> ignore (Unix.system ("rm -rf " ^ directory) : Unix.Exit_or_signal.t) ; diff --git a/src/lib/merkle_ledger/any_ledger.ml b/src/lib/merkle_ledger/any_ledger.ml index e74ac391d90..33def1b347a 100644 --- a/src/lib/merkle_ledger/any_ledger.ml +++ b/src/lib/merkle_ledger/any_ledger.ml @@ -87,7 +87,8 @@ module Make_base (Inputs : Intf.Inputs.Intf) : let get_at_index_exn (T ((module Base), t)) = Base.get_at_index_exn t - let set_batch (T ((module Base), t)) = Base.set_batch t + let set_batch ?hash_cache (T ((module Base), t)) = + Base.set_batch ?hash_cache t let set (T ((module Base), t)) = Base.set t diff --git a/src/lib/merkle_ledger/intf.ml b/src/lib/merkle_ledger/intf.ml index 39de10c4c5e..a42e16088ea 100644 --- a/src/lib/merkle_ledger/intf.ml +++ b/src/lib/merkle_ledger/intf.ml @@ -392,7 +392,8 @@ module Ledger = struct val set : t -> Location.t -> account -> unit - val set_batch : t -> (Location.t * account) list -> unit + val set_batch : + ?hash_cache:hash Addr.Map.t -> t -> (Location.t * account) list -> unit val get_at_index_exn : t -> int -> account diff --git a/src/lib/merkle_ledger/null_ledger.ml b/src/lib/merkle_ledger/null_ledger.ml index 157244e8c10..7bb99af3660 100644 --- a/src/lib/merkle_ledger/null_ledger.ml +++ b/src/lib/merkle_ledger/null_ledger.ml @@ -93,7 +93,8 @@ end = struct let get_at_index_exn _t = failwith "get_at_index_exn: null ledgers are empty" - let set_batch _t = failwith "set_batch: null ledgers cannot be mutated" + let set_batch ?hash_cache:_ _t = + failwith "set_batch: null ledgers cannot be mutated" let set _t = failwith "set: null ledgers cannot be mutated" diff --git a/src/lib/merkle_ledger/util.ml b/src/lib/merkle_ledger/util.ml index af51910d7c5..46bcba58e96 100644 --- a/src/lib/merkle_ledger/util.ml +++ b/src/lib/merkle_ledger/util.ml @@ -57,7 +57,10 @@ module Make (Inputs : Inputs_intf) : sig Inputs.Base.t -> (Inputs.Location.t * Inputs.Hash.t) list -> unit val set_batch : - Inputs.Base.t -> (Inputs.Location.t * Inputs.Account.t) list -> unit + ?hash_cache:Inputs.Hash.t Inputs.Location.Addr.Map.t + -> Inputs.Base.t + -> (Inputs.Location.t * Inputs.Account.t) list + -> unit val set_batch_accounts : Inputs.Base.t -> (Inputs.Location.Addr.t * Inputs.Account.t) list -> unit @@ -82,7 +85,18 @@ end = struct | addr, Some account -> Some (addr, account) ) - let rec compute_affected_locations_and_hashes t locations_and_hashes acc = + let lookup_hash ?hash_cache ~compute loc = + let res = + let%bind.Option addr = + Option.try_with (fun () -> Inputs.Location.to_path_exn loc) + in + let%bind.Option m = hash_cache in + Map.find m addr + in + match res with Some x -> x | _ -> compute () + + let rec compute_affected_locations_and_hashes ?hash_cache t + locations_and_hashes acc = let ledger_depth = Inputs.ledger_depth t in if not @@ List.is_empty locations_and_hashes then let height = @@ -103,11 +117,13 @@ end = struct the hash now. *) let parent_hash = - let left_hash, right_hash = - Inputs.Location.order_siblings location hash - sibling_hash - in - Inputs.Hash.merge ~height left_hash right_hash + lookup_hash ?hash_cache parent_location + ~compute:(fun () -> + let left_hash, right_hash = + Inputs.Location.order_siblings location hash + sibling_hash + in + Inputs.Hash.merge ~height left_hash right_hash ) in `Hash parent_hash | Some (`Hash _) -> @@ -125,27 +141,32 @@ end = struct (* We haven't recorded the sibling, so query the ledger to get the hash. *) - let sibling_location = Inputs.Location.sibling location in - let sibling_hash = Inputs.get_hash t sibling_location in let parent_hash = - let left_hash, right_hash = - Inputs.Location.order_siblings location hash sibling_hash - in - Inputs.Hash.merge ~height left_hash right_hash + lookup_hash ?hash_cache key ~compute:(fun () -> + let sibling_location = + Inputs.Location.sibling location + in + let sibling_hash = Inputs.get_hash t sibling_location in + let left_hash, right_hash = + Inputs.Location.order_siblings location hash + sibling_hash + in + Inputs.Hash.merge ~height left_hash right_hash ) in (key, parent_hash) :: acc | `Hash parent_hash -> (* We have already computed the hash above. *) (key, parent_hash) :: acc ) in - compute_affected_locations_and_hashes t rev_parent_locations_and_hashes + compute_affected_locations_and_hashes ?hash_cache t + rev_parent_locations_and_hashes (List.rev_append rev_parent_locations_and_hashes acc) else acc else acc - let set_hash_batch t locations_and_hashes = + let set_hash_batch ?hash_cache t locations_and_hashes = Inputs.set_raw_hash_batch t - (compute_affected_locations_and_hashes t locations_and_hashes + (compute_affected_locations_and_hashes ?hash_cache t locations_and_hashes locations_and_hashes ) let compute_last_index addresses = @@ -186,13 +207,17 @@ end = struct (* TODO: When we do batch on a database, we should add accounts, locations and hashes simulatenously for full atomicity. *) - let set_batch t locations_and_accounts = + let set_batch ?hash_cache t locations_and_accounts = set_raw_addresses t locations_and_accounts ; Inputs.set_raw_account_batch t locations_and_accounts ; - set_hash_batch t + set_hash_batch ?hash_cache t @@ List.map locations_and_accounts ~f:(fun (location, account) -> - ( Inputs.location_of_hash_addr (Inputs.Location.to_path_exn location) - , Inputs.Hash.hash_account account ) ) + let addr = Inputs.Location.to_path_exn location in + let account_hash = + lookup_hash ?hash_cache location ~compute:(fun () -> + Inputs.Hash.hash_account account ) + in + (Inputs.location_of_hash_addr addr, account_hash) ) let set_batch_accounts t addresses_and_accounts = set_batch t @@ -208,4 +233,6 @@ end = struct let num_accounts = List.length accounts in List.(zip_exn (take addresses num_accounts) accounts) |> set_batch_accounts t + + let set_hash_batch = set_hash_batch ?hash_cache:None end diff --git a/src/lib/merkle_ledger/util.mli b/src/lib/merkle_ledger/util.mli index 5473f664eb8..cec681679ee 100644 --- a/src/lib/merkle_ledger/util.mli +++ b/src/lib/merkle_ledger/util.mli @@ -57,7 +57,10 @@ module Make (Inputs : Inputs_intf) : sig Inputs.Base.t -> (Inputs.Location.t * Inputs.Hash.t) list -> unit val set_batch : - Inputs.Base.t -> (Inputs.Location.t * Inputs.Account.t) list -> unit + ?hash_cache:Inputs.Hash.t Inputs.Location.Addr.Map.t + -> Inputs.Base.t + -> (Inputs.Location.t * Inputs.Account.t) list + -> unit val set_batch_accounts : Inputs.Base.t -> (Inputs.Location.Addr.t * Inputs.Account.t) list -> unit diff --git a/src/lib/merkle_ledger_tests/test_mask.ml b/src/lib/merkle_ledger_tests/test_mask.ml index 76c661c0da1..cc224546757 100644 --- a/src/lib/merkle_ledger_tests/test_mask.ml +++ b/src/lib/merkle_ledger_tests/test_mask.ml @@ -65,11 +65,12 @@ module type Test_intf = sig (** Here we provide a base ledger and two layers of attached masks * one ontop another *) val with_chain : - ( Base.t - -> mask:Mask.Attached.t - -> mask_as_base:Base.t - -> mask2:Mask.Attached.t - -> 'a ) + ( Base.t (* base ledger *) + -> mask:(Mask.Attached.t * Base.t) lazy_t + -> (* first mask on top of base ledger *) + mask2:Mask.Attached.t lazy_t + -> (* second mask on top of the first mask *) + 'a ) -> 'a end @@ -234,22 +235,20 @@ module Make (Test : Test_intf) = struct let () = add_test "commit at layer2, dumps to layer1, not in base" (fun () -> - Test.with_chain (fun base ~mask:level1 ~mask_as_base:_ ~mask2:level2 -> - Mask.Attached.set level2 dummy_location dummy_account ; + Test.with_chain (fun base ~mask:m1_lazy ~mask2:m2_lazy -> + let m2 = Lazy.force m2_lazy in + let m1, _ = Lazy.force m1_lazy in + Mask.Attached.set m2 dummy_location dummy_account ; (* verify account is in the layer2 mask *) - assert ( - Mask.Attached.For_testing.location_in_mask level2 dummy_location ) ; - Mask.Attached.commit level2 ; + assert (Mask.Attached.For_testing.location_in_mask m2 dummy_location) ; + Mask.Attached.commit m2 ; (* account is no longer in layer2 *) assert ( - not - (Mask.Attached.For_testing.location_in_mask level2 - dummy_location ) ) ; + not (Mask.Attached.For_testing.location_in_mask m2 dummy_location) ) ; (* account is still not in base *) assert (Option.is_none @@ Maskable.get base dummy_location) ; (* account is present in layer1 *) - assert ( - Mask.Attached.For_testing.location_in_mask level1 dummy_location ) ) ) + assert (Mask.Attached.For_testing.location_in_mask m1 dummy_location) ) ) let () = add_test "register and unregister mask" (fun () -> @@ -389,7 +388,8 @@ module Make (Test : Test_intf) = struct "get_all_accounts should preserve the ordering of accounts by location \ with noncontiguous updates of accounts on the mask" (fun () -> (* see similar test in test_database *) - Test.with_chain (fun _ ~mask:mask1 ~mask_as_base:_ ~mask2 -> + Test.with_chain (fun _ ~mask:mask1_lazy ~mask2:mask2_lazy -> + let mask1, _ = Lazy.force mask1_lazy in let num_accounts = 1 lsl Test.depth in let gen_values gen list_length = Quickcheck.random_value @@ -413,6 +413,7 @@ module Make (Test : Test_intf) = struct |> List.unzip in let subset_balances = gen_values Balance.gen num_subset in + let mask2 = Lazy.force mask2_lazy in let subset_updated_accounts = List.map2_exn subset_accounts subset_balances ~f:(fun account balance -> @@ -610,7 +611,7 @@ module Make (Test : Test_intf) = struct let () = add_test "mask reparenting works" (fun () -> - Test.with_chain (fun base ~mask:m1 ~mask_as_base ~mask2:m2 -> + Test.with_chain (fun base ~mask:m1_lazy ~mask2:m2_lazy -> let num_accounts = 3 in let account_ids = Account_id.gen_accounts num_accounts in let balances = @@ -623,7 +624,9 @@ module Make (Test : Test_intf) = struct match accounts with | [ a1; a2; a3 ] -> let loc1 = parent_create_new_account_exn base a1 in + let m1, m1_base = Lazy.force m1_lazy in let loc2 = create_new_account_exn m1 a2 in + let m2 = Lazy.force m2_lazy in let loc3 = create_new_account_exn m2 a3 in let locs = [ (loc1, a1); (loc2, a2); (loc3, a3) ] in (* all accounts are here *) @@ -636,7 +639,7 @@ module Make (Test : Test_intf) = struct Mask.Attached.commit m1 ; [%test_result: Account.t option] ~message:"a2 is in base" ~expect:(Some a2) (Test.Base.get base loc2) ; - Maskable.remove_and_reparent_exn mask_as_base m1 ; + Maskable.remove_and_reparent_exn m1_base m1 ; [%test_result: Account.t option] ~message:"a1 is in base" ~expect:(Some a1) (Test.Base.get base loc1) ; [%test_result: Account.t option] ~message:"a2 is in base" @@ -783,14 +786,17 @@ module Make_maskable_and_mask_with_depth (Depth : Depth_S) = struct let with_chain f = with_instances (fun maskable mask -> - let attached1 = Maskable.register_mask maskable mask in - let attached1_as_base = - Any_base.cast (module Mask.Attached) attached1 + let attached1 = + lazy + (let m = Maskable.register_mask maskable mask in + (m, Any_base.cast (module Mask.Attached) m) ) + in + let attached2 = + lazy + ( Maskable.register_mask (snd @@ Lazy.force attached1) + @@ Mask.create ~depth:Depth.depth () ) in - let mask2 = Mask.create ~depth:Depth.depth () in - let attached2 = Maskable.register_mask attached1_as_base mask2 in - f maskable ~mask:attached1 ~mask_as_base:attached1_as_base - ~mask2:attached2 ) + f maskable ~mask:attached1 ~mask2:attached2 ) end module Make_maskable_and_mask (Depth : Depth_S) = diff --git a/src/lib/merkle_ledger_tests/test_stubs.ml b/src/lib/merkle_ledger_tests/test_stubs.ml index 00592d56d59..b56a6a1bf47 100644 --- a/src/lib/merkle_ledger_tests/test_stubs.ml +++ b/src/lib/merkle_ledger_tests/test_stubs.ml @@ -29,11 +29,11 @@ module Account = struct let create = Mina_base.Account.create - let balance Mina_base.Account.Poly.{ balance; _ } = balance + let balance Mina_base.Account.{ balance; _ } = balance - let update_balance t bal = { t with Mina_base.Account.Poly.balance = bal } + let update_balance t bal = { t with Mina_base.Account.balance = bal } - let token Mina_base.Account.Poly.{ token_id; _ } = token_id + let token Mina_base.Account.{ token_id; _ } = token_id end module Receipt = Mina_base.Receipt diff --git a/src/lib/merkle_mask/maskable_merkle_tree.ml b/src/lib/merkle_mask/maskable_merkle_tree.ml index c4cd8a888bf..3b511213aea 100644 --- a/src/lib/merkle_mask/maskable_merkle_tree.ml +++ b/src/lib/merkle_mask/maskable_merkle_tree.ml @@ -244,8 +244,8 @@ module Make (Inputs : Inputs_intf) = struct List.iter accounts ~f:(fun account -> Mask.Attached.parent_set_notify mask account ) ) ) - let set_batch t locations_and_accounts = - Base.set_batch t locations_and_accounts ; + let set_batch ?hash_cache t locations_and_accounts = + Base.set_batch ?hash_cache t locations_and_accounts ; batch_notify_mask_children t (List.map locations_and_accounts ~f:snd) let set_batch_accounts t addresses_and_accounts = diff --git a/src/lib/merkle_mask/masking_merkle_tree.ml b/src/lib/merkle_mask/masking_merkle_tree.ml index 1b0e91ac1f3..d696870a791 100644 --- a/src/lib/merkle_mask/masking_merkle_tree.ml +++ b/src/lib/merkle_mask/masking_merkle_tree.ml @@ -32,17 +32,21 @@ module Make (Inputs : Inputs_intf.S) = struct ; token_owners : Account_id.t Token_id.Map.t ; hashes : Hash.t Addr.Map.t ; locations : Location.t Account_id.Map.t + ; non_existent_accounts : Account_id.Set.t } [@@deriving sexp] (** Merges second maps object into the first one, potentially overwriting some keys *) - let maps_merge base { accounts; token_owners; hashes; locations } = + let maps_merge base + { accounts; token_owners; hashes; locations; non_existent_accounts } = let combine ~key:_ _ v = v in { accounts = Map.merge_skewed ~combine base.accounts accounts ; token_owners = Map.merge_skewed ~combine base.token_owners token_owners ; hashes = Map.merge_skewed ~combine base.hashes hashes ; locations = Map.merge_skewed ~combine base.locations locations + ; non_existent_accounts = + Account_id.Set.union base.non_existent_accounts non_existent_accounts } (** Structure managing cache accumulated since the "base" ledger. @@ -94,11 +98,12 @@ module Make (Inputs : Inputs_intf.S) = struct type unattached = t [@@deriving sexp] - let empty_maps () = + let empty_maps = { accounts = Location_binable.Map.empty ; token_owners = Token_id.Map.empty ; hashes = Addr.Map.empty ; locations = Account_id.Map.empty + ; non_existent_accounts = Account_id.Set.empty } let create ~depth () = @@ -108,7 +113,7 @@ module Make (Inputs : Inputs_intf.S) = struct ; current_location = None ; depth ; accumulated = None - ; maps = empty_maps () + ; maps = empty_maps ; is_committing = false } @@ -218,6 +223,8 @@ module Make (Inputs : Inputs_intf.S) = struct update_maps t ~f:(fun maps -> { maps with locations = Map.set maps.locations ~key:account_id ~data:location + ; non_existent_accounts = + Set.remove maps.non_existent_accounts account_id } ) ; (* if account is at a hitherto-unused location, that becomes the current location @@ -274,34 +281,36 @@ module Make (Inputs : Inputs_intf.S) = struct | _ -> None ) in - let from_parent = lookup_parent ancestor not_found in - List.fold_map self_found_or_none ~init:from_parent - ~f:(fun from_parent (id, self_found) -> - match (self_found, from_parent) with - | None, r :: rest -> - (rest, r) - | Some acc_found_locally, _ -> - (from_parent, (id, acc_found_locally)) - | _ -> - failwith "unexpected number of results from DB" ) - |> snd + if List.is_empty not_found then + List.map ~f:(fun (a, x) -> (a, Option.value_exn x)) self_found_or_none + else + let from_parent = lookup_parent ancestor not_found in + List.fold_map self_found_or_none ~init:from_parent + ~f:(fun from_parent (id, self_found) -> + match (self_found, from_parent) with + | None, r :: rest -> + (rest, r) + | Some acc_found_locally, _ -> + (from_parent, (id, acc_found_locally)) + | _ -> + failwith "unexpected number of results from DB" ) + |> snd let get_batch t = - let self_find ~maps id = - let res = Map.find maps.accounts id in - let res = - if Option.is_none res then - let is_empty = - Option.value_map ~default:true t.current_location - ~f:(fun current_location -> - let address = Location.to_path_exn id in - let current_address = Location.to_path_exn current_location in - Addr.is_further_right ~than:current_address address ) - in - Option.some_if is_empty None - else Some res - in - (id, res) + let is_empty loc = + Option.value_map ~default:true t.current_location ~f:(fun cur_loc -> + let cur_addr = Location.to_path_exn cur_loc in + Addr.is_further_right ~than:cur_addr @@ Location.to_path_exn loc ) + in + let self_find ~maps:{ accounts; _ } id = + ( id + , match Map.find accounts id with + | None when is_empty id -> + Some None + | None -> + None + | s -> + Some s ) in self_find_or_batch_lookup self_find Base.get_batch t @@ -538,8 +547,9 @@ module Make (Inputs : Inputs_intf.S) = struct (Account_id.derive_token_id ~owner:account_id) account_id - (* a write writes only to the mask, parent is not involved need to update - both account and hash pieces of the mask *) + (* a write writes only to the mask, parent is not involved + + need to update both account and hash pieces of the mask *) let set t location account = assert_is_attached t ; set_account_unsafe t location account ; @@ -621,13 +631,9 @@ module Make (Inputs : Inputs_intf.S) = struct let parent = get_parent t in let old_root_hash = merkle_root t in let account_data = Map.to_alist t.maps.accounts in - t.maps <- - { accounts = Location_binable.Map.empty - ; hashes = Addr.Map.empty - ; token_owners = Token_id.Map.empty - ; locations = Account_id.Map.empty - } ; - Base.set_batch parent account_data ; + let hash_cache = t.maps.hashes in + t.maps <- empty_maps ; + Base.set_batch ~hash_cache parent account_data ; Debug_assert.debug_assert (fun () -> [%test_result: Hash.t] ~message: @@ -784,21 +790,23 @@ module Make (Inputs : Inputs_intf.S) = struct failwith "Expected mask current location to represent an account" ) + let self_lookup_account ~maps account_id = + if Set.mem maps.non_existent_accounts account_id then Some None + else Option.map ~f:Option.some @@ Map.find maps.locations account_id + let location_of_account t account_id = assert_is_attached t ; let maps, ancestor = maps_and_ancestor t in - let mask_result = Map.find maps.locations account_id in - match mask_result with - | Some _ -> - mask_result + match self_lookup_account ~maps account_id with + | Some r -> + r | None -> Base.location_of_account ancestor account_id - let location_of_account_batch t = + let location_of_account_batch = self_find_or_batch_lookup - (fun ~maps id -> - (id, Option.map ~f:Option.some @@ Map.find maps.locations id) ) - Base.location_of_account_batch t + (fun ~maps id -> (id, self_lookup_account ~maps id)) + Base.location_of_account_batch (* Adds specified accounts to the mask by laoding them from parent ledger. @@ -810,8 +818,29 @@ module Make (Inputs : Inputs_intf.S) = struct let unsafe_preload_accounts_from_parent t account_ids = assert_is_attached t ; let locations = location_of_account_batch t account_ids in - let non_empty_locations = List.filter_map locations ~f:snd in + let non_empty_locations, empty_keys = + List.partition_map locations ~f:(function + | _, Some loc -> + First loc + | key, None -> + Second key ) + in + update_maps t ~f:(fun maps -> + { maps with + non_existent_accounts = + Set.union maps.non_existent_accounts + (Account_id.Set.of_list empty_keys) + } ) ; let accounts = get_batch t non_empty_locations in + let empty_locations = + Option.value_map (last_filled t) ~default:[] ~f:(fun init -> + snd + @@ List.fold_map empty_keys ~init ~f:(fun loc _ -> + Location.next loc + |> Option.value_map ~default:(loc, loc) ~f:(fun loc' -> + (loc', loc') ) ) ) + in + let locations = empty_locations @ non_empty_locations in let all_hash_locations = let rec generate_locations account_locations acc = match account_locations with @@ -832,7 +861,7 @@ module Make (Inputs : Inputs_intf.S) = struct generate_locations account_locations (Location.Hash address :: acc) ) in - generate_locations non_empty_locations [] + generate_locations locations [] in let all_hashes = get_hash_batch_exn t all_hash_locations in (* Batch import merkle paths and self hashes. *) @@ -841,11 +870,7 @@ module Make (Inputs : Inputs_intf.S) = struct self_set_hash t address hash ) ; (* Batch import accounts. *) List.iter accounts ~f:(fun (location, account) -> - match account with - | None -> - () - | Some account -> - set_account_unsafe t location account ) + Option.iter account ~f:(set_account_unsafe t location) ) (* not needed for in-memory mask; in the database, it's currently a NOP *) let get_inner_hash_at_addr_exn t address = @@ -857,12 +882,7 @@ module Make (Inputs : Inputs_intf.S) = struct as sometimes this is desired behavior *) let close t = assert_is_attached t ; - t.maps <- - { t.maps with - accounts = Location_binable.Map.empty - ; hashes = Addr.Map.empty - ; locations = Account_id.Map.empty - } ; + t.maps <- empty_maps ; Async.Ivar.fill_if_empty t.detached_parent_signal () let index_of_account_exn t key = @@ -969,31 +989,38 @@ module Make (Inputs : Inputs_intf.S) = struct (* NB: updates the mutable current_location field in t *) let get_or_create_account t account_id account = assert_is_attached t ; - let maps, ancestor = maps_and_ancestor t in - match Map.find maps.locations account_id with + let { locations; non_existent_accounts; _ }, ancestor = + maps_and_ancestor t + in + let add_location () = + (* not in parent, create new location *) + let maybe_location = + match t.current_location with + | None -> + Some (first_location ~ledger_depth:t.depth) + | Some loc -> + Location.next loc + in + match maybe_location with + | None -> + Or_error.error_string "Db_error.Out_of_leaves" + | Some location -> + (* `set` calls `self_set_location`, which updates + the current location + *) + set t location account ; + Ok (`Added, location) + in + match Map.find locations account_id with | None -> ( - (* not in mask, maybe in parent *) - match Base.location_of_account ancestor account_id with - | Some location -> - Ok (`Existed, location) - | None -> ( - (* not in parent, create new location *) - let maybe_location = - match last_filled t with - | None -> - Some (first_location ~ledger_depth:t.depth) - | Some loc -> - Location.next loc - in - match maybe_location with - | None -> - Or_error.error_string "Db_error.Out_of_leaves" - | Some location -> - (* `set` calls `self_set_location`, which updates - the current location - *) - set t location account ; - Ok (`Added, location) ) ) + if Set.mem non_existent_accounts account_id then add_location () + else + (* not in mask, maybe in parent *) + match Base.location_of_account ancestor account_id with + | Some location -> + Ok (`Existed, location) + | None -> + add_location () ) | Some location -> Ok (`Existed, location) end diff --git a/src/lib/mina_base/account.ml b/src/lib/mina_base/account.ml index f8f3675cd32..da459ca0881 100644 --- a/src/lib/mina_base/account.ml +++ b/src/lib/mina_base/account.ml @@ -228,8 +228,6 @@ module Poly = struct end] end -let token = Poly.token_id - module Key = struct [%%versioned module Stable = struct @@ -253,19 +251,18 @@ module Binable_arg = struct module Stable = struct module V2 = struct type t = - ( Public_key.Compressed.Stable.V1.t - , Token_id.Stable.V2.t - , Token_symbol.Stable.V1.t - , Balance.Stable.V1.t - , Nonce.Stable.V1.t - , Receipt.Chain_hash.Stable.V1.t - , Public_key.Compressed.Stable.V1.t option - , State_hash.Stable.V1.t - , Timing.Stable.V2.t - , Permissions.Stable.V2.t - , Zkapp_account.Stable.V2.t option ) - (* TODO: Cache the digest of this? *) - Poly.Stable.V2.t + { public_key : Public_key.Compressed.Stable.V1.t + ; token_id : Token_id.Stable.V2.t + ; token_symbol : Token_symbol.Stable.V1.t + ; balance : Balance.Stable.V1.t + ; nonce : Nonce.Stable.V1.t + ; receipt_chain_hash : Receipt.Chain_hash.Stable.V1.t + ; delegate : Public_key.Compressed.Stable.V1.t option + ; voting_for : State_hash.Stable.V1.t + ; timing : Timing.Stable.V2.t + ; permissions : Permissions.Stable.V2.t + ; zkapp : Zkapp_account.Stable.V2.t option + } [@@deriving sexp, equal, hash, compare, yojson] let to_latest = Fn.id @@ -280,8 +277,20 @@ let check = Fn.id [%%versioned_binable module Stable = struct module V2 = struct - type t = Binable_arg.Stable.V2.t - [@@deriving sexp, equal, hash, compare, yojson] + type t = Binable_arg.Stable.V2.t = + { public_key : Public_key.Compressed.Stable.V1.t + ; token_id : Token_id.Stable.V2.t + ; token_symbol : Token_symbol.Stable.V1.t + ; balance : Balance.Stable.V1.t + ; nonce : Nonce.Stable.V1.t + ; receipt_chain_hash : Receipt.Chain_hash.Stable.V1.t + ; delegate : Public_key.Compressed.Stable.V1.t option + ; voting_for : State_hash.Stable.V1.t + ; timing : Timing.Stable.V2.t + ; permissions : Permissions.Stable.V2.t + ; zkapp : Zkapp_account.Stable.V2.t option + } + [@@deriving sexp, equal, hash, compare, yojson, hlist, fields] include Binable.Of_binable_without_uuid @@ -300,25 +309,67 @@ module Stable = struct end end] +[%%define_locally +Stable.Latest.(sexp_of_t, t_of_sexp, equal, to_yojson, of_yojson)] + +let to_poly + { public_key + ; token_id + ; token_symbol + ; balance + ; nonce + ; receipt_chain_hash + ; delegate + ; voting_for + ; timing + ; permissions + ; zkapp + } = + { Poly.public_key + ; token_id + ; token_symbol + ; balance + ; nonce + ; receipt_chain_hash + ; delegate + ; voting_for + ; timing + ; permissions + ; zkapp + } + +let of_poly + { Poly.public_key + ; token_id + ; token_symbol + ; balance + ; nonce + ; receipt_chain_hash + ; delegate + ; voting_for + ; timing + ; permissions + ; zkapp + } = + { public_key + ; token_id + ; token_symbol + ; balance + ; nonce + ; receipt_chain_hash + ; delegate + ; voting_for + ; timing + ; permissions + ; zkapp + } + [%%define_locally Stable.Latest.(public_key)] let identifier ({ public_key; token_id; _ } : t) = Account_id.create public_key token_id -type value = - ( Public_key.Compressed.t - , Token_id.t - , Token_symbol.t - , Balance.t - , Nonce.t - , Receipt.Chain_hash.t - , Public_key.Compressed.t option - , State_hash.t - , Timing.t - , Permissions.t - , Zkapp_account.t option ) - Poly.t -[@@deriving sexp] +type value = t [@@deriving sexp] let key_gen = Public_key.Compressed.gen @@ -353,7 +404,7 @@ let delegate_opt = Option.value ~default:Public_key.Compressed.empty let to_input (t : t) = let open Random_oracle.Input.Chunked in let f mk acc field = mk (Core_kernel.Field.get field t) :: acc in - Poly.Fields.fold ~init:[] + Fields.fold ~init:[] ~public_key:(f Public_key.Compressed.to_input) ~token_id:(f Token_id.to_input) ~balance:(f Balance.to_input) ~token_symbol:(f Token_symbol.to_input) ~nonce:(f Nonce.to_input) @@ -406,7 +457,7 @@ let typ' zkapp = ; zkapp ] ~var_to_hlist:Poly.to_hlist ~var_of_hlist:Poly.of_hlist - ~value_to_hlist:Poly.to_hlist ~value_of_hlist:Poly.of_hlist + ~value_to_hlist:to_hlist ~value_of_hlist:of_hlist let typ : (var, value) Typ.t = let zkapp : @@ -598,7 +649,7 @@ end let digest = crypto_hash let empty = - { Poly.public_key = Public_key.Compressed.empty + { public_key = Public_key.Compressed.empty ; token_id = Token_id.default ; token_symbol = Token_symbol.default ; balance = Balance.zero @@ -622,7 +673,7 @@ let create account_id balance = (* Only allow delegation if this account is for the default token. *) if Token_id.(equal default) token_id then Some public_key else None in - { Poly.public_key + { public_key ; token_id ; token_symbol = Token_symbol.default ; balance @@ -650,7 +701,7 @@ let create_timed account_id balance ~initial_minimum_balance ~cliff_time if Token_id.(equal default) token_id then Some public_key else None in Or_error.return - { Poly.public_key + { public_key ; token_id ; token_symbol = Token_symbol.default ; balance @@ -670,23 +721,17 @@ let create_timed account_id balance ~initial_minimum_balance ~cliff_time } } -(* no vesting after cliff time + 1 slot *) -let create_time_locked public_key balance ~initial_minimum_balance ~cliff_time = - create_timed public_key balance ~initial_minimum_balance ~cliff_time - ~vesting_period:Global_slot_span.(succ zero) - ~vesting_increment:initial_minimum_balance - -let initial_minimum_balance Poly.{ timing; _ } = +let initial_minimum_balance { timing; _ } = match timing with | Timing.Untimed -> None | Timed t -> Some t.initial_minimum_balance -let cliff_time Poly.{ timing; _ } = +let cliff_time { timing; _ } = match timing with Timing.Untimed -> None | Timed t -> Some t.cliff_time -let cliff_amount Poly.{ timing; _ } = +let cliff_amount { timing; _ } = match timing with Timing.Untimed -> None | Timed t -> Some t.cliff_amount let vesting_increment Poly.{ timing; _ } = diff --git a/src/lib/mina_base/account_update.ml b/src/lib/mina_base/account_update.ml index 5806705444b..f019acf9f5d 100644 --- a/src/lib/mina_base/account_update.ml +++ b/src/lib/mina_base/account_update.ml @@ -12,6 +12,10 @@ module type Type = sig type t end +module Events = Zkapp_account.Events +module Actions = Zkapp_account.Actions +module Zkapp_uri = Zkapp_account.Zkapp_uri + module Authorization_kind = struct [%%versioned module Stable = struct @@ -20,19 +24,7 @@ module Authorization_kind = struct type t = Mina_wire_types.Mina_base.Account_update.Authorization_kind.V1.t = | Signature - | Proof of - (Field.t - [@version_asserted] - [@to_yojson fun t -> `String (Snark_params.Tick.Field.to_string t)] - [@of_yojson - function - | `String s -> - let field = Snark_params.Tick.Field.of_string s in - let s' = Snark_params.Tick.Field.to_string field in - if String.equal s s' then Ok field - else Error "Invalid JSON for field" - | _ -> - Error "expected JSON string"] ) + | Proof of (Field.t[@version_asserted]) | None_given [@@deriving sexp, equal, yojson, hash, compare] @@ -688,7 +680,7 @@ module Update = struct ; verification_key : Verification_key_wire.Stable.V1.t Set_or_keep.Stable.V1.t ; permissions : Permissions.Stable.V2.t Set_or_keep.Stable.V1.t - ; zkapp_uri : Bounded_types.String.Stable.V1.t Set_or_keep.Stable.V1.t + ; zkapp_uri : Zkapp_uri.Stable.V1.t Set_or_keep.Stable.V1.t ; token_symbol : Account.Token_symbol.Stable.V1.t Set_or_keep.Stable.V1.t ; timing : Timing_info.Stable.V1.t Set_or_keep.Stable.V1.t @@ -940,9 +932,6 @@ module Update = struct obj end -module Events = Zkapp_account.Events -module Actions = Zkapp_account.Actions - module Account_precondition = struct [%%versioned module Stable = struct diff --git a/src/lib/mina_base/dune b/src/lib/mina_base/dune index a771941a7fc..e362e42f2bb 100644 --- a/src/lib/mina_base/dune +++ b/src/lib/mina_base/dune @@ -49,7 +49,6 @@ block_time base58_check bignum_bigint - mina_compile_config codable crypto_params debug_assert @@ -69,7 +68,6 @@ pickles.backend mina_signature_kind mina_base.util - mina_node_config kimchi_backend hex snark_bits diff --git a/src/lib/mina_base/pending_coinbase.ml b/src/lib/mina_base/pending_coinbase.ml index 3e95eec97a4..a82584c1a9a 100644 --- a/src/lib/mina_base/pending_coinbase.ml +++ b/src/lib/mina_base/pending_coinbase.ml @@ -1314,7 +1314,7 @@ module Make_str (A : Wire_types.Concrete) = struct let%test_unit "add stack + remove stack = initial tree " = let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let depth = constraint_constants.pending_coinbase_depth in let coinbases_gen = @@ -1399,7 +1399,7 @@ module Make_str (A : Wire_types.Concrete) = struct let%test_unit "Checked_stack = Unchecked_stack" = let open Quickcheck in let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in test ~trials:20 (Generator.tuple2 Stack.gen (Coinbase.Gen.gen ~constraint_constants)) @@ -1422,7 +1422,7 @@ module Make_str (A : Wire_types.Concrete) = struct let%test_unit "Checked_tree = Unchecked_tree" = let open Quickcheck in let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let depth = constraint_constants.pending_coinbase_depth in let pending_coinbases = create ~depth () |> Or_error.ok_exn in @@ -1487,7 +1487,7 @@ module Make_str (A : Wire_types.Concrete) = struct let%test_unit "Checked_tree = Unchecked_tree after pop" = let open Quickcheck in let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let depth = constraint_constants.pending_coinbase_depth in test ~trials:20 @@ -1579,7 +1579,7 @@ module Make_str (A : Wire_types.Concrete) = struct let open Quickcheck in let module Pending_coinbase = T in let constraint_constants = - { Genesis_constants.Constraint_constants.for_unit_tests with + { Genesis_constants.For_unit_tests.Constraint_constants.t with pending_coinbase_depth = 3 } in diff --git a/src/lib/mina_base/protocol_constants_checked.ml b/src/lib/mina_base/protocol_constants_checked.ml index 867775531ad..11ae3074fa2 100644 --- a/src/lib/mina_base/protocol_constants_checked.ml +++ b/src/lib/mina_base/protocol_constants_checked.ml @@ -143,7 +143,7 @@ let var_to_input |] let%test_unit "value = var" = - let compiled = Genesis_constants.for_unit_tests.protocol in + let compiled = Genesis_constants.For_unit_tests.t.protocol in let test protocol_constants = let open Snarky_backendless in let p_var = diff --git a/src/lib/mina_base/signed_command.ml b/src/lib/mina_base/signed_command.ml index fca3543e21e..af23f0818c2 100644 --- a/src/lib/mina_base/signed_command.ml +++ b/src/lib/mina_base/signed_command.ml @@ -131,11 +131,6 @@ module Make_str (_ : Wire_types.Concrete) = struct let nonce = Fn.compose Payload.nonce payload - (* for filtering *) - let minimum_fee = Currency.Fee.minimum_user_command_fee - - let has_insufficient_fee t = Currency.Fee.(fee t < minimum_fee) - let signer { Poly.signer; _ } = signer let fee_token (_ : t) = Token_id.default @@ -192,9 +187,11 @@ module Make_str (_ : Wire_types.Concrete) = struct module Gen = struct let gen_inner (sign' : Signature_lib.Keypair.t -> Payload.t -> t) ~key_gen - ?(nonce = Account_nonce.zero) ~fee_range create_body = + ?(nonce = Account_nonce.zero) + ?(min_fee = Genesis_constants.For_unit_tests.t.minimum_user_command_fee) + ~fee_range create_body = let open Quickcheck.Generator.Let_syntax in - let min_fee = Fee.to_nanomina_int Currency.Fee.minimum_user_command_fee in + let min_fee = Fee.to_nanomina_int min_fee in let max_fee = min_fee + fee_range in let%bind (signer : Signature_keypair.t), (receiver : Signature_keypair.t) = @@ -218,8 +215,8 @@ module Make_str (_ : Wire_types.Concrete) = struct module Payment = struct let gen_inner (sign' : Signature_lib.Keypair.t -> Payload.t -> t) ~key_gen - ?nonce ?(min_amount = 1) ~max_amount ~fee_range () = - gen_inner sign' ~key_gen ?nonce ~fee_range + ?nonce ?(min_amount = 1) ~max_amount ?min_fee ~fee_range () = + gen_inner sign' ~key_gen ?nonce ?min_fee ~fee_range @@ fun { public_key = receiver; _ } -> let open Quickcheck.Generator.Let_syntax in let%map amount = @@ -237,22 +234,23 @@ module Make_str (_ : Wire_types.Concrete) = struct gen_inner sign let gen_with_random_participants ?sign_type ~keys ?nonce ?min_amount - ~max_amount ~fee_range = + ~max_amount ?min_fee ~fee_range = with_random_participants ~keys ~gen:(fun ~key_gen -> - gen ?sign_type ~key_gen ?nonce ?min_amount ~max_amount ~fee_range ) + gen ?sign_type ~key_gen ?nonce ?min_amount ~max_amount ?min_fee + ~fee_range ) end module Stake_delegation = struct - let gen ~key_gen ?nonce ~fee_range () = - gen_inner For_tests.fake_sign ~key_gen ?nonce ~fee_range + let gen ~key_gen ?nonce ?min_fee ~fee_range () = + gen_inner For_tests.fake_sign ~key_gen ?nonce ?min_fee ~fee_range (fun { public_key = new_delegate; _ } -> Quickcheck.Generator.return @@ Signed_command_payload.Body.Stake_delegation (Set_delegate { new_delegate = Public_key.compress new_delegate } ) ) - let gen_with_random_participants ~keys ?nonce ~fee_range = - with_random_participants ~keys ~gen:(gen ?nonce ~fee_range) + let gen_with_random_participants ~keys ?nonce ?min_fee ~fee_range = + with_random_participants ~keys ~gen:(gen ?nonce ?min_fee ~fee_range) end let payment = Payment.gen diff --git a/src/lib/mina_base/signed_command_intf.ml b/src/lib/mina_base/signed_command_intf.ml index 38e1753a2d0..2ef6347400e 100644 --- a/src/lib/mina_base/signed_command_intf.ml +++ b/src/lib/mina_base/signed_command_intf.ml @@ -22,6 +22,7 @@ module type Gen_intf = sig -> ?nonce:Account_nonce.t -> ?min_amount:int -> max_amount:int + -> ?min_fee:Currency.Fee.t -> fee_range:int -> unit -> t Quickcheck.Generator.t @@ -38,6 +39,7 @@ module type Gen_intf = sig -> ?nonce:Account_nonce.t -> ?min_amount:int -> max_amount:int + -> ?min_fee:Currency.Fee.t -> fee_range:int -> unit -> t Quickcheck.Generator.t @@ -46,6 +48,7 @@ module type Gen_intf = sig key_gen: (Signature_keypair.t * Signature_keypair.t) Quickcheck.Generator.t -> ?nonce:Account_nonce.t + -> ?min_fee:Currency.Fee.t -> fee_range:int -> unit -> t Quickcheck.Generator.t @@ -53,6 +56,7 @@ module type Gen_intf = sig val stake_delegation_with_random_participants : keys:Signature_keypair.t array -> ?nonce:Account_nonce.t + -> ?min_fee:Currency.Fee.t -> fee_range:int -> unit -> t Quickcheck.Generator.t @@ -114,11 +118,6 @@ module type S = sig val valid_until : t -> Global_slot_since_genesis.t - (* for filtering *) - val minimum_fee : Currency.Fee.t - - val has_insufficient_fee : t -> bool - val tag : t -> Transaction_union_tag.t val tag_string : t -> string diff --git a/src/lib/mina_base/staged_ledger_hash.ml b/src/lib/mina_base/staged_ledger_hash.ml index ecb42f8c0a0..3226f2ff683 100644 --- a/src/lib/mina_base/staged_ledger_hash.ml +++ b/src/lib/mina_base/staged_ledger_hash.ml @@ -213,18 +213,12 @@ module Make_str (A : Wire_types.Concrete) = struct let var_of_t t : var = List.map (Fold.to_list @@ fold t) ~f:Boolean.var_of_value - let warn_improper_transport () = - if String.equal Node_config.proof_level "check" then () - else printf "WARNING: improperly transporting staged-ledger-hash\n" - let typ : (var, value) Typ.t = Typ.transport (Typ.list ~length:length_in_bits Boolean.typ) ~there:(Fn.compose Fold.to_list fold) ~back:(fun _ -> - (* If we put a failwith here, we lose the ability to printf-inspect - * anything that uses staged-ledger-hashes from within Checked - * computations. It's useful when debugging to dump the protocol state - * and so we can just lie here instead. *) - warn_improper_transport () ; Lazy.force dummy ) + (* TODO: We could just use a prover value. *) + printf "WARNING: improperly transporting staged-ledger-hash\n" ; + Lazy.force dummy ) end module Poly = struct diff --git a/src/lib/mina_base/test/account_test.ml b/src/lib/mina_base/test/account_test.ml index cdab8441451..6530cfb8631 100644 --- a/src/lib/mina_base/test/account_test.ml +++ b/src/lib/mina_base/test/account_test.ml @@ -187,23 +187,23 @@ let incremental_balance_during_vesting_is_a_multiple_of_vesting_increment () = Quickcheck.test (let open Quickcheck in let open Generator.Let_syntax in - let%bind timing = + let%bind timing_ = Account.gen_timing_at_least_one_vesting_period Balance.max_int in let min_slot = Global_slot_since_genesis.( - add timing.cliff_time Global_slot_span.(of_int 1)) + add timing_.cliff_time Global_slot_span.(of_int 1)) in let max_slot = let open Global_slot_since_genesis in sub - Account.(timing_final_vesting_slot @@ Timing.of_record timing) + Account.(timing_final_vesting_slot @@ Timing.of_record timing_) Global_slot_span.(of_int 1) |> Option.value ~default:zero in let%bind slot1 = Global_slot_since_genesis.gen_incl min_slot max_slot in let%map slot2 = Global_slot_since_genesis.gen_incl slot1 max_slot in - (timing, slot1, slot2)) + (timing_, slot1, slot2)) ~f:(fun (timing, start_slot, end_slot) -> let open UInt64 in [%test_eq: int] 0 diff --git a/src/lib/mina_base/test/verification_key_permission_test.ml b/src/lib/mina_base/test/verification_key_permission_test.ml index 5e536a1f1c1..e7c8559722c 100644 --- a/src/lib/mina_base/test/verification_key_permission_test.ml +++ b/src/lib/mina_base/test/verification_key_permission_test.ml @@ -38,7 +38,7 @@ let update_vk_perm_with_different_version () = Quickcheck.test ~trials:10 auth_gen ~f:(fun auth -> match User_command.check_well_formedness - ~genesis_constants:Genesis_constants.for_unit_tests + ~genesis_constants:Genesis_constants.For_unit_tests.t (Zkapp_command (update_vk_perm_to_be ~auth:(auth, different_version))) with | Ok _ -> @@ -52,7 +52,7 @@ let update_vk_perm_with_current_version () = Quickcheck.test ~trials:10 auth_gen ~f:(fun auth -> match User_command.check_well_formedness - ~genesis_constants:Genesis_constants.for_unit_tests + ~genesis_constants:Genesis_constants.For_unit_tests.t (Zkapp_command (update_vk_perm_to_be ~auth:(auth, Mina_numbers.Txn_version.current) ) ) diff --git a/src/lib/mina_base/test/zero_vesting_period.ml b/src/lib/mina_base/test/zero_vesting_period.ml index 72d1673e588..bc717be8fc6 100644 --- a/src/lib/mina_base/test/zero_vesting_period.ml +++ b/src/lib/mina_base/test/zero_vesting_period.ml @@ -281,7 +281,7 @@ let zkapp_zero_vesting_period = mk_zkapp_with_vesting_period 0 let zero_vesting_period_is_error () = match User_command.check_well_formedness - ~genesis_constants:Genesis_constants.for_unit_tests + ~genesis_constants:Genesis_constants.For_unit_tests.t (Zkapp_command zkapp_zero_vesting_period) with | Error [ Zero_vesting_period ] -> @@ -294,7 +294,7 @@ let zkapp_nonzero_vesting_period = mk_zkapp_with_vesting_period 1 let nonzero_vesting_period_ok () = match User_command.check_well_formedness - ~genesis_constants:Genesis_constants.for_unit_tests + ~genesis_constants:Genesis_constants.For_unit_tests.t (Zkapp_command zkapp_nonzero_vesting_period) with | Ok () -> diff --git a/src/lib/mina_base/user_command.ml b/src/lib/mina_base/user_command.ml index bedeff135db..909fb53deb6 100644 --- a/src/lib/mina_base/user_command.ml +++ b/src/lib/mina_base/user_command.ml @@ -228,14 +228,11 @@ let fee : t -> Currency.Fee.t = function | Zkapp_command p -> Zkapp_command.fee p -(* for filtering *) -let minimum_fee = Currency.Fee.minimum_user_command_fee - -let has_insufficient_fee t = Currency.Fee.(fee t < minimum_fee) +let has_insufficient_fee ~minimum_fee t = Currency.Fee.(fee t < minimum_fee) let is_disabled = function | Zkapp_command _ -> - Mina_compile_config.zkapps_disabled + Node_config_unconfigurable_constants.zkapps_disabled | _ -> false @@ -433,11 +430,13 @@ module Well_formedness_error = struct "Transaction type disabled" end -let check_well_formedness ~genesis_constants t : +let check_well_formedness ~(genesis_constants : Genesis_constants.t) t : (unit, Well_formedness_error.t list) result = let preds = let open Well_formedness_error in - [ (has_insufficient_fee, Insufficient_fee) + [ ( has_insufficient_fee + ~minimum_fee:genesis_constants.minimum_user_command_fee + , Insufficient_fee ) ; (has_zero_vesting_period, Zero_vesting_period) ; (is_incompatible_version, Incompatible_version) ; (is_disabled, Transaction_type_disabled) diff --git a/src/lib/mina_base/zkapp_precondition.ml b/src/lib/mina_base/zkapp_precondition.ml index 6307ee56a3e..bed9523121a 100644 --- a/src/lib/mina_base/zkapp_precondition.ml +++ b/src/lib/mina_base/zkapp_precondition.ml @@ -849,7 +849,7 @@ module Protocol_state = struct let%bind start_checkpoint = Hash.gen State_hash.gen in let%bind lock_checkpoint = Hash.gen State_hash.gen in let min_epoch_length = 8 in - let max_epoch_length = Genesis_constants.slots_per_epoch in + let max_epoch_length = Genesis_constants.For_unit_tests.slots_per_epoch in let%map epoch_length = Numeric.gen (Length.gen_incl @@ -990,8 +990,9 @@ module Protocol_state = struct let snarked_ledger_hash = Zkapp_basic.Or_ignore.Ignore in let%bind blockchain_length = Numeric.gen Length.gen Length.compare in let max_min_window_density = - Genesis_constants.for_unit_tests.protocol.slots_per_sub_window - * Genesis_constants.Constraint_constants.compiled.sub_windows_per_window + Genesis_constants.For_unit_tests.t.protocol.slots_per_sub_window + * Genesis_constants.For_unit_tests.Constraint_constants.t + .sub_windows_per_window - 1 |> Length.of_int in diff --git a/src/lib/mina_block/block.ml b/src/lib/mina_block/block.ml index b9a04b18e98..ce044757af2 100644 --- a/src/lib/mina_block/block.ml +++ b/src/lib/mina_block/block.ml @@ -113,11 +113,8 @@ let payments block = | _ -> None ) -let account_ids_accessed t = - let transactions = - transactions - ~constraint_constants:Genesis_constants.Constraint_constants.compiled t - in +let account_ids_accessed ~constraint_constants t = + let transactions = transactions ~constraint_constants t in List.map transactions ~f:(fun { data = txn; status } -> Mina_transaction.Transaction.account_access_statuses txn status ) |> List.concat diff --git a/src/lib/mina_block/block.mli b/src/lib/mina_block/block.mli index 4787f11755e..2fc84e2877f 100644 --- a/src/lib/mina_block/block.mli +++ b/src/lib/mina_block/block.mli @@ -38,4 +38,6 @@ val transactions : val payments : t -> Signed_command.t With_status.t list val account_ids_accessed : - t -> (Account_id.t * [ `Accessed | `Not_accessed ]) list + constraint_constants:Genesis_constants.Constraint_constants.t + -> t + -> (Account_id.t * [ `Accessed | `Not_accessed ]) list diff --git a/src/lib/mina_block/precomputed_block.ml b/src/lib/mina_block/precomputed_block.ml index bc2d63c4212..d487f1ad3fa 100644 --- a/src/lib/mina_block/precomputed_block.ml +++ b/src/lib/mina_block/precomputed_block.ml @@ -106,7 +106,9 @@ let of_block ~logger let state_hash = (With_hash.hash block_with_hash).State_hash.State_hashes.state_hash in - let account_ids_accessed = Block.account_ids_accessed block in + let account_ids_accessed = + Block.account_ids_accessed ~constraint_constants block + in let start = Time.now () in let accounts_accessed = List.filter_map account_ids_accessed ~f:(fun (acct_id, status) -> diff --git a/src/lib/mina_commands/mina_commands.ml b/src/lib/mina_commands/mina_commands.ml index d794fb981b9..597188f42d9 100644 --- a/src/lib/mina_commands/mina_commands.ml +++ b/src/lib/mina_commands/mina_commands.ml @@ -35,18 +35,18 @@ let get_keys_with_details t = let%map.Participating_state accounts = accounts_pstate in List.map accounts ~f:(fun account -> ( string_of_public_key account - , account.Account.Poly.balance |> Currency.Balance.to_nanomina_int - , account.Account.Poly.nonce |> Account.Nonce.to_int ) ) + , account.Account.balance |> Currency.Balance.to_nanomina_int + , account.Account.nonce |> Account.Nonce.to_int ) ) let get_nonce t (addr : Account_id.t) = let open Participating_state.Option.Let_syntax in let%map account = get_account t addr in - account.Account.Poly.nonce + account.Account.nonce let get_balance t (addr : Account_id.t) = let open Participating_state.Option.Let_syntax in let%map account = get_account t addr in - account.Account.Poly.balance + account.Account.balance let get_trust_status t (ip_address : Unix.Inet_addr.Blocking_sexp.t) = let config = Mina_lib.config t in @@ -229,7 +229,7 @@ let verify_payment t (addr : Account_id.t) (verifying_txn : User_command.t) let open Participating_state.Let_syntax in let%map account = get_account t addr in let account = Option.value_exn account in - let resulting_receipt = account.Account.Poly.receipt_chain_hash in + let resulting_receipt = account.Account.receipt_chain_hash in let open Or_error.Let_syntax in let%bind (_ : Receipt.Chain_hash.t Mina_stdlib.Nonempty_list.t) = Result.of_option @@ -254,9 +254,10 @@ type active_state_fields = let max_block_height = ref 1 -let get_status ~commit_id ~flag t = +let get_status ~flag t = let open Mina_lib.Config in let config = Mina_lib.config t in + let commit_id = Mina_lib.commit_id t in let precomputed_values = config.precomputed_values in let protocol_constants = precomputed_values.genesis_constants.protocol in let constraint_constants = precomputed_values.constraint_constants in @@ -441,7 +442,7 @@ let get_status ~commit_id ~flag t = let%bind frontier = Mina_lib.transition_frontier t |> Pipe_lib.Broadcast_pipe.Reader.peek in - match Transition_frontier.catchup_tree frontier with + match Transition_frontier.catchup_state frontier with | Full full -> Some (List.map (Hashtbl.to_alist full.states) ~f:(fun (state, hashes) -> @@ -507,9 +508,7 @@ let get_status ~commit_id ~flag t = ; metrics } -let clear_hist_status ~commit_id ~flag t = - Perf_histograms.wipe () ; - get_status ~flag ~commit_id t +let clear_hist_status ~flag t = Perf_histograms.wipe () ; get_status ~flag t module Subscriptions = struct let new_block t public_key = diff --git a/src/lib/mina_compile_config/mina_compile_config.ml b/src/lib/mina_compile_config/mina_compile_config.ml index 51d4befb42d..3b7b24c0a02 100644 --- a/src/lib/mina_compile_config/mina_compile_config.ml +++ b/src/lib/mina_compile_config/mina_compile_config.ml @@ -20,45 +20,29 @@ let block_window_duration_ms = Node_config.block_window_duration let vrf_poll_interval_ms = Node_config.vrf_poll_interval -let rpc_handshake_timeout_sec = 60.0 - -let rpc_heartbeat_timeout_sec = 60.0 - -let rpc_heartbeat_send_every_sec = 10.0 (*same as the default*) - -(** limits on Zkapp_command.t size - 10.26*np + 10.08*n2 + 9.14*n1 < 69.45 - where np: number of single proof updates - n2: number of pairs of signed/no-auth update - n1: number of single signed/no-auth update - and their coefficients representing the cost - The formula was generated based on benchmarking data conducted on bare - metal i9 processor with room to include lower spec. - 69.45 was the total time for a combination of updates that was considered - acceptable. - The method used to estimate the cost was linear least squares. -*) +let rpc_handshake_timeout_sec = Node_config.rpc_handshake_timeout_sec -let zkapp_proof_update_cost = 10.26 +let rpc_heartbeat_timeout_sec = Node_config.rpc_heartbeat_timeout_sec -let zkapp_signed_pair_update_cost = 10.08 +let rpc_heartbeat_send_every_sec = Node_config.rpc_heartbeat_send_every_sec -let zkapp_signed_single_update_cost = 9.14 +let zkapp_proof_update_cost = Node_config.zkapp_proof_update_cost -let zkapp_transaction_cost_limit = 69.45 +let zkapp_signed_pair_update_cost = Node_config.zkapp_signed_pair_update_cost -let max_event_elements = 100 +let zkapp_signed_single_update_cost = + Node_config.zkapp_signed_single_update_cost -let max_action_elements = 100 +let zkapp_transaction_cost_limit = Node_config.zkapp_transaction_cost_limit -let network_id = Node_config.network +let max_event_elements = Node_config.max_event_elements -let zkapp_cmd_limit = Node_config.zkapp_cmd_limit +let max_action_elements = Node_config.max_action_elements -let zkapp_cmd_limit_hardcap = 128 +let network_id = Node_config.network -let zkapps_disabled = false +let zkapp_cmd_limit = Node_config.zkapp_cmd_limit -let slot_tx_end : int option = Node_config.slot_tx_end +let zkapp_cmd_limit_hardcap = Node_config.zkapp_cmd_limit_hardcap -let slot_chain_end : int option = Node_config.slot_chain_end +let zkapps_disabled = Node_config.zkapps_disabled diff --git a/src/lib/mina_compile_config/mina_compile_config.mli b/src/lib/mina_compile_config/mina_compile_config.mli index 75ee999b9e3..5ff9da76ea0 100644 --- a/src/lib/mina_compile_config/mina_compile_config.mli +++ b/src/lib/mina_compile_config/mina_compile_config.mli @@ -18,10 +18,6 @@ val network_id : string val zkapp_cmd_limit : int option -val slot_tx_end : int option - -val slot_chain_end : int option - val rpc_handshake_timeout_sec : float val rpc_heartbeat_timeout_sec : float diff --git a/src/lib/mina_generators/dune b/src/lib/mina_generators/dune index 65bd24feaff..97c1b8c524b 100644 --- a/src/lib/mina_generators/dune +++ b/src/lib/mina_generators/dune @@ -26,12 +26,10 @@ kimchi_pasta kimchi_pasta.basic mina_numbers - mina_compile_config zkapp_command_builder signature_lib mina_ledger mina_base - mina_node_config random_oracle with_hash mina_base.import @@ -42,6 +40,6 @@ random_oracle_input snark_params snarky.backendless - transaction_snark_tests + transaction_snark splittable_random )) diff --git a/src/lib/mina_generators/user_command_generators.ml b/src/lib/mina_generators/user_command_generators.ml index 57f84f724c9..5303156b38c 100644 --- a/src/lib/mina_generators/user_command_generators.ml +++ b/src/lib/mina_generators/user_command_generators.ml @@ -9,12 +9,11 @@ open Mina_base module Ledger = Mina_ledger.Ledger include User_command.Gen -(* using Precomputed_values depth introduces a cyclic dependency *) -let ledger_depth = Node_config.ledger_depth - let zkapp_command_with_ledger ?(ledger_init_state : Ledger.init_state option) ?num_keypairs ?max_account_updates ?max_token_updates ?account_state_tbl ?vk - ?failure () = + ?failure ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) () = + let ledger_depth = constraint_constants.ledger_depth in let open Quickcheck.Let_syntax in let open Signature_lib in (* Need a fee payer keypair, a keypair for the "balancing" account (so that the balance changes @@ -81,7 +80,7 @@ let zkapp_command_with_ledger ?(ledger_init_state : Ledger.init_state option) vk in let%bind balances = - let min_cmd_fee = Currency.Fee.minimum_user_command_fee in + let min_cmd_fee = genesis_constants.minimum_user_command_fee in let min_balance = Currency.Fee.to_nanomina_int min_cmd_fee |> Int.( + ) 100_000_000_000_000_000 @@ -142,7 +141,7 @@ let zkapp_command_with_ledger ?(ledger_init_state : Ledger.init_state option) let%bind zkapp_command = Zkapp_command_generators.gen_zkapp_command_from ~max_account_updates ~max_token_updates ~fee_payer_keypair ~keymap ~ledger ~account_state_tbl - ?vk ?failure () + ?vk ?failure ~genesis_constants ~constraint_constants () in let zkapp_command = Or_error.ok_exn @@ -158,7 +157,8 @@ let zkapp_command_with_ledger ?(ledger_init_state : Ledger.init_state option) (User_command.Zkapp_command zkapp_command, fee_payer_keypair, keymap, ledger) let sequence_zkapp_command_with_ledger ?ledger_init_state ?max_account_updates - ?max_token_updates ?length ?vk ?failure () = + ?max_token_updates ?length ?vk ?failure ~genesis_constants + ~constraint_constants () = let open Quickcheck.Let_syntax in let%bind length = match length with @@ -180,7 +180,8 @@ let sequence_zkapp_command_with_ledger ?ledger_init_state ?max_account_updates let account_state_tbl = Account_id.Table.create () in let%bind zkapp_command, fee_payer_keypair, keymap, ledger = zkapp_command_with_ledger ?ledger_init_state ~num_keypairs - ~max_account_updates ~max_token_updates ~account_state_tbl ?vk ?failure () + ~max_account_updates ~max_token_updates ~account_state_tbl ?vk ?failure + ~genesis_constants ~constraint_constants () in let rec go zkapp_command_and_fee_payer_keypairs n = if n <= 1 then @@ -192,7 +193,8 @@ let sequence_zkapp_command_with_ledger ?ledger_init_state ?max_account_updates let%bind zkapp_command = Zkapp_command_generators.gen_zkapp_command_from ~max_account_updates ~max_token_updates ~fee_payer_keypair ~keymap ~ledger - ~account_state_tbl ?vk ?failure () + ~account_state_tbl ?vk ?failure ~genesis_constants + ~constraint_constants () in let valid_zkapp_command = Or_error.ok_exn diff --git a/src/lib/mina_generators/zkapp_command_generators.ml b/src/lib/mina_generators/zkapp_command_generators.ml index 388123cf222..78247696219 100644 --- a/src/lib/mina_generators/zkapp_command_generators.ml +++ b/src/lib/mina_generators/zkapp_command_generators.ml @@ -34,8 +34,7 @@ let gen_account_precondition_from_account ?failure let open Quickcheck.Let_syntax in if no_account_precondition then return Zkapp_precondition.Account.accept else - let { Account.Poly.balance; nonce; delegate; receipt_chain_hash; zkapp; _ } - = + let { Account.balance; nonce; delegate; receipt_chain_hash; zkapp; _ } = account in (* choose constructor *) @@ -241,18 +240,20 @@ let gen_account_precondition_from_account ?failure return predicate_account else (* Nonce *) - let { Account.Poly.nonce; _ } = account in + let { Account.nonce; _ } = account in match failure with | Some Invalid_account_precondition -> return @@ Zkapp_precondition.Account.nonce (Account.Nonce.succ nonce) | _ -> return @@ Zkapp_precondition.Account.nonce nonce -let gen_fee ?fee_range ~num_updates (account : Account.t) = +let gen_fee ?fee_range ~num_updates ~(genesis_constants : Genesis_constants.t) + (account : Account.t) = let balance = account.balance in let lo_fee = Option.value_exn - Currency.Fee.(scale minimum_user_command_fee (num_updates * 2)) + Currency.Fee.( + scale genesis_constants.minimum_user_command_fee (num_updates * 2)) in let hi_fee = Option.value_exn Currency.Fee.(scale lo_fee 2) in assert ( @@ -1066,7 +1067,7 @@ let gen_account_update_from ?(no_account_precondition = false) (* takes an account id, if we want to sign this data *) let gen_account_update_body_fee_payer ?global_slot ?fee_range ?failure ?permissions_auth ~account_id ?vk ?protocol_state_view ~account_state_tbl - ~num_account_updates () : + ~num_account_updates ~genesis_constants () : Account_update.Body.Fee_payer.t Quickcheck.Generator.t = let open Quickcheck.Let_syntax in let account_precondition_gen (account : Account.t) = @@ -1076,7 +1077,8 @@ let gen_account_update_body_fee_payer ?global_slot ?fee_range ?failure gen_account_update_body_components ?global_slot ?failure ?permissions_auth ~account_id ~account_state_tbl ?vk ~zkapp_account_ids:[] ~is_fee_payer:true ~increment_nonce:((), true) - ~gen_balance_change:(gen_fee ?fee_range ~num_updates:num_account_updates) + ~gen_balance_change: + (gen_fee ?fee_range ~num_updates:num_account_updates ~genesis_constants) ~f_balance_change:fee_to_amt ~f_token_id:(fun token_id -> (* make sure the fee payer's token id is the default, @@ -1094,13 +1096,13 @@ let gen_account_update_body_fee_payer ?global_slot ?fee_range ?failure Account_update_body_components.to_fee_payer body_components let gen_fee_payer ?global_slot ?fee_range ?failure ?permissions_auth ~account_id - ?protocol_state_view ?vk ~account_state_tbl ~num_account_updates () : - Account_update.Fee_payer.t Quickcheck.Generator.t = + ?protocol_state_view ?vk ~account_state_tbl ~num_account_updates + ~genesis_constants () : Account_update.Fee_payer.t Quickcheck.Generator.t = let open Quickcheck.Let_syntax in let%map body = gen_account_update_body_fee_payer ?global_slot ?fee_range ?failure ?permissions_auth ~account_id ?vk ?protocol_state_view ~account_state_tbl - ~num_account_updates () + ~num_account_updates ~genesis_constants () in (* real signature to be added when this data inserted into a Zkapp_command.t *) let authorization = Signature.dummy in @@ -1130,7 +1132,8 @@ let gen_zkapp_command_from ?global_slot ?memo ?(no_account_precondition = false) ~(keymap : Signature_lib.Private_key.t Signature_lib.Public_key.Compressed.Map.t ) ?account_state_tbl ~ledger ?protocol_state_view ?vk ?available_public_keys - () = + ~genesis_constants + ~(constraint_constants : Genesis_constants.Constraint_constants.t) () = let open Quickcheck.Let_syntax in let fee_payer_pk = Signature_lib.Public_key.compress fee_payer_keypair.public_key @@ -1206,7 +1209,8 @@ let gen_zkapp_command_from ?global_slot ?memo ?(no_account_precondition = false) let%bind fee_payer = gen_fee_payer ?global_slot ?fee_range ?failure ~permissions_auth:Control.Tag.Signature ~account_id:fee_payer_acct_id ?vk - ~account_state_tbl ~num_account_updates:num_zkapp_command () + ~account_state_tbl ~num_account_updates:num_zkapp_command + ~genesis_constants () in let zkapp_account_ids = Account_id.Table.filteri account_state_tbl ~f:(fun ~key:_ ~data:(a, role) -> @@ -1443,9 +1447,7 @@ let gen_zkapp_command_from ?global_slot ?memo ?(no_account_precondition = false) Currency.Amount.( Signed.of_unsigned ( scale - (of_fee - Genesis_constants.Constraint_constants.compiled - .account_creation_fee ) + (of_fee constraint_constants.account_creation_fee) num_new_accounts |> Option.value_exn )) ) ~f:(fun acc node -> @@ -1485,9 +1487,7 @@ let gen_zkapp_command_from ?global_slot ?memo ?(no_account_precondition = false) Currency.Amount.( Signed.negate (Signed.of_unsigned - (of_fee - Genesis_constants.Constraint_constants.compiled - .account_creation_fee ) )) + (of_fee constraint_constants.account_creation_fee) )) in gen_account_update_from ~no_account_precondition ?balance_change_range ?global_slot ~zkapp_account_ids ~account_ids_seen ~authorization @@ -1557,7 +1557,7 @@ let gen_zkapp_command_from ?global_slot ?memo ?(no_account_precondition = false) let receipt_chain_hash = Receipt.Chain_hash.cons_zkapp_command_commitment Mina_numbers.Index.zero receipt_elt - account.Account.Poly.receipt_chain_hash + account.Account.receipt_chain_hash in ({ account with receipt_chain_hash }, `Fee_payer) ) ; let account_updates = @@ -1580,7 +1580,7 @@ let gen_zkapp_command_from ?global_slot ?memo ?(no_account_precondition = false) in Receipt.Chain_hash.cons_zkapp_command_commitment account_update_index receipt_elt - account.Account.Poly.receipt_chain_hash + account.Account.receipt_chain_hash in ({ account with receipt_chain_hash }, role) ) | Control.None_given -> @@ -1589,7 +1589,8 @@ let gen_zkapp_command_from ?global_slot ?memo ?(no_account_precondition = false) let gen_list_of_zkapp_command_from ?global_slot ?failure ?max_account_updates ?max_token_updates ~(fee_payer_keypairs : Signature_lib.Keypair.t list) - ~keymap ?account_state_tbl ~ledger ?protocol_state_view ?vk ?length () = + ~keymap ?account_state_tbl ~ledger ?protocol_state_view ?vk ?length + ~genesis_constants ~constraint_constants () = (* Since when generating multiple zkapp_command the fee payer's nonce should only be incremented as the `Fee_payer` role, this is why we pre-computed the `account_state_tbl` here. @@ -1633,7 +1634,8 @@ let gen_list_of_zkapp_command_from ?global_slot ?failure ?max_account_updates let%bind new_zkapp_command = gen_zkapp_command_from ?global_slot ?failure ?max_account_updates ?max_token_updates ~fee_payer_keypair ~keymap ~account_state_tbl - ~ledger ?protocol_state_view ?vk () + ~ledger ?protocol_state_view ?vk ~genesis_constants + ~constraint_constants () in go (n - 1) (new_zkapp_command :: acc) else return (List.rev acc) @@ -1739,10 +1741,16 @@ let gen_max_cost_zkapp_command_from ?memo ?fee_range let%test_module _ = ( module struct - module U = Transaction_snark_tests.Util open Signature_lib - let `VK vk, `Prover _ = Lazy.force U.trivial_zkapp + (* TODO: Should be For_unit_tests *) + let genesis_constants = Genesis_constants.For_unit_tests.t + + let constraint_constants = + Genesis_constants.For_unit_tests.Constraint_constants.t + + let `VK vk, `Prover _ = + Transaction_snark.For_tests.create_trivial_snapp ~constraint_constants () let vk = Async.Thread_safe.block_on_async_exn (fun () -> vk) @@ -1798,8 +1806,8 @@ let%test_module _ = Quickcheck.Generator.( generate (list_with_length 100 - (gen_zkapp_command_from ~fee_payer_keypair ~keymap - ~no_token_accounts:true + (gen_zkapp_command_from ~genesis_constants ~constraint_constants + ~fee_payer_keypair ~keymap ~no_token_accounts:true ~account_state_tbl:(Account_id.Table.create ()) ~generate_new_accounts:false ~ledger () ) ) ~size:100 @@ -1815,8 +1823,9 @@ let%test_module _ = Quickcheck.Generator.( generate (list_with_length 100 - (gen_zkapp_command_from ~no_account_precondition:true - ~fee_payer_keypair ~keymap ~no_token_accounts:true + (gen_zkapp_command_from ~genesis_constants ~constraint_constants + ~no_account_precondition:true ~fee_payer_keypair ~keymap + ~no_token_accounts:true ~fee_range: Currency.Fee.(of_mina_string_exn "2", of_mina_string_exn "4") ~balance_change_range: diff --git a/src/lib/mina_generators/zkapp_command_generators.mli b/src/lib/mina_generators/zkapp_command_generators.mli index 2c89247f28b..62662efe02f 100644 --- a/src/lib/mina_generators/zkapp_command_generators.mli +++ b/src/lib/mina_generators/zkapp_command_generators.mli @@ -74,6 +74,8 @@ val gen_zkapp_command_from : -> ?protocol_state_view:Zkapp_precondition.Protocol_state.View.t -> ?vk:(Side_loaded_verification_key.t, State_hash.t) With_hash.Stable.V1.t -> ?available_public_keys:Signature_lib.Public_key.Compressed.Hash_set.t + -> genesis_constants:Genesis_constants.t + -> constraint_constants:Genesis_constants.Constraint_constants.t -> unit -> Zkapp_command.t Quickcheck.Generator.t @@ -92,6 +94,8 @@ val gen_list_of_zkapp_command_from : -> ?protocol_state_view:Zkapp_precondition.Protocol_state.View.t -> ?vk:(Side_loaded_verification_key.t, State_hash.t) With_hash.Stable.V1.t -> ?length:int + -> genesis_constants:Genesis_constants.t + -> constraint_constants:Genesis_constants.Constraint_constants.t -> unit -> Zkapp_command.t list Quickcheck.Generator.t diff --git a/src/lib/mina_graphql/itn_zkapps.ml b/src/lib/mina_graphql/itn_zkapps.ml index d09cea5a173..9a7d094ec18 100644 --- a/src/lib/mina_graphql/itn_zkapps.ml +++ b/src/lib/mina_graphql/itn_zkapps.ml @@ -153,9 +153,11 @@ let insert_account_queue ~account_queue ~account_queue_size ~account_state_tbl ~data:(a, role) else () -let send_zkapps ~fee_payer_array ~constraint_constants ~tm_end ~scheduler_tbl - ~uuid ~keymap ~unused_pks ~stop_signal ~mina ~zkapp_command_details - ~wait_span ~logger ~account_state_tbl init_tm_next init_counter = +let send_zkapps ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) + ~fee_payer_array ~tm_end ~scheduler_tbl ~uuid ~keymap ~unused_pks + ~stop_signal ~mina ~zkapp_command_details ~wait_span ~logger + ~account_state_tbl init_tm_next init_counter = let wait_span_ms = Time.Span.to_ms wait_span |> int_of_float in let repeat tm_next counter = let%map () = Async_unix.at tm_next in @@ -251,7 +253,8 @@ let send_zkapps ~fee_payer_array ~constraint_constants ~tm_end ~scheduler_tbl ~ignore_sequence_events_precond:true ~no_token_accounts:true ~limited:true ~fee_payer_keypair:fee_payer ~keymap ~account_state_tbl ~generate_new_accounts ~ledger ~vk - ~available_public_keys:unused_pks () ) + ~available_public_keys:unused_pks ~genesis_constants + ~constraint_constants () ) ~size:1 ~random:(Splittable_random.State.create Random.State.default) in diff --git a/src/lib/mina_graphql/mina_graphql.ml b/src/lib/mina_graphql/mina_graphql.ml index 4b2d56944ec..d05d2dce7bd 100644 --- a/src/lib/mina_graphql/mina_graphql.ml +++ b/src/lib/mina_graphql/mina_graphql.ml @@ -407,8 +407,8 @@ module Mutations = struct |> Staged_ledger.ledger in let%bind accounts = Ledger.to_list best_tip_ledger in - let constraint_constants = - Genesis_constants.Constraint_constants.compiled + let { Precomputed_values.constraint_constants; _ } = + (Mina_lib.config mina).precomputed_values in let depth = constraint_constants.ledger_depth in let ledger = Ledger.create_ephemeral ~depth () in @@ -417,7 +417,7 @@ module Mutations = struct *) List.iter accounts ~f:(fun account -> let pk = Account.public_key account in - let token = Account.token account in + let token = Account.token_id account in let account_id = Account_id.create pk token in match Ledger.get_or_create_account ledger account_id account with | Ok (`Added, _loc) -> @@ -503,8 +503,9 @@ module Mutations = struct "Couldn't find an unlocked key for specified `sender`. Did you unlock \ the account you're making a transaction from?" - let create_user_command_input ~fee ~fee_payer_pk ~nonce_opt ~valid_until ~memo - ~signer ~body ~sign_choice : (User_command_input.t, string) result = + let create_user_command_input ~(genesis_constants : Genesis_constants.t) ~fee + ~fee_payer_pk ~nonce_opt ~valid_until ~memo ~signer ~body ~sign_choice : + (User_command_input.t, string) result = let open Result.Let_syntax in (* TODO: We should put a more sensible default here. *) let valid_until = @@ -515,15 +516,16 @@ module Mutations = struct ~error:(sprintf "Invalid `fee` provided.") in let%bind () = + let minimum_fee = genesis_constants.minimum_user_command_fee in Result.ok_if_true - Currency.Fee.(fee >= Signed_command.minimum_fee) + Currency.Fee.(fee >= minimum_fee) ~error: (* IMPORTANT! Do not change the content of this error without * updating Rosetta's construction API to handle the changes *) (sprintf !"Invalid user command. Fee %s is less than the minimum fee, %s." (Currency.Fee.to_mina_string fee) - (Currency.Fee.to_mina_string Signed_command.minimum_fee) ) + (Currency.Fee.to_mina_string minimum_fee) ) in let%map memo = Option.value_map memo ~default:(Ok Signed_command_memo.empty) @@ -534,24 +536,24 @@ module Mutations = struct User_command_input.create ~signer ~fee ~fee_payer_pk ?nonce:nonce_opt ~valid_until ~memo ~body ~sign_choice () - let make_signed_user_command ~signature ~nonce_opt ~signer ~memo ~fee - ~fee_payer_pk ~valid_until ~body = + let make_signed_user_command ~genesis_constants ~signature ~nonce_opt ~signer + ~memo ~fee ~fee_payer_pk ~valid_until ~body = let open Deferred.Result.Let_syntax in let%bind signature = signature |> Deferred.return in let%map user_command_input = - create_user_command_input ~nonce_opt ~signer ~memo ~fee ~fee_payer_pk - ~valid_until ~body + create_user_command_input ~genesis_constants ~nonce_opt ~signer ~memo ~fee + ~fee_payer_pk ~valid_until ~body ~sign_choice:(User_command_input.Sign_choice.Signature signature) |> Deferred.return in user_command_input - let send_signed_user_command ~signature ~mina ~nonce_opt ~signer ~memo ~fee - ~fee_payer_pk ~valid_until ~body = + let send_signed_user_command ~genesis_constants ~signature ~mina ~nonce_opt + ~signer ~memo ~fee ~fee_payer_pk ~valid_until ~body = let open Deferred.Result.Let_syntax in let%bind user_command_input = - make_signed_user_command ~signature ~nonce_opt ~signer ~memo ~fee - ~fee_payer_pk ~valid_until ~body + make_signed_user_command ~genesis_constants ~signature ~nonce_opt ~signer + ~memo ~fee ~fee_payer_pk ~valid_until ~body in let%map cmd = send_user_command mina user_command_input in Types.User_command.With_status.map cmd ~f:(fun cmd -> @@ -559,7 +561,8 @@ module Mutations = struct ; hash = Transaction_hash.hash_command (Signed_command cmd) } ) - let send_unsigned_user_command ~mina ~nonce_opt ~signer ~memo ~fee + let send_unsigned_user_command ~mina + ~(genesis_constants : Genesis_constants.t) ~nonce_opt ~signer ~memo ~fee ~fee_payer_pk ~valid_until ~body = let open Deferred.Result.Let_syntax in let%bind user_command_input = @@ -571,8 +574,8 @@ module Mutations = struct | `Hd_index hd_index -> Hd_index hd_index in - create_user_command_input ~nonce_opt ~signer ~memo ~fee ~fee_payer_pk - ~valid_until ~body ~sign_choice) + create_user_command_input ~genesis_constants ~nonce_opt ~signer ~memo ~fee + ~fee_payer_pk ~valid_until ~body ~sign_choice) |> Deferred.return in let%map cmd = send_user_command mina user_command_input in @@ -597,19 +600,23 @@ module Mutations = struct ] ~resolve:(fun { ctx = mina; _ } () (from, to_, fee, valid_until, memo, nonce_opt) signature -> + let { Precomputed_values.genesis_constants; _ } = + (Mina_lib.config mina).precomputed_values + in let body = Signed_command_payload.Body.Stake_delegation (Set_delegate { new_delegate = to_ }) in match signature with | None -> - send_unsigned_user_command ~mina ~nonce_opt ~signer:from ~memo ~fee - ~fee_payer_pk:from ~valid_until ~body + send_unsigned_user_command ~mina ~genesis_constants ~nonce_opt + ~signer:from ~memo ~fee ~fee_payer_pk:from ~valid_until ~body |> Deferred.Result.map ~f:Types.User_command.mk_user_command | Some signature -> let%bind signature = signature |> Deferred.return in - send_signed_user_command ~mina ~nonce_opt ~signer:from ~memo ~fee - ~fee_payer_pk:from ~valid_until ~body ~signature + send_signed_user_command ~mina ~genesis_constants ~nonce_opt + ~signer:from ~memo ~fee ~fee_payer_pk:from ~valid_until ~body + ~signature |> Deferred.Result.map ~f:Types.User_command.mk_user_command ) let send_payment = @@ -623,18 +630,22 @@ module Mutations = struct ~resolve:(fun { ctx = mina; _ } () (from, to_, amount, fee, valid_until, memo, nonce_opt) signature -> + let { Precomputed_values.genesis_constants; _ } = + (Mina_lib.config mina).precomputed_values + in let body = Signed_command_payload.Body.Payment { receiver_pk = to_; amount = Amount.of_uint64 amount } in match signature with | None -> - send_unsigned_user_command ~mina ~nonce_opt ~signer:from ~memo ~fee - ~fee_payer_pk:from ~valid_until ~body + send_unsigned_user_command ~mina ~genesis_constants ~nonce_opt + ~signer:from ~memo ~fee ~fee_payer_pk:from ~valid_until ~body |> Deferred.Result.map ~f:Types.User_command.mk_user_command | Some signature -> - send_signed_user_command ~mina ~nonce_opt ~signer:from ~memo ~fee - ~fee_payer_pk:from ~valid_until ~body ~signature + send_signed_user_command ~mina ~genesis_constants ~nonce_opt + ~signer:from ~memo ~fee ~fee_payer_pk:from ~valid_until ~body + ~signature |> Deferred.Result.map ~f:Types.User_command.mk_user_command ) let make_zkapp_endpoint ~name ~doc ~f = @@ -682,6 +693,9 @@ module Mutations = struct ] ~resolve:(fun { ctx = mina; _ } () senders_list receiver_pk amount fee repeat_count repeat_delay_ms -> + let { Precomputed_values.genesis_constants; _ } = + (Mina_lib.config mina).precomputed_values + in let dumb_password = lazy (return (Bytes.of_string "dumb")) in let senders = Array.of_list senders_list in let repeat_delay = @@ -712,9 +726,9 @@ module Mutations = struct Secrets.Wallets.import_keypair (Mina_lib.wallets mina) kp ~password:dumb_password in - send_unsigned_user_command ~mina ~nonce_opt:None ~signer:source_pk - ~memo:(Some memo) ~fee ~fee_payer_pk:source_pk ~valid_until:None - ~body + send_unsigned_user_command ~mina ~genesis_constants ~nonce_opt:None + ~signer:source_pk ~memo:(Some memo) ~fee ~fee_payer_pk:source_pk + ~valid_until:None ~body |> Deferred.Result.map ~f:(const 0) in @@ -1008,6 +1022,9 @@ module Mutations = struct return @@ O1trace.sync_thread "itn_schedule_payments" @@ fun () -> + let { Precomputed_values.genesis_constants; _ } = + (Mina_lib.config mina).precomputed_values + in let%bind.Result () = Result.ok_if_true with_seq_no ~error:"Missing sequence information" in @@ -1135,9 +1152,9 @@ module Mutations = struct ] ; let fee = Currency.Fee.to_uint64 fee in match%map - send_signed_user_command ~mina ~nonce_opt:(Some nonce) - ~signer:source_pk ~memo:(Some memo) ~fee ~fee_payer_pk:source_pk - ~valid_until ~body ~signature + send_signed_user_command ~mina ~genesis_constants + ~nonce_opt:(Some nonce) ~signer:source_pk ~memo:(Some memo) ~fee + ~fee_payer_pk:source_pk ~valid_until ~body ~signature with | Ok _cmd_with_status -> (* next nonce for this sender *) @@ -1248,7 +1265,10 @@ module Mutations = struct let tm_end = Time.add tm_start duration_span in [%log info] "Starting zkApp scheduler with handle %s" (Uuid.to_string uuid) ; - let { Precomputed_values.constraint_constants; _ } = + let { Precomputed_values.constraint_constants + ; genesis_constants + ; _ + } = (Mina_lib.config mina).precomputed_values in let zkapp_account_keypairs = @@ -1314,10 +1334,11 @@ module Mutations = struct in let tm_next = Time.add (Time.now ()) wait_span in don't_wait_for - @@ Itn_zkapps.send_zkapps ~fee_payer_array - ~constraint_constants ~scheduler_tbl ~uuid ~keymap - ~unused_pks ~stop_signal ~mina ~zkapp_command_details - ~wait_span ~logger ~tm_end ~account_state_tbl tm_next + @@ Itn_zkapps.send_zkapps ~genesis_constants + ~constraint_constants ~fee_payer_array ~scheduler_tbl + ~uuid ~keymap ~unused_pks ~stop_signal ~mina + ~zkapp_command_details ~wait_span ~logger ~tm_end + ~account_state_tbl tm_next (List.length zkapp_account_keypairs) ) ; Ok (Uuid.to_string uuid) ) @@ -1591,12 +1612,8 @@ module Mutations = struct end end -module Queries (Context : sig - val commit_id : string -end) = -struct +module Queries = struct open Schema - open Context (* helper for pooledUserCommands, pooledZkappCommands *) let get_commands ~resource_pool ~pk_opt ~hashes_opt ~txns_opt = @@ -1762,15 +1779,14 @@ struct agrees with status; see issue #8251 *) let%map { sync_status; _ } = - Mina_commands.get_status ~commit_id ~flag:`Performance mina + Mina_commands.get_status ~flag:`Performance mina in Ok sync_status ) let daemon_status = io_field "daemonStatus" ~doc:"Get running daemon status" ~args:[] ~typ:(non_null Types.DaemonStatus.t) ~resolve:(fun { ctx = mina; _ } () -> - Mina_commands.get_status ~commit_id ~flag:`Performance mina - >>| Result.return ) + Mina_commands.get_status ~flag:`Performance mina >>| Result.return ) let trust_status = field "trustStatus" @@ -1796,7 +1812,7 @@ struct field "version" ~typ:string ~args:Arg.[] ~doc:"The version of the node (git commit hash)" - ~resolve:(fun _ _ -> Some commit_id) + ~resolve:(fun { ctx; _ } _ -> Some (Mina_lib.commit_id ctx)) let get_filtered_log_entries = field "getFilteredLogEntries" @@ -2196,6 +2212,86 @@ struct let (module S) = Mina_lib.work_selection_method mina in S.pending_work_statements ~snark_pool ~fee_opt snark_job_state ) + module SnarkedLedgerMembership = struct + let resolve_membership : + mapper:(Ledger.path -> Account.t -> 'a) + -> Mina_lib.t resolve_info + -> unit + -> (Account.key * Token_id.t option) list + -> string + -> ('a list, string) result Io.t = + fun ~mapper { ctx = mina; _ } () account_infos state_hash -> + let open Deferred.Let_syntax in + let state_hash = State_hash.of_base58_check_exn state_hash in + let%bind ledger = + Mina_lib.get_snarked_ledger_full mina (Some state_hash) + in + let ledger = + match ledger with + | Ok ledger -> + ledger + | Error err -> + raise + (Failure + ("Failed to get snarked ledger: " ^ Error.to_string_hum err) ) + in + let%map memberships = + Deferred.List.map account_infos ~f:(fun (pk, token) -> + let token = Option.value ~default:Token_id.default token in + let account_id = Account_id.create pk token in + let location = Ledger.location_of_account ledger account_id in + match location with + | None -> + raise (Failure "Account not found in snarked ledger") + | Some location -> ( + let account = Ledger.get ledger location in + match account with + | None -> + raise (Failure "Account not found in snarked ledger") + | Some account -> + let proof = Ledger.merkle_path ledger location in + mapper proof account |> Deferred.return ) ) + in + Ok memberships + + let snarked_ledger_account_membership = + io_field "snarkedLedgerAccountMembership" + ~doc: + "obtain a membership proof for an account in the snarked ledger \ + along with the account's balance, timing information, and nonce" + ~args: + Arg. + [ arg "accountInfos" ~doc:"Token id of the account to check" + ~typ: + (non_null (list (non_null Types.Input.AccountInfo.arg_typ))) + ; arg "stateHash" ~doc:"Hash of the snarked ledger to check" + ~typ:(non_null string) + ] + ~typ:(non_null (list (non_null Types.SnarkedLedgerMembership.obj))) + ~resolve: + (resolve_membership ~mapper:Types.SnarkedLedgerMembership.of_account) + + let encoded_snarked_ledger_account_membership = + io_field "encodedSnarkedLedgerAccountMembership" + ~doc: + "obtain a membership proof for an account in the snarked ledger \ + along with the accounts full information encoded as base64 binable \ + type" + ~args: + Arg. + [ arg "accountInfos" ~doc:"Token id of the account to check" + ~typ: + (non_null (list (non_null Types.Input.AccountInfo.arg_typ))) + ; arg "stateHash" ~doc:"Hash of the snarked ledger to check" + ~typ:(non_null string) + ] + ~typ: + (non_null (list (non_null Types.SnarkedLedgerMembership.encoded_obj))) + ~resolve: + (resolve_membership + ~mapper:Types.SnarkedLedgerMembership.of_encoded_account ) + end + let genesis_constants = field "genesisConstants" ~doc: @@ -2241,6 +2337,9 @@ struct (from, to_, amount, fee, valid_until, memo, nonce_opt) signature -> let open Deferred.Result.Let_syntax in + let genesis_constants = + (Mina_lib.config mina).precomputed_values.genesis_constants + in let body = Signed_command_payload.Body.Payment { receiver_pk = to_; amount = Amount.of_uint64 amount } @@ -2253,8 +2352,9 @@ struct Deferred.Result.fail "Signature field is missing" in let%bind user_command_input = - Mutations.make_signed_user_command ~nonce_opt ~signer:from ~memo ~fee - ~fee_payer_pk:from ~valid_until ~body ~signature + Mutations.make_signed_user_command ~genesis_constants ~nonce_opt + ~signer:from ~memo ~fee ~fee_payer_pk:from ~valid_until ~body + ~signature in let%map user_command, _ = User_command_input.to_user_command @@ -2387,7 +2487,7 @@ struct Deferred.Result.fail "Daemon is bootstrapping" | `Active breadcrumb -> ( let txn_stop_slot_opt = - Runtime_config.slot_tx_end_or_default runtime_config + Runtime_config.slot_tx_end runtime_config in match txn_stop_slot_opt with | None -> @@ -2681,6 +2781,8 @@ struct ; trust_status_all ; snark_pool ; pending_snark_work + ; SnarkedLedgerMembership.snarked_ledger_account_membership + ; SnarkedLedgerMembership.encoded_snarked_ledger_account_membership ; genesis_constants ; time_offset ; validate_payment @@ -2753,29 +2855,21 @@ struct end end -let schema ~commit_id = - let module Q = Queries (struct - let commit_id = commit_id - end) in +let schema = Graphql_async.Schema.( - schema Q.commands ~mutations:Mutations.commands + schema Queries.commands ~mutations:Mutations.commands ~subscriptions:Subscriptions.commands) -let schema_limited ~commit_id = - let module Q = Queries (struct - let commit_id = commit_id - end) in +let schema_limited = (* including version because that's the default query *) Graphql_async.Schema.( schema - [ Q.daemon_status; Q.block; Q.version ] + [ Queries.daemon_status; Queries.block; Queries.version ] ~mutations:[] ~subscriptions:[]) -let schema_itn ~commit_id : (bool * Mina_lib.t) Schema.schema = - let module Q = Queries (struct - let commit_id = commit_id - end) in +let schema_itn : (bool * Mina_lib.t) Schema.schema = if Mina_compile_config.itn_features then Graphql_async.Schema.( - schema Q.Itn.commands ~mutations:Mutations.Itn.commands ~subscriptions:[]) + schema Queries.Itn.commands ~mutations:Mutations.Itn.commands + ~subscriptions:[]) else Graphql_async.Schema.(schema [] ~mutations:[] ~subscriptions:[]) diff --git a/src/lib/mina_graphql/types.ml b/src/lib/mina_graphql/types.ml index f8fb79b3894..a1c017cc9f7 100644 --- a/src/lib/mina_graphql/types.ml +++ b/src/lib/mina_graphql/types.ml @@ -205,7 +205,11 @@ let block_producer_timing : ] ) let merkle_path_element : - (_, [ `Left of Zkapp_basic.F.t | `Right of Zkapp_basic.F.t ] option) typ = + ( _ + , [ `Left of Snark_params.Tick.Field.t + | `Right of Snark_params.Tick.Field.t ] + option ) + typ = obj "MerklePathElement" ~fields:(fun _ -> [ field "left" ~typ:field_elem ~args:Arg.[] @@ -653,13 +657,13 @@ let local_state : (Mina_lib.t, Mina_state.Local_state.t option) typ = ~args:Arg.[] ~doc:"Stack frame component of local state" ~typ:(non_null field_elem) ~resolve:(fun _ t -> - (M.stack_frame t : Stack_frame.Digest.t :> Zkapp_basic.F.Stable.V1.t) + (M.stack_frame t : Stack_frame.Digest.t :> Snark_params.Tick.Field.t) ) ; field "callStack" ~args:Arg.[] ~doc:"Call stack component of local state" ~typ:(non_null field_elem) ~resolve:(fun _ t -> - (M.call_stack t : Call_stack_digest.t :> Zkapp_basic.F.Stable.V1.t) + (M.call_stack t : Call_stack_digest.t :> Snark_params.Tick.Field.t) ) ; field "transactionCommitment" ~args:Arg.[] @@ -767,6 +771,69 @@ let snarked_ledger_state : ~resolve:(fun _ ({ sok_digest = _; _ } : _ M.t) -> None) ] ) +module SnarkedLedgerMembership = struct + type encoded_account = { account : string; proof : Ledger.path } + + let encoded_obj = + obj "EncodedAccount" ~fields:(fun _ -> + [ field "account" + ~args:Arg.[] + ~doc:"Base64 encoded account as binable wire type" + ~typ:(non_null string) + ~resolve:(fun _ { account; _ } -> account) + ; field "merklePath" + ~args:Arg.[] + ~doc:"Membership proof in the snarked ledger" + ~typ:(non_null (list (non_null merkle_path_element))) + ~resolve:(fun _ { proof; _ } -> proof) + ] ) + + let of_encoded_account (proof : Ledger.path) (account : Account.t) : + encoded_account = + let account = + Binable.to_string (module Account.Binable_arg.Stable.Latest) account + |> Base64.encode_exn + in + { account; proof } + + type t = + { account_balance : Currency.Balance.t + ; timing_info : Account_timing.t + ; nonce : Account.Nonce.t + ; proof : Ledger.path + } + + let of_account (proof : Ledger.path) (account : Account.t) : t = + { account_balance = account.balance + ; timing_info = account.timing + ; nonce = account.nonce + ; proof + } + + let obj = + obj "MembershipInfo" ~fields:(fun _ -> + [ field "accountBalance" + ~args:Arg.[] + ~doc:"Account balance for a pk and token pair" + ~typ:(non_null balance) + ~resolve:(fun _ { account_balance; _ } -> account_balance) + ; field "timingInfo" + ~args:Arg.[] + ~doc:"Account timing according to chain state" + ~typ:(non_null account_timing) + ~resolve:(fun _ { timing_info; _ } -> timing_info) + ; field "nonce" + ~args:Arg.[] + ~doc:"current nonce related to the account" ~typ:(non_null uint32) + ~resolve:(fun _ { nonce; _ } -> Account.Nonce.to_uint32 nonce) + ; field "merklePath" + ~args:Arg.[] + ~doc:"Membership proof in the snarked ledger" + ~typ:(non_null (list (non_null merkle_path_element))) + ~resolve:(fun _ { proof; _ } -> proof) + ] ) +end + let blockchain_state : ( Mina_lib.t , (Mina_state.Blockchain_state.Value.t * State_hash.t) option ) @@ -1039,7 +1106,7 @@ module AccountObj = struct let%bind receipt_chain_hash = receipt_chain_hash in let%bind voting_for = voting_for in let%map permissions = permissions in - { Account.Poly.public_key + { Account.public_key ; token_id ; token_symbol ; nonce @@ -1053,7 +1120,7 @@ module AccountObj = struct } let of_full_account ?breadcrumb - { Account.Poly.public_key + { Account.public_key ; token_id ; token_symbol ; nonce @@ -1352,8 +1419,8 @@ module AccountObj = struct |> Ledger.location_of_account staking_ledger >>= Ledger.get staking_ledger with - | Some delegate_account -> - let delegate_key = delegate_account.public_key in + | Some account -> + let%bind delegate_key = account.delegate in Some (get_best_ledger_account_pk mina delegate_key) | None -> [%log' warn (Mina_lib.top_level_logger mina)] @@ -1367,10 +1434,10 @@ module AccountObj = struct Ledger.Db.index_of_account_exn staking_ledger account_id in - let delegate_account = + let account = Ledger.Db.get_at_index_exn staking_ledger index in - let delegate_key = delegate_account.public_key in + let%bind delegate_key = account.delegate in Some (get_best_ledger_account_pk mina delegate_key) with e -> [%log' warn (Mina_lib.top_level_logger mina)] @@ -2415,6 +2482,21 @@ module Input = struct | (h : input) -> `String (Frozen_ledger_hash.to_base58_check h) ) end + module AccountInfo = struct + let arg_typ : + ( (PublicKey.input * TokenId.input option) option + , (PublicKey.input * TokenId.input option) option ) + arg_typ = + obj "AccountInput" ~doc:"An account with a public key and a token id" + ~coerce:(fun public_key token -> (public_key, token)) + ~fields: + [ arg "publicKey" ~doc:"Public key of the account" + ~typ:(non_null PublicKey.arg_typ) + ; arg "token" ~doc:"Token id of the account" ~typ:TokenId.arg_typ + ] + ~split:(fun f (pk, token) -> f pk token) + end + module BlockTime = struct type input = Block_time.t diff --git a/src/lib/mina_intf/transition_frontier_components_intf.ml b/src/lib/mina_intf/transition_frontier_components_intf.ml index a8544af5c1c..24717b6fe93 100644 --- a/src/lib/mina_intf/transition_frontier_components_intf.ml +++ b/src/lib/mina_intf/transition_frontier_components_intf.ml @@ -325,6 +325,7 @@ module type Transition_router_intf = sig (** [sync_local_state] is `true` by default, may be set to `false` for tests *) val run : ?sync_local_state:bool + -> ?cache_exceptions:bool -> context:(module CONTEXT) -> trust_system:Trust_system.t -> verifier:Verifier.t @@ -335,18 +336,18 @@ module type Transition_router_intf = sig -> consensus_local_state:Consensus.Data.Local_state.t -> persistent_root_location:string -> persistent_frontier_location:string - -> frontier_broadcast_pipe: - transition_frontier option Pipe_lib.Broadcast_pipe.Reader.t - * transition_frontier option Pipe_lib.Broadcast_pipe.Writer.t + -> get_current_frontier:(unit -> transition_frontier option) + -> frontier_broadcast_writer: + transition_frontier option Pipe_lib.Broadcast_pipe.Writer.t -> network_transition_reader: ( [ `Transition of Mina_block.t Envelope.Incoming.t ] * [ `Time_received of Block_time.t ] * [ `Valid_cb of Mina_net2.Validation_callback.t ] ) Strict_pipe.Reader.t -> producer_transition_reader:breadcrumb Strict_pipe.Reader.t - -> most_recent_valid_block: - Mina_block.initial_valid_block Broadcast_pipe.Reader.t - * Mina_block.initial_valid_block Broadcast_pipe.Writer.t + -> get_most_recent_valid_block:(unit -> Mina_block.initial_valid_block) + -> most_recent_valid_block_writer: + Mina_block.initial_valid_block Broadcast_pipe.Writer.t -> get_completed_work: ( Transaction_snark_work.Statement.t -> Transaction_snark_work.Checked.t option ) diff --git a/src/lib/mina_ledger/ledger.ml b/src/lib/mina_ledger/ledger.ml index 470452519b0..d84b7a9afcc 100644 --- a/src/lib/mina_ledger/ledger.ml +++ b/src/lib/mina_ledger/ledger.ml @@ -73,11 +73,11 @@ module Ledger_inner = struct let identifier = Account.identifier - let balance Account.Poly.{ balance; _ } = balance + let balance Account.{ balance; _ } = balance let empty = Account.empty - let token = Account.Poly.token_id + let token = Account.token_id end end] @@ -459,7 +459,7 @@ let%test_unit "tokens test" = let open Mina_transaction_logic.For_tests in let open Zkapp_command_builder in let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let keypair_and_amounts = Quickcheck.random_value (Init_ledger.gen ()) in let ledger_get_exn ledger pk token = @@ -644,7 +644,7 @@ let%test_unit "zkapp_command payment test" = let open Mina_transaction_logic.For_tests in let module L = Ledger_inner in let constraint_constants = - { Genesis_constants.Constraint_constants.for_unit_tests with + { Genesis_constants.For_unit_tests.Constraint_constants.t with account_creation_fee = Currency.Fee.of_nanomina_int_exn 1 } in @@ -704,7 +704,7 @@ let%test_unit "user_command application on masked ledger" = let open Mina_transaction_logic.For_tests in let module L = Ledger_inner in let constraint_constants = - { Genesis_constants.Constraint_constants.for_unit_tests with + { Genesis_constants.For_unit_tests.Constraint_constants.t with account_creation_fee = Currency.Fee.of_nanomina_int_exn 1 } in @@ -733,7 +733,7 @@ let%test_unit "zkapp_command application on masked ledger" = let open Mina_transaction_logic.For_tests in let module L = Ledger_inner in let constraint_constants = - { Genesis_constants.Constraint_constants.for_unit_tests with + { Genesis_constants.For_unit_tests.Constraint_constants.t with account_creation_fee = Currency.Fee.of_nanomina_int_exn 1 } in diff --git a/src/lib/mina_ledger/sparse_ledger.ml b/src/lib/mina_ledger/sparse_ledger.ml index cd9ec670915..fec47bf2266 100644 --- a/src/lib/mina_ledger/sparse_ledger.ml +++ b/src/lib/mina_ledger/sparse_ledger.ml @@ -93,7 +93,7 @@ let%test_unit "of_ledger_subset_exn with keys that don't exist works" = |> Signature_lib.Public_key.compress ) in Ledger.with_ledger - ~depth:Genesis_constants.Constraint_constants.for_unit_tests.ledger_depth + ~depth:Genesis_constants.For_unit_tests.Constraint_constants.t.ledger_depth ~f:(fun ledger -> let _, pub1 = keygen () in let _, pub2 = keygen () in diff --git a/src/lib/mina_lib/dune b/src/lib/mina_lib/dune index 1fa9548fe7e..5fe7a7e01e2 100644 --- a/src/lib/mina_lib/dune +++ b/src/lib/mina_lib/dune @@ -25,7 +25,6 @@ transition_chain_prover best_tip_prover proof_carrying_data - mina_compile_config mina_runtime_config ledger_proof mina_net2 diff --git a/src/lib/mina_lib/mina_lib.ml b/src/lib/mina_lib/mina_lib.ml index bc3b267ffbf..ee1b1e8e315 100644 --- a/src/lib/mina_lib/mina_lib.ml +++ b/src/lib/mina_lib/mina_lib.ml @@ -7,7 +7,6 @@ open Mina_block open Pipe_lib open Strict_pipe open Signature_lib -open Network_peer module Archive_client = Archive_client module Config = Config module Conf_dir = Conf_dir @@ -120,6 +119,7 @@ type t = ; in_memory_reverse_structured_log_messages_for_integration_test : (int * string list * bool) ref ; vrf_evaluation_state : Block_producer.Vrf_evaluation_state.t + ; commit_id : string } [@@deriving fields] @@ -129,6 +129,8 @@ let time_controller t = t.config.time_controller let subscription t = t.subscriptions +let commit_id t = t.commit_id + let peek_frontier frontier_broadcast_pipe = Broadcast_pipe.Reader.peek frontier_broadcast_pipe |> Result.of_option @@ -405,11 +407,11 @@ let get_node_state t = | None -> None | Some tf -> ( - match Transition_frontier.catchup_tree tf with - | Full catchup_tree -> + match Transition_frontier.catchup_state tf with + | Full catchup_state -> Some (Transition_frontier.Full_catchup_tree.to_node_status_report - catchup_tree ) + catchup_state ) | _ -> None ) in @@ -456,19 +458,14 @@ exception Offline_shutdown exception Bootstrap_stuck_shutdown -let create_sync_status_observer ~logger ~is_seed ~demo_mode ~net - ~transition_frontier_and_catchup_signal_incr ~online_status_incr +let create_sync_status_observer ~logger ~genesis_timestamp ~is_seed ~demo_mode + ~net ~transition_frontier_and_catchup_signal_incr ~online_status_incr ~first_connection_incr ~first_message_incr = let open Mina_incremental.Status in let restart_delay = Time.Span.of_min 5. in let offline_shutdown_delay = Time.Span.of_min 25. in - let after_genesis = - let genesis_timestamp = - Genesis_constants.( - genesis_timestamp_of_string genesis_state_timestamp_string) - in - fun () -> Time.(( >= ) (now ())) genesis_timestamp - in + let genesis_timestamp = Genesis_constants.to_time genesis_timestamp in + let after_genesis () = Time.(( >= ) (now ())) genesis_timestamp in let incremental_status = map4 online_status_incr transition_frontier_and_catchup_signal_incr first_connection_incr first_message_incr @@ -791,7 +788,7 @@ let get_inferred_nonce_from_transaction_pool_and_ledger t | None -> let open Participating_state.Option.Let_syntax in let%map account = get_account t account_id in - account.Account.Poly.nonce + account.Account.nonce let snark_job_state t = t.snark_job_state @@ -920,7 +917,7 @@ let get_current_nonce t aid = let ledger_nonce = Participating_state.active (get_account t aid) |> Option.join - |> Option.map ~f:(fun { Account.Poly.nonce; _ } -> nonce) + |> Option.map ~f:(fun { Account.nonce; _ } -> nonce) |> Option.value ~default:nonce in Ok (`Min ledger_nonce, nonce) @@ -1222,6 +1219,12 @@ let online_broadcaster ~constraint_constants time_controller = module type CONTEXT = sig val logger : Logger.t + val time_controller : Block_time.Controller.t + + val trust_system : Trust_system.t + + val consensus_local_state : Consensus.Data.Local_state.t + val precomputed_values : Precomputed_values.t val constraint_constants : Genesis_constants.Constraint_constants.t @@ -1235,6 +1238,12 @@ let context ~commit_id (config : Config.t) : (module CONTEXT) = ( module struct let logger = config.logger + let time_controller = config.time_controller + + let trust_system = config.trust_system + + let consensus_local_state = config.consensus_local_state + let precomputed_values = config.precomputed_values let consensus_constants = precomputed_values.consensus_constants @@ -1244,8 +1253,8 @@ let context ~commit_id (config : Config.t) : (module CONTEXT) = let commit_id = commit_id end ) -let start ~commit_id t = - let commit_id_short = String.sub ~pos:0 ~len:8 commit_id in +let start t = + let commit_id_short = String.sub ~pos:0 ~len:8 t.commit_id in let set_next_producer_timing timing consensus_state = let block_production_status, next_producer_timing = let generated_from_consensus_at : @@ -1304,12 +1313,13 @@ let start ~commit_id t = t.block_production_status := block_production_status ; t.next_producer_timing <- Some next_producer_timing in - if + ( if not (Keypair.And_compressed_pk.Set.is_empty t.config.block_production_keypairs) then + let module Context = (val context ~commit_id:t.commit_id t.config) in Block_producer.run - ~context:(context ~commit_id t.config) + ~context:(module Context) ~vrf_evaluator:t.processes.vrf_evaluator ~verifier:t.processes.verifier ~set_next_producer_timing ~prover:t.processes.prover ~trust_system:t.config.trust_system @@ -1328,7 +1338,7 @@ let start ~commit_id t = ~block_produced_bvar:t.components.block_produced_bvar ~vrf_evaluation_state:t.vrf_evaluation_state ~net:t.components.net ~zkapp_cmd_limit_hardcap: - t.config.precomputed_values.genesis_constants.zkapp_cmd_limit_hardcap ; + t.config.precomputed_values.genesis_constants.zkapp_cmd_limit_hardcap ) ; perform_compaction t ; let () = match t.config.node_status_url with @@ -1340,7 +1350,7 @@ let start ~commit_id t = @@ Keypair.And_compressed_pk.Set.choose t.config.block_production_keypairs in - Node_status_service.start_simplified ~commit_id + Node_status_service.start_simplified ~commit_id:t.commit_id ~logger:t.config.logger ~node_status_url ~network:t.components.net ~chain_id:t.config.chain_id ~addrs_and_ports:t.config.gossip_net_params.addrs_and_ports @@ -1350,8 +1360,8 @@ let start ~commit_id t = .slot_duration_ms ) ~block_producer_public_key_base58 else - Node_status_service.start ~commit_id ~logger:t.config.logger - ~node_status_url ~network:t.components.net + Node_status_service.start ~commit_id:t.commit_id + ~logger:t.config.logger ~node_status_url ~network:t.components.net ~transition_frontier:t.components.transition_frontier ~sync_status:t.sync_status ~chain_id:t.config.chain_id ~addrs_and_ports:t.config.gossip_net_params.addrs_and_ports @@ -1369,6 +1379,8 @@ let start ~commit_id t = Uptime_service.start ~logger:t.config.logger ~uptime_url:t.config.uptime_url ~snark_worker_opt:t.processes.uptime_snark_worker_opt ~transition_frontier:t.components.transition_frontier + ~constraint_constants:t.config.precomputed_values.constraint_constants + ~protocol_constants:t.config.precomputed_values.genesis_constants.protocol ~time_controller:t.config.time_controller ~block_produced_bvar:t.components.block_produced_bvar ~uptime_submitter_keypair:t.config.uptime_submitter_keypair @@ -1379,24 +1391,25 @@ let start ~commit_id t = stop_long_running_daemon t ; Snark_worker.start t -let start_with_precomputed_blocks ~commit_id t blocks = +let start_with_precomputed_blocks t blocks = + let module Context = (val context ~commit_id:t.commit_id t.config) in let%bind () = Block_producer.run_precomputed - ~context:(context ~commit_id t.config) + ~context:(module Context) ~verifier:t.processes.verifier ~trust_system:t.config.trust_system ~time_controller:t.config.time_controller ~frontier_reader:t.components.transition_frontier ~transition_writer:t.pipes.producer_transition_writer ~precomputed_blocks:blocks in - start ~commit_id t + start t let send_resource_pool_diff_or_wait ~rl ~diff_score ~max_per_15_seconds diff = (* HACK: Pretend we're a remote peer so that we can rate limit ourselves. *) - let us = - { Network_peer.Peer.host = Unix.Inet_addr.of_string "127.0.0.1" + let us : Network_peer.Peer.t = + { host = Unix.Inet_addr.of_string "127.0.0.1" ; libp2p_port = 0 ; peer_id = "" } @@ -1434,7 +1447,7 @@ module type Itn_settable = sig val set_itn_logger_data : t -> daemon_port:int -> unit Deferred.Or_error.t end -let start_filtered_log +let start_filtered_log ~commit_id in_memory_reverse_structured_log_messages_for_integration_test (structured_log_ids : string list) = let handle str = @@ -1455,9 +1468,10 @@ let start_filtered_log Structured_log_events.Set.of_list @@ List.map ~f:Structured_log_events.id_of_string structured_log_ids in - Logger.Consumer_registry.register ~id:Logger.Logger_id.mina + Logger.Consumer_registry.register ~id:Logger.Logger_id.mina ~commit_id ~processor:(Logger.Processor.raw_structured_log_events event_set) - ~transport:(Logger.Transport.raw handle) ; + ~transport:(Logger.Transport.raw handle) + () ; Ok () ) let create ~commit_id ?wallets (config : Config.t) = @@ -1490,7 +1504,7 @@ let create ~commit_id ?wallets (config : Config.t) = if not (List.is_empty config.start_filtered_logs) then (* Start the filtered logs, if requested. *) Or_error.ok_exn - @@ start_filtered_log + @@ start_filtered_log ~commit_id in_memory_reverse_structured_log_messages_for_integration_test config.start_filtered_logs ; let%bind prover = @@ -1571,9 +1585,9 @@ let create ~commit_id ?wallets (config : Config.t) = ~metadata:[ ("exn", Error_json.error_to_yojson err) ] ) ) (fun () -> O1trace.thread "manage_vrf_evaluator_subprocess" (fun () -> - Vrf_evaluator.create ~constraint_constants ~pids:config.pids - ~logger:config.logger ~conf_dir:config.conf_dir - ~consensus_constants + Vrf_evaluator.create ~commit_id ~constraint_constants + ~pids:config.pids ~logger:config.logger + ~conf_dir:config.conf_dir ~consensus_constants ~keypairs:config.block_production_keypairs ) ) >>| Result.ok_exn in @@ -1606,6 +1620,8 @@ let create ~commit_id ?wallets (config : Config.t) = O1trace.thread "manage_uptime_snark_worker_subprocess" (fun () -> Uptime_service.Uptime_snark_worker.create + ~constraint_constants: + config.precomputed_values.constraint_constants ~logger:config.logger ~pids:config.pids ) ) >>| Result.ok ) in @@ -1625,24 +1641,16 @@ let create ~commit_id ?wallets (config : Config.t) = let frontier_broadcast_pipe_r, frontier_broadcast_pipe_w = Broadcast_pipe.create None in + let get_current_frontier () = + Broadcast_pipe.Reader.peek frontier_broadcast_pipe_r + in Exit_handlers.register_async_shutdown_handler ~logger:config.logger ~description:"Close transition frontier, if exists" (fun () -> - match Broadcast_pipe.Reader.peek frontier_broadcast_pipe_r with + match get_current_frontier () with | None -> Deferred.unit | Some frontier -> Transition_frontier.close ~loc:__LOC__ frontier ) ; - let handle_request name ~f query_env = - O1trace.thread ("handle_request_" ^ name) (fun () -> - let input = Envelope.Incoming.data query_env in - Deferred.return - @@ - let open Option.Let_syntax in - let%bind frontier = - Broadcast_pipe.Reader.peek frontier_broadcast_pipe_r - in - f ~frontier input ) - in (* knot-tying hacks so we can pass a get_node_status function before net, Mina_lib.t created *) let net_ref = ref None in let sync_status_ref = ref None in @@ -1682,9 +1690,7 @@ let create ~commit_id ?wallets (config : Config.t) = let ( protocol_state_hash , best_tip_opt , k_block_hashes_and_timestamps ) = - match - Broadcast_pipe.Reader.peek frontier_broadcast_pipe_r - with + match get_current_frontier () with | None -> ( config.precomputed_values .protocol_state_with_hashes @@ -1763,7 +1769,7 @@ let create ~commit_id ?wallets (config : Config.t) = @@ Consensus.Data.Consensus_state .blockchain_length consensus_state ) in - Mina_networking.Rpcs.Get_node_status.Node_status. + Mina_networking.Node_status.Stable.V2. { node_ip_addr ; node_peer_id ; sync_status @@ -1777,19 +1783,8 @@ let create ~commit_id ?wallets (config : Config.t) = ; block_height_opt } ) in - let get_some_initial_peers _ = - O1trace.thread "handle_request_get_some_initial_peers" (fun () -> - match !net_ref with - | None -> - (* should be unreachable; without a network, we wouldn't receive this RPC call *) - [%log' error config.logger] - "Network not instantiated when initial peers requested" ; - Deferred.return [] - | Some net -> - Mina_networking.peers net ) - in let slot_tx_end = - Runtime_config.slot_tx_end_or_default + Runtime_config.slot_tx_end config.Config.precomputed_values.runtime_config in let txn_pool_config = @@ -1803,7 +1798,7 @@ let create ~commit_id ?wallets (config : Config.t) = let first_received_message_signal = Ivar.create () in let online_status, notify_online_impl = online_broadcaster - ~constraint_constants:config.net_config.constraint_constants + ~constraint_constants:Context.constraint_constants config.time_controller in let on_first_received_message ~f = @@ -1848,7 +1843,7 @@ let create ~commit_id ?wallets (config : Config.t) = config.precomputed_values.consensus_constants.slot_duration_ms ; on_push = notify_online ; log_gossip_heard = config.net_config.log_gossip_heard.new_state - ; time_controller = config.net_config.time_controller + ; time_controller = Context.time_controller ; consensus_constants ; genesis_constants = config.precomputed_values.genesis_constants ; constraint_constants @@ -1857,110 +1852,12 @@ let create ~commit_id ?wallets (config : Config.t) = let sinks = (block_sink, tx_remote_sink, snark_remote_sink) in let%bind net = O1trace.thread "mina_networking" (fun () -> - Mina_networking.create config.net_config ~get_some_initial_peers - ~sinks - ~get_staged_ledger_aux_and_pending_coinbases_at_hash:(fun query_env - -> - O1trace.thread - "handle_request_get_staged_ledger_aux_and_pending_coinbases_at_hash" - (fun () -> - let input = Envelope.Incoming.data query_env in - Deferred.return - @@ - let open Option.Let_syntax in - let%bind frontier = - Broadcast_pipe.Reader.peek frontier_broadcast_pipe_r - in - let%map ( scan_state - , expected_merkle_root - , pending_coinbases - , protocol_states ) = - Sync_handler - .get_staged_ledger_aux_and_pending_coinbases_at_hash - ~frontier input - in - let staged_ledger_hash = - Staged_ledger_hash.of_aux_ledger_and_coinbase_hash - (Staged_ledger.Scan_state.hash scan_state) - expected_merkle_root pending_coinbases - in - [%log' debug config.logger] - ~metadata: - [ ( "staged_ledger_hash" - , Staged_ledger_hash.to_yojson staged_ledger_hash - ) - ] - "sending scan state and pending coinbase" ; - ( scan_state - , expected_merkle_root - , pending_coinbases - , protocol_states ) ) ) - ~answer_sync_ledger_query:(fun query_env -> - let open Deferred.Or_error.Let_syntax in - O1trace.thread "handle_request_answer_sync_ledger_query" - (fun () -> - let ledger_hash, _ = Envelope.Incoming.data query_env in - let%bind frontier = - Deferred.return - @@ peek_frontier frontier_broadcast_pipe_r - in - Sync_handler.answer_query ~frontier ledger_hash - (Envelope.Incoming.map ~f:Tuple2.get2 query_env) - ~logger:config.logger - ~trust_system:config.trust_system - |> Deferred.map - (* begin error string prefix so we can pattern-match *) - ~f: - (Result.of_option - ~error: - (Error.createf - !"%s for ledger_hash: \ - %{sexp:Ledger_hash.t}" - Mina_networking - .refused_answer_query_string ledger_hash ) ) ) - ) - ~get_ancestry: - (handle_request "get_ancestry" ~f:(fun ~frontier s -> - s - |> With_hash.map_hash ~f:(fun state_hash -> - { State_hash.State_hashes.state_hash - ; state_body_hash = None - } ) - |> Sync_handler.Root.prove - ~context:(module Context) - ~frontier ) ) - ~get_best_tip: - (handle_request "get_best_tip" ~f:(fun ~frontier () -> - let open Option.Let_syntax in - let open Proof_carrying_data in - let%map proof_with_data = - Best_tip_prover.prove - ~context:(module Context) - frontier - in - { proof_with_data with - data = With_hash.data proof_with_data.data - } ) ) - ~get_node_status - ~get_transition_chain_proof: - (handle_request "get_transition_chain_proof" - ~f:(fun ~frontier hash -> - Transition_chain_prover.prove ~frontier hash ) ) - ~get_transition_chain: - (handle_request "get_transition_chain" - ~f:Sync_handler.get_transition_chain ) - ~get_transition_knowledge:(fun _q -> - O1trace.thread "handle_request_get_transition_knowledge" - (fun () -> - return - ( match - Broadcast_pipe.Reader.peek - frontier_broadcast_pipe_r - with - | None -> - [] - | Some frontier -> - Sync_handler.best_tip_path ~frontier ) ) ) ) + Mina_networking.create + (module Context) + config.net_config ~sinks + ~get_transition_frontier:(fun () -> + Broadcast_pipe.Reader.peek frontier_broadcast_pipe_r ) + ~get_node_status ) in (* tie the first knot *) net_ref := Some net ; @@ -2007,12 +1904,15 @@ let create ~commit_id ?wallets (config : Config.t) = User_command.Zkapp_command zkapp_command ) , result_cb ) ) |> Deferred.don't_wait_for ; - let ((most_recent_valid_block_reader, _) as most_recent_valid_block) = + let most_recent_valid_block_reader, most_recent_valid_block_writer = Broadcast_pipe.create ( Mina_block.genesis ~precomputed_values:config.precomputed_values |> Validation.reset_frontier_dependencies_validation |> Validation.reset_staged_ledger_diff_validation ) in + let get_most_recent_valid_block () = + Broadcast_pipe.Reader.peek most_recent_valid_block_reader + in let valid_transitions, initialization_finish_signal = Transition_router.run ~context:(module Context) @@ -2022,10 +1922,11 @@ let create ~commit_id ?wallets (config : Config.t) = ~consensus_local_state:config.consensus_local_state ~persistent_root_location:config.persistent_root_location ~persistent_frontier_location:config.persistent_frontier_location - ~frontier_broadcast_pipe: - (frontier_broadcast_pipe_r, frontier_broadcast_pipe_w) - ~catchup_mode ~network_transition_reader:block_reader - ~producer_transition_reader ~most_recent_valid_block + ~get_current_frontier + ~frontier_broadcast_writer:frontier_broadcast_pipe_w ~catchup_mode + ~network_transition_reader:block_reader + ~producer_transition_reader ~get_most_recent_valid_block + ~most_recent_valid_block_writer ~get_completed_work: (Network_pool.Snark_pool.get_completed_work snark_pool) ~notify_online () @@ -2240,8 +2141,11 @@ let create ~commit_id ?wallets (config : Config.t) = return None in let sync_status = - create_sync_status_observer ~logger:config.logger ~net - ~is_seed:config.is_seed ~demo_mode:config.demo_mode + create_sync_status_observer ~logger:config.logger + ~genesis_timestamp: + config.precomputed_values.genesis_constants.protocol + .genesis_state_timestamp + ~net ~is_seed:config.is_seed ~demo_mode:config.demo_mode ~transition_frontier_and_catchup_signal_incr ~online_status_incr:(Var.watch @@ of_broadcast_pipe online_status) ~first_connection_incr: @@ -2288,6 +2192,7 @@ let create ~commit_id ?wallets (config : Config.t) = ; in_memory_reverse_structured_log_messages_for_integration_test ; vrf_evaluation_state = Block_producer.Vrf_evaluation_state.create () + ; commit_id } ) ) let net { components = { net; _ }; _ } = net @@ -2296,9 +2201,12 @@ let runtime_config { config = { precomputed_values; _ }; _ } = Genesis_ledger_helper.runtime_config_of_precomputed_values precomputed_values let start_filtered_log - ({ in_memory_reverse_structured_log_messages_for_integration_test; _ } : t) - (structured_log_ids : string list) = - start_filtered_log + ({ in_memory_reverse_structured_log_messages_for_integration_test + ; commit_id + ; _ + } : + t ) (structured_log_ids : string list) = + start_filtered_log ~commit_id in_memory_reverse_structured_log_messages_for_integration_test structured_log_ids diff --git a/src/lib/mina_lib/mina_lib.mli b/src/lib/mina_lib/mina_lib.mli index be43368e071..02389c2eb09 100644 --- a/src/lib/mina_lib/mina_lib.mli +++ b/src/lib/mina_lib/mina_lib.mli @@ -23,6 +23,12 @@ type Structured_log_events.t += module type CONTEXT = sig val logger : Logger.t + val time_controller : Block_time.Controller.t + + val trust_system : Trust_system.t + + val consensus_local_state : Consensus.Data.Local_state.t + val precomputed_values : Precomputed_values.t val constraint_constants : Genesis_constants.Constraint_constants.t @@ -44,6 +50,8 @@ val time_controller : t -> Block_time.Controller.t val subscription : t -> Mina_subscriptions.t +val commit_id : t -> string + val daemon_start_time : Time_ns.t (** Derived from local state (aka they may not reflect the latest public keys to which you've attempted to change *) @@ -170,13 +178,10 @@ val transaction_pool : t -> Network_pool.Transaction_pool.t val snark_pool : t -> Network_pool.Snark_pool.t -val start : commit_id:string -> t -> unit Deferred.t +val start : t -> unit Deferred.t val start_with_precomputed_blocks : - commit_id:string - -> t - -> Block_producer.Precomputed.t Sequence.t - -> unit Deferred.t + t -> Block_producer.Precomputed.t Sequence.t -> unit Deferred.t val stop_snark_worker : ?should_wait_kill:bool -> t -> unit Deferred.t diff --git a/src/lib/mina_lib/tests/tests.ml b/src/lib/mina_lib/tests/tests.ml index 407b666fab0..1858c6fe714 100644 --- a/src/lib/mina_lib/tests/tests.ml +++ b/src/lib/mina_lib/tests/tests.ml @@ -11,18 +11,23 @@ let%test_module "Epoch ledger sync tests" = module type CONTEXT = sig include Mina_lib.CONTEXT - val trust_system : Trust_system.t + val genesis_ledger : Mina_ledger.Ledger.t Lazy.t end type network_info = - { networking : Mina_networking.t - ; network_peer : Peer.t - ; consensus_local_state : Consensus.Data.Local_state.t - ; no_answer_ivar : unit Ivar.t + { networking : Mina_networking.t; network_peer : Peer.t } + + type test_state = + { name : string + ; network_info1 : network_info + ; network_info2 : network_info + ; staking_epoch_ledger : + Consensus.Data.Local_state.Snapshot.Ledger_snapshot.t + ; next_epoch_ledger : + Consensus.Data.Local_state.Snapshot.Ledger_snapshot.t + ; cleanup : unit -> unit } - exception No_sync_answer - exception Sync_timeout let logger = Logger.create () @@ -31,6 +36,11 @@ let%test_module "Epoch ledger sync tests" = let dir_prefix = "sync_test_data" + let genesis_constants = Genesis_constants.For_unit_tests.t + + let constraint_constants = + Genesis_constants.For_unit_tests.Constraint_constants.t + let make_dirname s = let open Core in let uuid = Uuid_unix.create () |> Uuid.to_string in @@ -58,7 +68,8 @@ let%test_module "Epoch ledger sync tests" = match%map Genesis_ledger_helper.init_from_config_file ~genesis_dir:(make_dirname "genesis_dir") - ~logger ~proof_level:None runtime_config + ~constraint_constants ~genesis_constants ~logger ~proof_level:None + runtime_config ~cli_proof_level:None with | Ok (precomputed_values, _) -> precomputed_values @@ -68,13 +79,14 @@ let%test_module "Epoch ledger sync tests" = in let constraint_constants = precomputed_values.constraint_constants in let consensus_constants = - let genesis_constants = Genesis_constants.for_unit_tests in + let genesis_constants = Genesis_constants.For_unit_tests.t in Consensus.Constants.create ~constraint_constants ~protocol_constants:genesis_constants.protocol in let%bind trust_system = Trust_system.create (make_dirname "trust_system") in + let time_controller = Block_time.Controller.basic ~logger in let module Context = struct let logger = logger @@ -86,22 +98,43 @@ let%test_module "Epoch ledger sync tests" = let trust_system = trust_system + let time_controller = time_controller + let commit_id = "not specified for unit test" end in + let genesis_ledger = + lazy + (Mina_ledger.Ledger.create + ~directory_name:(make_dirname "genesis_ledger") + ~depth:precomputed_values.constraint_constants.ledger_depth () ) + in + let genesis_epoch_data : Consensus.Genesis_epoch_data.t = None in + let genesis_state_hash = Quickcheck.random_value Ledger_hash.gen in + let consensus_local_state = + Consensus.Data.Local_state.create + ~context:(module Context) + ~genesis_ledger ~genesis_epoch_data + ~epoch_ledger_location:(make_dirname "epoch_ledger") + ~genesis_state_hash + (Signature_lib.Public_key.Compressed.Set.of_list []) + in + let module Context = struct + include Context + + let genesis_ledger = genesis_ledger + + let consensus_local_state = consensus_local_state + end in return (module Context : CONTEXT) let pids = Child_processes.Termination.create_pid_table () - let verifier = - Async.Thread_safe.block_on_async_exn (fun () -> - let%bind precomputed_values = - let%map (module Context) = make_context () in - Context.precomputed_values - in - Verifier.create ~logger ~proof_level:precomputed_values.proof_level - ~constraint_constants:precomputed_values.constraint_constants ~pids - ~conf_dir:(Some (make_dirname "verifier")) - ~commit_id:"not specified for unit tests" () ) + let make_verifier (module Context : CONTEXT) = + let open Context in + Verifier.create ~logger ~proof_level:precomputed_values.proof_level + ~constraint_constants:precomputed_values.constraint_constants ~pids + ~conf_dir:(Some (make_dirname "verifier")) + ~commit_id:"not specified for unit tests" () let make_empty_ledger (module Context : CONTEXT) = Mina_ledger.Ledger.create @@ -111,16 +144,11 @@ let%test_module "Epoch ledger sync tests" = Mina_ledger.Ledger.Db.create ~depth:Context.precomputed_values.constraint_constants.ledger_depth () - let peek_frontier frontier_broadcast_pipe = - Broadcast_pipe.Reader.peek frontier_broadcast_pipe - |> Result.of_option - ~error:(Error.of_string "Cannot retrieve transition frontier") - (* [instance] and [test_number] are used to make ports distinct among tests *) let make_mina_network ~context:(module Context : CONTEXT) ~name ~instance - ~test_number ~libp2p_keypair_str ~initial_peers ~genesis_ledger_hashes = + ~test_number ~libp2p_keypair_str ~initial_peers = let open Context in let frontier_broadcast_pipe_r, frontier_broadcast_pipe_w = Broadcast_pipe.create None @@ -133,6 +161,7 @@ let%test_module "Epoch ledger sync tests" = Block_time.Controller.create @@ Block_time.Controller.basic ~logger in let on_remote_push () = Deferred.unit in + let%bind verifier = make_verifier (module Context) in let block_reader, block_sink = let on_push () = Deferred.unit in Transition_handler.Block_sink.create @@ -175,22 +204,6 @@ let%test_module "Epoch ledger sync tests" = snark_remote_sink in let sinks = (block_sink, tx_remote_sink, snark_remote_sink) in - let genesis_ledger = - lazy - (Mina_ledger.Ledger.create - ~directory_name:(make_dirname "genesis_ledger") - ~depth:precomputed_values.constraint_constants.ledger_depth () ) - in - let genesis_epoch_data : Consensus.Genesis_epoch_data.t = None in - let genesis_state_hash = Quickcheck.random_value Ledger_hash.gen in - let consensus_local_state = - Consensus.Data.Local_state.create - ~context:(module Context) - ~genesis_ledger ~genesis_epoch_data - ~epoch_ledger_location:(make_dirname "epoch_ledger") - ~genesis_state_hash - (Signature_lib.Public_key.Compressed.Set.of_list []) - in let genesis_ledger_hash = Mina_ledger.Ledger.merkle_root (Lazy.force genesis_ledger) in @@ -261,86 +274,53 @@ let%test_module "Epoch ledger sync tests" = } in let config : Mina_networking.Config.t = - { logger - ; trust_system - ; time_controller - ; consensus_constants - ; consensus_local_state - ; genesis_ledger_hash - ; constraint_constants - ; precomputed_values - ; creatable_gossip_net - ; is_seed - ; log_gossip_heard - } + { genesis_ledger_hash; creatable_gossip_net; is_seed; log_gossip_heard } in - let no_answer_ivar = Ivar.create () in - let get_best_tip _ = return None in - let answer_sync_ledger_query query_env = - let ledger_hash, _ = Envelope.Incoming.data query_env in - let%bind.Deferred.Or_error frontier = - Deferred.return @@ peek_frontier frontier_broadcast_pipe_r - in - Sync_handler.answer_query ~frontier ledger_hash - (Envelope.Incoming.map ~f:Tuple2.get2 query_env) - ~logger ~trust_system - |> Deferred.map ~f:(function - | Some answer -> - Ok answer - | None -> - if - List.mem genesis_ledger_hashes ledger_hash - ~equal:Frozen_ledger_hash.equal - then - (* should happen only when trying to sync to genesis ledger *) - Ivar.fill_if_empty no_answer_ivar () ; - Error (Error.of_string "No answer to sync query") ) - in - let unimplemented name _ = failwithf "RPC %s unimplemented" name () in let rpc_error name _ = return @@ Or_error.error_string (sprintf "Error for unimplemented RPC %s" name) in let%bind (mina_networking : Mina_networking.t) = - Mina_networking.create config ~sinks ~answer_sync_ledger_query - ~get_best_tip - ~get_some_initial_peers:(unimplemented "get_some_initial_peers") - ~get_staged_ledger_aux_and_pending_coinbases_at_hash: - (unimplemented "get_staged_ledger_aux_and_pending_coinbases_at_hash") - ~get_ancestry:(unimplemented "get_ancestry") + Mina_networking.create + (module Context) + config ~sinks + ~get_transition_frontier:(fun () -> + Broadcast_pipe.Reader.peek frontier_broadcast_pipe_r ) ~get_node_status:(rpc_error "get_node_status") - ~get_transition_chain_proof: - (unimplemented "get_transition_chain_proof") - ~get_transition_chain:(unimplemented "get_transition_chain") - ~get_transition_knowledge:(unimplemented "get_transition_knowledge") in (* create transition frontier *) let tr_tm0 = Unix.gettimeofday () in let _valid_transitions, initialization_finish_signal = let notify_online () = Deferred.unit in - let most_recent_valid_block = + let most_recent_valid_block_reader, most_recent_valid_block_writer = Broadcast_pipe.create ( Mina_block.genesis ~precomputed_values |> Mina_block.Validation.reset_frontier_dependencies_validation |> Mina_block.Validation.reset_staged_ledger_diff_validation ) in + let get_current_frontier () = + Broadcast_pipe.Reader.peek frontier_broadcast_pipe_r + in + let get_most_recent_valid_block () = + Broadcast_pipe.Reader.peek most_recent_valid_block_reader + in (* we're going to set and sync the epoch ledgers in the test so router should not do a sync *) - Transition_router.run ~sync_local_state:false + Transition_router.run ~sync_local_state:false ~cache_exceptions:true ~context:(module Context) - ~trust_system:config.trust_system ~verifier ~network:mina_networking - ~is_seed:config.is_seed ~is_demo_mode:false - ~time_controller:config.time_controller - ~consensus_local_state:config.consensus_local_state + ~trust_system ~verifier ~network:mina_networking + ~is_seed:config.is_seed ~is_demo_mode:false ~time_controller + ~consensus_local_state ~persistent_root_location:(make_dirname "persistent_root_location") ~persistent_frontier_location: (make_dirname "persistent_frontier_location") - ~frontier_broadcast_pipe: - (frontier_broadcast_pipe_r, frontier_broadcast_pipe_w) + ~get_current_frontier + ~frontier_broadcast_writer:frontier_broadcast_pipe_w ~get_completed_work:(Fn.const None) ~catchup_mode:`Normal ~network_transition_reader:block_reader ~producer_transition_reader - ~most_recent_valid_block ~notify_online () + ~get_most_recent_valid_block ~most_recent_valid_block_writer + ~notify_online () in let%bind () = Ivar.read initialization_finish_signal in let tr_tm1 = Unix.gettimeofday () in @@ -350,19 +330,15 @@ let%test_module "Epoch ledger sync tests" = let peer_id = Mina_net2.Keypair.to_peer_id libp2p_keypair in Peer.create Core.Unix.Inet_addr.localhost ~libp2p_port ~peer_id in - return - { networking = mina_networking - ; network_peer - ; consensus_local_state - ; no_answer_ivar - } + return { networking = mina_networking; network_peer } - let run_test ?(timeout_min = default_timeout_min) (module Context : CONTEXT) - ~name ~staking_epoch_ledger ~next_epoch_ledger ~starting_accounts - ~test_number = + let setup_test ?(timeout_min = default_timeout_min) + (module Context : CONTEXT) ~name ~staking_epoch_ledger + ~next_epoch_ledger ~test_number = let%bind fresh_trust_system = Trust_system.create (make_dirname "trust_system") in + let open Context in let module Context2 = struct include Context @@ -374,25 +350,6 @@ let%test_module "Epoch ledger sync tests" = don't_wait_for (let%map () = after (Time.Span.of_min timeout_min) in if not !test_finished then (cleanup () ; raise Sync_timeout) ) ; - let staking_ledger_root = - Consensus.Data.Local_state.Snapshot.Ledger_snapshot.merkle_root - staking_epoch_ledger - in - let next_epoch_ledger_root = - Consensus.Data.Local_state.Snapshot.Ledger_snapshot.merkle_root - next_epoch_ledger - in - let genesis_ledger_hashes = - match (staking_epoch_ledger, next_epoch_ledger) with - | Genesis_epoch_ledger _, Genesis_epoch_ledger _ -> - [ staking_ledger_root; next_epoch_ledger_root ] - | Genesis_epoch_ledger _, Ledger_db _ -> - [ staking_ledger_root ] - | Ledger_db _, Genesis_epoch_ledger _ -> - [ next_epoch_ledger_root ] - | Ledger_db _, Ledger_db _ -> - [] - in let net_info1_tm0 = Unix.gettimeofday () in let%bind network_info1 = make_mina_network ~name @@ -400,7 +357,7 @@ let%test_module "Epoch ledger sync tests" = ~instance:0 ~test_number ~libp2p_keypair_str: "CAESQFzI5/57gycQ1qumCq00OFo60LArXgbrgV0b5P8tNiSujUZT5Psc+74luHmSSf7kVIZ7w0YObC//UVXPCOgeh4o=,CAESII1GU+T7HPu+Jbh5kkn+5FSGe8NGDmwv/1FVzwjoHoeK,12D3KooWKKqrPfHi4PNkWms5Z9oANjRftE5vueTmkt4rpz9sXM69" - ~initial_peers:[] ~genesis_ledger_hashes + ~initial_peers:[] in let net_info1_tm1 = Unix.gettimeofday () in [%log debug] "(%s) Time to create network 1: %0.02f" name @@ -414,25 +371,33 @@ let%test_module "Epoch ledger sync tests" = next_epoch_ledger in (* store snapshots in local state *) - Consensus.Data.Local_state.For_tests.set_snapshot - network_info1.consensus_local_state Staking_epoch_snapshot - staking_epoch_snapshot ; - Consensus.Data.Local_state.For_tests.set_snapshot - network_info1.consensus_local_state Next_epoch_snapshot - next_epoch_snapshot ; + Consensus.Data.Local_state.For_tests.set_snapshot consensus_local_state + Staking_epoch_snapshot staking_epoch_snapshot ; + Consensus.Data.Local_state.For_tests.set_snapshot consensus_local_state + Next_epoch_snapshot next_epoch_snapshot ; let net_info2_tm0 = Unix.gettimeofday () in - let%bind network_info2 = + let%map network_info2 = make_mina_network ~name ~instance:1 ~test_number ~context:(module Context2) ~libp2p_keypair_str: "CAESQMHCQMQDqPKTFLAjZWwA3vvbkzMJZiVrjvte+bDfUvEeRhjvhsa9IfuFDEmJ721drMJ5cEWAmVmrQYfretz9MUQ=,CAESIEYY74bGvSH7hQxJie9tXazCeXBFgJlZq0GH63rc/TFE,12D3KooWEXzm5pMj1DQqNz6bpMRdJa55bytbawkuHVNhGR3XuTpw" ~initial_peers: [ Mina_net2.Multiaddr.of_peer network_info1.network_peer ] - ~genesis_ledger_hashes in let net_info2_tm1 = Unix.gettimeofday () in [%log debug] "(%s) Time to create network 2: %0.02f" name (net_info2_tm1 -. net_info2_tm0) ; + { name + ; network_info1 + ; network_info2 + ; staking_epoch_ledger + ; next_epoch_ledger + ; cleanup + } + + let both_ledgers_sync_successfully ~starting_accounts + (module Context : CONTEXT) (test : test_state) = + let open Context in let make_sync_ledger () = let db_ledger = make_empty_db_ledger (module Context) in List.iter starting_accounts ~f:(fun (acct : Account.t) -> @@ -451,18 +416,35 @@ let%test_module "Epoch ledger sync tests" = let query_reader = Mina_ledger.Sync_ledger.Db.query_reader sync_ledger in - let response_writer = + let answer_writer = Mina_ledger.Sync_ledger.Db.answer_writer sync_ledger in - Mina_networking.glue_sync_ledger network_info2.networking - ~preferred:[ network_info1.network_peer ] - query_reader response_writer ; + (* + (* setup a proxy response pipe so we can inspect the messages from our test *) + let proxy_answer_reader, proxy_answer_writer = + Linear_pipe.create () + in + don't_wait_for ( + Linear_pipe.Reader.iter proxy_answer_reader ~f:(fun answer -> + if Option.is_none response && is_genesis_state_hash + ( match response with + | None when genesis_state_hash -> + ) + Linear_pipe.write proxy_response_writer response) + *) + Mina_networking.glue_sync_ledger test.network_info2.networking + ~preferred:[ test.network_info1.network_peer ] + query_reader answer_writer ; sync_ledger in - (* should only happen when syncing to a genesis ledger *) - don't_wait_for - (let%bind () = Ivar.read network_info1.no_answer_ivar in - cleanup () ; raise No_sync_answer ) ; + let staking_ledger_root = + Consensus.Data.Local_state.Snapshot.Ledger_snapshot.merkle_root + test.staking_epoch_ledger + in + let next_epoch_ledger_root = + Consensus.Data.Local_state.Snapshot.Ledger_snapshot.merkle_root + test.next_epoch_ledger + in (* sync current staking ledger *) let sync_ledger1_tm0 = Unix.gettimeofday () in let sync_ledger1 = make_sync_ledger () in @@ -473,7 +455,7 @@ let%test_module "Epoch ledger sync tests" = with | `Ok ledger -> let sync_ledger1_tm1 = Unix.gettimeofday () in - [%log debug] "(%s) Time to sync ledger 1: %0.02f" name + [%log debug] "(%s) Time to sync ledger 1: %0.02f" test.name (sync_ledger1_tm1 -. sync_ledger1_tm0) ; let ledger_root = Mina_ledger.Ledger.Db.merkle_root ledger in assert (Ledger_hash.equal ledger_root staking_ledger_root) ; @@ -490,17 +472,45 @@ let%test_module "Epoch ledger sync tests" = with | `Ok ledger -> let sync_ledger2_tm1 = Unix.gettimeofday () in - [%log debug] "(%s) Time to sync ledger 2: %0.02f" name + [%log debug] "(%s) Time to sync ledger 2: %0.02f" test.name (sync_ledger2_tm1 -. sync_ledger2_tm0) ; - cleanup () ; + test.cleanup () ; let ledger_root = Mina_ledger.Ledger.Db.merkle_root ledger in assert (Ledger_hash.equal ledger_root next_epoch_ledger_root) ; [%log debug] "Synced next epoch ledger, sync test succeeded" ; Deferred.unit | `Target_changed _ -> - cleanup () ; + test.cleanup () ; failwith "Target changed when getting next epoch ledger" + let cannot_sync_staking_ledger (test : test_state) = + let staking_ledger_root = + Consensus.Data.Local_state.Snapshot.Ledger_snapshot.merkle_root + test.staking_epoch_ledger + in + let%map response = + Mina_networking.query_peer test.network_info2.networking + test.network_info1.network_peer.peer_id + Mina_networking.Rpcs.Answer_sync_ledger_query + (staking_ledger_root, Num_accounts) + in + match response with + | Connected { data = Ok (Error err); _ } -> + if + not + (String.is_substring (Error.to_string_hum err) + ~substring:"Refusing to answer sync ledger query" ) + then + failwithf "unexpected error returned from sync ledger RPC: %s" + (Error.to_string_hum err) () + | Connected { data = Ok (Ok _); _ } -> + failwith "unexpected successful RPC response" + | Connected { data = Error err; _ } -> + failwithf "unexpected RPC failure: %s" (Error.to_string_hum err) () + | Failed_to_connect err -> + failwithf "unexpected connection failure: %s" + (Error.to_string_hum err) () + let make_genesis_ledger (module Context : CONTEXT) (accounts : Account.t list) = let ledger = make_empty_ledger (module Context) in @@ -541,9 +551,12 @@ let%test_module "Epoch ledger sync tests" = let next_epoch_ledger = make_db_ledger (module Context) (List.take test_accounts 20) in - run_test ~name:"sync to empty ledgers" ~test_number:1 + setup_test ~name:"sync to empty ledgers" ~test_number:1 (module Context) - ~staking_epoch_ledger ~next_epoch_ledger ~starting_accounts:[] ) + ~staking_epoch_ledger ~next_epoch_ledger + >>= both_ledgers_sync_successfully + (module Context) + ~starting_accounts:[] ) let%test_unit "Sync current, next staking ledgers to nonempty ledgers" = Async.Thread_safe.block_on_async_exn (fun () -> @@ -560,9 +573,10 @@ let%test_module "Epoch ledger sync tests" = the ledger to sync to, see issue #12170 *) let starting_accounts = List.take test_accounts 8 in - run_test ~name:"sync to nonempty ledgers" ~test_number:2 + setup_test ~name:"sync to nonempty ledgers" ~test_number:2 (module Context) - ~staking_epoch_ledger ~next_epoch_ledger ~starting_accounts ) + ~staking_epoch_ledger ~next_epoch_ledger + >>= both_ledgers_sync_successfully (module Context) ~starting_accounts ) (* A `fetch` to sync a genesis ledger will just loop, because `get_ledger_by_hash` returns None for genesis ledgers @@ -570,32 +584,18 @@ let%test_module "Epoch ledger sync tests" = In the consensus code, we don't call `fetch` if the requested hash is the genesis ledger hash, so such looping should not occur - In the tests here, we check whether `answer_sync_query` returns None, reflecting - the None returned by `get_ledger_by_hash`, and fill an ivar; if we detect - that has been filled, we raise an exception, No_sync_answer - - That exception should be raised only in the following test + In the tests here, we send a single `Answer_sync_ledger_query` RPC to determine + that the other peer will not serve us a genesis ledger. *) let%test_unit "Sync genesis ledgers to empty ledgers, should fail" = - let f () = - Monitor.try_with ~here:[%here] (fun () -> - let%bind (module Context) = make_context () in - let staking_epoch_ledger = - make_genesis_ledger (module Context) (List.take test_accounts 10) - in - let next_epoch_ledger = staking_epoch_ledger in - run_test ~name:"fail to sync genesis ledgers" ~test_number:3 - (module Context) - ~staking_epoch_ledger ~next_epoch_ledger ~starting_accounts:[] ) - in - match Async.Thread_safe.block_on_async_exn f with - | Ok () -> - failwith "Ledgers synced to a genesis ledger, unexpectedly" - | Error exn -> ( - match Monitor.extract_exn exn with - | No_sync_answer -> - [%log debug] "Did not sync to genesis ledger, sync test succeeded" ; - () - | exn' -> - failwithf "Unexpected exception: %s" (Exn.to_string exn') () ) + Async.Thread_safe.block_on_async_exn (fun () -> + let%bind (module Context) = make_context () in + let staking_epoch_ledger = + make_genesis_ledger (module Context) (List.take test_accounts 10) + in + let next_epoch_ledger = staking_epoch_ledger in + setup_test ~name:"fail to sync genesis ledgers" ~test_number:3 + (module Context) + ~staking_epoch_ledger ~next_epoch_ledger + >>= cannot_sync_staking_ledger ) end ) diff --git a/src/lib/mina_networking/dune b/src/lib/mina_networking/dune index 8857e15962b..38b9efd1775 100644 --- a/src/lib/mina_networking/dune +++ b/src/lib/mina_networking/dune @@ -49,6 +49,8 @@ o1trace ppx_version.runtime bounded_types + sync_handler + transition_chain_prover ) (inline_tests (flags -verbose -show-counts)) (preprocess diff --git a/src/lib/mina_networking/mina_networking.ml b/src/lib/mina_networking/mina_networking.ml index cbb89e762b0..15dbc9ac89b 100644 --- a/src/lib/mina_networking/mina_networking.ml +++ b/src/lib/mina_networking/mina_networking.ml @@ -1,14 +1,12 @@ open Core open Async open Mina_base +open Mina_stdlib module Sync_ledger = Mina_ledger.Sync_ledger -open Mina_block open Network_peer open Network_pool open Pipe_lib -let refused_answer_query_string = "Refused to answer_query" - exception No_initial_peers type Structured_log_events.t += @@ -30,955 +28,24 @@ type Structured_log_events.t += [@@deriving register_event { msg = "Broadcasting snark pool diff over gossip net" }] -(* INSTRUCTIONS FOR ADDING A NEW RPC: - * - define a new module under the Rpcs module - * - add an entry to the Rpcs.rpc GADT definition for the new module (type ('query, 'response) rpc, below) - * - add the new constructor for Rpcs.rpc to Rpcs.all_of_type_erased_rpc - * - add a pattern matching case to Rpcs.implementation_of_rpc mapping the - * new constructor to the new module for your RPC - * - add a match case to `match_handler`, below - *) -module Rpcs = struct - (* for versioning of the types here, see - - RFC 0012, and - - https://ocaml.janestreet.com/ocaml-core/latest/doc/async_rpc_kernel/Async_rpc_kernel/Versioned_rpc/ - - The "master" types are the ones used internally in the code base. Each - version has coercions between their query and response types and the master - types. - *) - - [%%versioned_rpc - module Get_some_initial_peers = struct - module Master = struct - let name = "get_some_initial_peers" - - module T = struct - type query = unit [@@deriving sexp, yojson] - - type response = Network_peer.Peer.t list [@@deriving sexp, yojson] - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = Mina_metrics.Network.get_some_initial_peers_rpcs_sent - - let received_counter = - Mina_metrics.Network.get_some_initial_peers_rpcs_received - - let failed_request_counter = - Mina_metrics.Network.get_some_initial_peers_rpc_requests_failed - - let failed_response_counter = - Mina_metrics.Network.get_some_initial_peers_rpc_responses_failed - - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M - - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) - - module V1 = struct - module T = struct - type query = unit - - type response = Network_peer.Peer.Stable.V1.t list - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = Fn.id - - let caller_model_of_response = Fn.id - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - [%%versioned_rpc - module Get_staged_ledger_aux_and_pending_coinbases_at_hash = struct - module Master = struct - let name = "get_staged_ledger_aux_and_pending_coinbases_at_hash" - - module T = struct - type query = State_hash.t - - type response = - ( Staged_ledger.Scan_state.t - * Ledger_hash.t - * Pending_coinbase.t - * Mina_state.Protocol_state.value list ) - option - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = - Mina_metrics.Network - .get_staged_ledger_aux_and_pending_coinbases_at_hash_rpcs_sent - - let received_counter = - Mina_metrics.Network - .get_staged_ledger_aux_and_pending_coinbases_at_hash_rpcs_received - - let failed_request_counter = - Mina_metrics.Network - .get_staged_ledger_aux_and_pending_coinbases_at_hash_rpc_requests_failed - - let failed_response_counter = - Mina_metrics.Network - .get_staged_ledger_aux_and_pending_coinbases_at_hash_rpc_responses_failed - - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M - - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) - - module V2 = struct - module T = struct - type query = State_hash.Stable.V1.t - - type response = - ( Staged_ledger.Scan_state.Stable.V2.t - * Ledger_hash.Stable.V1.t - * Pending_coinbase.Stable.V2.t - * Mina_state.Protocol_state.Value.Stable.V2.t list ) - option - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = Fn.id - - let caller_model_of_response = Fn.id - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - [%%versioned_rpc - module Answer_sync_ledger_query = struct - module Master = struct - let name = "answer_sync_ledger_query" - - module T = struct - type query = Ledger_hash.t * Sync_ledger.Query.t - - type response = - (( Sync_ledger.Answer.t - , Bounded_types.Wrapped_error.Stable.V1.t ) - Result.t - [@version_asserted] ) - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = Mina_metrics.Network.answer_sync_ledger_query_rpcs_sent - - let received_counter = - Mina_metrics.Network.answer_sync_ledger_query_rpcs_received - - let failed_request_counter = - Mina_metrics.Network.answer_sync_ledger_query_rpc_requests_failed - - let failed_response_counter = - Mina_metrics.Network.answer_sync_ledger_query_rpc_responses_failed - - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M - - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) - - module V3 = struct - module T = struct - type query = Ledger_hash.Stable.V1.t * Sync_ledger.Query.Stable.V1.t - [@@deriving sexp] - - type response = - (( Sync_ledger.Answer.Stable.V2.t - , Bounded_types.Wrapped_error.Stable.V1.t ) - Result.t - [@version_asserted] ) - [@@deriving sexp] - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = Fn.id - - let caller_model_of_response = Fn.id - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - [%%versioned_rpc - module Get_transition_chain = struct - module Master = struct - let name = "get_transition_chain" - - module T = struct - type query = State_hash.t list [@@deriving sexp, to_yojson] - - type response = Mina_block.t list option - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = Mina_metrics.Network.get_transition_chain_rpcs_sent - - let received_counter = - Mina_metrics.Network.get_transition_chain_rpcs_received - - let failed_request_counter = - Mina_metrics.Network.get_transition_chain_rpc_requests_failed - - let failed_response_counter = - Mina_metrics.Network.get_transition_chain_rpc_responses_failed - - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M - - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) - - module V2 = struct - module T = struct - type query = State_hash.Stable.V1.t list [@@deriving sexp] - - type response = Mina_block.Stable.V2.t list option - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = ident - - let caller_model_of_response = ident - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - [%%versioned_rpc - module Get_transition_chain_proof = struct - module Master = struct - let name = "get_transition_chain_proof" - - module T = struct - type query = State_hash.t [@@deriving sexp, to_yojson] - - type response = (State_hash.t * State_body_hash.t list) option - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = Mina_metrics.Network.get_transition_chain_proof_rpcs_sent - - let received_counter = - Mina_metrics.Network.get_transition_chain_proof_rpcs_received - - let failed_request_counter = - Mina_metrics.Network.get_transition_chain_proof_rpc_requests_failed - - let failed_response_counter = - Mina_metrics.Network.get_transition_chain_proof_rpc_responses_failed - - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M - - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) - - module V1 = struct - module T = struct - type query = State_hash.Stable.V1.t [@@deriving sexp] - - type response = - (State_hash.Stable.V1.t * State_body_hash.Stable.V1.t list) option - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = Fn.id - - let caller_model_of_response = Fn.id - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - [%%versioned_rpc - module Get_transition_knowledge = struct - module Master = struct - let name = "Get_transition_knowledge" - - module T = struct - type query = unit [@@deriving sexp, to_yojson] - - type response = State_hash.t list - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = Mina_metrics.Network.get_transition_knowledge_rpcs_sent - - let received_counter = - Mina_metrics.Network.get_transition_knowledge_rpcs_received - - let failed_request_counter = - Mina_metrics.Network.get_transition_knowledge_rpc_requests_failed - - let failed_response_counter = - Mina_metrics.Network.get_transition_knowledge_rpc_responses_failed - - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M - - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) - - module V1 = struct - module T = struct - type query = unit [@@deriving sexp] - - type response = State_hash.Stable.V1.t list - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = Fn.id - - let caller_model_of_response = Fn.id - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - [%%versioned_rpc - module Get_ancestry = struct - module Master = struct - let name = "get_ancestry" - - module T = struct - (** NB: The state hash sent in this query should not be trusted, as it can be forged. This is ok for how this RPC is implented, as we only use the state hash for tie breaking when checking whether or not the proof is worth serving. *) - type query = - (Consensus.Data.Consensus_state.Value.t, State_hash.t) With_hash.t - [@@deriving sexp, to_yojson] - - type response = - ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) - Proof_carrying_data.t - option - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = Mina_metrics.Network.get_ancestry_rpcs_sent - - let received_counter = Mina_metrics.Network.get_ancestry_rpcs_received +module type CONTEXT = sig + val logger : Logger.t - let failed_request_counter = - Mina_metrics.Network.get_ancestry_rpc_requests_failed + val trust_system : Trust_system.t - let failed_response_counter = - Mina_metrics.Network.get_ancestry_rpc_responses_failed + val time_controller : Block_time.Controller.t - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M + val consensus_local_state : Consensus.Data.Local_state.t - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) + val precomputed_values : Precomputed_values.t - module V2 = struct - module T = struct - type query = - ( Consensus.Data.Consensus_state.Value.Stable.V2.t - , State_hash.Stable.V1.t ) - With_hash.Stable.V1.t - [@@deriving sexp] + val constraint_constants : Genesis_constants.Constraint_constants.t - type response = - ( Mina_block.Stable.V2.t - , State_body_hash.Stable.V1.t list * Mina_block.Stable.V2.t ) - Proof_carrying_data.Stable.V1.t - option - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = ident - - let caller_model_of_response = ident - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - [%%versioned_rpc - module Ban_notify = struct - module Master = struct - let name = "ban_notify" - - module T = struct - (* banned until this time *) - type query = Core.Time.t [@@deriving sexp] - - type response = unit - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = Mina_metrics.Network.ban_notify_rpcs_sent - - let received_counter = Mina_metrics.Network.ban_notify_rpcs_received - - let failed_request_counter = - Mina_metrics.Network.ban_notify_rpc_requests_failed - - let failed_response_counter = - Mina_metrics.Network.ban_notify_rpc_responses_failed - - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M - - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) - - module V1 = struct - module T = struct - type query = Core.Time.Stable.V1.t [@@deriving sexp] - - type response = unit - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = Fn.id - - let caller_model_of_response = Fn.id - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - [%%versioned_rpc - module Get_best_tip = struct - module Master = struct - let name = "get_best_tip" - - module T = struct - type query = unit [@@deriving sexp, to_yojson] - - type response = - ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) - Proof_carrying_data.t - option - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = Mina_metrics.Network.get_best_tip_rpcs_sent - - let received_counter = Mina_metrics.Network.get_best_tip_rpcs_received - - let failed_request_counter = - Mina_metrics.Network.get_best_tip_rpc_requests_failed - - let failed_response_counter = - Mina_metrics.Network.get_best_tip_rpc_responses_failed - - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M - - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) - - module V2 = struct - module T = struct - type query = unit [@@deriving sexp] - - type response = - ( Mina_block.Stable.V2.t - , State_body_hash.Stable.V1.t list * Mina_block.Stable.V2.t ) - Proof_carrying_data.Stable.V1.t - option - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = ident - - let caller_model_of_response = ident - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - [%%versioned_rpc - module Get_node_status = struct - module Node_status = struct - [%%versioned - module Stable = struct - module V2 = struct - type t = - { node_ip_addr : Network_peer.Peer.Inet_addr.Stable.V1.t - ; node_peer_id : Network_peer.Peer.Id.Stable.V1.t - [@to_yojson fun peer_id -> `String peer_id] - [@of_yojson - function `String s -> Ok s | _ -> Error "expected string"] - ; sync_status : Sync_status.Stable.V1.t - ; peers : Network_peer.Peer.Stable.V1.t list - ; block_producers : - Signature_lib.Public_key.Compressed.Stable.V1.t list - ; protocol_state_hash : State_hash.Stable.V1.t - ; ban_statuses : - ( Network_peer.Peer.Stable.V1.t - * Trust_system.Peer_status.Stable.V1.t ) - list - ; k_block_hashes_and_timestamps : - (State_hash.Stable.V1.t * Bounded_types.String.Stable.V1.t) list - ; git_commit : Bounded_types.String.Stable.V1.t - ; uptime_minutes : int - ; block_height_opt : int option [@default None] - } - [@@deriving to_yojson, of_yojson] - - let to_latest = Fn.id - end - - module V1 = struct - type t = - { node_ip_addr : Network_peer.Peer.Inet_addr.Stable.V1.t - ; node_peer_id : Network_peer.Peer.Id.Stable.V1.t - [@to_yojson fun peer_id -> `String peer_id] - [@of_yojson - function `String s -> Ok s | _ -> Error "expected string"] - ; sync_status : Sync_status.Stable.V1.t - ; peers : Network_peer.Peer.Stable.V1.t list - ; block_producers : - Signature_lib.Public_key.Compressed.Stable.V1.t list - ; protocol_state_hash : State_hash.Stable.V1.t - ; ban_statuses : - ( Network_peer.Peer.Stable.V1.t - * Trust_system.Peer_status.Stable.V1.t ) - list - ; k_block_hashes_and_timestamps : - (State_hash.Stable.V1.t * Bounded_types.String.Stable.V1.t) list - ; git_commit : Bounded_types.String.Stable.V1.t - ; uptime_minutes : int - } - [@@deriving to_yojson, of_yojson] - - let to_latest status : Latest.t = - { node_ip_addr = status.node_ip_addr - ; node_peer_id = status.node_peer_id - ; sync_status = status.sync_status - ; peers = status.peers - ; block_producers = status.block_producers - ; protocol_state_hash = status.protocol_state_hash - ; ban_statuses = status.ban_statuses - ; k_block_hashes_and_timestamps = - status.k_block_hashes_and_timestamps - ; git_commit = status.git_commit - ; uptime_minutes = status.uptime_minutes - ; block_height_opt = None - } - end - end] - end - - module Master = struct - let name = "get_node_status" - - module T = struct - type query = unit [@@deriving sexp, to_yojson] - - type response = - (Node_status.t, Bounded_types.Wrapped_error.Stable.V1.t) result - end - - module Caller = T - module Callee = T - end - - include Master.T - - let sent_counter = Mina_metrics.Network.get_node_status_rpcs_sent - - let received_counter = Mina_metrics.Network.get_node_status_rpcs_received - - let failed_request_counter = - Mina_metrics.Network.get_node_status_rpc_requests_failed - - let failed_response_counter = - Mina_metrics.Network.get_node_status_rpc_responses_failed - - module M = Versioned_rpc.Both_convert.Plain.Make (Master) - include M - - let response_to_yojson response = - match response with - | Ok status -> - Node_status.Stable.Latest.to_yojson status - | Error err -> - `Assoc [ ("error", Error_json.error_to_yojson err) ] - - include Perf_histograms.Rpc.Plain.Extend (struct - include M - include Master - end) - - module V2 = struct - module T = struct - type query = unit [@@deriving sexp] - - type response = - (( Node_status.Stable.V2.t - , Bounded_types.Wrapped_error.Stable.V1.t ) - Result.t - [@version_asserted] ) - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = Fn.id - - let caller_model_of_response = Fn.id - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - - module V1 = struct - module T = struct - type query = unit [@@deriving sexp] - - type response = - (( Node_status.Stable.V1.t - , Bounded_types.Wrapped_error.Stable.V1.t ) - Core_kernel.Result.t - [@version_asserted] ) - - let query_of_caller_model = Fn.id - - let callee_model_of_query = Fn.id - - let response_of_callee_model = function - | Error err -> - Error err - | Ok (status : Node_status.Stable.Latest.t) -> - Ok - { Node_status.Stable.V1.node_ip_addr = status.node_ip_addr - ; node_peer_id = status.node_peer_id - ; sync_status = status.sync_status - ; peers = status.peers - ; block_producers = status.block_producers - ; protocol_state_hash = status.protocol_state_hash - ; ban_statuses = status.ban_statuses - ; k_block_hashes_and_timestamps = - status.k_block_hashes_and_timestamps - ; git_commit = status.git_commit - ; uptime_minutes = status.uptime_minutes - } - - let caller_model_of_response = function - | Error err -> - Error err - | Ok (status : Node_status.Stable.V1.t) -> - Ok (Node_status.Stable.V1.to_latest status) - end - - module T' = - Perf_histograms.Rpc.Plain.Decorate_bin_io - (struct - include M - include Master - end) - (T) - - include T' - include Register (T') - end - end] - - type ('query, 'response) rpc = - | Get_some_initial_peers - : (Get_some_initial_peers.query, Get_some_initial_peers.response) rpc - | Get_staged_ledger_aux_and_pending_coinbases_at_hash - : ( Get_staged_ledger_aux_and_pending_coinbases_at_hash.query - , Get_staged_ledger_aux_and_pending_coinbases_at_hash.response ) - rpc - | Answer_sync_ledger_query - : ( Answer_sync_ledger_query.query - , Answer_sync_ledger_query.response ) - rpc - | Get_transition_chain - : (Get_transition_chain.query, Get_transition_chain.response) rpc - | Get_transition_knowledge - : ( Get_transition_knowledge.query - , Get_transition_knowledge.response ) - rpc - | Get_transition_chain_proof - : ( Get_transition_chain_proof.query - , Get_transition_chain_proof.response ) - rpc - | Get_node_status : (Get_node_status.query, Get_node_status.response) rpc - | Get_ancestry : (Get_ancestry.query, Get_ancestry.response) rpc - | Ban_notify : (Ban_notify.query, Ban_notify.response) rpc - | Get_best_tip : (Get_best_tip.query, Get_best_tip.response) rpc - - type rpc_handler = - | Rpc_handler : - { rpc : ('q, 'r) rpc - ; f : ('q, 'r) Rpc_intf.rpc_fn - ; cost : 'q -> int - ; budget : int * [ `Per of Time.Span.t ] - } - -> rpc_handler - - let implementation_of_rpc : - type q r. (q, r) rpc -> (q, r) Rpc_intf.rpc_implementation = function - | Get_some_initial_peers -> - (module Get_some_initial_peers) - | Get_staged_ledger_aux_and_pending_coinbases_at_hash -> - (module Get_staged_ledger_aux_and_pending_coinbases_at_hash) - | Answer_sync_ledger_query -> - (module Answer_sync_ledger_query) - | Get_transition_chain -> - (module Get_transition_chain) - | Get_transition_knowledge -> - (module Get_transition_knowledge) - | Get_transition_chain_proof -> - (module Get_transition_chain_proof) - | Get_node_status -> - (module Get_node_status) - | Get_ancestry -> - (module Get_ancestry) - | Ban_notify -> - (module Ban_notify) - | Get_best_tip -> - (module Get_best_tip) - - let match_handler : - type q r. - rpc_handler - -> (q, r) rpc - -> do_:((q, r) Rpc_intf.rpc_fn -> 'a) - -> 'a option = - fun (Rpc_handler { rpc = impl_rpc; f; cost = _; budget = _ }) rpc ~do_ -> - match (rpc, impl_rpc) with - | Get_some_initial_peers, Get_some_initial_peers -> - Some (do_ f) - | Get_some_initial_peers, _ -> - None - | ( Get_staged_ledger_aux_and_pending_coinbases_at_hash - , Get_staged_ledger_aux_and_pending_coinbases_at_hash ) -> - Some (do_ f) - | Get_staged_ledger_aux_and_pending_coinbases_at_hash, _ -> - None - | Answer_sync_ledger_query, Answer_sync_ledger_query -> - Some (do_ f) - | Answer_sync_ledger_query, _ -> - None - | Get_transition_chain, Get_transition_chain -> - Some (do_ f) - | Get_transition_chain, _ -> - None - | Get_transition_knowledge, Get_transition_knowledge -> - Some (do_ f) - | Get_transition_knowledge, _ -> - None - | Get_transition_chain_proof, Get_transition_chain_proof -> - Some (do_ f) - | Get_transition_chain_proof, _ -> - None - | Get_node_status, Get_node_status -> - Some (do_ f) - | Get_node_status, _ -> - None - | Get_ancestry, Get_ancestry -> - Some (do_ f) - | Get_ancestry, _ -> - None - | Ban_notify, Ban_notify -> - Some (do_ f) - | Ban_notify, _ -> - None - | Get_best_tip, Get_best_tip -> - Some (do_ f) - | Get_best_tip, _ -> - None + val consensus_constants : Consensus.Constants.t end +module Node_status = Node_status +module Rpcs = Rpcs module Sinks = Sinks module Gossip_net = Gossip_net.Make (Rpcs) @@ -988,14 +55,7 @@ module Config = struct [@@deriving make] type t = - { logger : Logger.t - ; trust_system : Trust_system.t - ; time_controller : Block_time.Controller.t - ; consensus_constants : Consensus.Constants.t - ; consensus_local_state : Consensus.Data.Local_state.t - ; genesis_ledger_hash : Ledger_hash.t - ; constraint_constants : Genesis_constants.Constraint_constants.t - ; precomputed_values : Precomputed_values.t + { genesis_ledger_hash : Ledger_hash.t ; creatable_gossip_net : Gossip_net.Any.creatable ; is_seed : bool ; log_gossip_heard : log_gossip_heard @@ -1010,399 +70,43 @@ type t = } [@@deriving fields] -let wrap_rpc_data_in_envelope conn data = - Envelope.Incoming.wrap_peer ~data ~sender:conn - -type protocol_version_status = - { valid_current : bool; valid_next : bool; matches_daemon : bool } - -let protocol_version_status t = - let header = Mina_block.header t in - let valid_current = - Protocol_version.is_valid (Header.current_protocol_version header) - in - let valid_next = - Option.for_all - (Header.proposed_protocol_version_opt header) - ~f:Protocol_version.is_valid - in - let matches_daemon = - Protocol_version.compatible_with_daemon - (Header.current_protocol_version header) - in - { valid_current; valid_next; matches_daemon } - -let create (config : Config.t) ~sinks - ~(get_some_initial_peers : - Rpcs.Get_some_initial_peers.query Envelope.Incoming.t - -> Rpcs.Get_some_initial_peers.response Deferred.t ) - ~(get_staged_ledger_aux_and_pending_coinbases_at_hash : - Rpcs.Get_staged_ledger_aux_and_pending_coinbases_at_hash.query - Envelope.Incoming.t - -> Rpcs.Get_staged_ledger_aux_and_pending_coinbases_at_hash.response - Deferred.t ) - ~(answer_sync_ledger_query : - Rpcs.Answer_sync_ledger_query.query Envelope.Incoming.t - -> Rpcs.Answer_sync_ledger_query.response Deferred.t ) - ~(get_ancestry : - Rpcs.Get_ancestry.query Envelope.Incoming.t - -> Rpcs.Get_ancestry.response Deferred.t ) - ~(get_best_tip : - Rpcs.Get_best_tip.query Envelope.Incoming.t - -> Rpcs.Get_best_tip.response Deferred.t ) - ~(get_node_status : - Rpcs.Get_node_status.query Envelope.Incoming.t - -> Rpcs.Get_node_status.response Deferred.t ) - ~(get_transition_chain_proof : - Rpcs.Get_transition_chain_proof.query Envelope.Incoming.t - -> Rpcs.Get_transition_chain_proof.response Deferred.t ) - ~(get_transition_chain : - Rpcs.Get_transition_chain.query Envelope.Incoming.t - -> Rpcs.Get_transition_chain.response Deferred.t ) - ~(get_transition_knowledge : - Rpcs.Get_transition_knowledge.query Envelope.Incoming.t - -> Rpcs.Get_transition_knowledge.response Deferred.t ) = - let module Context = struct - let logger = config.logger - end in +let create (module Context : CONTEXT) (config : Config.t) ~sinks + ~(get_transition_frontier : unit -> Transition_frontier.t option) + ~(get_node_status : unit -> Node_status.t Deferred.Or_error.t) = let open Context in - let run_for_rpc_result conn data ~f action_msg msg_args = - let data_in_envelope = wrap_rpc_data_in_envelope conn data in - let sender = Envelope.Incoming.sender data_in_envelope in - let%bind () = - Trust_system.( - record_envelope_sender config.trust_system config.logger sender - Actions.(Made_request, Some (action_msg, msg_args))) - in - let%bind result = f data_in_envelope in - return (result, sender) - in - let incr_failed_response = Mina_metrics.Counter.inc_one in - let record_unknown_item result sender action_msg msg_args - failed_response_counter = - let%map () = - if Option.is_none result then ( - incr_failed_response failed_response_counter ; - Trust_system.( - record_envelope_sender config.trust_system config.logger sender - Actions.(Requested_unknown_item, Some (action_msg, msg_args))) ) - else return () - in - result - in - let validate_protocol_versions ~rpc_name sender external_transition = - let open Trust_system.Actions in - let { valid_current; valid_next; matches_daemon } = - protocol_version_status external_transition - in - let%bind () = - if valid_current then return () - else - let actions = - ( Sent_invalid_protocol_version - , Some - ( "$rpc_name: external transition with invalid current protocol \ - version" - , [ ("rpc_name", `String rpc_name) - ; ( "current_protocol_version" - , `String - (Protocol_version.to_string - (Header.current_protocol_version - (Mina_block.header external_transition) ) ) ) - ] ) ) - in - Trust_system.record_envelope_sender config.trust_system config.logger - sender actions - in - let%bind () = - if valid_next then return () - else - let actions = - ( Sent_invalid_protocol_version - , Some - ( "$rpc_name: external transition with invalid proposed protocol \ - version" - , [ ("rpc_name", `String rpc_name) - ; ( "proposed_protocol_version" - , `String - (Protocol_version.to_string - (Option.value_exn - (Header.proposed_protocol_version_opt - (Mina_block.header external_transition) ) ) ) ) - ] ) ) - in - Trust_system.record_envelope_sender config.trust_system config.logger - sender actions - in - let%map () = - if matches_daemon then return () - else - let actions = - ( Sent_mismatched_protocol_version - , Some - ( "$rpc_name: current protocol version in external transition \ - does not match daemon current protocol version" - , [ ("rpc_name", `String rpc_name) - ; ( "current_protocol_version" - , `String - (Protocol_version.to_string - (Header.current_protocol_version - (Mina_block.header external_transition) ) ) ) - ; ( "daemon_current_protocol_version" - , `String Protocol_version.(to_string current) ) - ] ) ) - in - Trust_system.record_envelope_sender config.trust_system config.logger - sender actions - in - valid_current && valid_next && matches_daemon - in - (* each of the passed-in procedures expects an enveloped input, so - we wrap the data received via RPC *) - let get_staged_ledger_aux_and_pending_coinbases_at_hash_rpc conn ~version:_ - hash = - let action_msg = "Staged ledger and pending coinbases at hash: $hash" in - let msg_args = [ ("hash", State_hash.to_yojson hash) ] in - let%bind result, sender = - run_for_rpc_result conn hash - ~f:get_staged_ledger_aux_and_pending_coinbases_at_hash action_msg - msg_args - in - record_unknown_item result sender action_msg msg_args - Rpcs.Get_staged_ledger_aux_and_pending_coinbases_at_hash - .failed_response_counter - in - let answer_sync_ledger_query_rpc conn ~version:_ ((hash, query) as sync_query) - = - let%bind result, sender = - run_for_rpc_result conn sync_query ~f:answer_sync_ledger_query - "Answer_sync_ledger_query: $query" - [ ("query", Sync_ledger.Query.to_yojson query) ] - in - let%bind () = - match result with - | Ok _ -> - return () - | Error err -> - (* N.B.: to_string_mach double-quotes the string, don't want that *) - incr_failed_response - Rpcs.Answer_sync_ledger_query.failed_response_counter ; - let err_msg = Error.to_string_hum err in - if String.is_prefix err_msg ~prefix:refused_answer_query_string then - Trust_system.( - record_envelope_sender config.trust_system config.logger sender - Actions. - ( Requested_unknown_item - , Some - ( "Sync ledger query with hash: $hash, query: $query, \ - with error: $error" - , [ ("hash", Ledger_hash.to_yojson hash) - ; ( "query" - , Syncable_ledger.Query.to_yojson - Mina_ledger.Ledger.Addr.to_yojson query ) - ; ("error", Error_json.error_to_yojson err) - ] ) )) - else return () - in - return result - in - let md p = [ ("peer", Peer.to_yojson p) ] in - let get_ancestry_rpc conn ~version:_ query = - [%log debug] "Sending root proof to $peer" ~metadata:(md conn) ; - let action_msg = "Get_ancestry query: $query" in - let msg_args = [ ("query", Rpcs.Get_ancestry.query_to_yojson query) ] in - let%bind result, sender = - run_for_rpc_result conn query ~f:get_ancestry action_msg msg_args - in - match result with - | None -> - record_unknown_item result sender action_msg msg_args - Rpcs.Get_ancestry.failed_response_counter - | Some { proof = _, ext_trans; _ } -> - let%map valid_protocol_versions = - validate_protocol_versions ~rpc_name:"Get_ancestry" sender ext_trans - in - if valid_protocol_versions then result else None - in - let get_some_initial_peers_rpc (conn : Peer.t) ~version:_ () = - [%log trace] "Sending some initial peers to $peer" ~metadata:(md conn) ; - let action_msg = "Get_some_initial_peers query: $query" in - let msg_args = [ ("query", `Assoc []) ] in - let%map result, _sender = - run_for_rpc_result conn () ~f:get_some_initial_peers action_msg msg_args - in - if List.is_empty result then - incr_failed_response Rpcs.Get_some_initial_peers.failed_response_counter ; - result - in - let get_best_tip_rpc conn ~version:_ () = - [%log debug] "Sending best_tip to $peer" ~metadata:(md conn) ; - let action_msg = "Get_best_tip. query: $query" in - let msg_args = [ ("query", Rpcs.Get_best_tip.query_to_yojson ()) ] in - let%bind result, sender = - run_for_rpc_result conn () ~f:get_best_tip action_msg msg_args - in - match result with - | None -> - record_unknown_item result sender action_msg msg_args - Rpcs.Get_best_tip.failed_response_counter - | Some { data = data_ext_trans; proof = _, proof_ext_trans } -> - let%bind valid_data_protocol_versions = - validate_protocol_versions ~rpc_name:"Get_best_tip (data)" sender - data_ext_trans - in - let%map valid_proof_protocol_versions = - validate_protocol_versions ~rpc_name:"Get_best_tip (proof)" sender - proof_ext_trans - in - if valid_data_protocol_versions && valid_proof_protocol_versions then - result - else None - in - let get_transition_chain_proof_rpc conn ~version:_ query = - [%log info] "Sending transition_chain_proof to $peer" ~metadata:(md conn) ; - let action_msg = "Get_transition_chain_proof query: $query" in - let msg_args = - [ ("query", Rpcs.Get_transition_chain_proof.query_to_yojson query) ] - in - let%bind result, sender = - run_for_rpc_result conn query ~f:get_transition_chain_proof action_msg - msg_args - in - record_unknown_item result sender action_msg msg_args - Rpcs.Get_transition_chain_proof.failed_response_counter - in - let get_transition_knowledge_rpc conn ~version:_ query = - [%log info] "Sending transition_knowledge to $peer" ~metadata:(md conn) ; - let action_msg = "Get_transition_knowledge query: $query" in - let msg_args = - [ ("query", Rpcs.Get_transition_knowledge.query_to_yojson query) ] - in - let%map result = - run_for_rpc_result conn query ~f:get_transition_knowledge action_msg - msg_args - >>| fst - in - if List.is_empty result then - incr_failed_response Rpcs.Get_transition_knowledge.failed_response_counter ; - result - in - let get_transition_chain_rpc conn ~version:_ query = - [%log info] "Sending transition_chain to $peer" ~metadata:(md conn) ; - let action_msg = "Get_transition_chain query: $query" in - let msg_args = - [ ("query", Rpcs.Get_transition_chain.query_to_yojson query) ] - in - let%bind result, sender = - run_for_rpc_result conn query ~f:get_transition_chain action_msg msg_args - in - match result with - | None -> - record_unknown_item result sender action_msg msg_args - Rpcs.Get_transition_chain.failed_response_counter - | Some ext_trans -> - let%map valid_protocol_versions = - Deferred.List.map ext_trans - ~f: - (validate_protocol_versions ~rpc_name:"Get_transition_chain" - sender ) - in - if List.for_all valid_protocol_versions ~f:(Bool.equal true) then result - else None - in - let ban_notify_rpc conn ~version:_ ban_until = - (* the port in `conn' is an ephemeral port, not of interest *) - [%log warn] "Node banned by peer $peer until $ban_until" - ~metadata: - [ ("peer", Peer.to_yojson conn) - ; ( "ban_until" - , `String (Time.to_string_abs ~zone:Time.Zone.utc ban_until) ) - ] ; - (* no computation to do; we're just getting notification *) - Deferred.unit - in - let rpc_handlers = - let open Rpcs in - let open Time.Span in - let unit _ = 1 in - [ Rpc_handler - { rpc = Get_some_initial_peers - ; f = get_some_initial_peers_rpc - ; budget = (1, `Per minute) - ; cost = unit - } - ; Rpc_handler - { rpc = Get_staged_ledger_aux_and_pending_coinbases_at_hash - ; f = get_staged_ledger_aux_and_pending_coinbases_at_hash_rpc - ; budget = (4, `Per minute) - ; cost = unit - } - ; Rpc_handler - { rpc = Answer_sync_ledger_query - ; f = answer_sync_ledger_query_rpc - ; budget = - (Int.pow 2 17, `Per minute) (* Not that confident about this one. *) - ; cost = unit - } - ; Rpc_handler - { rpc = Get_best_tip - ; f = get_best_tip_rpc - ; budget = (3, `Per minute) - ; cost = unit - } - ; Rpc_handler - { rpc = Get_ancestry - ; f = get_ancestry_rpc - ; budget = (5, `Per minute) - ; cost = unit - } - ; Rpc_handler - { rpc = Get_transition_knowledge - ; f = get_transition_knowledge_rpc - ; budget = (1, `Per minute) - ; cost = unit - } - ; Rpc_handler - { rpc = Get_transition_chain - ; f = get_transition_chain_rpc - ; budget = (1, `Per second) (* Not that confident about this one. *) - ; cost = (fun x -> Int.max 1 (List.length x)) - } - ; Rpc_handler - { rpc = Get_transition_chain_proof - ; f = get_transition_chain_proof_rpc - ; budget = (3, `Per minute) - ; cost = unit - } - ; Rpc_handler - { rpc = Ban_notify - ; f = ban_notify_rpc - ; budget = (1, `Per minute) - ; cost = unit - } - ] - in + let gossip_net_ref = ref None in + let module Rpc_context = struct + include Context + + let list_peers () = + match !gossip_net_ref with + | None -> + (* should be unreachable; without a network, we wouldn't receive this RPC call *) + [%log error] "Network not instantiated when initial peers requested" ; + return [] + | Some gossip_net -> + Gossip_net.Any.peers gossip_net + + let get_transition_frontier = get_transition_frontier + end in let%map gossip_net = O1trace.thread "gossip_net" (fun () -> - Gossip_net.Any.create config.creatable_gossip_net rpc_handlers + Gossip_net.Any.create config.creatable_gossip_net + (module Rpc_context) (Gossip_net.Message.Any_sinks ((module Sinks), sinks)) ) in + gossip_net_ref := Some gossip_net ; (* The node status RPC is implemented directly in go, serving a string which is periodically updated. This is so that one can make this RPC on a node even if that node is at its connection limit. *) - let fake_time = Time.now () in Clock.every' (Time.Span.of_min 1.) (fun () -> O1trace.thread "update_node_status" (fun () -> - match%bind - get_node_status - { data = (); sender = Local; received_at = fake_time } - with + match%bind get_node_status () with | Error _ -> Deferred.unit | Ok data -> Gossip_net.Any.set_node_status gossip_net - ( Rpcs.Get_node_status.Node_status.to_yojson data - |> Yojson.Safe.to_string ) + (Node_status.to_yojson data |> Yojson.Safe.to_string) >>| ignore ) ) ; don't_wait_for (Gossip_net.Any.on_first_connect gossip_net ~f:(fun () -> @@ -1419,7 +123,7 @@ let create (config : Config.t) ~sinks For example, some things you really want to not drop (like your outgoing block announcment). *) - { gossip_net; logger = config.logger; trust_system = config.trust_system } + { gossip_net; logger; trust_system } (* lift and expose select gossip net functions *) include struct @@ -1435,9 +139,7 @@ include struct let open Deferred.Or_error.Let_syntax in let%bind s = get_peer_node_status t.gossip_net peer in Or_error.try_with (fun () -> - match - Rpcs.Get_node_status.Node_status.of_yojson (Yojson.Safe.from_string s) - with + match Node_status.of_yojson (Yojson.Safe.from_string s) with | Ok x -> x | Error e -> @@ -1471,6 +173,22 @@ include struct lift (set_connection_gating ?clean_added_peers) t config end +let get_node_status_from_peers (t : t) + (addrs : Mina_net2.Multiaddr.t list option) = + let run = Deferred.List.map ~how:`Parallel ~f:(get_peer_node_status t) in + match addrs with + | None -> + peers t >>= run + | Some addrs -> ( + match Option.all (List.map ~f:Mina_net2.Multiaddr.to_peer addrs) with + | Some peers -> + run peers + | None -> + Deferred.return + (List.map addrs ~f:(fun _ -> + Or_error.error_string + "Could not parse peers in node status request" ) ) ) + (* TODO: Have better pushback behavior *) let broadcast_state t state = [%str_log' trace t.logger] diff --git a/src/lib/mina_networking/mina_networking.mli b/src/lib/mina_networking/mina_networking.mli index 11b8794420b..d53ae824086 100644 --- a/src/lib/mina_networking/mina_networking.mli +++ b/src/lib/mina_networking/mina_networking.mli @@ -1,6 +1,7 @@ open Async open Core open Mina_base +open Mina_ledger open Network_pool open Pipe_lib open Network_peer @@ -14,9 +15,34 @@ type Structured_log_events.t += | Gossip_snark_pool_diff of { work : Snark_pool.Resource_pool.Diff.compact } [@@deriving register_event] -val refused_answer_query_string : string +module type CONTEXT = sig + val logger : Logger.t + + val trust_system : Trust_system.t + + val time_controller : Block_time.Controller.t + + val consensus_local_state : Consensus.Data.Local_state.t + + val precomputed_values : Precomputed_values.t + + val constraint_constants : Genesis_constants.Constraint_constants.t + + val consensus_constants : Consensus.Constants.t +end + +module Node_status = Node_status +module Sinks = Sinks + +module Gossip_net : Gossip_net.S with module Rpc_interface := Rpcs module Rpcs : sig + module Get_some_initial_peers : sig + type query = unit + + type response = Peer.t list + end + module Get_staged_ledger_aux_and_pending_coinbases_at_hash : sig type query = State_hash.t @@ -29,9 +55,10 @@ module Rpcs : sig end module Answer_sync_ledger_query : sig - type query = Ledger_hash.t * Mina_ledger.Sync_ledger.Query.t + type query = Ledger_hash.t * Sync_ledger.Query.t - type response = Mina_ledger.Sync_ledger.Answer.t Core.Or_error.t + type response = + (Sync_ledger.Answer.t, Bounded_types.Wrapped_error.Stable.V1.t) Result.t end module Get_transition_chain : sig @@ -40,18 +67,18 @@ module Rpcs : sig type response = Mina_block.t list option end - module Get_transition_knowledge : sig - type query = unit - - type response = State_hash.t list - end - module Get_transition_chain_proof : sig type query = State_hash.t type response = (State_hash.t * State_body_hash.t list) option end + module Get_transition_knowledge : sig + type query = unit + + type response = State_hash.t list + end + module Get_ancestry : sig type query = (Consensus.Data.Consensus_state.Value.t, State_hash.t) With_hash.t @@ -64,13 +91,14 @@ module Rpcs : sig end module Ban_notify : sig + (* banned until this time *) type query = Core.Time.t type response = unit end module Get_best_tip : sig - type query = unit [@@deriving sexp, to_yojson] + type query = unit type response = ( Mina_block.t @@ -79,45 +107,7 @@ module Rpcs : sig option end - module Get_node_status : sig - module Node_status : sig - [%%versioned: - module Stable : sig - module V2 : sig - type t = - { node_ip_addr : Network_peer.Peer.Inet_addr.Stable.V1.t - ; node_peer_id : Peer.Id.Stable.V1.t - ; sync_status : Sync_status.Stable.V1.t - ; peers : Network_peer.Peer.Stable.V1.t list - ; block_producers : - Signature_lib.Public_key.Compressed.Stable.V1.t list - ; protocol_state_hash : State_hash.Stable.V1.t - ; ban_statuses : - ( Network_peer.Peer.Stable.V1.t - * Trust_system.Peer_status.Stable.V1.t ) - list - ; k_block_hashes_and_timestamps : - (State_hash.Stable.V1.t * string) list - ; git_commit : string - ; uptime_minutes : int - ; block_height_opt : int option - } - end - end] - end - - type query = unit [@@deriving sexp, to_yojson] - - type response = Node_status.t Or_error.t [@@deriving to_yojson] - end - - module Get_some_initial_peers : sig - type query = unit [@@deriving sexp, to_yojson] - - type response = Network_peer.Peer.t list [@@deriving to_yojson] - end - - type ('query, 'response) rpc = + type ('query, 'response) rpc = ('query, 'response) Rpcs.rpc = | Get_some_initial_peers : (Get_some_initial_peers.query, Get_some_initial_peers.response) rpc | Get_staged_ledger_aux_and_pending_coinbases_at_hash @@ -138,32 +128,18 @@ module Rpcs : sig : ( Get_transition_chain_proof.query , Get_transition_chain_proof.response ) rpc - | Get_node_status : (Get_node_status.query, Get_node_status.response) rpc | Get_ancestry : (Get_ancestry.query, Get_ancestry.response) rpc | Ban_notify : (Ban_notify.query, Ban_notify.response) rpc | Get_best_tip : (Get_best_tip.query, Get_best_tip.response) rpc - - include Rpc_intf.Rpc_interface_intf with type ('q, 'r) rpc := ('q, 'r) rpc end -module Sinks : module type of Sinks - -module Gossip_net : Gossip_net.S with module Rpc_intf := Rpcs - module Config : sig type log_gossip_heard = { snark_pool_diff : bool; transaction_pool_diff : bool; new_state : bool } [@@deriving make] type t = - { logger : Logger.t - ; trust_system : Trust_system.t - ; time_controller : Block_time.Controller.t - ; consensus_constants : Consensus.Constants.t - ; consensus_local_state : Consensus.Data.Local_state.t - ; genesis_ledger_hash : Ledger_hash.t - ; constraint_constants : Genesis_constants.Constraint_constants.t - ; precomputed_values : Precomputed_values.t + { genesis_ledger_hash : Ledger_hash.t ; creatable_gossip_net : Gossip_net.Any.creatable ; is_seed : bool ; log_gossip_heard : log_gossip_heard @@ -181,9 +157,12 @@ val bandwidth_info : Deferred.Or_error.t val get_peer_node_status : + t -> Network_peer.Peer.t -> Node_status.t Deferred.Or_error.t + +val get_node_status_from_peers : t - -> Network_peer.Peer.t - -> Rpcs.Get_node_status.Node_status.t Deferred.Or_error.t + -> Mina_net2.Multiaddr.t list option + -> Node_status.t Or_error.t list Deferred.t val add_peer : t -> Network_peer.Peer.t -> is_seed:bool -> unit Deferred.Or_error.t @@ -264,7 +243,7 @@ val query_peer : -> Network_peer.Peer.Id.t -> ('q, 'r) Rpcs.rpc -> 'q - -> 'r Network_peer.Rpc_intf.rpc_response Deferred.t + -> 'r Gossip_net.rpc_response Deferred.t val restart_helper : t -> unit @@ -282,35 +261,9 @@ val ban_notification_reader : t -> Gossip_net.ban_notification Linear_pipe.Reader.t val create : - Config.t + (module CONTEXT) + -> Config.t -> sinks:Sinks.t - -> get_some_initial_peers: - ( Rpcs.Get_some_initial_peers.query Envelope.Incoming.t - -> Rpcs.Get_some_initial_peers.response Deferred.t ) - -> get_staged_ledger_aux_and_pending_coinbases_at_hash: - ( Rpcs.Get_staged_ledger_aux_and_pending_coinbases_at_hash.query - Envelope.Incoming.t - -> Rpcs.Get_staged_ledger_aux_and_pending_coinbases_at_hash.response - Deferred.t ) - -> answer_sync_ledger_query: - ( Rpcs.Answer_sync_ledger_query.query Envelope.Incoming.t - -> Rpcs.Answer_sync_ledger_query.response Deferred.t ) - -> get_ancestry: - ( Rpcs.Get_ancestry.query Envelope.Incoming.t - -> Rpcs.Get_ancestry.response Deferred.t ) - -> get_best_tip: - ( Rpcs.Get_best_tip.query Envelope.Incoming.t - -> Rpcs.Get_best_tip.response Deferred.t ) - -> get_node_status: - ( Rpcs.Get_node_status.query Envelope.Incoming.t - -> Rpcs.Get_node_status.response Deferred.t ) - -> get_transition_chain_proof: - ( Rpcs.Get_transition_chain_proof.query Envelope.Incoming.t - -> Rpcs.Get_transition_chain_proof.response Deferred.t ) - -> get_transition_chain: - ( Rpcs.Get_transition_chain.query Envelope.Incoming.t - -> Rpcs.Get_transition_chain.response Deferred.t ) - -> get_transition_knowledge: - ( Rpcs.Get_transition_knowledge.query Envelope.Incoming.t - -> Rpcs.Get_transition_knowledge.response Deferred.t ) + -> get_transition_frontier:(unit -> Transition_frontier.t option) + -> get_node_status:(unit -> Node_status.t Deferred.Or_error.t) -> t Deferred.t diff --git a/src/lib/mina_networking/node_status.ml b/src/lib/mina_networking/node_status.ml new file mode 100644 index 00000000000..ceb6bc9fe42 --- /dev/null +++ b/src/lib/mina_networking/node_status.ml @@ -0,0 +1,74 @@ +open Core_kernel +open Mina_base +open Network_peer + +[%%versioned +module Stable = struct + module V2 = struct + type t = + { node_ip_addr : Peer.Inet_addr.Stable.V1.t + ; node_peer_id : Peer.Id.Stable.V1.t + [@to_yojson fun peer_id -> `String peer_id] + [@of_yojson + function `String s -> Ok s | _ -> Error "expected string"] + ; sync_status : Sync_status.Stable.V1.t + ; peers : Peer.Stable.V1.t list + ; block_producers : Signature_lib.Public_key.Compressed.Stable.V1.t list + ; protocol_state_hash : State_hash.Stable.V1.t + ; ban_statuses : + (Peer.Stable.V1.t * Trust_system.Peer_status.Stable.V1.t) list + ; k_block_hashes_and_timestamps : + (State_hash.Stable.V1.t * Bounded_types.String.Stable.V1.t) list + ; git_commit : Bounded_types.String.Stable.V1.t + ; uptime_minutes : int + ; block_height_opt : int option [@default None] + } + [@@deriving to_yojson, of_yojson] + + let to_latest = Fn.id + end + + module V1 = struct + type t = + { node_ip_addr : Peer.Inet_addr.Stable.V1.t + ; node_peer_id : Peer.Id.Stable.V1.t + [@to_yojson fun peer_id -> `String peer_id] + [@of_yojson + function `String s -> Ok s | _ -> Error "expected string"] + ; sync_status : Sync_status.Stable.V1.t + ; peers : Peer.Stable.V1.t list + ; block_producers : Signature_lib.Public_key.Compressed.Stable.V1.t list + ; protocol_state_hash : State_hash.Stable.V1.t + ; ban_statuses : + (Peer.Stable.V1.t * Trust_system.Peer_status.Stable.V1.t) list + ; k_block_hashes_and_timestamps : + (State_hash.Stable.V1.t * Bounded_types.String.Stable.V1.t) list + ; git_commit : Bounded_types.String.Stable.V1.t + ; uptime_minutes : int + } + [@@deriving to_yojson, of_yojson] + + let to_latest status : Latest.t = + { node_ip_addr = status.node_ip_addr + ; node_peer_id = status.node_peer_id + ; sync_status = status.sync_status + ; peers = status.peers + ; block_producers = status.block_producers + ; protocol_state_hash = status.protocol_state_hash + ; ban_statuses = status.ban_statuses + ; k_block_hashes_and_timestamps = status.k_block_hashes_and_timestamps + ; git_commit = status.git_commit + ; uptime_minutes = status.uptime_minutes + ; block_height_opt = None + } + end +end] + +type response = (t, Error.t) result + +let response_to_yojson (response : response) : Yojson.Safe.t = + match response with + | Ok status -> + to_yojson status + | Error err -> + `Assoc [ ("error", Error_json.error_to_yojson err) ] diff --git a/src/lib/mina_networking/rpcs.ml b/src/lib/mina_networking/rpcs.ml new file mode 100644 index 00000000000..9b4cca901d4 --- /dev/null +++ b/src/lib/mina_networking/rpcs.ml @@ -0,0 +1,1127 @@ +open Async +open Core +open Mina_base +open Mina_ledger +open Network_peer + +(* For versioning of the types here, see + + RFC 0012, and + + https://ocaml.janestreet.com/ocaml-core/latest/doc/async_rpc_kernel/Async_rpc_kernel/Versioned_rpc/ + + The "master" types are the ones used internally in the code base. Each + version has coercions between their query and response types and the master + types. +*) + +(* The common context passed into all rpc handlers. Add new things here to get them into the scope + of an rpc handler. Notably, calls back into Gossip_net need to be expicitly wrapped at this + layer in order to solve a recursive dependency between Gossip_net.Make and this module. *) + +module type CONTEXT = sig + val logger : Logger.t + + val trust_system : Trust_system.t + + val precomputed_values : Precomputed_values.t + + val constraint_constants : Genesis_constants.Constraint_constants.t + + val consensus_constants : Consensus.Constants.t + + val list_peers : unit -> Peer.t list Deferred.t + + val get_transition_frontier : unit -> Transition_frontier.t option +end + +type ctx = (module CONTEXT) + +let validate_protocol_versions ~logger ~trust_system ~rpc_name ~sender blocks = + let version_errors = + let invalid_current_versions = + List.filter blocks ~f:(fun block -> + Mina_block.header block |> Mina_block.Header.current_protocol_version + |> Protocol_version.is_valid |> not ) + in + + let invalid_next_versions = + List.filter blocks ~f:(fun block -> + Mina_block.header block + |> Mina_block.Header.proposed_protocol_version_opt + |> Option.for_all ~f:Protocol_version.is_valid + |> not ) + in + let current_version_mismatches = + List.filter blocks ~f:(fun block -> + Mina_block.header block |> Mina_block.Header.current_protocol_version + |> Protocol_version.compatible_with_daemon |> not ) + in + List.map invalid_current_versions ~f:(fun x -> + (`Invalid_current_version, x) ) + @ List.map invalid_next_versions ~f:(fun x -> (`Invalid_next_version, x)) + @ List.map current_version_mismatches ~f:(fun x -> + (`Current_version_mismatch, x) ) + in + let%map () = + (* NB: these errors aren't always accurate... sometimes we are calling this when we were + requested to serve an outdated block (requested vs sent) *) + Deferred.List.iter version_errors ~how:`Parallel + ~f:(fun (version_error, block) -> + let header = Mina_block.header block in + let block_protocol_version = + Mina_block.Header.current_protocol_version header + in + let proposed_protocol_version = + Mina_block.Header.proposed_protocol_version_opt header + in + let action, error_msg, error_metadata = + match version_error with + | `Invalid_current_version -> + ( Trust_system.Actions.Sent_invalid_protocol_version + , "block with invalid current protocol version" + , [ ( "block_current_protocol_version" + , `String (Protocol_version.to_string block_protocol_version) + ) + ] ) + | `Invalid_next_version -> + ( Trust_system.Actions.Sent_invalid_protocol_version + , "block with invalid proposed protocol version" + , [ ( "block_proposed_protocol_version" + , `String + (Protocol_version.to_string + (Option.value_exn proposed_protocol_version) ) ) + ] ) + | `Current_version_mismatch -> + ( Sent_mismatched_protocol_version + , "current protocol version in block does not match daemon \ + current protocol version" + , [ ( "block_current_protocol_version" + , `String (Protocol_version.to_string block_protocol_version) + ) + ; ( "daemon_current_protocol_version" + , `String Protocol_version.(to_string current) ) + ] ) + in + let msg = + Some + ( Printf.sprintf "$rpc_name: %s" error_msg + , [ ("rpc_name", `String rpc_name) ] @ error_metadata ) + in + Trust_system.record_envelope_sender trust_system logger sender + (action, msg) ) + in + List.is_empty version_errors + +[%%versioned_rpc +module Get_some_initial_peers = struct + type nonrec ctx = ctx + + module Master = struct + let name = "get_some_initial_peers" + + module T = struct + type query = unit [@@deriving sexp, yojson] + + type response = Peer.t list [@@deriving sexp, yojson] + end + + module Caller = T + module Callee = T + end + + include Master.T + + let sent_counter = Mina_metrics.Network.get_some_initial_peers_rpcs_sent + + let received_counter = + Mina_metrics.Network.get_some_initial_peers_rpcs_received + + let failed_request_counter = + Mina_metrics.Network.get_some_initial_peers_rpc_requests_failed + + let failed_response_counter = + Mina_metrics.Network.get_some_initial_peers_rpc_responses_failed + + module M = Versioned_rpc.Both_convert.Plain.Make (Master) + include M + + include Perf_histograms.Rpc.Plain.Extend (struct + include M + include Master + end) + + module V1 = struct + module T = struct + type query = unit + + type response = Network_peer.Peer.Stable.V1.t list + + let query_of_caller_model = Fn.id + + let callee_model_of_query = Fn.id + + let response_of_callee_model = Fn.id + + let caller_model_of_response = Fn.id + end + + module T' = + Perf_histograms.Rpc.Plain.Decorate_bin_io + (struct + include M + include Master + end) + (T) + + include T' + include Register (T') + end + + let receipt_trust_action_message _ = ("Get_some_initial_peers query", []) + + let log_request_received ~logger ~sender () = + [%log trace] "Sending some initial peers to $peer" + ~metadata:[ ("peer", Peer.to_yojson sender) ] + + let response_is_successful peer_list = not (List.is_empty peer_list) + + let handle_request (module Context : CONTEXT) ~version:_ _request = + Context.list_peers () + + let rate_limit_budget = (1, `Per Time.Span.minute) + + let rate_limit_cost = Fn.const 1 +end] + +[%%versioned_rpc +module Get_staged_ledger_aux_and_pending_coinbases_at_hash = struct + type nonrec ctx = ctx + + module Master = struct + let name = "get_staged_ledger_aux_and_pending_coinbases_at_hash" + + module T = struct + type query = State_hash.t + + type response = + ( Staged_ledger.Scan_state.t + * Ledger_hash.t + * Pending_coinbase.t + * Mina_state.Protocol_state.value list ) + option + end + + module Caller = T + module Callee = T + end + + include Master.T + + let sent_counter = + Mina_metrics.Network + .get_staged_ledger_aux_and_pending_coinbases_at_hash_rpcs_sent + + let received_counter = + Mina_metrics.Network + .get_staged_ledger_aux_and_pending_coinbases_at_hash_rpcs_received + + let failed_request_counter = + Mina_metrics.Network + .get_staged_ledger_aux_and_pending_coinbases_at_hash_rpc_requests_failed + + let failed_response_counter = + Mina_metrics.Network + .get_staged_ledger_aux_and_pending_coinbases_at_hash_rpc_responses_failed + + module M = Versioned_rpc.Both_convert.Plain.Make (Master) + include M + + include Perf_histograms.Rpc.Plain.Extend (struct + include M + include Master + end) + + module V2 = struct + module T = struct + type query = State_hash.Stable.V1.t + + type response = + ( Staged_ledger.Scan_state.Stable.V2.t + * Ledger_hash.Stable.V1.t + * Pending_coinbase.Stable.V2.t + * Mina_state.Protocol_state.Value.Stable.V2.t list ) + option + + let query_of_caller_model = Fn.id + + let callee_model_of_query = Fn.id + + let response_of_callee_model = Fn.id + + let caller_model_of_response = Fn.id + end + + module T' = + Perf_histograms.Rpc.Plain.Decorate_bin_io + (struct + include M + include Master + end) + (T) + + include T' + include Register (T') + end + + let receipt_trust_action_message hash = + ( "Staged ledger and pending coinbases at hash: $hash" + , [ ("hash", State_hash.to_yojson hash) ] ) + + let log_request_received ~logger:_ ~sender:_ _request = () + + let response_is_successful = Option.is_some + + let handle_request (module Context : CONTEXT) ~version:_ request = + let open Context in + let hash = Envelope.Incoming.data request in + let result = + let%bind.Option frontier = get_transition_frontier () in + Sync_handler.get_staged_ledger_aux_and_pending_coinbases_at_hash ~frontier + hash + in + let%map () = + match result with + | Some + (scan_state, expected_merkle_root, pending_coinbases, _protocol_states) + -> + let staged_ledger_hash = + Staged_ledger_hash.of_aux_ledger_and_coinbase_hash + (Staged_ledger.Scan_state.hash scan_state) + expected_merkle_root pending_coinbases + in + [%log debug] + ~metadata: + [ ( "staged_ledger_hash" + , Staged_ledger_hash.to_yojson staged_ledger_hash ) + ] + "sending scan state and pending coinbase" ; + Deferred.unit + | None -> + Trust_system.( + record_envelope_sender trust_system logger + (Envelope.Incoming.sender request) + Actions. + ( Requested_unknown_item + , Some (receipt_trust_action_message hash) )) + in + result + + let rate_limit_budget = (4, `Per Time.Span.minute) + + let rate_limit_cost = Fn.const 1 +end] + +[%%versioned_rpc +module Answer_sync_ledger_query = struct + type nonrec ctx = ctx + + module Master = struct + let name = "answer_sync_ledger_query" + + module T = struct + type query = Ledger_hash.t * Sync_ledger.Query.t + + type response = + (( Sync_ledger.Answer.t + , Bounded_types.Wrapped_error.Stable.V1.t ) + Result.t + [@version_asserted] ) + end + + module Caller = T + module Callee = T + end + + include Master.T + + let sent_counter = Mina_metrics.Network.answer_sync_ledger_query_rpcs_sent + + let received_counter = + Mina_metrics.Network.answer_sync_ledger_query_rpcs_received + + let failed_request_counter = + Mina_metrics.Network.answer_sync_ledger_query_rpc_requests_failed + + let failed_response_counter = + Mina_metrics.Network.answer_sync_ledger_query_rpc_responses_failed + + module M = Versioned_rpc.Both_convert.Plain.Make (Master) + include M + + include Perf_histograms.Rpc.Plain.Extend (struct + include M + include Master + end) + + module V3 = struct + module T = struct + type query = Ledger_hash.Stable.V1.t * Sync_ledger.Query.Stable.V1.t + [@@deriving sexp] + + type response = + (( Sync_ledger.Answer.Stable.V2.t + , Bounded_types.Wrapped_error.Stable.V1.t ) + Result.t + [@version_asserted] ) + [@@deriving sexp] + + let query_of_caller_model = Fn.id + + let callee_model_of_query = Fn.id + + let response_of_callee_model = Fn.id + + let caller_model_of_response = Fn.id + end + + module T' = + Perf_histograms.Rpc.Plain.Decorate_bin_io + (struct + include M + include Master + end) + (T) + + include T' + include Register (T') + end + + let receipt_trust_action_message (_, query) = + ( "Answer_sync_ledger_query: $query" + , [ ("query", Sync_ledger.Query.to_yojson query) ] ) + + let log_request_received ~logger:_ ~sender:_ _request = () + + let response_is_successful = Result.is_ok + + let handle_request (module Context : CONTEXT) ~version:_ request = + let open Context in + let ledger_hash, _ = Envelope.Incoming.data request in + let query = Envelope.Incoming.map request ~f:Tuple2.get2 in + let%bind answer = + let%bind.Deferred.Option frontier = return (get_transition_frontier ()) in + Sync_handler.answer_query ~frontier ledger_hash query ~logger + ~trust_system + in + let result = + Result.of_option answer + ~error: + (Error.createf + !"Refusing to answer sync ledger query for ledger_hash: \ + %{sexp:Ledger_hash.t}" + ledger_hash ) + in + let%map () = + match result with + | Ok _ -> + return () + | Error err -> + Trust_system.( + record_envelope_sender trust_system logger + (Envelope.Incoming.sender request) + Actions. + ( Requested_unknown_item + , Some + ( "Sync ledger query with hash: $hash, query: $query, with \ + error: $error" + , [ ("hash", Ledger_hash.to_yojson ledger_hash) + ; ( "query" + , Syncable_ledger.Query.to_yojson + Mina_ledger.Ledger.Addr.to_yojson + (Envelope.Incoming.data query) ) + ; ("error", Error_json.error_to_yojson err) + ] ) )) + in + result + + let rate_limit_budget = (Int.pow 2 17, `Per Time.Span.minute) + + let rate_limit_cost = Fn.const 1 +end] + +[%%versioned_rpc +module Get_transition_chain = struct + type nonrec ctx = ctx + + module Master = struct + let name = "get_transition_chain" + + module T = struct + type query = State_hash.t list [@@deriving sexp, to_yojson] + + type response = Mina_block.t list option + end + + module Caller = T + module Callee = T + end + + include Master.T + + let sent_counter = Mina_metrics.Network.get_transition_chain_rpcs_sent + + let received_counter = Mina_metrics.Network.get_transition_chain_rpcs_received + + let failed_request_counter = + Mina_metrics.Network.get_transition_chain_rpc_requests_failed + + let failed_response_counter = + Mina_metrics.Network.get_transition_chain_rpc_responses_failed + + module M = Versioned_rpc.Both_convert.Plain.Make (Master) + include M + + include Perf_histograms.Rpc.Plain.Extend (struct + include M + include Master + end) + + module V2 = struct + module T = struct + type query = State_hash.Stable.V1.t list [@@deriving sexp] + + type response = Mina_block.Stable.V2.t list option + + let query_of_caller_model = Fn.id + + let callee_model_of_query = Fn.id + + let response_of_callee_model = ident + + let caller_model_of_response = ident + end + + module T' = + Perf_histograms.Rpc.Plain.Decorate_bin_io + (struct + include M + include Master + end) + (T) + + include T' + include Register (T') + end + + let receipt_trust_action_message query = + ("Get_transition_chain query: $query", [ ("query", query_to_yojson query) ]) + + let log_request_received ~logger ~sender _request = + [%log info] "Sending transition_chain to $peer" + ~metadata:[ ("peer", Peer.to_yojson sender) ] + + let response_is_successful = Option.is_some + + let handle_request (module Context : CONTEXT) ~version:_ request = + let open Context in + let hashes = Envelope.Incoming.data request in + let result = + let%bind.Option frontier = get_transition_frontier () in + Sync_handler.get_transition_chain ~frontier hashes + in + match result with + | Some blocks -> + let%map valid_versions = + validate_protocol_versions ~logger ~trust_system + ~rpc_name:"Get_transition_chain" + ~sender:(Envelope.Incoming.sender request) + blocks + in + Option.some_if valid_versions blocks + | None -> + let%map () = + Trust_system.( + record_envelope_sender trust_system logger + (Envelope.Incoming.sender request) + Actions. + ( Requested_unknown_item + , Some (receipt_trust_action_message hashes) )) + in + None + + let rate_limit_budget = (1, `Per Time.Span.second) + + let rate_limit_cost hashes = Int.max 1 (List.length hashes) +end] + +[%%versioned_rpc +module Get_transition_knowledge = struct + type nonrec ctx = ctx + + module Master = struct + let name = "Get_transition_knowledge" + + module T = struct + type query = unit [@@deriving sexp, to_yojson] + + type response = State_hash.t list + end + + module Caller = T + module Callee = T + end + + include Master.T + + let sent_counter = Mina_metrics.Network.get_transition_knowledge_rpcs_sent + + let received_counter = + Mina_metrics.Network.get_transition_knowledge_rpcs_received + + let failed_request_counter = + Mina_metrics.Network.get_transition_knowledge_rpc_requests_failed + + let failed_response_counter = + Mina_metrics.Network.get_transition_knowledge_rpc_responses_failed + + module M = Versioned_rpc.Both_convert.Plain.Make (Master) + include M + + include Perf_histograms.Rpc.Plain.Extend (struct + include M + include Master + end) + + module V1 = struct + module T = struct + type query = unit [@@deriving sexp] + + type response = State_hash.Stable.V1.t list + + let query_of_caller_model = Fn.id + + let callee_model_of_query = Fn.id + + let response_of_callee_model = Fn.id + + let caller_model_of_response = Fn.id + end + + module T' = + Perf_histograms.Rpc.Plain.Decorate_bin_io + (struct + include M + include Master + end) + (T) + + include T' + include Register (T') + end + + let receipt_trust_action_message query = + ( "Get_transition_knowledge query: $query" + , [ ("query", query_to_yojson query) ] ) + + let log_request_received ~logger ~sender _request = + [%log info] "Sending transition_knowledge to $peer" + ~metadata:[ ("peer", Peer.to_yojson sender) ] + + let response_is_successful hashes = not (List.is_empty hashes) + + let handle_request (module Context : CONTEXT) ~version:_ _request = + let open Context in + let result = + let%map.Option frontier = get_transition_frontier () in + Sync_handler.best_tip_path ~frontier + in + return (Option.value result ~default:[]) + + let rate_limit_budget = (1, `Per Time.Span.minute) + + let rate_limit_cost = Fn.const 1 +end] + +[%%versioned_rpc +module Get_transition_chain_proof = struct + type nonrec ctx = ctx + + module Master = struct + let name = "get_transition_chain_proof" + + module T = struct + type query = State_hash.t [@@deriving sexp, to_yojson] + + type response = (State_hash.t * State_body_hash.t list) option + end + + module Caller = T + module Callee = T + end + + include Master.T + + let sent_counter = Mina_metrics.Network.get_transition_chain_proof_rpcs_sent + + let received_counter = + Mina_metrics.Network.get_transition_chain_proof_rpcs_received + + let failed_request_counter = + Mina_metrics.Network.get_transition_chain_proof_rpc_requests_failed + + let failed_response_counter = + Mina_metrics.Network.get_transition_chain_proof_rpc_responses_failed + + module M = Versioned_rpc.Both_convert.Plain.Make (Master) + include M + + include Perf_histograms.Rpc.Plain.Extend (struct + include M + include Master + end) + + module V1 = struct + module T = struct + type query = State_hash.Stable.V1.t [@@deriving sexp] + + type response = + (State_hash.Stable.V1.t * State_body_hash.Stable.V1.t list) option + + let query_of_caller_model = Fn.id + + let callee_model_of_query = Fn.id + + let response_of_callee_model = Fn.id + + let caller_model_of_response = Fn.id + end + + module T' = + Perf_histograms.Rpc.Plain.Decorate_bin_io + (struct + include M + include Master + end) + (T) + + include T' + include Register (T') + end + + let receipt_trust_action_message query = + ( "Get_transition_chain_proof query: $query" + , [ ("query", query_to_yojson query) ] ) + + let log_request_received ~logger ~sender _request = + [%log info] "Sending transition_chain_proof to $peer" + ~metadata:[ ("peer", Peer.to_yojson sender) ] + + let response_is_successful = Option.is_some + + let handle_request (module Context : CONTEXT) ~version:_ request = + let open Context in + let hash = Envelope.Incoming.data request in + let result = + let%bind.Option frontier = get_transition_frontier () in + Transition_chain_prover.prove ~frontier hash + in + let%map () = + if Option.is_none result then + Trust_system.( + record_envelope_sender trust_system logger + (Envelope.Incoming.sender request) + Actions. + (Requested_unknown_item, Some (receipt_trust_action_message hash))) + else return () + in + result + + let rate_limit_budget = (3, `Per Time.Span.minute) + + let rate_limit_cost = Fn.const 1 +end] + +[%%versioned_rpc +module Get_ancestry = struct + type nonrec ctx = ctx + + module Master = struct + let name = "get_ancestry" + + module T = struct + (** NB: The state hash sent in this query should not be trusted, as it can be forged. This is ok for how this RPC is implented, as we only use the state hash for tie breaking when checking whether or not the proof is worth serving. *) + type query = + (Consensus.Data.Consensus_state.Value.t, State_hash.t) With_hash.t + [@@deriving sexp, to_yojson] + + type response = + ( Mina_block.t + , State_body_hash.t list * Mina_block.t ) + Proof_carrying_data.t + option + end + + module Caller = T + module Callee = T + end + + include Master.T + + let sent_counter = Mina_metrics.Network.get_ancestry_rpcs_sent + + let received_counter = Mina_metrics.Network.get_ancestry_rpcs_received + + let failed_request_counter = + Mina_metrics.Network.get_ancestry_rpc_requests_failed + + let failed_response_counter = + Mina_metrics.Network.get_ancestry_rpc_responses_failed + + module M = Versioned_rpc.Both_convert.Plain.Make (Master) + include M + + include Perf_histograms.Rpc.Plain.Extend (struct + include M + include Master + end) + + module V2 = struct + module T = struct + type query = + ( Consensus.Data.Consensus_state.Value.Stable.V2.t + , State_hash.Stable.V1.t ) + With_hash.Stable.V1.t + [@@deriving sexp] + + type response = + ( Mina_block.Stable.V2.t + , State_body_hash.Stable.V1.t list * Mina_block.Stable.V2.t ) + Proof_carrying_data.Stable.V1.t + option + + let query_of_caller_model = Fn.id + + let callee_model_of_query = Fn.id + + let response_of_callee_model = ident + + let caller_model_of_response = ident + end + + module T' = + Perf_histograms.Rpc.Plain.Decorate_bin_io + (struct + include M + include Master + end) + (T) + + include T' + include Register (T') + end + + let receipt_trust_action_message query = + ("Get_ancestry query: $query", [ ("query", query_to_yojson query) ]) + + let log_request_received ~logger ~sender _request = + [%log debug] "Sending root proof to $peer" + ~metadata:[ ("peer", Peer.to_yojson sender) ] + + let response_is_successful = Option.is_some + + let handle_request (module Context : CONTEXT) ~version:_ request = + let open Context in + let consensus_state_with_hash = Envelope.Incoming.data request in + let result = + let%bind.Option frontier = get_transition_frontier () in + consensus_state_with_hash + |> With_hash.map_hash ~f:(fun state_hash -> + { State_hash.State_hashes.state_hash; state_body_hash = None } ) + |> Sync_handler.Root.prove ~context:(module Context) ~frontier + in + match result with + | None -> + let%map () = + Trust_system.( + record_envelope_sender trust_system logger + (Envelope.Incoming.sender request) + Actions. + ( Requested_unknown_item + , Some (receipt_trust_action_message consensus_state_with_hash) + )) + in + None + | Some { proof = _, block; _ } -> + let%map valid_versions = + validate_protocol_versions ~logger ~trust_system + ~rpc_name:"Get_ancestry" + ~sender:(Envelope.Incoming.sender request) + [ block ] + in + if valid_versions then result else None + + let rate_limit_budget = (5, `Per Time.Span.minute) + + let rate_limit_cost = Fn.const 1 +end] + +[%%versioned_rpc +module Ban_notify = struct + type nonrec ctx = ctx + + module Master = struct + let name = "ban_notify" + + module T = struct + (* banned until this time *) + type query = Core.Time.t [@@deriving sexp] + + type response = unit + end + + module Caller = T + module Callee = T + end + + include Master.T + + let sent_counter = Mina_metrics.Network.ban_notify_rpcs_sent + + let received_counter = Mina_metrics.Network.ban_notify_rpcs_received + + let failed_request_counter = + Mina_metrics.Network.ban_notify_rpc_requests_failed + + let failed_response_counter = + Mina_metrics.Network.ban_notify_rpc_responses_failed + + module M = Versioned_rpc.Both_convert.Plain.Make (Master) + include M + + include Perf_histograms.Rpc.Plain.Extend (struct + include M + include Master + end) + + module V1 = struct + module T = struct + type query = Core.Time.Stable.V1.t [@@deriving sexp] + + type response = unit + + let query_of_caller_model = Fn.id + + let callee_model_of_query = Fn.id + + let response_of_callee_model = Fn.id + + let caller_model_of_response = Fn.id + end + + module T' = + Perf_histograms.Rpc.Plain.Decorate_bin_io + (struct + include M + include Master + end) + (T) + + include T' + include Register (T') + end + + let receipt_trust_action_message _request = ("Ban_notify query", []) + + let log_request_received ~logger ~sender ban_until = + [%log warn] "Node banned by peer $peer until $ban_until" + ~metadata: + [ ("peer", Peer.to_yojson sender) + ; ( "ban_until" + , `String (Time.to_string_abs ~zone:Time.Zone.utc ban_until) ) + ] + + let response_is_successful = Fn.const true + + let handle_request _ctx ~version:_ _request = Deferred.unit + + let rate_limit_budget = (1, `Per Time.Span.minute) + + let rate_limit_cost = Fn.const 1 +end] + +[%%versioned_rpc +module Get_best_tip = struct + type nonrec ctx = ctx + + module Master = struct + let name = "get_best_tip" + + module T = struct + type query = unit [@@deriving sexp, to_yojson] + + type response = + ( Mina_block.t + , State_body_hash.t list * Mina_block.t ) + Proof_carrying_data.t + option + end + + module Caller = T + module Callee = T + end + + include Master.T + + let sent_counter = Mina_metrics.Network.get_best_tip_rpcs_sent + + let received_counter = Mina_metrics.Network.get_best_tip_rpcs_received + + let failed_request_counter = + Mina_metrics.Network.get_best_tip_rpc_requests_failed + + let failed_response_counter = + Mina_metrics.Network.get_best_tip_rpc_responses_failed + + module M = Versioned_rpc.Both_convert.Plain.Make (Master) + include M + + include Perf_histograms.Rpc.Plain.Extend (struct + include M + include Master + end) + + module V2 = struct + module T = struct + type query = unit [@@deriving sexp] + + type response = + ( Mina_block.Stable.V2.t + , State_body_hash.Stable.V1.t list * Mina_block.Stable.V2.t ) + Proof_carrying_data.Stable.V1.t + option + + let query_of_caller_model = Fn.id + + let callee_model_of_query = Fn.id + + let response_of_callee_model = ident + + let caller_model_of_response = ident + end + + module T' = + Perf_histograms.Rpc.Plain.Decorate_bin_io + (struct + include M + include Master + end) + (T) + + include T' + include Register (T') + end + + let receipt_trust_action_message _request = ("Get_best_tip query", []) + + let log_request_received ~logger ~sender _request = + [%log debug] "Sending best_tip to $peer" + ~metadata:[ ("peer", Peer.to_yojson sender) ] + + let response_is_successful = Option.is_some + + let handle_request (module Context : CONTEXT) ~version:_ request = + let open Context in + let result = + let open Option.Let_syntax in + let%bind frontier = get_transition_frontier () in + let%map proof_with_data = + Best_tip_prover.prove ~context:(module Context) frontier + in + (* strip hash from proof data *) + Proof_carrying_data.map proof_with_data ~f:With_hash.data + in + match result with + | None -> + let%map () = + Trust_system.( + record_envelope_sender trust_system logger + (Envelope.Incoming.sender request) + Actions. + (Requested_unknown_item, Some (receipt_trust_action_message ()))) + in + None + | Some { data = data_block; proof = _, proof_block } -> + let%map data_valid_versions = + validate_protocol_versions ~logger ~trust_system + ~rpc_name:"Get_best_tip (data)" + ~sender:(Envelope.Incoming.sender request) + [ data_block ] + and proof_valid_versions = + validate_protocol_versions ~logger ~trust_system + ~rpc_name:"Get_best_tip (proof)" + ~sender:(Envelope.Incoming.sender request) + [ proof_block ] + in + if data_valid_versions && proof_valid_versions then result else None + + let rate_limit_budget = (3, `Per Time.Span.minute) + + let rate_limit_cost = Fn.const 1 +end] + +type ('query, 'response) rpc = + | Get_some_initial_peers + : (Get_some_initial_peers.query, Get_some_initial_peers.response) rpc + | Get_staged_ledger_aux_and_pending_coinbases_at_hash + : ( Get_staged_ledger_aux_and_pending_coinbases_at_hash.query + , Get_staged_ledger_aux_and_pending_coinbases_at_hash.response ) + rpc + | Answer_sync_ledger_query + : (Answer_sync_ledger_query.query, Answer_sync_ledger_query.response) rpc + | Get_transition_chain + : (Get_transition_chain.query, Get_transition_chain.response) rpc + | Get_transition_knowledge + : (Get_transition_knowledge.query, Get_transition_knowledge.response) rpc + | Get_transition_chain_proof + : ( Get_transition_chain_proof.query + , Get_transition_chain_proof.response ) + rpc + | Get_ancestry : (Get_ancestry.query, Get_ancestry.response) rpc + | Ban_notify : (Ban_notify.query, Ban_notify.response) rpc + | Get_best_tip : (Get_best_tip.query, Get_best_tip.response) rpc + +type any_rpc = Rpc : ('q, 'r) rpc -> any_rpc + +let all_rpcs = + [ Rpc Get_some_initial_peers + ; Rpc Get_staged_ledger_aux_and_pending_coinbases_at_hash + ; Rpc Answer_sync_ledger_query + ; Rpc Get_best_tip + ; Rpc Get_ancestry + ; Rpc Get_transition_knowledge + ; Rpc Get_transition_chain + ; Rpc Get_transition_chain_proof + ; Rpc Ban_notify + ] + +let implementation : + type q r. (q, r) rpc -> (ctx, q, r) Gossip_net.rpc_implementation = function + | Get_some_initial_peers -> + (module Get_some_initial_peers) + | Get_staged_ledger_aux_and_pending_coinbases_at_hash -> + (module Get_staged_ledger_aux_and_pending_coinbases_at_hash) + | Answer_sync_ledger_query -> + (module Answer_sync_ledger_query) + | Get_transition_chain -> + (module Get_transition_chain) + | Get_transition_knowledge -> + (module Get_transition_knowledge) + | Get_transition_chain_proof -> + (module Get_transition_chain_proof) + | Get_ancestry -> + (module Get_ancestry) + | Ban_notify -> + (module Ban_notify) + | Get_best_tip -> + (module Get_best_tip) diff --git a/src/lib/mina_state/dune b/src/lib/mina_state/dune index 81ada9bac46..d5a2ac71c0c 100644 --- a/src/lib/mina_state/dune +++ b/src/lib/mina_state/dune @@ -25,7 +25,6 @@ block_time mina_base mina_debug - mina_node_config mina_transaction_logic snark_params consensus diff --git a/src/lib/mina_stdlib/list.ml b/src/lib/mina_stdlib/list.ml index 5fa12faf383..c775f402385 100644 --- a/src/lib/mina_stdlib/list.ml +++ b/src/lib/mina_stdlib/list.ml @@ -1,3 +1,6 @@ +open Core_kernel +include List + module Length = struct type 'a t = ('a list, int) Sigs.predicate2 diff --git a/src/lib/mina_stdlib/list.mli b/src/lib/mina_stdlib/list.mli index 46a5a504e42..7296d0893e7 100644 --- a/src/lib/mina_stdlib/list.mli +++ b/src/lib/mina_stdlib/list.mli @@ -1,3 +1,7 @@ +open Core_kernel + +include module type of List + (** {1 Predicates over list lengths}*) module Length : sig diff --git a/src/lib/mina_wire_types/snark_params.ml b/src/lib/mina_wire_types/snark_params.ml index c1164b677a2..c4248a05fa0 100644 --- a/src/lib/mina_wire_types/snark_params.ml +++ b/src/lib/mina_wire_types/snark_params.ml @@ -1,6 +1,6 @@ module Tick = struct module Field = struct - type t = Pasta_bindings.Fp.t + type t = Kimchi_pasta_basic.Fp.t end module Inner_curve = struct diff --git a/src/lib/network_peer/network_peer.ml b/src/lib/network_peer/network_peer.ml deleted file mode 100644 index f2e37f142c3..00000000000 --- a/src/lib/network_peer/network_peer.ml +++ /dev/null @@ -1,14 +0,0 @@ -module Peer = Peer -module Envelope = Envelope -module Rpc_intf = Rpc_intf - -type query_peer = - { query : - 'r 'q. - Peer.t - -> ( Async_rpc_kernel.Versioned_rpc.Connection_with_menu.t - -> 'q - -> 'r Async_kernel.Deferred.Or_error.t ) - -> 'q - -> 'r Async_kernel.Deferred.Or_error.t - } diff --git a/src/lib/network_peer/rpc_intf.ml b/src/lib/network_peer/rpc_intf.ml deleted file mode 100644 index d3e913c7695..00000000000 --- a/src/lib/network_peer/rpc_intf.ml +++ /dev/null @@ -1,62 +0,0 @@ -open Async -open Core - -type state = Peer.t - -type ('query, 'response) rpc_fn = - state -> version:int -> 'query -> 'response Deferred.t - -type 'r rpc_response = - | Failed_to_connect of Error.t - | Connected of 'r Or_error.t Envelope.Incoming.t - -module type Rpc_implementation_intf = sig - type query - - type response - - val name : string - - val versions : unit -> Int.Set.t - - val sent_counter : Mina_metrics.Counter.t * Mina_metrics.Gauge.t - - val received_counter : Mina_metrics.Counter.t * Mina_metrics.Gauge.t - - val failed_request_counter : Mina_metrics.Counter.t - - val failed_response_counter : Mina_metrics.Counter.t - - val implement_multi : - ?log_not_previously_seen_version:(name:string -> int -> unit) - -> (query, response) rpc_fn - -> state Rpc.Implementation.t list - - val dispatch_multi : - Versioned_rpc.Connection_with_menu.t - -> query - -> response Deferred.Or_error.t -end - -type ('query, 'response) rpc_implementation = - (module Rpc_implementation_intf - with type query = 'query - and type response = 'response ) - -module type Rpc_interface_intf = sig - type ('query, 'response) rpc - - type rpc_handler = - | Rpc_handler : - { rpc : ('q, 'r) rpc - ; f : ('q, 'r) rpc_fn - ; cost : 'q -> int - ; budget : int * [ `Per of Time.Span.t ] - } - -> rpc_handler - - val implementation_of_rpc : ('q, 'r) rpc -> ('q, 'r) rpc_implementation - - val match_handler : - rpc_handler -> ('q, 'r) rpc -> do_:(('q, 'r) rpc_fn -> 'a) -> 'a option -end diff --git a/src/lib/network_pool/dune b/src/lib/network_pool/dune index ef8d83ca142..4202e251646 100644 --- a/src/lib/network_pool/dune +++ b/src/lib/network_pool/dune @@ -21,7 +21,6 @@ integers ;; local libraries bounded_types - mina_compile_config mina_generators sgn sgn_type @@ -47,7 +46,6 @@ mina_transaction mina_state transaction_snark - transaction_snark_tests consensus network_peer currency diff --git a/src/lib/network_pool/test/indexed_pool_tests.ml b/src/lib/network_pool/test/indexed_pool_tests.ml index 9462601ed7b..042175ada96 100644 --- a/src/lib/network_pool/test/indexed_pool_tests.ml +++ b/src/lib/network_pool/test/indexed_pool_tests.ml @@ -408,7 +408,7 @@ let command_nonce (txn : Transaction_hash.User_command_with_valid_signature.t) = let dummy_state_view = let state_body = let consensus_constants = - let genesis_constants = Genesis_constants.for_unit_tests in + let genesis_constants = Genesis_constants.For_unit_tests.t in Consensus.Constants.create ~constraint_constants ~protocol_constants:genesis_constants.protocol in @@ -581,7 +581,7 @@ let make_zkapp_command_payment ~(sender : Keypair.t) ~(receiver : Keypair.t) Transaction_hash.User_command_with_valid_signature.create cmd let support_for_zkapp_command_commands () = - let fee = Fee.minimum_user_command_fee in + let fee = Genesis_constants.For_unit_tests.t.minimum_user_command_fee in let amount = Amount.of_nanomina_int_exn @@ Fee.to_nanomina_int fee in let balance = Option.value_exn (Amount.scale amount 100) in let kp1 = @@ -614,7 +614,7 @@ let support_for_zkapp_command_commands () = () ) let nonce_increment_side_effects () = - let fee = Fee.minimum_user_command_fee in + let fee = Genesis_constants.For_unit_tests.t.minimum_user_command_fee in let amount = Amount.of_nanomina_int_exn @@ Fee.to_nanomina_int fee in let balance = Option.value_exn (Amount.scale amount 100) in let kp1 = @@ -647,7 +647,7 @@ let nonce_increment_side_effects () = () ) let nonce_invariant_violation () = - let fee = Fee.minimum_user_command_fee in + let fee = Genesis_constants.For_unit_tests.t.minimum_user_command_fee in let amount = Amount.of_nanomina_int_exn @@ Fee.to_nanomina_int fee in let balance = Option.value_exn (Amount.scale amount 100) in let kp1 = @@ -767,7 +767,7 @@ let apply_transactions txns accounts = | None -> failwith "sender not found" | Some a -> - let open Account.Poly in + let open Account in let nonce = Account.Nonce.succ a.nonce in let balance = let amt = @@ -857,7 +857,7 @@ let transaction_replacement () = in assert_pool_consistency pool ; let queue, _ = - let open Account.Poly in + let open Account in Public_key.decompress sender.public_key |> Option.value_exn |> Account_id.of_public_key |> Account_id.Map.find_exn (Indexed_pool.For_tests.all_by_sender pool') diff --git a/src/lib/network_pool/test/transaction_gen.ml b/src/lib/network_pool/test/transaction_gen.ml index 4d7bf6e282e..268f5916cad 100644 --- a/src/lib/network_pool/test/transaction_gen.ml +++ b/src/lib/network_pool/test/transaction_gen.ml @@ -56,7 +56,7 @@ let sgn_cmd_to_txn cmd = let gen_amount : (uint64, Account.t) Stateful_gen.t = let open Stateful_gen in let open Let_syntax in - let open Account.Poly in + let open Account in let%bind balance = getf (fun a -> a.balance) in let%bind amt = lift @@ Amount.(gen_incl zero @@ Balance.to_amount balance) in let%map () = @@ -66,7 +66,7 @@ let gen_amount : (uint64, Account.t) Stateful_gen.t = Amount.to_uint64 amt let accounts_map accounts = - List.map accounts ~f:Account.Poly.(fun a -> (a.public_key, a)) + List.map accounts ~f:Account.(fun a -> (a.public_key, a)) |> Public_key.Compressed.Map.of_alist_exn let with_accounts ~f ~account_map ~init txns = @@ -78,7 +78,7 @@ let with_accounts ~f ~account_map ~init txns = let%map accum' = f accum a t in let accounts' = Public_key.Compressed.Map.set accounts ~key:pk - ~data:Account.Poly.{ a with nonce = Account_nonce.succ a.nonce } + ~data:Account.{ a with nonce = Account_nonce.succ a.nonce } in (accounts', accum') ) |> Result.map ~f:snd @@ -90,7 +90,7 @@ let pool_of_transactions ~init ~account_map txns = (Signed_command t) ) ) ~init ~f:(fun p t -> - let open Account.Poly in + let open Account in Indexed_pool.For_tests.assert_pool_consistency p ; let a = Public_key.Compressed.Map.find_exn account_map (sender_pk t) in Indexed_pool.add_from_gossip_exn p t a.nonce (Balance.to_amount a.balance) @@ -101,7 +101,7 @@ let pool_of_transactions ~init ~account_map txns = let rec gen_txns_from_single_sender_to receiver_public_key = let open Stateful_gen in let open Let_syntax in - let open Account.Poly in + let open Account in let%bind sender = get in if Balance.(sender.balance = zero) then return [] else diff --git a/src/lib/network_pool/transaction_pool.ml b/src/lib/network_pool/transaction_pool.ml index 40daa7ead25..751dd94c0b0 100644 --- a/src/lib/network_pool/transaction_pool.ml +++ b/src/lib/network_pool/transaction_pool.ml @@ -1653,8 +1653,10 @@ let%test_module _ = let proof_level = precomputed_values.proof_level + let genesis_constants = precomputed_values.genesis_constants + let minimum_fee = - Currency.Fee.to_nanomina_int Currency.Fee.minimum_user_command_fee + Currency.Fee.to_nanomina_int genesis_constants.minimum_user_command_fee let logger = Logger.create () @@ -1675,7 +1677,6 @@ let%test_module _ = let dummy_state_view = let state_body = let consensus_constants = - let genesis_constants = Genesis_constants.for_unit_tests in Consensus.Constants.create ~constraint_constants ~protocol_constants:genesis_constants.protocol in @@ -1915,7 +1916,7 @@ let%test_module _ = let trust_system = Trust_system.null () in let config = Test.Resource_pool.make_config ~trust_system ~pool_max_size ~verifier - ~genesis_constants:Genesis_constants.compiled ~slot_tx_end + ~genesis_constants ~slot_tx_end in let pool_, _, _ = Test.create ~config ~logger ~constraint_constants ~consensus_constants @@ -2044,7 +2045,8 @@ let%test_module _ = } in let zkapp_command = - Transaction_snark.For_tests.multiple_transfers test_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + test_spec in let zkapp_command = Or_error.ok_exn @@ -2102,7 +2104,8 @@ let%test_module _ = let%map (zkapp_command : Zkapp_command.t) = Mina_generators.Zkapp_command_generators.gen_zkapp_command_from ~max_token_updates:1 ~keymap ~account_state_tbl - ~fee_payer_keypair ~ledger:best_tip_ledger () + ~fee_payer_keypair ~ledger:best_tip_ledger ~constraint_constants + ~genesis_constants () in let zkapp_command = { zkapp_command with diff --git a/src/lib/node_config/dune b/src/lib/node_config/dune index 793b8b31de3..3d3eebb8b77 100644 --- a/src/lib/node_config/dune +++ b/src/lib/node_config/dune @@ -1,7 +1,11 @@ (library (name node_config) (public_name mina_node_config) + (libraries + node_config_intf + node_config_version + node_config_unconfigurable_constants) (preprocessor_deps ../../config.mlh) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_version ppx_base ppx_optcomp)) -) \ No newline at end of file +) diff --git a/src/lib/node_config/for_unit_tests/dune b/src/lib/node_config/for_unit_tests/dune new file mode 100644 index 00000000000..460efc1f009 --- /dev/null +++ b/src/lib/node_config/for_unit_tests/dune @@ -0,0 +1,10 @@ +(library + (name node_config_for_unit_tests) + (public_name mina_node_config.for_unit_tests) + (libraries + node_config_intf + node_config_version + node_config_unconfigurable_constants) + (instrumentation (backend bisect_ppx)) + (preprocess (pps ppx_version ppx_base ppx_optcomp)) +) diff --git a/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.ml b/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.ml new file mode 100644 index 00000000000..95c880e9142 --- /dev/null +++ b/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.ml @@ -0,0 +1,66 @@ +(** This file consists of compile-time constants that are not in Genesis_constants. + This file includes all of the constants defined at compile-time for both + tests and production. +*) + +include Node_config_version +include Node_config_unconfigurable_constants + +let (ledger_depth : int) = (10 : int) + +let (curve_size : int) = (255 : int) + +let (coinbase : string) = ("20" : string) + +let (k : int) = (24 : int) + +let (delta : int) = (0 : int) + +let (slots_per_epoch : int) = (576 : int) + +let (slots_per_sub_window : int) = (2 : int) + +let (sub_windows_per_window : int) = (3 : int) + +let (grace_period_slots : int) = (180 : int) + +let (scan_state_with_tps_goal : bool) = (false : bool) + +let (scan_state_transaction_capacity_log_2 : int) = (3 : int) + +let scan_state_transaction_capacity_log_2 = + Some scan_state_transaction_capacity_log_2 + +let (scan_state_work_delay : int) = (2 : int) + +let (proof_level : string) = ("check" : string) + +let (pool_max_size : int) = (3000 : int) + +let (account_creation_fee_int : string) = ("0.001" : string) + +let (default_transaction_fee : string) = ("5" : string) + +let (default_snark_worker_fee : string) = ("1" : string) + +let (minimum_user_command_fee : string) = ("2" : string) + +let (supercharged_coinbase_factor : int) = (1 : int) + +let (plugins : bool) = (true : bool) + +let (genesis_state_timestamp : string) = ("2019-01-30 12:00:00-08:00" : string) + +let (block_window_duration : int) = (2000 : int) + +let (itn_features : bool) = (true : bool) + +let compaction_interval = None + +let (network : string) = ("testnet" : string) + +let (vrf_poll_interval : int) = (0 : int) + +let zkapp_cmd_limit = None + +let scan_state_tps_goal_x10 : int option = None diff --git a/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.mli b/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.mli new file mode 100644 index 00000000000..eb996f25855 --- /dev/null +++ b/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.mli @@ -0,0 +1 @@ +include Node_config_intf.S diff --git a/src/lib/node_config/intf/dune b/src/lib/node_config/intf/dune new file mode 100644 index 00000000000..b7f80d092f6 --- /dev/null +++ b/src/lib/node_config/intf/dune @@ -0,0 +1,7 @@ +(library + (name node_config_intf) + (public_name mina_node_config.intf) + (modules_without_implementation node_config_intf) + (instrumentation (backend bisect_ppx)) + (preprocess (pps ppx_version ppx_base ppx_optcomp)) +) diff --git a/src/lib/node_config/intf/node_config_intf.mli b/src/lib/node_config/intf/node_config_intf.mli new file mode 100644 index 00000000000..3d2960cc380 --- /dev/null +++ b/src/lib/node_config/intf/node_config_intf.mli @@ -0,0 +1,94 @@ +module type Version = sig + val protocol_version_transaction : int + + val protocol_version_network : int + + val protocol_version_patch : int +end + +(* It's stupid that this exists. TODO: Remove and make configurable. *) +module type Unconfigurable_constants = sig + val zkapp_proof_update_cost : float + + val zkapp_signed_pair_update_cost : float + + val zkapp_signed_single_update_cost : float + + val zkapp_transaction_cost_limit : float + + val max_event_elements : int + + val max_action_elements : int + + val zkapp_cmd_limit_hardcap : int + + val zkapps_disabled : bool + + val rpc_handshake_timeout_sec : float + + val rpc_heartbeat_timeout_sec : float + + val rpc_heartbeat_send_every_sec : float +end + +module type S = sig + include Version + + include Unconfigurable_constants + + val ledger_depth : int + + val curve_size : int + + val coinbase : string + + val k : int + + val delta : int + + val slots_per_epoch : int + + val slots_per_sub_window : int + + val sub_windows_per_window : int + + val grace_period_slots : int + + val scan_state_with_tps_goal : bool + + val scan_state_transaction_capacity_log_2 : int option + + val scan_state_work_delay : int + + val proof_level : string + + val pool_max_size : int + + val account_creation_fee_int : string + + val default_transaction_fee : string + + val default_snark_worker_fee : string + + val minimum_user_command_fee : string + + val supercharged_coinbase_factor : int + + val plugins : bool + + val genesis_state_timestamp : string + + val block_window_duration : int + + val itn_features : bool + + val compaction_interval : int option + + val vrf_poll_interval : int + + val network : string + + val zkapp_cmd_limit : int option + + val scan_state_tps_goal_x10 : int option +end diff --git a/src/lib/node_config/node_config.ml b/src/lib/node_config/node_config.ml index d28cdc61327..78485f82a17 100644 --- a/src/lib/node_config/node_config.ml +++ b/src/lib/node_config/node_config.ml @@ -6,6 +6,9 @@ tests and production. *) +include Node_config_version +include Node_config_unconfigurable_constants + [%%inject "ledger_depth", ledger_depth] [%%inject "curve_size", curve_size] @@ -42,8 +45,6 @@ let scan_state_transaction_capacity_log_2 = [%%inject "scan_state_work_delay", scan_state_work_delay] -[%%inject "cache_exceptions", cache_exceptions] - [%%inject "proof_level", proof_level] [%%inject "pool_max_size", pool_max_size] @@ -56,12 +57,6 @@ let scan_state_transaction_capacity_log_2 = [%%inject "minimum_user_command_fee", minimum_user_command_fee] -[%%inject "protocol_version_transaction", protocol_version_transaction] - -[%%inject "protocol_version_network", protocol_version_network] - -[%%inject "protocol_version_patch", protocol_version_patch] - [%%inject "supercharged_coinbase_factor", supercharged_coinbase_factor] [%%inject "plugins", plugins] @@ -100,30 +95,6 @@ let zkapp_cmd_limit = Some zkapp_cmd_limit [%%endif] -[%%ifndef slot_tx_end] - -let slot_tx_end : int option = None - -[%%else] - -[%%inject "slot_tx_end", slot_tx_end] - -let slot_tx_end = Some slot_tx_end - -[%%endif] - -[%%ifndef slot_chain_end] - -let slot_chain_end : int option = None - -[%%else] - -[%%inject "slot_chain_end", slot_chain_end] - -let slot_chain_end = Some slot_chain_end - -[%%endif] - [%%ifndef scan_state_tps_goal_x10] let scan_state_tps_goal_x10 : int option = None diff --git a/src/lib/node_config/node_config.mli b/src/lib/node_config/node_config.mli index 9ba56b7ce45..eb996f25855 100644 --- a/src/lib/node_config/node_config.mli +++ b/src/lib/node_config/node_config.mli @@ -1,67 +1 @@ -val ledger_depth : int - -val curve_size : int - -val coinbase : string - -val k : int - -val delta : int - -val slots_per_epoch : int - -val slots_per_sub_window : int - -val sub_windows_per_window : int - -val grace_period_slots : int - -val scan_state_with_tps_goal : bool - -val scan_state_transaction_capacity_log_2 : int option - -val scan_state_work_delay : int - -val cache_exceptions : bool - -val proof_level : string - -val pool_max_size : int - -val account_creation_fee_int : string - -val default_transaction_fee : string - -val default_snark_worker_fee : string - -val minimum_user_command_fee : string - -val protocol_version_transaction : int - -val protocol_version_network : int - -val protocol_version_patch : int - -val supercharged_coinbase_factor : int - -val plugins : bool - -val genesis_state_timestamp : string - -val block_window_duration : int - -val itn_features : bool - -val compaction_interval : int option - -val vrf_poll_interval : int - -val network : string - -val zkapp_cmd_limit : int option - -val slot_tx_end : int option - -val slot_chain_end : int option - -val scan_state_tps_goal_x10 : int option +include Node_config_intf.S diff --git a/src/lib/node_config/unconfigurable_constants/dune b/src/lib/node_config/unconfigurable_constants/dune new file mode 100644 index 00000000000..6bcb95d8668 --- /dev/null +++ b/src/lib/node_config/unconfigurable_constants/dune @@ -0,0 +1,7 @@ +(library + (name node_config_unconfigurable_constants) + (public_name mina_node_config.unconfigurable_constants) + (libraries node_config_intf) + (instrumentation (backend bisect_ppx)) + (preprocess (pps ppx_version ppx_base ppx_optcomp)) +) diff --git a/src/lib/node_config/unconfigurable_constants/node_config_unconfigurable_constants.ml b/src/lib/node_config/unconfigurable_constants/node_config_unconfigurable_constants.ml new file mode 100644 index 00000000000..1097f348655 --- /dev/null +++ b/src/lib/node_config/unconfigurable_constants/node_config_unconfigurable_constants.ml @@ -0,0 +1,38 @@ +(* FIXME: These should be configurable. *) + +(** limits on Zkapp_command.t size + 10.26*np + 10.08*n2 + 9.14*n1 < 69.45 + where np: number of single proof updates + n2: number of pairs of signed/no-auth update + n1: number of single signed/no-auth update + and their coefficients representing the cost + The formula was generated based on benchmarking data conducted on bare + metal i9 processor with room to include lower spec. + 69.45 was the total time for a combination of updates that was considered + acceptable. + The method used to estimate the cost was linear least squares. +*) + +let zkapp_proof_update_cost = 10.26 + +let zkapp_signed_pair_update_cost = 10.08 + +let zkapp_signed_single_update_cost = 9.14 + +let zkapp_transaction_cost_limit = 69.45 + +let max_event_elements = 100 + +let max_action_elements = 100 + +let zkapp_cmd_limit_hardcap = 128 + +(* These are fine to be non-configurable *) + +let zkapps_disabled = false + +let rpc_handshake_timeout_sec = 60.0 + +let rpc_heartbeat_timeout_sec = 60.0 + +let rpc_heartbeat_send_every_sec = 10.0 (*same as the default*) diff --git a/src/lib/node_config/unconfigurable_constants/node_config_unconfigurable_constants.mli b/src/lib/node_config/unconfigurable_constants/node_config_unconfigurable_constants.mli new file mode 100644 index 00000000000..51efc504085 --- /dev/null +++ b/src/lib/node_config/unconfigurable_constants/node_config_unconfigurable_constants.mli @@ -0,0 +1 @@ +include Node_config_intf.Unconfigurable_constants diff --git a/src/lib/node_config/version/dune b/src/lib/node_config/version/dune new file mode 100644 index 00000000000..e44cc2d039e --- /dev/null +++ b/src/lib/node_config/version/dune @@ -0,0 +1,7 @@ +(library + (name node_config_version) + (public_name mina_node_config.version) + (libraries node_config_intf) + (instrumentation (backend bisect_ppx)) + (preprocess (pps ppx_version ppx_base ppx_optcomp)) +) diff --git a/src/lib/node_config/version/node_config_version.ml b/src/lib/node_config/version/node_config_version.ml new file mode 100644 index 00000000000..e3b93525a58 --- /dev/null +++ b/src/lib/node_config/version/node_config_version.ml @@ -0,0 +1,6 @@ +(* transaction >= 1, network >= 0, patch >= 0 *) +let protocol_version_transaction = 3 + +let protocol_version_network = 0 + +let protocol_version_patch = 0 diff --git a/src/lib/node_config/version/node_config_version.mli b/src/lib/node_config/version/node_config_version.mli new file mode 100644 index 00000000000..6e8d9e786e3 --- /dev/null +++ b/src/lib/node_config/version/node_config_version.mli @@ -0,0 +1 @@ +include Node_config_intf.Version diff --git a/src/lib/node_status/dune b/src/lib/node_status/dune deleted file mode 100644 index f6c2dd08b94..00000000000 --- a/src/lib/node_status/dune +++ /dev/null @@ -1,18 +0,0 @@ -(library - (name node_status) - (public_name node_status) - (library_flags -linkall) - (libraries - ;; opam libraries - core - core_kernel - async - async_kernel - ;; local libraries - mina_net2 - mina_networking) - (preprocess - (pps ppx_version ppx_compare ppx_deriving.enum ppx_deriving.ord - ppx_base ppx_bench ppx_let ppx_sexp_conv ppx_bin_prot)) - (instrumentation (backend bisect_ppx)) - (synopsis "Get node status from other nodes")) diff --git a/src/lib/node_status/node_status.ml b/src/lib/node_status/node_status.ml deleted file mode 100644 index 103e79b3c99..00000000000 --- a/src/lib/node_status/node_status.ml +++ /dev/null @@ -1,23 +0,0 @@ -(* node_status.ml *) - -open Core -open Async - -let get_node_status_from_peers (net : Mina_networking.t) - (peers : Mina_net2.Multiaddr.t list option) = - let run = - Deferred.List.map ~how:`Parallel - ~f:(Mina_networking.get_peer_node_status net) - in - match peers with - | None -> - Mina_networking.peers net >>= run - | Some peers -> ( - match Option.all (List.map ~f:Mina_net2.Multiaddr.to_peer peers) with - | Some peers -> - run peers - | None -> - Deferred.return - (List.map peers ~f:(fun _ -> - Or_error.error_string - "Could not parse peers in node status request" ) ) ) diff --git a/src/lib/node_status_service/node_status_service.ml b/src/lib/node_status_service/node_status_service.ml index 537cc9c0599..c62ee15dcb8 100644 --- a/src/lib/node_status_service/node_status_service.ml +++ b/src/lib/node_status_service/node_status_service.ml @@ -195,11 +195,11 @@ let start ~commit_id ~logger ~node_status_url ~transition_frontier ~sync_status Deferred.unit | Some tf -> ( let catchup_job_states = - match Transition_frontier.catchup_tree tf with - | Full catchup_tree -> + match Transition_frontier.catchup_state tf with + | Full catchup_state -> Some (Transition_frontier.Full_catchup_tree.to_node_status_report - catchup_tree ) + catchup_state ) | _ -> None in diff --git a/src/lib/pickles/dune b/src/lib/pickles/dune index d6406d88277..a19b6bb34f5 100644 --- a/src/lib/pickles/dune +++ b/src/lib/pickles/dune @@ -70,7 +70,7 @@ promise kimchi_backend_common logger - internal_tracing.context_logger + logger.context_logger ppx_version.runtime error_json bounded_types diff --git a/src/lib/pickles/step.ml b/src/lib/pickles/step.ml index 88246019671..455b282fcf3 100644 --- a/src/lib/pickles/step.ml +++ b/src/lib/pickles/step.ml @@ -81,7 +81,7 @@ struct * auxiliary_value * (int, prevs_length) Vector.t ) Promise.t = - let logger = Internal_tracing_context_logger.get () in + let logger = Context_logger.get () in [%log internal] "Pickles_step_proof" ; let _ = auxiliary_typ in (* unused *) diff --git a/src/lib/pickles/step_main.ml b/src/lib/pickles/step_main.ml index d1ea1db5338..3c0ff9f02b2 100644 --- a/src/lib/pickles/step_main.ml +++ b/src/lib/pickles/step_main.ml @@ -278,7 +278,7 @@ let step_main : in let main () : _ Types.Step.Statement.t Promise.t = let open Impls.Step in - let logger = Internal_tracing_context_logger.get () in + let logger = Context_logger.get () in let module Max_proofs_verified = ( val max_proofs_verified : Nat.Add.Intf with type n = max_proofs_verified ) in diff --git a/src/lib/pickles/test/chunked_circuits/dune b/src/lib/pickles/test/chunked_circuits/dune index d1a2f7be3f1..edde300139d 100644 --- a/src/lib/pickles/test/chunked_circuits/dune +++ b/src/lib/pickles/test/chunked_circuits/dune @@ -53,7 +53,7 @@ promise kimchi_backend_common logger - internal_tracing.context_logger + logger.context_logger ppx_version.runtime error_json) (instrumentation diff --git a/src/lib/pickles/test/optional_custom_gates/dune b/src/lib/pickles/test/optional_custom_gates/dune index c95192fed3e..d3ae564b5e7 100644 --- a/src/lib/pickles/test/optional_custom_gates/dune +++ b/src/lib/pickles/test/optional_custom_gates/dune @@ -53,7 +53,7 @@ promise kimchi_backend_common logger - internal_tracing.context_logger + logger.context_logger ppx_version.runtime error_json pickles_optional_custom_gates_circuits) diff --git a/src/lib/pickles/test/optional_custom_gates/test_gadgets/dune b/src/lib/pickles/test/optional_custom_gates/test_gadgets/dune index 87d1765266c..89dbd087de4 100644 --- a/src/lib/pickles/test/optional_custom_gates/test_gadgets/dune +++ b/src/lib/pickles/test/optional_custom_gates/test_gadgets/dune @@ -53,7 +53,7 @@ promise kimchi_backend_common logger - internal_tracing.context_logger + logger.context_logger ppx_version.runtime error_json) (instrumentation diff --git a/src/lib/pickles/verify.ml b/src/lib/pickles/verify.ml index 7905dbeae4d..47d5e3eec06 100644 --- a/src/lib/pickles/verify.ml +++ b/src/lib/pickles/verify.ml @@ -19,7 +19,7 @@ end let verify_heterogenous (ts : Instance.t list) = let module Tick_field = Backend.Tick.Field in - let logger = Internal_tracing_context_logger.get () in + let logger = Context_logger.get () in [%log internal] "Verify_heterogenous" ~metadata:[ ("count", `Int (List.length ts)) ] ; let tick_field : _ Plonk_checks.field = (module Tick_field) in diff --git a/src/lib/pickles/wrap.ml b/src/lib/pickles/wrap.ml index 75750c17c8e..87affb1bdb7 100644 --- a/src/lib/pickles/wrap.ml +++ b/src/lib/pickles/wrap.ml @@ -311,7 +311,7 @@ let wrap , max_proofs_verified ) Vector.t ) P.Base.Step.t ) = - let logger = Internal_tracing_context_logger.get () in + let logger = Context_logger.get () in [%log internal] "Pickles_wrap_proof" ; let messages_for_next_wrap_proof = let module M = diff --git a/src/lib/pickles/wrap_main.ml b/src/lib/pickles/wrap_main.ml index 944b9e48dc0..55b0129c8d5 100644 --- a/src/lib/pickles/wrap_main.ml +++ b/src/lib/pickles/wrap_main.ml @@ -163,7 +163,7 @@ let wrap_main , _ , Field.t ) Types.Wrap.Statement.In_circuit.t ) -> - let logger = Internal_tracing_context_logger.get () in + let logger = Context_logger.get () in with_label __LOC__ (fun () -> let which_branch' = exists diff --git a/src/lib/precomputed_values/dune b/src/lib/precomputed_values/dune index 9f6aa02c596..f5ba2846016 100644 --- a/src/lib/precomputed_values/dune +++ b/src/lib/precomputed_values/dune @@ -22,4 +22,4 @@ (ppx_runtime_libraries base) (preprocess (pps ppx_version ppx_jane ppxlib.metaquot)) - (instrumentation (backend bisect_ppx))) \ No newline at end of file + (instrumentation (backend bisect_ppx))) diff --git a/src/lib/precomputed_values/precomputed_values.ml b/src/lib/precomputed_values/precomputed_values.ml index 42014a5844c..fd97c4ec317 100644 --- a/src/lib/precomputed_values/precomputed_values.ml +++ b/src/lib/precomputed_values/precomputed_values.ml @@ -5,9 +5,9 @@ include T let hashes = lazy (let constraint_constants = - Genesis_constants.Constraint_constants.compiled + Genesis_constants.For_unit_tests.Constraint_constants.t in - let proof_level = Genesis_constants.Proof_level.compiled in + let proof_level = Genesis_constants.Proof_level.Full in let ts = Transaction_snark.constraint_system_digests ~constraint_constants () in @@ -27,15 +27,15 @@ let for_unit_tests = Packed.t for_unit_tests) ~genesis_epoch_data:Consensus.Genesis_epoch_data.for_unit_tests ~constraint_constants: - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t ~consensus_constants:(Lazy.force Consensus.Constants.for_unit_tests) ~genesis_body_reference in { runtime_config = Runtime_config.default ; constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests - ; proof_level = Genesis_constants.Proof_level.for_unit_tests - ; genesis_constants = Genesis_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t + ; proof_level = Genesis_constants.For_unit_tests.Proof_level.t + ; genesis_constants = Genesis_constants.For_unit_tests.t ; genesis_ledger = Genesis_ledger.for_unit_tests ; genesis_epoch_data = Consensus.Genesis_epoch_data.for_unit_tests ; genesis_body_reference @@ -44,35 +44,3 @@ let for_unit_tests = ; constraint_system_digests = hashes ; proof_data = None }) - -let compiled_inputs = - lazy - (let open Staged_ledger_diff in - let constraint_constants = - Genesis_constants.Constraint_constants.compiled - in - let genesis_constants = Genesis_constants.compiled in - let genesis_epoch_data = Consensus.Genesis_epoch_data.compiled in - let consensus_constants = - Consensus.Constants.create ~constraint_constants - ~protocol_constants:genesis_constants.protocol - in - let protocol_state_with_hashes = - Mina_state.Genesis_protocol_state.t ~genesis_ledger:Test_genesis_ledger.t - ~genesis_epoch_data ~constraint_constants ~consensus_constants - ~genesis_body_reference - in - { Genesis_proof.Inputs.runtime_config = Runtime_config.default - ; constraint_constants - ; proof_level = Genesis_constants.Proof_level.compiled - ; genesis_constants - ; genesis_ledger = (module Test_genesis_ledger) - ; genesis_epoch_data - ; genesis_body_reference - ; consensus_constants - ; protocol_state_with_hashes - ; constraint_system_digests = None - ; blockchain_proof_system_id = None - }) - -let compiled = None diff --git a/src/lib/precomputed_values/precomputed_values.mli b/src/lib/precomputed_values/precomputed_values.mli index 67ba6012f79..e8252cae2a4 100644 --- a/src/lib/precomputed_values/precomputed_values.mli +++ b/src/lib/precomputed_values/precomputed_values.mli @@ -1,7 +1,3 @@ include module type of Genesis_proof.T with type t = Genesis_proof.T.t val for_unit_tests : t Lazy.t - -val compiled_inputs : Genesis_proof.Inputs.t Lazy.t - -val compiled : t Lazy.t option diff --git a/src/lib/proof_carrying_data/proof_carrying_data.ml b/src/lib/proof_carrying_data/proof_carrying_data.ml index b2a90fe3488..bd59372b738 100644 --- a/src/lib/proof_carrying_data/proof_carrying_data.ml +++ b/src/lib/proof_carrying_data/proof_carrying_data.ml @@ -9,4 +9,4 @@ module Stable = struct end end] -let map { data; proof } ~f1 ~f2 = { data = f1 data; proof = f2 proof } +let map { data; proof } ~f = { data = f data; proof } diff --git a/src/lib/protocol_version/dune b/src/lib/protocol_version/dune index b06a7b5152d..89b881a3aeb 100644 --- a/src/lib/protocol_version/dune +++ b/src/lib/protocol_version/dune @@ -12,7 +12,7 @@ ppx_version.runtime ;; local libraries mina_wire_types - node_config + mina_node_config.version ) (preprocess (pps ppx_version ppx_bin_prot ppx_fields_conv ppx_sexp_conv ppx_compare ppx_deriving_yojson)) diff --git a/src/lib/protocol_version/protocol_version.ml b/src/lib/protocol_version/protocol_version.ml index 2ff200d0034..2b796841e0a 100644 --- a/src/lib/protocol_version/protocol_version.ml +++ b/src/lib/protocol_version/protocol_version.ml @@ -45,11 +45,11 @@ module Make_str (A : Wire_types.Concrete) = struct let to_string t = sprintf "%u.%u.%u" t.transaction t.network t.patch - let current_transaction = Node_config.protocol_version_transaction + let current_transaction = Node_config_version.protocol_version_transaction - let current_network = Node_config.protocol_version_network + let current_network = Node_config_version.protocol_version_network - let current_patch = Node_config.protocol_version_patch + let current_patch = Node_config_version.protocol_version_patch let current = { transaction = current_transaction diff --git a/src/lib/prover/prover.ml b/src/lib/prover/prover.ml index f260405a475..2fbbfe47cf7 100644 --- a/src/lib/prover/prover.ml +++ b/src/lib/prover/prover.ml @@ -120,7 +120,7 @@ module Worker_state = struct let txn_snark_statement, txn_snark_proof = ledger_proof_opt next_state t in - Internal_tracing.Context_logger.with_logger (Some logger) + Context_logger.with_logger (Some logger) @@ fun () -> let%map.Async.Deferred (), (), proof = B.step @@ -331,19 +331,21 @@ module Worker = struct let max_size = 256 * 1024 * 512 in let num_rotate = 1 in Logger.Consumer_registry.register ~id:"default" - ~processor:(Logger.Processor.raw ()) + ~processor:(Logger.Processor.raw ()) ~commit_id ~transport: (Logger_file_system.dumb_logrotate ~directory:conf_dir - ~log_filename:"mina-prover.log" ~max_size ~num_rotate ) ; + ~log_filename:"mina-prover.log" ~max_size ~num_rotate ) + () ; Option.iter internal_trace_filename ~f:(fun log_filename -> Itn_logger.set_message_postprocessor Internal_tracing.For_itn_logger.post_process_message ; Logger.Consumer_registry.register ~id:Logger.Logger_id.mina - ~processor:Internal_tracing.For_logger.processor + ~processor:Internal_tracing.For_logger.processor ~commit_id ~transport: (Internal_tracing.For_logger.json_lines_rotate_transport ~directory:(conf_dir ^ "/internal-tracing") - ~log_filename () ) ) ; + ~log_filename () ) + () ) ; if enable_internal_tracing then don't_wait_for @@ Internal_tracing.toggle ~commit_id ~logger `Enabled ; [%log info] "Prover started" ; diff --git a/src/lib/rosetta_lib/dune b/src/lib/rosetta_lib/dune index 7548ae84124..a2e13d38186 100644 --- a/src/lib/rosetta_lib/dune +++ b/src/lib/rosetta_lib/dune @@ -26,7 +26,6 @@ rosetta_models mina_base currency - mina_compile_config unsigned_extended mina_base.import ) diff --git a/src/lib/rosetta_lib/errors.ml b/src/lib/rosetta_lib/errors.ml index 9a6e377b065..8ae99965c79 100644 --- a/src/lib/rosetta_lib/errors.ml +++ b/src/lib/rosetta_lib/errors.ml @@ -43,7 +43,7 @@ module Variant = struct `Transaction_submit_no_sender | `Transaction_submit_duplicate | `Transaction_submit_bad_nonce - | `Transaction_submit_fee_small + | `Transaction_submit_fee_small of string | `Transaction_submit_invalid_signature | `Transaction_submit_insufficient_balance | `Transaction_submit_expired ] @@ -126,7 +126,7 @@ end = struct "Can't send transaction: A duplicate is detected" | `Transaction_submit_bad_nonce -> "Can't send transaction: Nonce invalid" - | `Transaction_submit_fee_small -> + | `Transaction_submit_fee_small _ -> "Can't send transaction: Fee too small" | `Transaction_submit_invalid_signature -> "Can't send transaction: Invalid signature" @@ -206,7 +206,7 @@ end = struct None | `Transaction_submit_bad_nonce -> None - | `Transaction_submit_fee_small -> + | `Transaction_submit_fee_small _ -> None | `Transaction_submit_invalid_signature -> None @@ -260,7 +260,7 @@ end = struct false | `Transaction_submit_bad_nonce -> false - | `Transaction_submit_fee_small -> + | `Transaction_submit_fee_small _ -> false | `Transaction_submit_invalid_signature -> false @@ -326,11 +326,11 @@ end = struct "You must use the current nonce in your account in the ledger or one \ that is inferred based on pending transactions in the transaction \ pool." - | `Transaction_submit_fee_small -> + | `Transaction_submit_fee_small s -> sprintf "The minimum fee on transactions is %s . Please increase your fee to \ at least this amount." - (Currency.Fee.to_mina_string Currency.Fee.minimum_user_command_fee) + s | `Transaction_submit_invalid_signature -> "An invalid signature is attached to this transaction" | `Transaction_submit_insufficient_balance -> @@ -410,7 +410,7 @@ module Transaction_submit = struct (* This is a very hacky error message check from GraphQL right now. * We'll need to do some surgery on the daemon to properly pass errors through * GraphQL more explicitly *) - let of_request_error s = + let of_request_error ~minimum_user_command_fee s = let variant = let p pat = String.is_substring ~substring:pat s in if p "infer nonce for transaction from specified" then @@ -419,7 +419,9 @@ module Transaction_submit = struct else if p "either different from inferred nonce" then Some `Transaction_submit_bad_nonce else if p "is less than the minimum fee" then - Some `Transaction_submit_fee_small + Some + (`Transaction_submit_fee_small + (Currency.Fee.to_mina_string minimum_user_command_fee) ) else if p "Error: Invalid_signature" then Some `Transaction_submit_invalid_signature else if p "[\"Insufficient_funds\"]" then diff --git a/src/lib/rosetta_lib/memoize.ml b/src/lib/rosetta_lib/memoize.ml index 70a0037a27e..d3058bb9eb7 100644 --- a/src/lib/rosetta_lib/memoize.ml +++ b/src/lib/rosetta_lib/memoize.ml @@ -14,17 +14,21 @@ let ignores_args : ('a -> 'b) -> 'a -> 'b = fun _a -> b let build : - (graphql_uri:Uri.t -> unit -> ('gql, 'e) Deferred.Result.t) + ( graphql_uri:Uri.t + -> minimum_user_command_fee:Currency.Fee.t + -> unit + -> ('gql, 'e) Deferred.Result.t ) -> graphql_uri:Uri.t + -> minimum_user_command_fee:Currency.Fee.t -> unit -> ('gql, 'e) Deferred.Result.t = fun f -> let open Deferred.Result.Let_syntax in let cached_response : 'gql option ref = ref None in - fun ~graphql_uri () -> + fun ~graphql_uri ~minimum_user_command_fee () -> match !cached_response with | None -> - let%map r = f ~graphql_uri () in + let%map r = f ~graphql_uri ~minimum_user_command_fee () in cached_response := Some r ; r | Some r -> diff --git a/src/lib/rosetta_lib/transaction.ml b/src/lib/rosetta_lib/transaction.ml index cd3b47c65d5..45e9b0f8b94 100644 --- a/src/lib/rosetta_lib/transaction.ml +++ b/src/lib/rosetta_lib/transaction.ml @@ -25,9 +25,9 @@ module Unsigned = struct } [@@deriving yojson] - let is_fee_sufficient (payment : t) : bool = + let is_fee_sufficient ~minimum_user_command_fee (payment : t) : bool = let open Currency.Fee in - of_uint64 payment.fee >= Currency.Fee.minimum_user_command_fee + of_uint64 payment.fee >= minimum_user_command_fee end module Delegation = struct @@ -223,6 +223,32 @@ module Signed = struct ; stake_delegation : Unsigned.Rendered.Delegation.t option } [@@deriving yojson] + + let deprecated_fields = + [ "create_token"; "create_token_account"; "mint_tokens" ] + + let of_yojson = function + | `Assoc l -> + let open Result.Let_syntax in + let%bind l = + let exception Non_null of string in + try + return + @@ List.filter l ~f:(fun (field, json) -> + if List.mem ~equal:String.equal deprecated_fields field + then + match json with + | `Null -> + false + | _ -> + raise (Non_null field) + else true ) + with Non_null field -> + Error (sprintf "Found non-null deprecated field '%s'" field) + in + of_yojson (`Assoc l) + | x -> + of_yojson x end let render (t : t) = diff --git a/src/lib/runtime_config/dune b/src/lib/runtime_config/dune index 873dc3e8b9d..52380e39c46 100644 --- a/src/lib/runtime_config/dune +++ b/src/lib/runtime_config/dune @@ -39,7 +39,6 @@ signature_lib staged_ledger bounded_types - mina_compile_config ) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_custom_printf ppx_sexp_conv ppx_let ppx_deriving_yojson diff --git a/src/lib/runtime_config/runtime_config.ml b/src/lib/runtime_config/runtime_config.ml index 29d24ab0da8..2d8dfa305d5 100644 --- a/src/lib/runtime_config/runtime_config.ml +++ b/src/lib/runtime_config/runtime_config.ml @@ -473,6 +473,7 @@ module Json_layout = struct ; zkapp_cmd_limit_hardcap : int option [@default None] ; slot_tx_end : int option [@default None] ; slot_chain_end : int option [@default None] + ; minimum_user_command_fee : Currency.Fee.t option ; network_id : string option [@default None] } [@@deriving yojson, fields] @@ -639,7 +640,6 @@ module Accounts = struct let to_account (a : t) : Mina_base.Account.t = let open Signature_lib in - let open Mina_base.Account.Poly in let timing = let open Mina_base.Account_timing.Poly in match a.timing with @@ -1221,6 +1221,8 @@ module Daemon = struct ; zkapp_cmd_limit_hardcap : int option [@default None] ; slot_tx_end : int option [@default None] ; slot_chain_end : int option [@default None] + ; minimum_user_command_fee : Currency.Fee.Stable.Latest.t option + [@default None] ; network_id : string option [@default None] } [@@deriving bin_io_unversioned] @@ -1261,6 +1263,9 @@ module Daemon = struct ; slot_tx_end = opt_fallthrough ~default:t1.slot_tx_end t2.slot_tx_end ; slot_chain_end = opt_fallthrough ~default:t1.slot_chain_end t2.slot_chain_end + ; minimum_user_command_fee = + opt_fallthrough ~default:t1.minimum_user_command_fee + t2.minimum_user_command_fee ; network_id = opt_fallthrough ~default:t1.network_id t2.network_id } @@ -1273,6 +1278,9 @@ module Daemon = struct let%bind zkapp_transaction_cost_limit = Float.gen_incl 0.0 100.0 in let%bind max_event_elements = Int.gen_incl 0 100 in let%bind zkapp_cmd_limit_hardcap = Int.gen_incl 0 1000 in + let%bind minimum_user_command_fee = + Currency.Fee.(gen_incl one (of_mina_int_exn 10)) + in let%map max_action_elements = Int.gen_incl 0 1000 in { txpool_max_size = Some txpool_max_size ; peer_list_url = None @@ -1285,6 +1293,7 @@ module Daemon = struct ; zkapp_cmd_limit_hardcap = Some zkapp_cmd_limit_hardcap ; slot_tx_end = None ; slot_chain_end = None + ; minimum_user_command_fee = Some minimum_user_command_fee ; network_id = None } end @@ -1583,14 +1592,12 @@ let make_fork_config ~staged_ledger ~global_slot_since_genesis ~state_hash } ~proof:(Proof_keys.make ~fork ()) () -let slot_tx_end_or_default, slot_chain_end_or_default = - let f compile get_runtime t = - Option.map ~f:Mina_numbers.Global_slot_since_hard_fork.of_int - @@ Option.value_map t.daemon ~default:compile ~f:(fun daemon -> - Option.merge compile ~f:(fun _c r -> r) @@ get_runtime daemon ) +let slot_tx_end, slot_chain_end = + let f get_runtime t = + let open Option.Let_syntax in + t.daemon >>= get_runtime >>| Mina_numbers.Global_slot_since_hard_fork.of_int in - ( f Mina_compile_config.slot_tx_end (fun d -> d.slot_tx_end) - , f Mina_compile_config.slot_chain_end (fun d -> d.slot_chain_end) ) + (f (fun d -> d.slot_tx_end), f (fun d -> d.slot_chain_end)) module Test_configs = struct let bootstrap = diff --git a/src/lib/signature_kind/compile_config/mina_signature_kind.ml b/src/lib/signature_kind/compile_config/mina_signature_kind.ml index 407fbee6ec6..9b0d8fc486f 100644 --- a/src/lib/signature_kind/compile_config/mina_signature_kind.ml +++ b/src/lib/signature_kind/compile_config/mina_signature_kind.ml @@ -1,4 +1,4 @@ -type t = Testnet | Mainnet | Other_network of string +include Mina_signature_kind_type let t = match Node_config.network with diff --git a/src/lib/signature_kind/dune b/src/lib/signature_kind/dune index 386298976ee..49f8609f479 100644 --- a/src/lib/signature_kind/dune +++ b/src/lib/signature_kind/dune @@ -1,6 +1,7 @@ (library (name mina_signature_kind) (public_name mina_signature_kind) + (libraries mina_signature_kind.type) (preprocess (pps ppx_version)) (instrumentation (backend bisect_ppx)) (virtual_modules mina_signature_kind) diff --git a/src/lib/signature_kind/mainnet/mina_signature_kind.ml b/src/lib/signature_kind/mainnet/mina_signature_kind.ml index f890f8fa41b..412d2eaef58 100644 --- a/src/lib/signature_kind/mainnet/mina_signature_kind.ml +++ b/src/lib/signature_kind/mainnet/mina_signature_kind.ml @@ -1,3 +1,3 @@ -type t = Testnet | Mainnet | Other_network of string +include Mina_signature_kind_type let t = Mainnet diff --git a/src/lib/signature_kind/mina_signature_kind.mli b/src/lib/signature_kind/mina_signature_kind.mli index 387650838fc..22295330db8 100644 --- a/src/lib/signature_kind/mina_signature_kind.mli +++ b/src/lib/signature_kind/mina_signature_kind.mli @@ -1,3 +1,6 @@ -type t = Testnet | Mainnet | Other_network of string +type t = Mina_signature_kind_type.t = + | Testnet + | Mainnet + | Other_network of string val t : t diff --git a/src/lib/signature_kind/testnet/mina_signature_kind.ml b/src/lib/signature_kind/testnet/mina_signature_kind.ml index 08814b39a4e..fdd7d4bfc22 100644 --- a/src/lib/signature_kind/testnet/mina_signature_kind.ml +++ b/src/lib/signature_kind/testnet/mina_signature_kind.ml @@ -1,3 +1,3 @@ -type t = Testnet | Mainnet | Other_network of string +include Mina_signature_kind_type let t = Testnet diff --git a/src/lib/signature_kind/type/dune b/src/lib/signature_kind/type/dune new file mode 100644 index 00000000000..19b8f4bdb7f --- /dev/null +++ b/src/lib/signature_kind/type/dune @@ -0,0 +1,5 @@ +(library + (name mina_signature_kind_type) + (public_name mina_signature_kind.type) + (preprocess (pps ppx_version)) + (instrumentation (backend bisect_ppx))) diff --git a/src/lib/signature_kind/type/mina_signature_kind_type.ml b/src/lib/signature_kind/type/mina_signature_kind_type.ml new file mode 100644 index 00000000000..7b466af5884 --- /dev/null +++ b/src/lib/signature_kind/type/mina_signature_kind_type.ml @@ -0,0 +1 @@ +type t = Testnet | Mainnet | Other_network of string diff --git a/src/lib/signature_lib/dune b/src/lib/signature_lib/dune index 1dc9b5e9eb8..7038b38ca2c 100644 --- a/src/lib/signature_lib/dune +++ b/src/lib/signature_lib/dune @@ -24,8 +24,6 @@ codable snark_params mina_debug - mina_node_config - mina_signature_kind blake2 hash_prefix_states non_zero_curve_point diff --git a/src/lib/snark_params/snark_params.ml b/src/lib/snark_params/snark_params.ml index 64a572efdce..93a7227b02d 100644 --- a/src/lib/snark_params/snark_params.ml +++ b/src/lib/snark_params/snark_params.ml @@ -183,6 +183,10 @@ module Tick = struct include Tick0.Field module Bits = Bits.Make_field (Tick0.Field) (Tick0.Bigint) + let to_yojson = Kimchi_pasta_basic.Fp.to_yojson + + let of_yojson = Kimchi_pasta_basic.Fp.of_yojson + let size_in_triples = Int.((size_in_bits + 2) / 3) end diff --git a/src/lib/snark_profiler_lib/snark_profiler_lib.ml b/src/lib/snark_profiler_lib/snark_profiler_lib.ml index 53481dd8209..92340905980 100644 --- a/src/lib/snark_profiler_lib/snark_profiler_lib.ml +++ b/src/lib/snark_profiler_lib/snark_profiler_lib.ml @@ -5,12 +5,6 @@ open Signature_lib open Mina_base open Mina_transaction -let constraint_constants = Genesis_constants.Constraint_constants.compiled - -let genesis_constants = Genesis_constants.compiled - -let proof_level = Genesis_constants.Proof_level.compiled - (* We're just profiling, so okay to monkey-patch here *) module Sparse_ledger = struct include Mina_ledger.Sparse_ledger @@ -18,7 +12,9 @@ module Sparse_ledger = struct let merkle_root t = Frozen_ledger_hash.of_ledger_hash @@ merkle_root t end -let create_ledger_and_transactions num_transactions : +let create_ledger_and_transactions + ~(constraint_constants : Genesis_constants.Constraint_constants.t) + num_transactions : Mina_ledger.Ledger.t * _ User_command.t_ Transaction.t_ list = let num_accounts = 4 in let ledger = @@ -118,7 +114,9 @@ module Transaction_key = struct include Comparable.Make (T) include Hashable.Make (T) - let of_zkapp_command ~ledger (p : Zkapp_command.t) = + let of_zkapp_command + ~(constraint_constants : Genesis_constants.Constraint_constants.t) ~ledger + (p : Zkapp_command.t) = let second_pass_ledger = let new_mask = Mina_ledger.Ledger.Mask.create @@ -187,6 +185,8 @@ end let transaction_combinations = Transaction_key.Table.create () let create_ledger_and_zkapps ?(min_num_updates = 1) ?(num_proof_updates = 0) + ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) ~max_num_updates () : (Mina_ledger.Ledger.t * Zkapp_command.t list) Async.Deferred.t = let `VK verification_key, `Prover prover = @@ -210,7 +210,7 @@ let create_ledger_and_zkapps ?(min_num_updates = 1) ?(num_proof_updates = 0) ~data:kp.private_key ) in let balances = - let min_cmd_fee = Currency.Fee.minimum_user_command_fee in + let min_cmd_fee = genesis_constants.minimum_user_command_fee in let min_balance = Currency.Fee.to_nanomina_int min_cmd_fee |> Int.( + ) 1_000_000_000_000_000 @@ -394,7 +394,10 @@ let create_ledger_and_zkapps ?(min_num_updates = 1) ?(num_proof_updates = 0) let p = Zkapp_command.of_simple { simple_parties with account_updates } in - let combination = Transaction_key.of_zkapp_command ~ledger p in + let combination = + Transaction_key.of_zkapp_command ~constraint_constants ~ledger + p + in let perm_string = List.fold ~init:"S" account_updates ~f:(fun acc (p : Account_update.Simple.t) -> @@ -435,66 +438,6 @@ let create_ledger_and_zkapps ?(min_num_updates = 1) ?(num_proof_updates = 0) in (ledger, zkapp) -let _create_ledger_and_zkapps_from_generator num_transactions : - Mina_ledger.Ledger.t * Zkapp_command.t list = - let length = - match num_transactions with - | `Count length -> - length - | `Two_from_same -> - failwith "Must provide a count when profiling with snapps" - in - let max_account_updates = 6 in - printf - !"Generating zkApp transactions with %d updates\n%!" - max_account_updates ; - let start = Time.now () in - let `VK vk, `Prover prover = - Transaction_snark.For_tests.create_trivial_snapp ~constraint_constants () - in - let vk = Async.Thread_safe.block_on_async_exn (fun () -> vk) in - let cmd_infos, ledger = - Quickcheck.random_value - (Mina_generators.User_command_generators - .sequence_zkapp_command_with_ledger ~max_account_updates ~length ~vk () ) - in - let zkapps = - List.map cmd_infos ~f:(fun (user_cmd, _keypair, keymap) -> - match user_cmd with - | User_command.Zkapp_command parties_valid -> - let parties = Zkapp_command.Valid.forget parties_valid in - let other_parties = Zkapp_command.account_updates_list parties in - let proof_count, signature_count, no_auths = - List.fold ~init:(0, 0, 0) - (Account_update.of_fee_payer parties.fee_payer :: other_parties) - ~f:(fun (pc, sc, na) (p : Account_update.t) -> - match p.authorization with - | Proof _ -> - (pc + 1, sc, na) - | Signature _ -> - (pc, sc + 1, na) - | _ -> - (pc, sc, na + 1) ) - in - printf - !"Generated zkapp with %d parties of which %d signatures, %d \ - proofs and %d none\n\ - %!" - (List.length other_parties + 1) - signature_count proof_count no_auths ; - Async.Thread_safe.block_on_async_exn (fun () -> - Zkapp_command_builder.replace_authorizations - ~prover (*~dummy_proof:proof*) - ~keymap - (Zkapp_command.Valid.forget parties_valid) ) - | User_command.Signed_command _ -> - failwith "Expected Zkapp_command user command" ) - in - printf - !"Time to generate zkapps: %f secs\n%!" - Time.(Span.to_sec (diff (now ()) start)) ; - (ledger, zkapps) - let time thunk = let start = Time.now () in let x = thunk () in @@ -509,23 +452,48 @@ let rec pair_up = function | _ -> failwith "Expected even length list" -let precomputed_values = Precomputed_values.compiled_inputs +let state_body ~(genesis_constants : Genesis_constants.t) + ~(constraint_constants : Genesis_constants.Constraint_constants.t) = + lazy + (let genesis_epoch_data = Consensus.Genesis_epoch_data.compiled in + let consensus_constants = + Consensus.Constants.create ~constraint_constants + ~protocol_constants:genesis_constants.protocol + in + (* TODO: Do we really need to create a whole ledger just to compute this? + Probably not.. + *) + let module Test_genesis_ledger = struct + include Genesis_ledger.Make (struct + include Test_genesis_ledger + + let directory = `Ephemeral -let state_body = - Mina_state.( - Lazy.map precomputed_values ~f:(fun values -> - values.protocol_state_with_hashes.data |> Protocol_state.body )) + let depth = constraint_constants.ledger_depth + end) + end in + Mina_state.Genesis_protocol_state.t ~genesis_ledger:Test_genesis_ledger.t + ~genesis_epoch_data ~constraint_constants ~consensus_constants + ~genesis_body_reference:Staged_ledger_diff.genesis_body_reference + |> With_hash.data |> Mina_state.Protocol_state.body ) -let curr_state_view = Lazy.map state_body ~f:Mina_state.Protocol_state.Body.view +let curr_state_view ~genesis_constants ~constraint_constants = + Lazy.map + (state_body ~genesis_constants ~constraint_constants) + ~f:Mina_state.Protocol_state.Body.view -let state_body_hash = Lazy.map ~f:Mina_state.Protocol_state.Body.hash state_body +let state_body_hash ~genesis_constants ~constraint_constants = + Lazy.map ~f:Mina_state.Protocol_state.Body.hash + (state_body ~genesis_constants ~constraint_constants) -let pending_coinbase_stack_target (t : Transaction.t) stack = +let pending_coinbase_stack_target ~genesis_constants ~constraint_constants + (t : Transaction.t) stack = let stack_with_state = Pending_coinbase.Stack.( push_state - (Lazy.force state_body_hash) - (Lazy.force curr_state_view).global_slot_since_genesis stack) + (Lazy.force @@ state_body_hash ~genesis_constants ~constraint_constants) + (Lazy.force @@ curr_state_view ~genesis_constants ~constraint_constants) + .global_slot_since_genesis stack) in let target = match t with @@ -540,6 +508,7 @@ let format_time_span ts = sprintf !"Total time was: %{Time.Span.to_string_hum}" ts let apply_transactions_and_keep_intermediate_ledgers + ~(constraint_constants : Genesis_constants.Constraint_constants.t) ~(txn_state_view : Zkapp_precondition.Protocol_state.View.t) first_pass_ledger txns = let first_pass_target_ledgers, partially_applied_txns = @@ -568,13 +537,16 @@ let apply_transactions_and_keep_intermediate_ledgers (* This gives the "wall-clock time" to snarkify the given list of transactions, assuming unbounded parallelism. *) -let profile_user_command (module T : Transaction_snark.S) sparse_ledger0 +let profile_user_command (module T : Transaction_snark.S) ~genesis_constants + ~constraint_constants sparse_ledger0 (transitions : Transaction.Valid.t list) _ : string Async.Deferred.t = - let txn_state_view = Lazy.force curr_state_view in + let txn_state_view = + Lazy.force @@ curr_state_view ~genesis_constants ~constraint_constants + in let open Async.Deferred.Let_syntax in let first_pass_target_ledgers, second_pass_target_ledgers, applied_txns = - apply_transactions_and_keep_intermediate_ledgers ~txn_state_view - sparse_ledger0 transitions + apply_transactions_and_keep_intermediate_ledgers ~constraint_constants + ~txn_state_view sparse_ledger0 transitions in let final_first_pass_ledger = Sparse_ledger.merkle_root (List.last_exn first_pass_target_ledgers) @@ -617,7 +589,9 @@ let profile_user_command (module T : Transaction_snark.S) sparse_ledger0 ; target = { first_pass_ledger = target_hash ; second_pass_ledger = target_hash - ; pending_coinbase_stack = coinbase_stack_target + ; pending_coinbase_stack = + coinbase_stack_target ~genesis_constants + ~constraint_constants ; local_state = Mina_state.Local_state.empty () } ; connecting_ledger_left = target_hash @@ -633,14 +607,18 @@ let profile_user_command (module T : Transaction_snark.S) sparse_ledger0 } ~init_stack:coinbase_stack_source { Transaction_protocol_state.Poly.transaction = valid_txn - ; block_data = Lazy.force state_body + ; block_data = + Lazy.force + @@ state_body ~genesis_constants ~constraint_constants ; global_slot = txn_state_view.global_slot_since_genesis } (unstage (Sparse_ledger.handler source_ledger)) in let tm1 = Core.Unix.gettimeofday () in let span = Time.Span.of_sec (tm1 -. tm0) in - ( (Time.Span.max span max_span, target_ledger, coinbase_stack_target) + ( ( Time.Span.max span max_span + , target_ledger + , coinbase_stack_target ~genesis_constants ~constraint_constants ) , proof :: proofs ) ) in let rec merge_all serial_time proofs = @@ -672,7 +650,9 @@ let profile_user_command (module T : Transaction_snark.S) sparse_ledger0 let%map total_time = merge_all base_proof_time (List.rev base_proofs_rev) in format_time_span total_time -let profile_zkapps ~verifier ledger zkapp_commands = +let profile_zkapps + ~(constraint_constants : Genesis_constants.Constraint_constants.t) ~verifier + ledger zkapp_commands = let open Async.Deferred.Let_syntax in let tm0 = Core.Unix.gettimeofday () in let%map () = @@ -743,8 +723,8 @@ let profile_zkapps ~verifier ledger zkapp_commands = let combination = Transaction_key.of_zkapp_command ~ledger zkapp_command in - Transaction_key.Table.change transaction_combinations combination - ~f:(fun data_opt -> + Transaction_key.Table.change transaction_combinations + (combination ~constraint_constants) ~f:(fun data_opt -> let txn, _, perm_string = Option.value_exn data_opt in Some (txn, time_values, perm_string) ) ; printf @@ -783,18 +763,20 @@ let profile_zkapps ~verifier ledger zkapp_commands = let total_time = Time.Span.of_sec (tm1 -. tm0) in format_time_span total_time -let check_base_snarks sparse_ledger0 (transitions : Transaction.Valid.t list) - preeval = +let check_base_snarks ~genesis_constants ~constraint_constants sparse_ledger0 + (transitions : Transaction.Valid.t list) preeval = ignore ( let sok_message = Sok_message.create ~fee:Currency.Fee.zero ~prover: Public_key.(compress (of_private_key_exn (Private_key.create ()))) in - let txn_state_view = Lazy.force curr_state_view in + let txn_state_view = + Lazy.force @@ curr_state_view ~genesis_constants ~constraint_constants + in let first_pass_target_ledgers, _, applied_txns = - apply_transactions_and_keep_intermediate_ledgers ~txn_state_view - sparse_ledger0 transitions + apply_transactions_and_keep_intermediate_ledgers ~constraint_constants + ~txn_state_view sparse_ledger0 transitions in List.zip_exn first_pass_target_ledgers applied_txns |> List.fold ~init:sparse_ledger0 @@ -813,7 +795,7 @@ let check_base_snarks sparse_ledger0 (transitions : Transaction.Valid.t list) in let supply_increase = Mina_ledger.Ledger.Transaction_applied.supply_increase - applied_txn + ~constraint_constants applied_txn |> Or_error.ok_exn in let () = @@ -826,11 +808,14 @@ let check_base_snarks sparse_ledger0 (transitions : Transaction.Valid.t list) ~init_stack:Pending_coinbase.Stack.empty ~pending_coinbase_stack_state: { source = Pending_coinbase.Stack.empty - ; target = coinbase_stack_target + ; target = + coinbase_stack_target ~genesis_constants + ~constraint_constants } ~supply_increase { Transaction_protocol_state.Poly.block_data = - Lazy.force state_body + Lazy.force + @@ state_body ~genesis_constants ~constraint_constants ; transaction = valid_txn ; global_slot = txn_state_view.global_slot_since_genesis } @@ -840,18 +825,20 @@ let check_base_snarks sparse_ledger0 (transitions : Transaction.Valid.t list) : Sparse_ledger.t ) ; Async.Deferred.return "Base constraint system satisfied" -let generate_base_snarks_witness sparse_ledger0 - (transitions : Transaction.Valid.t list) preeval = +let generate_base_snarks_witness ~genesis_constants ~constraint_constants + sparse_ledger0 (transitions : Transaction.Valid.t list) preeval = ignore ( let sok_message = Sok_message.create ~fee:Currency.Fee.zero ~prover: Public_key.(compress (of_private_key_exn (Private_key.create ()))) in - let txn_state_view = Lazy.force curr_state_view in + let txn_state_view = + Lazy.force @@ curr_state_view ~genesis_constants ~constraint_constants + in let first_pass_target_ledgers, _, applied_txns = - apply_transactions_and_keep_intermediate_ledgers ~txn_state_view - sparse_ledger0 transitions + apply_transactions_and_keep_intermediate_ledgers ~constraint_constants + ~txn_state_view sparse_ledger0 transitions in List.zip_exn first_pass_target_ledgers applied_txns |> List.fold ~init:sparse_ledger0 @@ -870,7 +857,7 @@ let generate_base_snarks_witness sparse_ledger0 in let supply_increase = Mina_ledger.Ledger.Transaction_applied.supply_increase - applied_txn + ~constraint_constants applied_txn |> Or_error.ok_exn in let () = @@ -884,11 +871,15 @@ let generate_base_snarks_witness sparse_ledger0 ~pending_coinbase_stack_state: { Transaction_snark.Pending_coinbase_stack_state.source = Pending_coinbase.Stack.empty - ; target = coinbase_stack_target + ; target = + coinbase_stack_target ~genesis_constants + ~constraint_constants } ~supply_increase { Transaction_protocol_state.Poly.transaction = valid_txn - ; block_data = Lazy.force state_body + ; block_data = + Lazy.force + @@ state_body ~genesis_constants ~constraint_constants ; global_slot = txn_state_view.global_slot_since_genesis } (unstage (Sparse_ledger.handler source_ledger)) diff --git a/src/lib/snark_worker/dune b/src/lib/snark_worker/dune index cb52b4b4cdf..35f564ad95a 100644 --- a/src/lib/snark_worker/dune +++ b/src/lib/snark_worker/dune @@ -42,7 +42,7 @@ mina_ledger transaction_snark_work error_json - mina_compile_config + mina_node_config.unconfigurable_constants mina_state transaction_protocol_state ppx_version.runtime diff --git a/src/lib/snark_worker/functor.ml b/src/lib/snark_worker/functor.ml index 20ad043775d..a62453e2877 100644 --- a/src/lib/snark_worker/functor.ml +++ b/src/lib/snark_worker/functor.ml @@ -122,15 +122,17 @@ module Make (Inputs : Intf.Inputs_intf) : let%map res = Rpc.Connection.with_client ~handshake_timeout: - (Time.Span.of_sec Mina_compile_config.rpc_handshake_timeout_sec) + (Time.Span.of_sec + Node_config_unconfigurable_constants.rpc_handshake_timeout_sec ) ~heartbeat_config: (Rpc.Connection.Heartbeat_config.create ~timeout: (Time_ns.Span.of_sec - Mina_compile_config.rpc_heartbeat_timeout_sec ) + Node_config_unconfigurable_constants.rpc_heartbeat_timeout_sec ) ~send_every: (Time_ns.Span.of_sec - Mina_compile_config.rpc_heartbeat_send_every_sec ) + Node_config_unconfigurable_constants + .rpc_heartbeat_send_every_sec ) () ) (Tcp.Where_to_connect.of_host_and_port address) (fun conn -> Rpc.Rpc.dispatch rpc conn query) @@ -226,11 +228,7 @@ module Make (Inputs : Intf.Inputs_intf) : let main (module Rpcs_versioned : Intf.Rpcs_versioned_S with type Work.ledger_proof = Inputs.Ledger_proof.t ) ~logger - ~proof_level daemon_address shutdown_on_disconnect = - let constraint_constants = - (* TODO: Make this configurable. *) - Genesis_constants.Constraint_constants.compiled - in + ~proof_level ~constraint_constants daemon_address shutdown_on_disconnect = let%bind state = Worker_state.create ~constraint_constants ~proof_level () in @@ -342,7 +340,8 @@ module Make (Inputs : Intf.Inputs_intf) : in go () - let command_from_rpcs + let command_from_rpcs ~commit_id ~proof_level:default_proof_level + ~constraint_constants (module Rpcs_versioned : Intf.Rpcs_versioned_S with type Work.ledger_proof = Inputs.Ledger_proof.t ) = Command.async ~summary:"Snark worker" @@ -366,26 +365,27 @@ module Make (Inputs : Intf.Inputs_intf) : let logger = Logger.create () ~metadata:[ ("process", `String "Snark Worker") ] in + let proof_level = + Option.value ~default:default_proof_level proof_level + in Option.value_map ~default:() conf_dir ~f:(fun conf_dir -> let logrotate_max_size = 1024 * 10 in let logrotate_num_rotate = 1 in - Logger.Consumer_registry.register ~id:Logger.Logger_id.snark_worker + Logger.Consumer_registry.register ~commit_id + ~id:Logger.Logger_id.snark_worker ~processor:(Logger.Processor.raw ()) ~transport: (Logger_file_system.dumb_logrotate ~directory:conf_dir ~log_filename:"mina-snark-worker.log" - ~max_size:logrotate_max_size ~num_rotate:logrotate_num_rotate ) ) ; + ~max_size:logrotate_max_size ~num_rotate:logrotate_num_rotate ) + () ) ; Signal.handle [ Signal.term ] ~f:(fun _signal -> [%log info] !"Received signal to terminate. Aborting snark worker process" ; Core.exit 0 ) ; - let proof_level = - Option.value ~default:Genesis_constants.Proof_level.compiled - proof_level - in main (module Rpcs_versioned) - ~logger ~proof_level daemon_port + ~logger ~proof_level ~constraint_constants daemon_port (Option.value ~default:true shutdown_on_disconnect)) let arguments ~proof_level ~daemon_address ~shutdown_on_disconnect = diff --git a/src/lib/snark_worker/intf.ml b/src/lib/snark_worker/intf.ml index e36b146ab00..9173d066d9c 100644 --- a/src/lib/snark_worker/intf.ml +++ b/src/lib/snark_worker/intf.ml @@ -153,7 +153,10 @@ module type S0 = sig end val command_from_rpcs : - (module Rpcs_versioned_S with type Work.ledger_proof = ledger_proof) + commit_id:string + -> proof_level:Genesis_constants.Proof_level.t + -> constraint_constants:Genesis_constants.Constraint_constants.t + -> (module Rpcs_versioned_S with type Work.ledger_proof = ledger_proof) -> Command.t val arguments : @@ -170,5 +173,9 @@ module type S = sig module Rpcs_versioned : Rpcs_versioned_S with type Work.ledger_proof = ledger_proof - val command : Command.t + val command : + commit_id:string + -> proof_level:Genesis_constants.Proof_level.t + -> constraint_constants:Genesis_constants.Constraint_constants.t + -> Command.t end diff --git a/src/lib/snark_worker/standalone/run_snark_worker.ml b/src/lib/snark_worker/standalone/run_snark_worker.ml index e60efb84eef..771f647c6c2 100644 --- a/src/lib/snark_worker/standalone/run_snark_worker.ml +++ b/src/lib/snark_worker/standalone/run_snark_worker.ml @@ -19,10 +19,11 @@ let command = in fun () -> let open Async in + let constraint_constants = + Genesis_constants.Compiled.constraint_constants + in let%bind worker_state = - Prod.Worker_state.create - ~constraint_constants:Genesis_constants.Constraint_constants.compiled - ~proof_level () + Prod.Worker_state.create ~constraint_constants ~proof_level () in let public_key = fst Key_gen.Sample_keypairs.genesis_winner in let fee = Currency.Fee.of_nanomina_int_exn 10 in diff --git a/src/lib/staged_ledger/dune b/src/lib/staged_ledger/dune index 28dae16d0cc..5ff42d9fe0b 100644 --- a/src/lib/staged_ledger/dune +++ b/src/lib/staged_ledger/dune @@ -37,7 +37,6 @@ ledger_proof logger transaction_snark - transaction_snark_tests transaction_snark_scan_state sgn mina_base diff --git a/src/lib/staged_ledger/staged_ledger.ml b/src/lib/staged_ledger/staged_ledger.ml index 2e717b5759a..af202350850 100644 --- a/src/lib/staged_ledger/staged_ledger.ml +++ b/src/lib/staged_ledger/staged_ledger.ml @@ -561,8 +561,9 @@ module T = struct ; init_stack = new_init_stack } ) - let apply_single_transaction_second_pass ~connecting_ledger ledger - state_and_body_hash ~global_slot (pre_stmt : Pre_statement.t) = + let apply_single_transaction_second_pass ~constraint_constants + ~connecting_ledger ledger state_and_body_hash ~global_slot + (pre_stmt : Pre_statement.t) = let open Result.Let_syntax in let empty_local_state = Mina_state.Local_state.empty () in let second_pass_ledger_source_hash = Ledger.merkle_root ledger in @@ -579,7 +580,8 @@ module T = struct let second_pass_ledger_target_hash = Ledger.merkle_root ledger in let%bind supply_increase = to_staged_ledger_or_error - (Ledger.Transaction_applied.supply_increase applied_txn) + (Ledger.Transaction_applied.supply_increase ~constraint_constants + applied_txn ) in let%map () = let actual_status = @@ -654,14 +656,14 @@ module T = struct in (List.rev res_rev, pending_coinbase_stack_state.pc.target) - let apply_transactions_second_pass ~yield ~global_slot ledger - state_and_body_hash pre_stmts = + let apply_transactions_second_pass ~constraint_constants ~yield ~global_slot + ledger state_and_body_hash pre_stmts = let open Deferred.Result.Let_syntax in let connecting_ledger = Ledger.merkle_root ledger in Mina_stdlib.Deferred.Result.List.map pre_stmts ~f:(fun pre_stmt -> let%bind result = - apply_single_transaction_second_pass ~connecting_ledger ~global_slot - ledger state_and_body_hash pre_stmt + apply_single_transaction_second_pass ~constraint_constants + ~connecting_ledger ~global_slot ledger state_and_body_hash pre_stmt |> Deferred.return in let%map () = yield () in @@ -702,8 +704,8 @@ module T = struct in let first_pass_ledger_end = Ledger.merkle_root ledger in let%map txns_with_witnesses = - apply_transactions_second_pass ~yield ~global_slot ledger - state_and_body_hash (pre_stmts1 @ pre_stmts2) + apply_transactions_second_pass ~constraint_constants ~yield ~global_slot + ledger state_and_body_hash (pre_stmts1 @ pre_stmts2) in (txns_with_witnesses, updated_stack1, updated_stack2, first_pass_ledger_end) @@ -818,8 +820,9 @@ module T = struct ~f:(fun _ -> check (List.drop data (fst partitions.first)) partitions) partitions.second - let update_coinbase_stack_and_get_data ~logger ~constraint_constants - ~global_slot scan_state ledger pending_coinbase_collection transactions + let update_coinbase_stack_and_get_data_impl ~logger ~constraint_constants + ~global_slot ~first_partition_slots:slots ~no_second_partition + ~is_new_stack ledger pending_coinbase_collection transactions current_state_view state_and_body_hash = let open Deferred.Result.Let_syntax in let coinbase_exists txns = @@ -832,101 +835,104 @@ module T = struct Continue acc ) ~finish:Fn.id in + if no_second_partition then ( + (*Single partition: + 1.Check if a new stack is required and get a working stack [working_stack] + 2.create data for enqueuing onto the scan state *) + let%bind working_stack = + working_stack pending_coinbase_collection ~is_new_stack + |> Deferred.return + in + [%log internal] "Update_ledger_and_get_statements" + ~metadata:[ ("partition", `String "single") ] ; + let%map data, updated_stack, _, first_pass_ledger_end = + update_ledger_and_get_statements ~constraint_constants ~global_slot + ledger working_stack (transactions, None) current_state_view + state_and_body_hash + in + [%log internal] "Update_ledger_and_get_statements_done" ; + [%log internal] "Update_coinbase_stack_done" + ~metadata: + [ ("is_new_stack", `Bool is_new_stack) + ; ("transactions_len", `Int (List.length transactions)) + ; ("data_len", `Int (List.length data)) + ] ; + ( is_new_stack + , data + , Pending_coinbase.Update.Action.Update_one + , `Update_one updated_stack + , `First_pass_ledger_end first_pass_ledger_end ) ) + else + (*Two partition: + Assumption: Only one of the partition will have coinbase transaction(s)in it. + 1. Get the latest stack for coinbase in the first set of transactions + 2. get the first set of scan_state data[data1] + 3. get a new stack for the second partion because the second set of transactions would start from the begining of the next tree in the scan_state + 4. Initialize the new stack with the state from the first stack + 5. get the second set of scan_state data[data2]*) + let txns_for_partition1 = List.take transactions slots in + let coinbase_in_first_partition = coinbase_exists txns_for_partition1 in + let%bind working_stack1 = + working_stack pending_coinbase_collection ~is_new_stack:false + |> Deferred.return + in + let txns_for_partition2 = List.drop transactions slots in + [%log internal] "Update_ledger_and_get_statements" + ~metadata:[ ("partition", `String "both") ] ; + let%map data, updated_stack1, updated_stack2, first_pass_ledger_end = + update_ledger_and_get_statements ~constraint_constants ~global_slot + ledger working_stack1 + (txns_for_partition1, Some txns_for_partition2) + current_state_view state_and_body_hash + in + [%log internal] "Update_ledger_and_get_statements_done" ; + let second_has_data = List.length txns_for_partition2 > 0 in + let pending_coinbase_action, stack_update = + match (coinbase_in_first_partition, second_has_data) with + | true, true -> + ( Pending_coinbase.Update.Action.Update_two_coinbase_in_first + , `Update_two (updated_stack1, updated_stack2) ) + (*updated_stack2 does not have coinbase and but has the state from the previous stack*) + | true, false -> + (*updated_stack1 has some new coinbase but parition 2 has no + data and so we have only one stack to update*) + (Update_one, `Update_one updated_stack1) + | false, true -> + (*updated_stack1 just has the new state. [updated stack2] might have coinbase, definitely has some + data and therefore will have a non-dummy state.*) + ( Update_two_coinbase_in_second + , `Update_two (updated_stack1, updated_stack2) ) + | false, false -> + (* a diff consists of only non-coinbase transactions. This is currently not possible because a diff will have a coinbase at the very least, so don't update anything?*) + (Update_none, `Update_none) + in + [%log internal] "Update_coinbase_stack_done" + ~metadata: + [ ("is_new_stack", `Bool false) + ; ("coinbase_in_first_partition", `Bool coinbase_in_first_partition) + ; ("second_has_data", `Bool second_has_data) + ; ("txns_for_partition1_len", `Int (List.length txns_for_partition1)) + ; ("txns_for_partition2_len", `Int (List.length txns_for_partition2)) + ] ; + ( false + , data + , pending_coinbase_action + , stack_update + , `First_pass_ledger_end first_pass_ledger_end ) + + let update_coinbase_stack_and_get_data ~logger ~constraint_constants + ~global_slot scan_state ledger pending_coinbase_collection transactions + current_state_view state_and_body_hash = let { Scan_state.Space_partition.first = slots, _; second } = Scan_state.partition_if_overflowing scan_state in - if not @@ List.is_empty transactions then ( - match second with - | None -> - (*Single partition: - 1.Check if a new stack is required and get a working stack [working_stack] - 2.create data for enqueuing onto the scan state *) - let is_new_stack = Scan_state.next_on_new_tree scan_state in - let%bind working_stack = - working_stack pending_coinbase_collection ~is_new_stack - |> Deferred.return - in - [%log internal] "Update_ledger_and_get_statements" - ~metadata:[ ("partition", `String "single") ] ; - let%map data, updated_stack, _, first_pass_ledger_end = - update_ledger_and_get_statements ~constraint_constants ~global_slot - ledger working_stack (transactions, None) current_state_view - state_and_body_hash - in - [%log internal] "Update_ledger_and_get_statements_done" ; - [%log internal] "Update_coinbase_stack_done" - ~metadata: - [ ("is_new_stack", `Bool is_new_stack) - ; ("transactions_len", `Int (List.length transactions)) - ; ("data_len", `Int (List.length data)) - ] ; - ( is_new_stack - , data - , Pending_coinbase.Update.Action.Update_one - , `Update_one updated_stack - , `First_pass_ledger_end first_pass_ledger_end ) - | Some _ -> - (*Two partition: - Assumption: Only one of the partition will have coinbase transaction(s)in it. - 1. Get the latest stack for coinbase in the first set of transactions - 2. get the first set of scan_state data[data1] - 3. get a new stack for the second partion because the second set of transactions would start from the begining of the next tree in the scan_state - 4. Initialize the new stack with the state from the first stack - 5. get the second set of scan_state data[data2]*) - let txns_for_partition1 = List.take transactions slots in - let coinbase_in_first_partition = - coinbase_exists txns_for_partition1 - in - let%bind working_stack1 = - working_stack pending_coinbase_collection ~is_new_stack:false - |> Deferred.return - in - let txns_for_partition2 = List.drop transactions slots in - [%log internal] "Update_ledger_and_get_statements" - ~metadata:[ ("partition", `String "both") ] ; - let%map data, updated_stack1, updated_stack2, first_pass_ledger_end = - update_ledger_and_get_statements ~constraint_constants ~global_slot - ledger working_stack1 - (txns_for_partition1, Some txns_for_partition2) - current_state_view state_and_body_hash - in - [%log internal] "Update_ledger_and_get_statements_done" ; - let second_has_data = List.length txns_for_partition2 > 0 in - let pending_coinbase_action, stack_update = - match (coinbase_in_first_partition, second_has_data) with - | true, true -> - ( Pending_coinbase.Update.Action.Update_two_coinbase_in_first - , `Update_two (updated_stack1, updated_stack2) ) - (*updated_stack2 does not have coinbase and but has the state from the previous stack*) - | true, false -> - (*updated_stack1 has some new coinbase but parition 2 has no - data and so we have only one stack to update*) - (Update_one, `Update_one updated_stack1) - | false, true -> - (*updated_stack1 just has the new state. [updated stack2] might have coinbase, definitely has some - data and therefore will have a non-dummy state.*) - ( Update_two_coinbase_in_second - , `Update_two (updated_stack1, updated_stack2) ) - | false, false -> - (* a diff consists of only non-coinbase transactions. This is currently not possible because a diff will have a coinbase at the very least, so don't update anything?*) - (Update_none, `Update_none) - in - [%log internal] "Update_coinbase_stack_done" - ~metadata: - [ ("is_new_stack", `Bool false) - ; ( "coinbase_in_first_partition" - , `Bool coinbase_in_first_partition ) - ; ("second_has_data", `Bool second_has_data) - ; ( "txns_for_partition1_len" - , `Int (List.length txns_for_partition1) ) - ; ( "txns_for_partition2_len" - , `Int (List.length txns_for_partition2) ) - ] ; - ( false - , data - , pending_coinbase_action - , stack_update - , `First_pass_ledger_end first_pass_ledger_end ) ) + let is_new_stack = Scan_state.next_on_new_tree scan_state in + if not @@ List.is_empty transactions then + update_coinbase_stack_and_get_data_impl ~logger ~constraint_constants + ~global_slot ~first_partition_slots:slots + ~no_second_partition:(Option.is_none second) ~is_new_stack ledger + pending_coinbase_collection transactions current_state_view + state_and_body_hash else ( [%log internal] "Update_coinbase_stack_done" ; Deferred.return @@ -2288,12 +2294,12 @@ include T module Test_helpers = struct let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t let dummy_state_and_view ?global_slot () = let state = let consensus_constants = - let genesis_constants = Genesis_constants.for_unit_tests in + let genesis_constants = Genesis_constants.For_unit_tests.t in Consensus.Constants.create ~constraint_constants ~protocol_constants:genesis_constants.protocol in @@ -2341,6 +2347,9 @@ module Test_helpers = struct let dummy_state_view ?global_slot () = dummy_state_and_view ?global_slot () |> snd + + let update_coinbase_stack_and_get_data_impl = + update_coinbase_stack_and_get_data_impl end let%test_module "staged ledger tests" = @@ -2362,10 +2371,12 @@ let%test_module "staged ledger tests" = let coinbase_receiver = Public_key.compress coinbase_receiver_keypair.public_key - let proof_level = Genesis_constants.Proof_level.for_unit_tests + let proof_level = Genesis_constants.For_unit_tests.Proof_level.t + + let genesis_constants = Genesis_constants.For_unit_tests.t let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t let zkapp_cmd_limit_hardcap = 200 @@ -2932,7 +2943,8 @@ let%test_module "staged ledger tests" = let%bind zkapp_command_and_fee_payer_keypairs, ledger = Mina_generators.User_command_generators .sequence_zkapp_command_with_ledger ?ledger_init_state - ~max_token_updates:1 ~length:num_zkapps ~vk ?failure () + ~max_token_updates:1 ~length:num_zkapps ~vk ?failure + ~constraint_constants ~genesis_constants () in let zkapps = List.map zkapp_command_and_fee_payer_keypairs ~f:(function @@ -4807,7 +4819,10 @@ let%test_module "staged ledger tests" = { status = Applied ; data = mk_basic_zkapp_command ~keymap - ~fee:(Fee.to_nanomina_int User_command.minimum_fee) + ~fee: + (Fee.to_nanomina_int + Genesis_constants.For_unit_tests.t + .minimum_user_command_fee ) ~fee_payer_pk:a.public_key ~fee_payer_nonce:(Unsigned.UInt32.of_int 0) [ mk_basic_node ~account:a ~authorization:Signature @@ -4822,7 +4837,10 @@ let%test_module "staged ledger tests" = { status = Applied ; data = mk_basic_zkapp_command ~keymap - ~fee:(Fee.to_nanomina_int User_command.minimum_fee) + ~fee: + (Fee.to_nanomina_int + Genesis_constants.For_unit_tests.t + .minimum_user_command_fee ) ~fee_payer_pk:a.public_key ~fee_payer_nonce:(Unsigned.UInt32.of_int 1) [ mk_basic_node ~account:b ~authorization:Signature @@ -4837,7 +4855,10 @@ let%test_module "staged ledger tests" = { status = Applied ; data = mk_basic_zkapp_command ~prover:prover_a ~keymap - ~fee:(Fee.to_nanomina_int User_command.minimum_fee) + ~fee: + (Fee.to_nanomina_int + Genesis_constants.For_unit_tests.t + .minimum_user_command_fee ) ~fee_payer_pk:a.public_key ~fee_payer_nonce:(Unsigned.UInt32.of_int 2) [ mk_basic_node ~account:a ~authorization:(Proof vk_a.hash) @@ -4869,7 +4890,10 @@ let%test_module "staged ledger tests" = { status = Applied ; data = mk_basic_zkapp_command ~keymap - ~fee:(Fee.to_nanomina_int User_command.minimum_fee) + ~fee: + (Fee.to_nanomina_int + Genesis_constants.For_unit_tests.t + .minimum_user_command_fee ) ~fee_payer_pk:a.public_key ~fee_payer_nonce:(Unsigned.UInt32.of_int 0) [ mk_basic_node ~account:a ~authorization:Signature @@ -4885,7 +4909,10 @@ let%test_module "staged ledger tests" = Failed [ []; [ Account_nonce_precondition_unsatisfied ] ] ; data = mk_basic_zkapp_command ~keymap - ~fee:(Fee.to_nanomina_int User_command.minimum_fee) + ~fee: + (Fee.to_nanomina_int + Genesis_constants.For_unit_tests.t + .minimum_user_command_fee ) ~fee_payer_pk:a.public_key ~fee_payer_nonce:(Unsigned.UInt32.of_int 1) [ mk_basic_node ~account:a ~authorization:Signature @@ -4906,7 +4933,10 @@ let%test_module "staged ledger tests" = { status = Applied ; data = mk_basic_zkapp_command ~prover:prover_a ~keymap - ~fee:(Fee.to_nanomina_int User_command.minimum_fee) + ~fee: + (Fee.to_nanomina_int + Genesis_constants.For_unit_tests.t + .minimum_user_command_fee ) ~fee_payer_pk:a.public_key ~fee_payer_nonce:(Unsigned.UInt32.of_int 2) [ mk_basic_node ~account:a ~authorization:(Proof vk_a.hash) diff --git a/src/lib/staged_ledger/staged_ledger.mli b/src/lib/staged_ledger/staged_ledger.mli index 90181dea908..805314908cb 100644 --- a/src/lib/staged_ledger/staged_ledger.mli +++ b/src/lib/staged_ledger/staged_ledger.mli @@ -77,7 +77,7 @@ module Scan_state : sig -> Mina_state.Protocol_state.value State_hash.With_state_hashes.t list Or_error.t - (** Apply transactions corresponding to the last emitted proof based on the + (** Apply transactions corresponding to the last emitted proof based on the two-pass system to get snarked ledger- first pass includes legacy transactions and zkapp payments and the second pass includes account updates. This ignores any account updates if a blocks transactions were split among two trees. *) val get_snarked_ledger_sync : @@ -104,7 +104,7 @@ module Scan_state : sig -> t -> unit Or_error.t - (** Apply transactions corresponding to the last emitted proof based on the + (** Apply transactions corresponding to the last emitted proof based on the two-pass system to get snarked ledger- first pass includes legacy transactions and zkapp payments and the second pass includes account updates. This ignores any account updates if a blocks transactions were split among two trees. *) val get_snarked_ledger_async : @@ -356,4 +356,28 @@ module Test_helpers : sig ?global_slot:Mina_numbers.Global_slot_since_genesis.t -> unit -> Zkapp_precondition.Protocol_state.View.t + + val update_coinbase_stack_and_get_data_impl : + logger:Logger.t + -> constraint_constants:Genesis_constants.Constraint_constants.t + -> global_slot:Mina_numbers.Global_slot_since_genesis.t + -> first_partition_slots:int + -> no_second_partition:bool + -> is_new_stack:bool + -> Ledger.t + -> Pending_coinbase.t + -> Transaction.t With_status.t list + -> Zkapp_precondition.Protocol_state.View.t + -> Frozen_ledger_hash.t * Frozen_ledger_hash.t + -> ( bool + * Transaction_snark_scan_state.Transaction_with_witness.t list + * Pending_coinbase.Update.Action.t + * [> `Update_none + | `Update_one of Pending_coinbase.Stack_versioned.t + | `Update_two of + Pending_coinbase.Stack_versioned.t + * Pending_coinbase.Stack_versioned.t ] + * [> `First_pass_ledger_end of Frozen_ledger_hash.t ] + , Staged_ledger_error.t ) + Deferred.Result.t end diff --git a/src/lib/staged_ledger/test/txn_application_test.ml b/src/lib/staged_ledger/test/txn_application_test.ml index a03eb54c9d2..457e5420062 100644 --- a/src/lib/staged_ledger/test/txn_application_test.ml +++ b/src/lib/staged_ledger/test/txn_application_test.ml @@ -13,10 +13,11 @@ let gen_apply_and_txn : (apply * Application_state.txn) Quickcheck.Generator.t = let open Quickcheck.Generator in let open Let_syntax in let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let%bind txn, _, _, validating_ledger = - User_command_generators.zkapp_command_with_ledger () + User_command_generators.zkapp_command_with_ledger ~constraint_constants + ~genesis_constants:Genesis_constants.For_unit_tests.t () in let%map global_slot = Global_slot_since_genesis.gen in let current_state_view = Test_helpers.dummy_state_view ~global_slot () in diff --git a/src/lib/sync_handler/sync_handler.ml b/src/lib/sync_handler/sync_handler.ml index 6a156577bdf..6cc38a179f8 100644 --- a/src/lib/sync_handler/sync_handler.ml +++ b/src/lib/sync_handler/sync_handler.ml @@ -171,7 +171,7 @@ module Make (Inputs : Inputs_intf) : in With_hash.data @@ Mina_block.Validated.forget validated_transition in - match Transition_frontier.catchup_tree frontier with + match Transition_frontier.catchup_state frontier with | Full _ -> (* Super catchup *) Option.return @@ List.filter_map hashes ~f:get diff --git a/src/lib/test_genesis_ledger/dune b/src/lib/test_genesis_ledger/dune index 591196b151e..8f234cb295f 100644 --- a/src/lib/test_genesis_ledger/dune +++ b/src/lib/test_genesis_ledger/dune @@ -1,6 +1,6 @@ (library (public_name test_genesis_ledger) (name test_genesis_ledger) - (libraries coda_genesis_ledger core_kernel genesis_constants mina_node_config) + (libraries coda_genesis_ledger core_kernel) (instrumentation (backend bisect_ppx)) (preprocess (pps ppx_version ppx_let))) diff --git a/src/lib/test_genesis_ledger/test_genesis_ledger.ml b/src/lib/test_genesis_ledger/test_genesis_ledger.ml index b81fc6e7533..e97d81da23b 100644 --- a/src/lib/test_genesis_ledger/test_genesis_ledger.ml +++ b/src/lib/test_genesis_ledger/test_genesis_ledger.ml @@ -1,7 +1 @@ -include Genesis_ledger.Make (struct - include (val Genesis_ledger.fetch_ledger_exn "test") - - let directory = `Ephemeral - - let depth = Genesis_constants.Constraint_constants.compiled.ledger_depth -end) +include (val Genesis_ledger.fetch_ledger_exn "test") diff --git a/src/lib/test_genesis_ledger/test_genesis_ledger.mli b/src/lib/test_genesis_ledger/test_genesis_ledger.mli index 1769705b124..3c0392c3cac 100644 --- a/src/lib/test_genesis_ledger/test_genesis_ledger.mli +++ b/src/lib/test_genesis_ledger/test_genesis_ledger.mli @@ -1 +1 @@ -include Genesis_ledger.Intf.S +include Genesis_ledger.Intf.Accounts_intf diff --git a/src/lib/transaction_logic/mina_transaction_logic.ml b/src/lib/transaction_logic/mina_transaction_logic.ml index e6b9631a847..381b06b85ea 100644 --- a/src/lib/transaction_logic/mina_transaction_logic.ml +++ b/src/lib/transaction_logic/mina_transaction_logic.ml @@ -173,13 +173,16 @@ module Transaction_applied = struct | Coinbase c -> c.new_accounts - let supply_increase : t -> Currency.Amount.Signed.t Or_error.t = - fun t -> + let supply_increase : + constraint_constants:Genesis_constants.Constraint_constants.t + -> t + -> Currency.Amount.Signed.t Or_error.t = + fun ~constraint_constants t -> let open Or_error.Let_syntax in let burned_tokens = Currency.Amount.Signed.of_unsigned (burned_tokens t) in let account_creation_fees = let account_creation_fee_int = - Genesis_constants.Constraint_constants.compiled.account_creation_fee + constraint_constants.account_creation_fee |> Currency.Fee.to_nanomina_int in let num_accounts_created = List.length @@ new_accounts t in @@ -323,7 +326,10 @@ module type S = sig val burned_tokens : t -> Currency.Amount.t - val supply_increase : t -> Currency.Amount.Signed.t Or_error.t + val supply_increase : + constraint_constants:Genesis_constants.Constraint_constants.t + -> t + -> Currency.Amount.Signed.t Or_error.t val transaction : t -> Transaction.t With_status.t @@ -607,8 +613,8 @@ let timing_error_to_user_command_status err = [`Insufficient_balance true]. In this scenario, this value MUST NOT be used, as it contains an incorrect placeholder value. *) -let validate_timing_with_min_balance' ~account ~txn_amount ~txn_global_slot = - let open Account.Poly in +let validate_timing_with_min_balance' ~(account : Account.t) ~txn_amount + ~txn_global_slot = let open Account.Timing.Poly in match account.timing with | Untimed -> ( @@ -661,7 +667,7 @@ let validate_timing_with_min_balance ~account ~txn_amount ~txn_global_slot = !"For %s account, the requested transaction for amount %{sexp: Amount.t} \ at global slot %{sexp: Global_slot_since_genesis.t}, the balance \ %{sexp: Balance.t} is insufficient" - kind txn_amount txn_global_slot account.Account.Poly.balance + kind txn_amount txn_global_slot account.Account.balance |> Or_error.tag ~tag:nsf_tag in let min_balance_error min_balance = @@ -2872,8 +2878,8 @@ module For_tests = struct other did not" a () in - let hide_rc (a : _ Account.Poly.t) = - { a with receipt_chain_hash = () } + let hide_rc (a : Account.t) = + { (Account.to_poly a) with receipt_chain_hash = () } in match L.(location_of_account l1 a, location_of_account l2 a) with | None, None -> diff --git a/src/lib/transaction_logic/test/predicates.ml b/src/lib/transaction_logic/test/predicates.ml index 6e72f327379..15fc4c95616 100644 --- a/src/lib/transaction_logic/test/predicates.ml +++ b/src/lib/transaction_logic/test/predicates.ml @@ -66,7 +66,7 @@ let add_to_balance balance amount = None let verify_balance_change ~balance_change orig updt = - let open Account.Poly in + let open Account in add_to_balance orig.balance balance_change |> Option.value_map ~default:false ~f:(Balance.equal updt.balance) diff --git a/src/lib/transaction_logic/test/protocol_config_examples.ml b/src/lib/transaction_logic/test/protocol_config_examples.ml index b689678c0b9..09bd4b435a8 100644 --- a/src/lib/transaction_logic/test/protocol_config_examples.ml +++ b/src/lib/transaction_logic/test/protocol_config_examples.ml @@ -29,6 +29,6 @@ let protocol_state : Zkapp_precondition.Protocol_state.View.t = } let constraint_constants = - { Genesis_constants.Constraint_constants.for_unit_tests with + { Genesis_constants.For_unit_tests.Constraint_constants.t with account_creation_fee = Fee.of_mina_int_exn 1 } diff --git a/src/lib/transaction_logic/test/supply_increase.ml b/src/lib/transaction_logic/test/supply_increase.ml index 30bda9ed3a1..894eba4fb52 100644 --- a/src/lib/transaction_logic/test/supply_increase.ml +++ b/src/lib/transaction_logic/test/supply_increase.ml @@ -48,5 +48,7 @@ let%test_module "supply_increase" = Quickcheck.test generator ~f:(fun payload -> [%test_eq: signed_amount Or_error.t] (Or_error.return @@ Currency.Amount.Signed.zero) - (supply_increase payload) ) + (supply_increase + ~constraint_constants: + Genesis_constants.For_unit_tests.Constraint_constants.t payload ) ) end ) diff --git a/src/lib/transaction_logic/test/zkapp_logic.ml b/src/lib/transaction_logic/test/zkapp_logic.ml index a0cc7f57faf..1ee7ad57f88 100644 --- a/src/lib/transaction_logic/test/zkapp_logic.ml +++ b/src/lib/transaction_logic/test/zkapp_logic.ml @@ -183,9 +183,8 @@ let%test_module "Test transaction logic." = Predicates.verify_balance_change ~balance_change orig updt && not - Account.Poly.( - Account.Token_symbol.equal orig.token_symbol - updt.token_symbol) + (Account.Token_symbol.equal orig.token_symbol + updt.token_symbol ) | _ -> false ) ) ) (run_zkapp_cmd ~fee_payer ~fee ~accounts txns) ) diff --git a/src/lib/transaction_snark/test/account_timing/account_timing.ml b/src/lib/transaction_snark/test/account_timing/account_timing.ml index e27b8dc4372..1d9a6ac594a 100644 --- a/src/lib/transaction_snark/test/account_timing/account_timing.ml +++ b/src/lib/transaction_snark/test/account_timing/account_timing.ml @@ -15,6 +15,9 @@ let%test_module "account timing check" = ( module struct open Mina_ledger.Ledger.For_tests + let constraint_constants = + Genesis_constants.For_unit_tests.Constraint_constants.t + let account_with_default_vesting_schedule ?(token = Token_id.default) ?(initial_minimum_balance = Balance.of_mina_int_exn 10_000) ?(cliff_amount = Amount.zero) @@ -295,8 +298,6 @@ let%test_module "account timing check" = (* user commands with timings *) - let constraint_constants = Genesis_constants.Constraint_constants.compiled - let keypairss, keypairs = (* these tests are based on relative balance/payment amounts, don't need to run on multiple keypairs @@ -324,7 +325,7 @@ let%test_module "account timing check" = let check_transaction_snark ~(txn_global_slot : Mina_numbers.Global_slot_since_genesis.t) (sparse_ledger_before : Mina_ledger.Sparse_ledger.t) - (transaction : Mina_transaction.Transaction.t) = + (transaction : Mina_transaction.Transaction.t) ~constraint_constants = let sok_message = Sok_message.create ~fee:Currency.Fee.zero ~prover: @@ -361,7 +362,8 @@ let%test_module "account timing check" = stack_with_state in let supply_increase = - Mina_ledger.Ledger.Transaction_applied.supply_increase txn_applied + Mina_ledger.Ledger.Transaction_applied.supply_increase + ~constraint_constants txn_applied |> Or_error.ok_exn in Transaction_snark.check_transaction ~constraint_constants ~sok_message @@ -382,7 +384,7 @@ let%test_module "account timing check" = (unstage (Mina_ledger.Sparse_ledger.handler sparse_ledger_before)) let apply_user_commands_at_slot ledger slot ?expected_failure_status - ?(expected_rejection = false) + ?(expected_rejection = false) ~constraint_constants (txns : Mina_transaction.Transaction.t list) = ignore ( List.map txns ~f:(fun txn -> @@ -444,12 +446,12 @@ let%test_module "account timing check" = but failed with %s" failures_str () ) ) ; check_transaction_snark ~txn_global_slot:slot - sparse_ledger_before txn + sparse_ledger_before txn ~constraint_constants | Error err -> ( (*transaction snark should fail as well*) try check_transaction_snark ~txn_global_slot:slot - sparse_ledger_before txn ; + sparse_ledger_before txn ~constraint_constants ; failwith "transaction snark successful for a failing transaction" with _exn -> @@ -514,7 +516,7 @@ let%test_module "account timing check" = ~depth:constraint_constants.ledger_depth ~f:(fun ledger -> Mina_ledger.Ledger.apply_initial_ledger_state ledger ledger_init_state ; - apply_user_commands_at_slot ledger + apply_user_commands_at_slot ledger ~constraint_constants Mina_numbers.Global_slot_since_genesis.(succ zero) user_commands ) ) @@ -575,7 +577,7 @@ let%test_module "account timing check" = | _ -> failwith "Expected signed user command" in - apply_user_commands_at_slot ledger + apply_user_commands_at_slot ledger ~constraint_constants Mina_numbers.Global_slot_since_genesis.(succ zero) ~expected_rejection:true [ Mina_transaction.Transaction.Command (Signed_command uc) ] ) ) @@ -625,7 +627,7 @@ let%test_module "account timing check" = ~depth:constraint_constants.ledger_depth ~f:(fun ledger -> Mina_ledger.Ledger.apply_initial_ledger_state ledger ledger_init_state ; - apply_user_commands_at_slot ledger + apply_user_commands_at_slot ledger ~constraint_constants (Mina_numbers.Global_slot_since_genesis.of_int 9999) ~expected_rejection:true [ Mina_transaction.Transaction.Command @@ -681,7 +683,7 @@ let%test_module "account timing check" = ~depth:constraint_constants.ledger_depth ~f:(fun ledger -> Mina_ledger.Ledger.apply_initial_ledger_state ledger ledger_init_state ; - apply_user_commands_at_slot ledger + apply_user_commands_at_slot ledger ~constraint_constants (Mina_numbers.Global_slot_since_genesis.of_int 10000) [ user_command ] ) ) @@ -717,7 +719,8 @@ let%test_module "account timing check" = *) let amount = liquid_bal_100_slots - - Fee.to_nanomina_int Currency.Fee.minimum_user_command_fee + - Fee.to_nanomina_int + Genesis_constants.For_unit_tests.t.minimum_user_command_fee in let%map user_command = let%map payment = @@ -741,7 +744,7 @@ let%test_module "account timing check" = Mina_ledger.Ledger.apply_initial_ledger_state ledger ledger_init_state ; (* 100 vesting periods after cliff *) - apply_user_commands_at_slot ledger + apply_user_commands_at_slot ledger ~constraint_constants (Mina_numbers.Global_slot_since_genesis.of_int 10100) [ user_command ] ) ) @@ -789,7 +792,7 @@ let%test_module "account timing check" = ~depth:constraint_constants.ledger_depth ~f:(fun ledger -> Mina_ledger.Ledger.apply_initial_ledger_state ledger ledger_init_state ; - apply_user_commands_at_slot ledger + apply_user_commands_at_slot ledger ~constraint_constants Mina_numbers.Global_slot_since_genesis.(of_int 20_000) [ user_command ] ) ) @@ -832,7 +835,7 @@ let%test_module "account timing check" = (* slot well past cliff *) apply_user_commands_at_slot ledger (Mina_numbers.Global_slot_since_genesis.of_int 200_000) - ~expected_rejection:true + ~expected_rejection:true ~constraint_constants [ Mina_transaction.Transaction.Command (Signed_command user_command) ] ) ) @@ -877,7 +880,7 @@ let%test_module "account timing check" = (* slot before cliff, insufficient fund to pay fee *) apply_user_commands_at_slot ledger (Mina_numbers.Global_slot_since_genesis.of_int 9_000) - ~expected_rejection:true + ~expected_rejection:true ~constraint_constants [ Mina_transaction.Transaction.Command (Signed_command user_command) ] ) ) @@ -921,7 +924,7 @@ let%test_module "account timing check" = ledger_init_state ; apply_user_commands_at_slot ledger (Mina_numbers.Global_slot_since_genesis.of_int 10_000) - ~expected_rejection:true + ~constraint_constants ~expected_rejection:true [ Mina_transaction.Transaction.Command (Signed_command user_command) ] ) ) @@ -970,7 +973,7 @@ let%test_module "account timing check" = ~depth:constraint_constants.ledger_depth ~f:(fun ledger -> Mina_ledger.Ledger.apply_initial_ledger_state ledger ledger_init_state ; - apply_user_commands_at_slot ledger + apply_user_commands_at_slot ledger ~constraint_constants (Mina_numbers.Global_slot_since_genesis.of_int 11_000) [ Mina_transaction.Transaction.Command (Signed_command user_command) @@ -1020,7 +1023,7 @@ let%test_module "account timing check" = ~depth:constraint_constants.ledger_depth ~f:(fun ledger -> Mina_ledger.Ledger.apply_initial_ledger_state ledger ledger_init_state ; - apply_user_commands_at_slot ledger + apply_user_commands_at_slot ledger ~constraint_constants (Mina_numbers.Global_slot_since_genesis.of_int 11_000) [ Mina_transaction.Transaction.Command (Signed_command user_command) @@ -1231,7 +1234,8 @@ let%test_module "account timing check" = Option.value ~default:zero @@ Signed_command.amount cmd in let fee = - Currency.Fee.to_uint64 Currency.Fee.minimum_user_command_fee + Currency.Fee.to_uint64 + Genesis_constants.For_unit_tests.t.minimum_user_command_fee |> of_uint64 in let total = Option.value ~default:max_int (amount + fee) in @@ -1425,7 +1429,8 @@ let%test_module "account timing check" = ; preconditions = None } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in return (ledger_init_state, zkapp_command) in @@ -1495,7 +1500,8 @@ let%test_module "account timing check" = ; preconditions = None } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in return (ledger_init_state, zkapp_command) in @@ -1576,7 +1582,8 @@ let%test_module "account timing check" = ; preconditions = None } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in return (ledger_init_state, zkapp_command) in @@ -1793,7 +1800,8 @@ let%test_module "account timing check" = ; preconditions = None } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in return (ledger_init_state, zkapp_command) in @@ -1879,7 +1887,8 @@ let%test_module "account timing check" = ; preconditions = None } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in return (ledger_init_state, zkapp_command) in @@ -1955,7 +1964,8 @@ let%test_module "account timing check" = ; preconditions = None } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in return (ledger_init_state, zkapp_command) in @@ -2032,7 +2042,8 @@ let%test_module "account timing check" = ; preconditions = None } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in return (ledger_init_state, zkapp_command) in @@ -2112,7 +2123,8 @@ let%test_module "account timing check" = ; preconditions = None } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in return (ledger_init_state, zkapp_command) in @@ -2187,7 +2199,8 @@ let%test_module "account timing check" = ; preconditions = None } in - Transaction_snark.For_tests.multiple_transfers zkapp_command_spec + Transaction_snark.For_tests.multiple_transfers ~constraint_constants + zkapp_command_spec in return (ledger_init_state, zkapp_command) in diff --git a/src/lib/transaction_snark/test/transaction_union/transaction_union.ml b/src/lib/transaction_snark/test/transaction_union/transaction_union.ml index cd9ff0b28c9..c5f9b64705f 100644 --- a/src/lib/transaction_snark/test/transaction_union/transaction_union.ml +++ b/src/lib/transaction_snark/test/transaction_union/transaction_union.ml @@ -144,7 +144,7 @@ let%test_module "Transaction union tests" = in let supply_increase = Mina_ledger.Ledger.Transaction_applied.supply_increase - applied_transaction + ~constraint_constants applied_transaction |> Or_error.ok_exn in Transaction_snark.check_transaction txn_in_block diff --git a/src/lib/transaction_snark/test/util.ml b/src/lib/transaction_snark/test/util.ml index ed4fdbbd975..187377c0ec9 100644 --- a/src/lib/transaction_snark/test/util.ml +++ b/src/lib/transaction_snark/test/util.ml @@ -7,9 +7,10 @@ module Impl = Pickles.Impls.Step module Zkapp_command_segment = Transaction_snark.Zkapp_command_segment module Statement = Transaction_snark.Statement -let constraint_constants = Genesis_constants.Constraint_constants.compiled +let constraint_constants = + Genesis_constants.For_unit_tests.Constraint_constants.t -let genesis_constants = Genesis_constants.compiled +let genesis_constants = Genesis_constants.For_unit_tests.t (* Always run tests with proof-level Full *) let proof_level = Genesis_constants.Proof_level.Full @@ -213,7 +214,8 @@ let check_zkapp_command_with_merges_exn ?(logger = logger_null) ; connecting_ledger_right = connecting_ledger ; fee_excess = Zkapp_command.fee_excess zkapp_command ; supply_increase = - Ledger.Transaction_applied.supply_increase applied_txn + Ledger.Transaction_applied.supply_increase + ~constraint_constants applied_txn |> Or_error.ok_exn ; sok_digest = () } @@ -570,7 +572,7 @@ let test_transaction_union ?expected_failure ?txn_global_slot ledger txn = ~consensus_state:consensus_state_at_slot ~constants: (Protocol_constants_checked.value_of_t - Genesis_constants.compiled.protocol )) + genesis_constants.protocol )) .body in let state_body_hash = Mina_state.Protocol_state.Body.hash state_body in @@ -664,7 +666,8 @@ let test_transaction_union ?expected_failure ?txn_global_slot ledger txn = let supply_increase = Option.value_map applied_transaction ~default:Amount.Signed.zero ~f:(fun txn -> - Ledger.Transaction_applied.supply_increase txn |> Or_error.ok_exn ) + Ledger.Transaction_applied.supply_increase ~constraint_constants txn + |> Or_error.ok_exn ) in match Or_error.try_with (fun () -> diff --git a/src/lib/transaction_snark/test/verify-simple-test/transaction_snark_tests_verify_simple_test.ml b/src/lib/transaction_snark/test/verify-simple-test/transaction_snark_tests_verify_simple_test.ml index e4dfdab5ac3..4ce0c013468 100644 --- a/src/lib/transaction_snark/test/verify-simple-test/transaction_snark_tests_verify_simple_test.ml +++ b/src/lib/transaction_snark/test/verify-simple-test/transaction_snark_tests_verify_simple_test.ml @@ -1,9 +1,11 @@ open Core_kernel open Mina_base +let constraint_constants = + Genesis_constants.For_unit_tests.Constraint_constants.t + let `VK vk, `Prover p = - Transaction_snark.For_tests.create_trivial_snapp - ~constraint_constants:Genesis_constants.Constraint_constants.compiled () + Transaction_snark.For_tests.create_trivial_snapp ~constraint_constants () let { With_hash.data = vk; hash = _ } = Async.Thread_safe.block_on_async_exn (fun () -> vk) diff --git a/src/lib/transaction_snark/test/zkapp_fuzzy/zkapp_fuzzy.ml b/src/lib/transaction_snark/test/zkapp_fuzzy/zkapp_fuzzy.ml index 05c1a6542ac..e044932f337 100644 --- a/src/lib/transaction_snark/test/zkapp_fuzzy/zkapp_fuzzy.ml +++ b/src/lib/transaction_snark/test/zkapp_fuzzy/zkapp_fuzzy.ml @@ -105,9 +105,11 @@ let generate_zkapp_commands_and_apply_them_consecutively_5_times ~successful let zkapp_command_dummy_auths = Quickcheck.Generator.generate ~size:10 ~random (Mina_generators.Zkapp_command_generators.gen_zkapp_command_from - ~global_slot ~protocol_state_view:U.genesis_state_view - ~account_state_tbl ~fee_payer_keypair:fee_payer_keypairs.(i) - ~max_account_updates ~keymap ~ledger ~vk () ) + ~constraint_constants:U.constraint_constants + ~genesis_constants:U.genesis_constants ~global_slot + ~protocol_state_view:U.genesis_state_view ~account_state_tbl + ~fee_payer_keypair:fee_payer_keypairs.(i) ~max_account_updates + ~keymap ~ledger ~vk () ) in let%bind.Deferred zkapp_command = Zkapp_command_builder.replace_authorizations ~prover ~keymap @@ -155,7 +157,9 @@ let generate_zkapp_commands_and_apply_them_freshly ~successful let zkapp_command_dummy_auths = Quickcheck.Generator.generate ~size:10 ~random (Mina_generators.Zkapp_command_generators.gen_zkapp_command_from - ~global_slot ~protocol_state_view:U.genesis_state_view + ~constraint_constants:U.constraint_constants + ~genesis_constants:U.genesis_constants ~global_slot + ~protocol_state_view:U.genesis_state_view ~fee_payer_keypair:fee_payer_keypairs.(0) ~max_account_updates ~keymap ~ledger ~vk () ) in @@ -201,8 +205,9 @@ let mk_invalid_test ~successful ~max_account_updates ~type_of_failure let zkapp_command_dummy_auths = Quickcheck.Generator.generate ~size:10 ~random (Mina_generators.Zkapp_command_generators.gen_zkapp_command_from - ~global_slot ~failure:type_of_failure - ~protocol_state_view:U.genesis_state_view + ~constraint_constants:U.constraint_constants + ~genesis_constants:U.genesis_constants ~global_slot + ~failure:type_of_failure ~protocol_state_view:U.genesis_state_view ~fee_payer_keypair:fee_payer_keypairs.(0) ~max_account_updates ~keymap ~ledger ~vk () ) in @@ -256,6 +261,8 @@ let test_timed_account ~successful ~max_account_updates ~individual_test_timeout let zkapp_command_dummy_auths = Quickcheck.Generator.generate ~size:10 ~random (Mina_generators.Zkapp_command_generators.gen_zkapp_command_from + ~constraint_constants:U.constraint_constants + ~genesis_constants:U.genesis_constants ~protocol_state_view:U.genesis_state_view ~fee_payer_keypair:fee_payer_keypairs.(0) ~max_account_updates ~keymap ~ledger ~vk () ) diff --git a/src/lib/transaction_snark/test/zkapp_payments/zkapp_payments.ml b/src/lib/transaction_snark/test/zkapp_payments/zkapp_payments.ml index 9d0625746df..02be76c1b63 100644 --- a/src/lib/transaction_snark/test/zkapp_payments/zkapp_payments.ml +++ b/src/lib/transaction_snark/test/zkapp_payments/zkapp_payments.ml @@ -223,7 +223,8 @@ let%test_module "Zkapp payments tests" = } in let zkapp_command = - Transaction_snark.For_tests.multiple_transfers test_spec + Transaction_snark.For_tests.multiple_transfers + ~constraint_constants test_spec in Init_ledger.init (module Ledger.Ledger_inner) @@ -289,7 +290,8 @@ let%test_module "Zkapp payments tests" = } in let zkapp_command = - Transaction_snark.For_tests.multiple_transfers test_spec + Transaction_snark.For_tests.multiple_transfers + ~constraint_constants test_spec in U.check_zkapp_command_with_merges_exn ~expected_failure: diff --git a/src/lib/transaction_snark/test/zkapp_preconditions/zkapp_preconditions.ml b/src/lib/transaction_snark/test/zkapp_preconditions/zkapp_preconditions.ml index 8fceedc5e5e..f033a2aa71a 100644 --- a/src/lib/transaction_snark/test/zkapp_preconditions/zkapp_preconditions.ml +++ b/src/lib/transaction_snark/test/zkapp_preconditions/zkapp_preconditions.ml @@ -444,7 +444,7 @@ let%test_module "Account precondition tests" = let interval v = { Closed_interval.lower = v; Closed_interval.upper = v } in - let { Mina_base.Account.Poly.balance + let { Mina_base.Account.balance ; nonce ; receipt_chain_hash ; delegate diff --git a/src/lib/transaction_snark/test/zkapp_tokens/dune b/src/lib/transaction_snark/test/zkapp_tokens/dune index a225b1be26f..7917433e5fe 100644 --- a/src/lib/transaction_snark/test/zkapp_tokens/dune +++ b/src/lib/transaction_snark/test/zkapp_tokens/dune @@ -8,6 +8,8 @@ async_unix core_kernel sexplib0 + ppx_deriving_yojson.runtime + result ;; local libraries mina_base.import transaction_snark @@ -26,7 +28,7 @@ mina_transaction_logic ) (library_flags -linkall) - (inline_tests (flags -verbose -show-counts)) + (inline_tests (flags -verbose -show-counts) (deps proof_cache.json)) (preprocess (pps ppx_snarky ppx_version ppx_jane ppx_mina)) (instrumentation (backend bisect_ppx))) diff --git a/src/lib/transaction_snark/test/zkapp_tokens/proof_cache.json b/src/lib/transaction_snark/test/zkapp_tokens/proof_cache.json new file mode 100644 index 00000000000..ba81b097b68 --- /dev/null +++ b/src/lib/transaction_snark/test/zkapp_tokens/proof_cache.json @@ -0,0 +1 @@ +[{"verification_key":{"domain":{"log_size_of_group":15,"group_gen":"0x2FD0767705FA5B03402039FC9E89AD1DE3C85D25401FD8DD898DCE603D1C0F3E"},"max_poly_size":65536,"public":67,"prev_challenges":2,"srs":null,"evals":{"sigma_comm":[{"unshifted":[["Finite",["0x06CE8D333B289EDA3EB3E409C224ECB0C1987391B535C4C9FE8FCB8578D682FB","0x0E7572A25F42B63655840987553266B4C8B9D07CBB9364A4A04F4D144A6DF4C0"]]],"shifted":null},{"unshifted":[["Finite",["0x374312FBE769A6AB24EE031F74C070CF77CBA0CBA01121F2AEE8D823EB4B9BA7","0x209A26EFA2E6F89D9A27C75E3C5DF15C9EFF1B895B0B1ACAD7F96DC696FFA760"]]],"shifted":null},{"unshifted":[["Finite",["0x1E6FF0BC3A34349064F7B5DE3D26B9FE5C520A4FDE4AD2E0E139BF4104FBB1D8","0x3EF4C51A4D0852D6E2281FCA31DE49F67F8FF53156E3325CC1C3A97677F31270"]]],"shifted":null},{"unshifted":[["Finite",["0x19FA5C0681C3F3024ADE9DCCA50721F38C5008CE3D40F38E4370C1EDF0A1C99C","0x08D8A86BA0935EAFA262176E939A6F2F61BCDECFFBF9E02B895503CC9B322110"]]],"shifted":null},{"unshifted":[["Finite",["0x28C73CCD058F1A16AC75C8F3A72077B250EB3C5D3666D0EF7A043AF7654101B6","0x00A00EAE3F194C78CF69E08C5582CCEA6638FA09D7FA6FD2D2A596ADAC234B95"]]],"shifted":null},{"unshifted":[["Finite",["0x3C4DE96A67CEE8E7802AF089040D72B0A9844D70B534496482D7E9427A65EE75","0x195C650BFCD7204F9ADCEB62D3C9035889C0087D75D4AAC2EED11EFFF2B69419"]]],"shifted":null},{"unshifted":[["Finite",["0x337CD4E4CF4A9F3FE16CC6DA48C20728F9DF6E375A60E2D489581BE91D7B34E5","0x33931C7D096CC7ECB1C30013D04288CDC5C036E5293A76CC08EE21DEFFDC39FC"]]],"shifted":null}],"coefficients_comm":[{"unshifted":[["Finite",["0x00F664217E5F3DBE768B62C0754702507C0E916DDB31A2E0B21FA7E034480647","0x018E00B840EEB2764D2DD3DC5ADA908D531063037769B410CF30A84822ECD39A"]]],"shifted":null},{"unshifted":[["Finite",["0x25D1C4EDC549B14973133B79B80AE29071D2FBB1874F3D2D06BB8C046E9B4317","0x260750391BF7DC41FE7CA22EBE7DF650C21B46C931005AD007905A47ECB84410"]]],"shifted":null},{"unshifted":[["Finite",["0x281D52D2CE701D2C17B284C0A3B2F8EF4FB40BD161824AB2F8F9040A3F18C64E","0x32A3C0CC8AC24935D6E97AC9C69599303E0C6B0942813C4EFC96669608CA8101"]]],"shifted":null},{"unshifted":[["Finite",["0x138F29163A1A860BFE0E857E82F3611A3FBFC5A20F3493B73218BBCFA1C48BA3","0x00C176531D67768196602AA7C605AE15CFC798E90F9A512C7021F07198FF10C6"]]],"shifted":null},{"unshifted":[["Finite",["0x3D92536A3BED6C5A5F7668DE6096B99032F2BE4D90E5C26F30401FB9E5494F8A","0x3623296C7BB6EB4CC06E4D52E591E7396A889BB6543D6E18D8F031E1C5D5A691"]]],"shifted":null},{"unshifted":[["Finite",["0x24BD958D08F68D15E8E2DCBB976A45AA7674B42DF9B5545A058F598D5012AFBA","0x37B7ADAC8D28D4F44296C62CA4532215DDACDA471E26AD5AE8895756150A8094"]]],"shifted":null},{"unshifted":[["Finite",["0x38FC85E37B6F95DDB3661250AD5F2593935DF8581F021B77E7EB8E04A73B0EC7","0x3D61E0CE9D6095ECA4687D1DF4A9855A056D0F2DAD062D37F3F03545A95F3364"]]],"shifted":null},{"unshifted":[["Finite",["0x120BD7F85ACD3B4FAC5D916ABC1AEEFA931A3C85105C8BB0B1213B457F6D2C76","0x374C61E77C4E393514B9C61686B828E3A747C0A5C0928E9F58B45D08E92D1EF8"]]],"shifted":null},{"unshifted":[["Finite",["0x0773A5E07809FE4A3AE7E6062DA4FFBCB00D62C54A32341A5CAA92DAF963C570","0x10A0FEF3CDCFDFC378D9E7129FC0FDD35F9F91672B0C24A7C4FFEFB827EA9FCF"]]],"shifted":null},{"unshifted":[["Finite",["0x11FD1584F349750D5E072446E6F97AB6C6BC25C9295DB1A60D46E8875B748D28","0x3EF56F59DC6825F538EC8F7354602156877CF42BEE69B2FAA9D975BA7C8E1BBB"]]],"shifted":null},{"unshifted":[["Finite",["0x1EE8EDCC876B4856B409F4084F9609AB1FE41547AA6A800A45E59B6880CA6C83","0x3CAE7396BD738B3582892AB0811DF1644F5E6946ED156A822FEEE43CF76502A9"]]],"shifted":null},{"unshifted":[["Finite",["0x17C1BC38F3C7A56ED4745539752C203CC980782744A68A3644EBFB0E64CE3611","0x004960B7E862C809D9BC141A3C1EEDD82F2DF1931C71C5EFBFE127BFC21245F0"]]],"shifted":null},{"unshifted":[["Finite",["0x1AF920494F7B02889E7AF56E0140A608FF0D1659AA8941DC83E181136BAB9F9B","0x1CCB80D3DC22AA4180F3EC62294A94A2E403B02A8B477D37B7A201EFBBFEAC26"]]],"shifted":null},{"unshifted":[["Finite",["0x1935C8F6642C82514D87287B7B11640FD84B1092316EA6F67B373F30C5BE39D1","0x1FA1D414235BD84A99279F5696A807839F82349AF630C97828C7501497591227"]]],"shifted":null},{"unshifted":[["Finite",["0x09F58CE4CE5612FC1296F68F6639DD78D49350F652D780F4833A3F9D4B4EF403","0x12448E9F5550532134D91A860D2BA990C00E0DE578383C8F3943FB6900D1A637"]]],"shifted":null}],"generic_comm":{"unshifted":[["Finite",["0x129EB567DBAC44734FDA6FA6FF0335643B22C2D11EE7F008B96C125C29DEB3DC","0x39BBABAD7177820AFAC0CFBA6D5AD6D45F26B45902351820B95FC4DB5C19E8C8"]]],"shifted":null},"psm_comm":{"unshifted":[["Finite",["0x18049B4AA02D563D29C70EDBFAA86C2DB857EBFF6219F507616A8AE33DCD4BCC","0x1A8F3D9EBF1F487509A4FB480786D0F019FF1AACC13B0AF9E9133720BC5D2EC6"]]],"shifted":null},"complete_add_comm":{"unshifted":[["Finite",["0x171FDFC6FD49189CE9CF603CAD918377A9D11CB2D17C872791DF8A6F1B49A697","0x280E32CBFBFC53EE4C07BE060040DEEFDF139F4F910BF54E210133A86B7723DA"]]],"shifted":null},"mul_comm":{"unshifted":[["Finite",["0x2CBD8958D442C8B8C1408B068C768655B2D57861AEA5239380FFF97834C71402","0x085AE342F6DB85EC1B6D5FC7A880DC5A216A91A3D1331BB3BA6279A68123E432"]]],"shifted":null},"emul_comm":{"unshifted":[["Finite",["0x27F7901FF92406DFD680096DC6EE34624D15ACC043BB9C25D24522A0DF915B2B","0x0AB7AE83EE6687A46B371BF32999BEA39DFF1561A57B4AB622AB67DE06B907FA"]]],"shifted":null},"endomul_scalar_comm":{"unshifted":[["Finite",["0x37BD8C24EE9C980793A63DECF7EE11D9A0B1093C2F4921DA183C2577891DFE9F","0x1BB453A281198EBB2ACEFBDDA573E88A557438DA36F727643DF1F906D8365FA2"]]],"shifted":null}},"shifts":["0x0000000000000000000000000000000000000000000000000000000000000001","0x00B9CDC8FD0BD4B27E2A74AF7AEBD5734D52D75BDF85EBF1CAD03413E914A2E3","0x0033BFCF8112720332825BD83D44D92CADC0C30466E8102C419C30FA2665695A","0x0087F4BB29954E16960F2DE3A1FA5AC7B62146DB348C7C9F0E8BF10B2C8E8411","0x00EC71373B9F6CF15ED1949647365DB60B2E26C3A8ABBA5BB06BF23E9DBE5893","0x00F39197CC4C55084C68D31F64F1A172406B585CB86445F00C248C721C496D10","0x00B8DD039799DBEE12D2E6A4299A83E067353C0143C5DFD203190C239159EEA3"],"lookup_index":null},"proofs":[{"public_input":["0x1ED7FD065DEBC0E4EE1AECEE9263ADFCD91B22207B4057FE74C790620C36B696","0x0000000000000000000000000000000000000000000000000000000000000000","0x15FCFC7EA14CFC3D408BCCA3B7BDA3A56B4B8176AF5C0F43001848FAA84598AB","0x0000000000000000000000000000000000000000000000000000000000000001","0x1E9038AFD7E2C4742A281CC132FB6A4A950F3ADEA1CE42B9C029CCFEA0C86B1E","0x0000000000000000000000000000000000000000000000000000000000000001","0x16127D7B977F56BBCB7ABE8BB8DB64EC119ABDD869D57ABD52EC305C97486A7A","0x0000000000000000000000000000000000000000000000000000000000000001","0x1B5F14A5DBAE6F99112E1543935BE93579A1126FBF8544C94FAC2FFD0D89413A","0x0000000000000000000000000000000000000000000000000000000000000000","0x0F27365B9625B92562E5F2EB592C733E803E6D884FC2E6BFF672AD175957CA94","0x00000000000000000000000000000000F9D857ADE38B9AA7318C94B681B1CD66","0x0000000000000000000000000000000089A23F35D8D194BE609986924B0814EE","0x000000000000000000000000000000008823AA72D8B4E187B9B490FAA0E9FF9A","0x00000000000000000000000000000000DE34CB32746DDCE60629B1754D8C7485","0x00000000000000000000000000000000FC81777E8C5D1E1BE5A78CB002192665","0x00000000000000000000000000000000676188582CEC8162003BF0CFB6730B57","0x000000000000000000000000000000007C7AF8A78B246E7B12761B5A7CA7B223","0x000000000000000000000000000000006718617F4C99B936EDC2460FF6A7D4B9","0x000000000000000000000000000000007378DFF2A68FCBC9C4E905FBE9C9F987","0x00000000000000000000000000000000EDACEB1DEA42A12F14900EBE301D648A","0x0000000000000000000000000000000078378AC2937C82D6D1B381CB936AB78A","0x000000000000000000000000000000001E399384DA3ED361CED14A4714CE63F5","0x0000000000000000000000000000000021E9C6CF83AD789A80831CEA9E73C6DA","0x00000000000000000000000000000000C502ABDDDA87784795DA9169525BEE8B","0x000000000000000000000000000000000030B91D2EA17BB53D54803EC2E0543F","0x0000000000000000000000000000000018A9D861F3401BF0B8138ED14EFE910A","0x00000000000000000000000000000000DE4D51879CC73A05F45F1F1CE2603E06","0x00000000000000000000000000000000B56CE07C8055098A9C448DD300ABF290","0x00000000000000000000000000000000BFD00ECBC0E8CE8A58E3103F5660F1F5","0x00000000000000000000000000000000F921707F6D98B04080ABDFB13D6867BE","0x0000000000000000000000000000000000000000000000000000000000000001","0x1D7DC6DA06DC40DF7CF0626144B583FD13A76DC3319F2FCCB2E7652E65CEDB5F","0x0000000000000000000000000000000000000000000000000000000000000000","0x083C764F04AC09FA49F9383BE03C00577D54B0FE9B83209740355FC2FF990A64","0x0000000000000000000000000000000000000000000000000000000000000001","0x083A7401EEC5F978970114DDBFA836FF2E8EB0B9C4C655564A20B331818A7C19","0x0000000000000000000000000000000000000000000000000000000000000000","0x0271A00E5CB9B15A2CA6166D48B81E791B58E0F64C158CE7C69C08DA1B3979BE","0x0000000000000000000000000000000000000000000000000000000000000000","0x01D06600C660616E8C6FF78D357AA15FE82F3E30418049B2492E40A9186C6D7E","0x0000000000000000000000000000000000000000000000000000000000000000","0x3D17987DEC91602C7C5AC801919B1B339BEBD4732AC592A9CBB4DDBAB1F10AB5","0x00000000000000000000000000000000902DC9CBCA3CBFA8680C3521625C01E2","0x000000000000000000000000000000008D027648487FE70B934946053CAF6B95","0x0000000000000000000000000000000034CC63AC4DBF4958953E7ABA7A6F8193","0x0000000000000000000000000000000000563C4959B228652459D969168AAE3F","0x00000000000000000000000000000000A8F85FD70E6129C496552AC4895996D4","0x00000000000000000000000000000000EB8D546FE89F9054F266CDCA09BC428E","0x00000000000000000000000000000000970D0F6B1DF669823837126B829D97C9","0x000000000000000000000000000000008A3B577AA9E79ABA7DEB5A722C7ADEA4","0x000000000000000000000000000000001DB750F02DE77270959328EECF0D11A6","0x00000000000000000000000000000000F7EF02C4080793166CC4709D114EF1A2","0x000000000000000000000000000000000B1A613C58F84881CDF72D72282C89C9","0x00000000000000000000000000000000521C8096CBC4B65A31CAED787132E1DC","0x0000000000000000000000000000000005A2E2B36D3635495F7F7ECF38B02045","0x000000000000000000000000000000006FC18F592C5D739812399EC551C452E6","0x00000000000000000000000000000000468DDB30F1DF1699E004E4438FCD391A","0x000000000000000000000000000000005719F1BFA218B72C2B5BA5167300640C","0x0000000000000000000000000000000085516E52FA966009AB9879DF289A859D","0x000000000000000000000000000000007B755F824AE0C12057926BE16906D9F4","0x00000000000000000000000000000000B9DF73DA3C90D12F19C1109A44192566","0x0000000000000000000000000000000040F3B2BFF165B9BED89F28ADB2F59E2E","0x0000000000000000000000000000000000000000000000000000000000000001","0x34ACF5538A60E4DCBCB2F59C94ACC4BCADB8A39C3AE2D69D31BE3FFB138CAA14","0x373176B83C7D47D0518737B686559C0088F654599CB48A2ACE46BD233EEE3A37","0x328898F51AADDC80AABB797E17385492CC1301FE8932D3B0AB40F9612D8EBBE7"],"proof":{"messages":{"w_comm":[[["0x0DE9C9BCF5DB36980B12363FA8EE45A3537A423E2D5390D46EEA0A36089F5901","0x01AE8FCA893A3FC3611DEA2D4FA59EAF103D1B9EF2319391A629183AFBF69E51"]],[["0x338B0520F40DEEDE209D939223449083090A5E3C999E8576D4419888657C7A1A","0x027BF9AA4A5A3B9E6D65052D56131C86BF79FD6816F796766BA6B79149680BAD"]],[["0x2144DDF57E59AF2ACAB22CA9FE2647EFEDACC3A99F2DCBC6D311303E282F1F4F","0x3BAD8ED15DEAAC2D3DF05C1A53E0466D828B3EC5958228E9585CF12EC3D53827"]],[["0x3A8F682414ED7B874ADD82CACA25CA75E70EED21B11984D29283626E861CA23D","0x0633469AD571263100D00070761193143807BC42A681CB305BAE28849F26E338"]],[["0x261CA834D31E2D20110BE8694C167CAF34B6A91A426751EA4061822C6368EEB0","0x2D57380512371E970FB7F8AD7A2753E3AA13AD5EA612DA644837E000AC920625"]],[["0x1D6964C3ADE2DD5C52FB1803C9BB62339796692D666CA2E7C78FCCA14385E950","0x243D02A9B2C07DDDA7AE80AD3DC06E62BE521D20091BF6F9730BD32175710526"]],[["0x167C51D8EB69CB6A8E60586378D043CFDD92BC639056A1F4CE6A0B7D6F668B48","0x14664C12A97CB90B5AA5D2B591A0A76DD9FC99DDB537FBB726A34C422CDBC454"]],[["0x29FC2799C3CEC4FF6875B9661ADD4C874B3DDC18BB1807FB493BAC0837A6A329","0x15E7E2D65C259B4AF607FAC62FA43CA3E3BD85078D193AFE94EDEBFD67840ED4"]],[["0x05A9561569D4ABF1466D01721BEF0DABD1AD6D1F9E2326717872441B258B4819","0x1D98A76C42EA75343D597ED279F6B3D711B236D2F39B0829BB319E35DFADC916"]],[["0x125491995DA23A58DB9A4F6CB52D6D1FF59F5C0E93CF7B584BDF337695645C65","0x0ECD890D8AFBB8F1F271635D634AED95D20C3A4A24B492D44CCD22A210C9D145"]],[["0x1F84F2E3CAF28932517EC270E9E2BED77BC44C23D131867E8DD80B2B211A7687","0x000E3CD1FDB5F1D938AC00D9A1164ED3F548270672D263CF0C896A5021D98DED"]],[["0x269BA36334F29D7FDAB1ECE0C76FFB208D6F6666CC00C6850274652712E838CD","0x2C9BD4851252A763102B202111B1B12ED3E8F69C6FA7931B81CA3979E7D2F98D"]],[["0x0CA5841609E451056A7A9F7FA7244480C34ADFC4C38B9BB90732C2A2DF500F47","0x3E2268140390AAD094914855988FB739A2C26654F992D20A796D6D65F98FC6BB"]],[["0x1194B8A9935091E268230707186CA6F0E82D2F9961F3508B56343886FD01D6B9","0x3F1016F757CB43FB74A344463EFA023E54E127BACECCCEA9C1A1196064F16AF4"]],[["0x2F2AA0445EE1E9DE53AF71670B3CA3FE6494FA8681142BCAAA144E850E26E9C7","0x2033542F5AFBBCD66B8164ED6E2E2A34F99741A1DE026F88B0DACD7D2D137DCD"]]],"z_comm":[["0x133E16D30C0C988DB545787088B491B85374D3A37DD8667040F0C17BFE3BEE83","0x35843DB47924187BAAAE12ACC2A4EE369492CD303EBE14563AA496D8B5CBD79F"]],"t_comm":[["0x1CA435AE9ED88428D8BFFDAF8F9794FE51ED4C5ABE93E2C4930117E8EBDEEF04","0x2F41ED4E30A67F1456C750093E60893FF48032127C313D12636E3F3F1C7E5811"],["0x04224D17D86A9F137C37C2EBCB47755C6BDC3D4B6E13D29F501A4130A2875AB7","0x0DF5EAD4C2207BF32611EFE158F6751A2D248E999BB049AFAEA6D98B47B44A18"],["0x2B60606C864C600ECBAB2AC1F80124A10951B2F18CBBB841AD86D1B6A07D80EE","0x1CA0041EAE7247C594A4163D09BCDF5CFA7113317199EE7E9AEDB393405408BA"],["0x02F3ED3B2ADD739A5CCA4022AFE488DD4200CAAAE6C060C4EE2040C0DB6D2CB2","0x290E69C1AD3F4E8AAC17A130823D3D1CF7EE34BD8BA95122DC56C1C5FEACF6FB"],["0x3EC932987EE9473EA4723774FCC321DA7C74A447BEEC93C30FC12B1C0EE94579","0x3269AB000CD56E64D5BA9AEF1DABB773DE0C71A05E0B819E27483C81CFF6FAF7"],["0x122E6F1D317A0BA544A8435F69EF5F83D50139D63D1EC4C6DF4AD44E37C093AC","0x1A28A6E4D7CC987B8E3A9CD80EBC5A2FEC943308194B07804B6CEEFED3A7EA53"],["0x10B033F1A4DB751B305F3375AEF0C6CD4CA1C191199020407802405599073A28","0x365D19043E12559C8581282B5FD9A140B2CB0438A8E842C63E56FE24769EDB3B"]],"lookup":null},"openings":{"proof":{"lr":[[["0x3020372AF44CC05AF4AF28E844715F08AE04BF0D6CFEBE1504F4A8F506133F08","0x118E7E09DAA0BDE8845E2253EDD741950BEFDA5DC1F1006EEBC4E003412F1DC4"],["0x07164433D6C6AD844DB7BC9808560D7C5439611101E19BB2FA9EAB2E29F20F2D","0x331589572813A8AD77B60569E418E5CFFC38135B0866EB666F49CD032F685A0B"]],[["0x15833CDC73472949EA67C54641983124690A05792A1E6356F7C263D898037FD0","0x0C10571A99BB5A00E5F8AAB965AC590EE939EB90548AA249A64619E284AC5B71"],["0x2DE45AC4C1F119C6C99AA83DB42DC90EC9BEA81662E2608902B22751A4C18B1C","0x25E5B1FB7E40447CEFD766FA452CCB27FE5E4A167E1C61FC95AA6DF1508963BA"]],[["0x1EA97B10415AE93CE6918B322E0FD5001DBDAFD3C2D44887DF647CD7CAD7ADCA","0x1CBAF7835B72544682695D58B69B3A7326B59F70D39A06798F4F7B89E3C3FB98"],["0x0DC94A0022C45A6310E813063006B84649F26BC473E107BE7E8710C98AC0F821","0x042EFAF4D13D07B51AF74E0F50C63C7FB0D2A7F647DA5B98193E168F3DDAFEC8"]],[["0x2ACC313D0AB1D2CFBD820376015D271D90E724645B9E05D8E7D80F8A70AC1066","0x2F112BAA322D255516E87640C05542B72F0AB5E123CEAD1D53A1828794D9D5CE"],["0x321AE0EC355E26680C0F7C2BCD748354B0DE7ED5C732D43895775F6E4E455ED3","0x0B88D2EED152630BFC083D2A1036E5C02F480F9D7E4686638A0809A38E2E86E4"]],[["0x05F47A57E80EB15BED497F73E5832EFF50E516DA6B3F5104314CB991914A5755","0x27BAE78B91D269F6816DD5484C9A30D974C7457B935F5B05C650BA346EE4A896"],["0x0F94A977B51CE5E730166D991099D68DDBC03409573A18041B437E67D22EA0BB","0x001D017090DA9B5CCF61A1E14B4AF54DD8F6673548F72E2A7848CBB9FDC09636"]],[["0x2D3E69D90A6B6A3AC818AE4B288D1F152016899881AF3A8EB9A0ED2154953BB5","0x2C6AB3A16EC1A9A5E277542BDA27515358870347D426A258EB868DC25B15A716"],["0x14A2F8D1B3265AE5A3704A5EA33C17FAF332FFC863AB64D2EFF71F94A87CDD07","0x1E65BBF6D51ED746EC34E66D3C6BC6D965AB04CD4C7594D2ADC10E92534AB96A"]],[["0x1CA1294DA274328293BAA7CA4FE08C57C08E2F9F1C235F3C924328C78DA4B516","0x0F8E4333C064A954E530A8307063432F7063404C7394520DFCFA5DCF736BF434"],["0x324BD14C19E4CE1A529EEEDEBCADE0D16F46C291514902D3E7FCEEAF49BC23EA","0x19352836539F185076B73A1D7D548D8D47CC5B496062E0A8B357E447EEED4014"]],[["0x212CFD38070DF40CC962CAFD8485CF8D887B00ECE89CB399268AF4F0053248AC","0x3B5489009718CF84C8E94A57AC7B7D8CAD27ECECE0AF17E870D2B4998E633E30"],["0x0F6D27E3C1899478CA2805B28E9A4142732297A9B4CEE254FE81322919759D43","0x3BB1C10470E442BC74AD7454341DA88C9A943FECEC19906998FB60B26E5AD67F"]],[["0x240FA6D0562A9D9D854AD054C1130268B1A5FBE0D9EC191EDA38D14759F7A90F","0x2B9D3D35C4A1C3E2B86F1218ABB17AAC414173D00460758BC94E85192A589CCC"],["0x12F7CF22C7C6421394D6BBF1A32B8482EC28F4E893322EEAB9C40A12EFDB9B8B","0x328CE0678CD9696441DE1261E7B218662A02A4B295D463E0D5519BBEB2C19979"]],[["0x0EA74D3BF4AC5F2C868C8E3FA9109D39B628256212F371981ECFEBEEBD5826D8","0x334798D2F7799FFDA9099009818E44B9C01C43F8C62DCB03E4F9061F0746C677"],["0x30D82B6E1AB224A410D639D01AFFC8F64BA75CD7624EFBFB5D962BA462F6A5AD","0x3428ADF80A8C7E2189D30B2ED0115D7FA4F50EC4296AEDB42F36530793E78831"]],[["0x36DFE461367E49FF19FCE12DAD6A23A106315B9C09B32F3E8513D9BBE9BF58C5","0x3CAD7B378197ED11E3DE62C283D9CC6314EF700233F465C648A710529A69352A"],["0x3AB380E2B56C0EB533589E7FBB89252501DD739AB423395476F3970FF88B9B87","0x3DD47CBD03933F121CB45EF416E2F27443A5D45FAFD26916B5C51DB3678E43CA"]],[["0x0E35F5337499C6ACF8E3793A3D5299B5803D04811A431179016C1C5024819EAD","0x1565491A9F16A6C2269FB29BE840C68253FE3326DDC5EBAD255803CB60FF0560"],["0x155482F319CFE9C2D4636F467569388363B93CFC28DF1C367561F6F4362F9599","0x3C698E84D82863CB8F1F8F0F059445909A209BA7EB934EAFB27C580893FB2CD4"]],[["0x1EC75982905BD32247E07C77D82CBBD993FE9E8A1DDA5675F9E330F9872FD0F8","0x262ABCF6C19CB450BB550A0AA5A173F3C624E7E1AD4CE9816B7D6CFA35B9366C"],["0x318991988F41B015107E7BC3BD35F7D66ED3435F905A5DDD53195988AB41FABD","0x34CC17FA260056985BE6787EADE26E23BA21F3D26E24AD0274EEE8E6ACE8E721"]],[["0x3EF568D18F98D782CC6215C6E08FA66BD0770AF4B3F0A328B099FCC665160BD8","0x173A9E784654F12D99E099CB6722C77C3EA09669A1116EE544C52DA23B5EB8D9"],["0x16661269A58C679A735DE259E30B1EBD5CE027A1996FC039F034D456696B4BA8","0x10F9742D5DEB1C6448FFCDDA7BD591A4395547C45570FD34445D704D6510282F"]],[["0x15478C6FDC8B0679CF5A57359F9A9D7A848D1564EEA64FDCD41F09BB8DB3E96C","0x034C2666B077535B447AFA755D07E19D0D68E211E15CA2045E01DB8F33C86811"],["0x3EF616E7B94754AECE7F2E5CE03874523183262DF792EF8EDA30C434F65ECD09","0x27BF73FB1238D04F90A6CFEF7025025FB10047970E4C0159897783B7B7B73CF7"]],[["0x0F6D53A51588F83C4F973F01F0E2FE8278C543E652CD819F9EF11BB9E29019F9","0x2F5E4C5ABE914257074D41037B148D2516B4129A35BA492FF0ACF84AB51B2072"],["0x182610F2FD0EEDA3CB179ACC62C63562741936220935D71DD761BDABFBD568A0","0x0D42CA12A1A34EAAA4D6F277741BEA009E001B8D6CE5DD63C391FF8CD21E9F85"]]],"z_1":"0x3234311B55C4D3F2754E75D591069877230C8F542E182A1F4E2F3FBC993EA213","z_2":"0x24A6837A7B0DFE007A6116E2EF526AE628A7BFAECDCB06F7CB20741E15564A72","delta":["0x045078DBCC12CA1096EBE57E527B576BA09DE1EB436DE47738C2E7F84EF051B1","0x2DFD51328CD860D5D30FBAA6DA08309B52F556A19300E040D7CDAF4E66698B98"],"challenge_polynomial_commitment":["0x16114E439A606D3F3D363C8DC589A188C313EF71336B811252712665AF29BB01","0x1A288EA05A520F9CDCF3D0EA91146935DC367E57F65154DBF79CE89E64DA7C95"]},"evals":{"w":[[["0x2B0D3C637FD37FF5333AE8FC634E5E8823A7811CC5C22EC95E28AC9E414BF8F3"],["0x2870F2EA6A1E15533923523B42906013490104D3B5CEE912A302AA2439B93F54"]],[["0x3346D85C6079559C7C8A2239F6ADA0FDD2B0D8D40732D5E2A78569317ADDB068"],["0x21A6C03F9D7497A91DAA4ADEAE81B0D3932FB35BEC7F3B46C5E9454FB14198AE"]],[["0x0407118AAF53562797CBCABF0E51BE4FBA9F0CDD72998F6E97A30BEDA1721C60"],["0x37BAEF8FE5A0822FF58E915398E9A5D891EAAF0428BCDD81909686F8C333F47D"]],[["0x3DD6F8895B120153A10554DE51E9AC5969121584D8B2805252107668A58EDFB7"],["0x28DC6122FB464D02B5E93FE83B167580D8196F67B220C9789F38F30906962E21"]],[["0x1A2A972F6EB0A2AF2A98F4B88FABFC4CF7C433779F19D3B79F4D9DCF0B6361A5"],["0x1349AAC1CFCFAEED756A147CCBD907A6784AC27C767257A259B7A280CFDD2FD6"]],[["0x3DE5A43DDE837493DED4020481DC835B063319136160B0613A37B7F0DC3BE881"],["0x07A3969EA7CB93C00C728FA3FCFD584C179CA1FB57893CE40E00FB6CF2BB5AB0"]],[["0x2BD5FAB9819DB6408A07D18092344AB663DD2B26B8A7721852FD05AA291A57D9"],["0x071F94E3A19247FE769339F539942F54902342DF45958343199DB8A39A4CD530"]],[["0x3B2E44A3A0964B4B64158DDB5ECB935B200B722E573D3BB38CDD845D8FF22564"],["0x2FCD4B277BB96399F5B2B0F33D3891D829B59E5285EC808C0D7139E413812C2C"]],[["0x1137C5B1E974A35852A0E0EFF581B76B7BD548FE24D7DBF282562A6D6C33A854"],["0x1829244267F9DA953F3DFA1EED815DE2806F75FF8CEB7CAAC354CE3B583E3C9C"]],[["0x07B1B6A99E1A03753C1FC54B8DE8AC1F5D8192399D0F027091F0AE1373BFF3F9"],["0x0CD598210EBE5C1B73FCD6E7F53BE8CA7AFEA990EE0729F7B79AE70567639AD0"]],[["0x359E8C88ED740F2877E81A69FCE4D2BF2C4B1C25EC4B05E9EC672E7FD3E48AD8"],["0x0FB611C820047CB4C46B9871E0915565814265CDC4306B93D70160E2B33F5B6F"]],[["0x3308284425BC3B71570FDCBEAACB87BF0C552AB4C57C04E8BE193A3009022218"],["0x37867D2785B491F701C64867952E12CFF113EB13915E78110E08D225A902F188"]],[["0x26C486B4BE69DE28DDA5577F3D68F72F3F29E61A519B58723A7E64D9F07D9891"],["0x17A6D9D4EFD9B67FD354ECFE6D8F9E93B64B5501E61FCDD3060BEBE689FCF1C9"]],[["0x27AB391ADB81574894812E7DC49AD83098B7CC4F1426335676BA657F715BEA8D"],["0x008C02088E9C573E716EF79D077597238E11E40FB900014EA613CDDBD88DCEB7"]],[["0x201A0EEB337841C1666A017D7BE2B6BBE8C2EE759E6438C8DBAD7C41C0AFF95D"],["0x1A133D28781F1108B7A4F85E8DA18FDA831BEF2F90EE167F21710702F5211617"]]],"coefficients":[[["0x27A8E14BE3F7399981FA354AA0D76151579407F2BF46D3509703E8A48A8C63EF"],["0x30C0A348204E9926BC5CCBA45CF6A9D1A33EE295FFA6CBB58EC4D343AAC7D640"]],[["0x298913CBAFD17C28839D7D09DBC8A9B114647F5635540292EFE0187FD34E0EF5"],["0x01B46FEF3F197A95992CE899D7E3D7F4BE274423BC3595C3C1EDD6420388DD31"]],[["0x33F0F236BB4B4E91636362E5C62B3148AF7A7DD751972F3388AD10FAB8F828BD"],["0x3E2A712D57C69C5807F54BCEAAB46112946A5CEB945BF0C4BD8FC730CC788DA1"]],[["0x12D7A0F00D18AA2341F6CD6E3FB3BA5F33120B481C701C72895419ACE44354DA"],["0x1A7C7B2824DCF00EBB15032035E1B8250F13D05979039077EA24D51A9EE85FB8"]],[["0x3E60DD98FBBF871BD17B487CABFB74D0319CE964515416FB04A0B0D694E601CD"],["0x1917FE90B83989D6A001329AD49723CD6793B504C9BBDE6E7BAD1E4D1A0389CE"]],[["0x3999FAC67759240F677233ADD6E35EC69CFDC6708B48ECBC1383C9E2BC95542B"],["0x34AA41F3871829DD84D36DD324E7F551D8C2F9DF8A669F2F652C70A7528003A1"]],[["0x14945C23AA53BD2F7144F78A9E02F357D60E640D5008FD45D14958909F9E0439"],["0x1B94D616427FE7514957B25E3E0EABF54FD72BAD01AD46517737F68E804338FD"]],[["0x139260FE2C74AE158990D37399625693020AC48F64CA3F8310D7E887E26F2831"],["0x081ABC6364A0BDCA74464D13E22089E48EB5DE701DE99DC0EBB09CAFF0CFCD30"]],[["0x39D4B790F7AF984A04AA83D4F95EBA8846B5710EF39D7107F3DF9C3F8DD063E7"],["0x3B113713EFFF96A4E51A8168383A021DEED4A169622E50FE36B025C440901958"]],[["0x24CA09FCA84E16B83116FC7B08EF3CA168D01D1C183FCE1B2C5A8550D956C882"],["0x1900518E6CE182CDFE5A6EF1362490D0F36FAEF5BF52322E6A6B0DE0BDF32ED7"]],[["0x0BA01EF2B9A4292BF480AFC5CC6D92B4B69CE3C664DC443ED8679D2FD09E7A5D"],["0x3DDA7416A03F433F9CC7B305E7500FFF3AFDD0FCBC57ECEEC2DEAD87074C54B8"]],[["0x0BB970DD88A4F4E74170FD839A8AFE59810C08AD8B610CB6C4F6F5F9A5537636"],["0x11CBA43B1D40A40C9A98513FA939A4EDCC13891717BF5ED37FA634CCEBE09D57"]],[["0x06F0055C549D64C1BF41F50103ADE52B7C86EF8653AD6B4D5B40A1B01F0FC79D"],["0x048C13BC5CA68CA93E92AFDB09663D3DE9DAF9C96A07BCB618E30E4E61B162C1"]],[["0x147C3FC1453D1868313BA3D44BB256F158C651FCF294EE994F38ECDA47EED82E"],["0x3C29508E9A12D417B4FCCA907A212B89FDA13364893C51094D94FAB1ADE7F9ED"]],[["0x2C5F81080349725AE649CBCA605E1F8FB8F2AB2695477B2A480199F7B717AF1C"],["0x1E2646FE8A94F7A1035009E706801C047C98DE63DA6C95C6D1F6474D35BA29BE"]]],"z":[["0x1DCA944019D1218CE379E1C0AE1D0D6F6B79CF4B92CC91E25BFA83CF7BC1304D"],["0x3EF71373FB2D5CAD94301E4FFB5C5C2B021F112691FE58EDFE2BF1890573C0F2"]],"s":[[["0x02604CFD9CE0B9A18E2BBEAD88C38AC10611A05C1E77AE004F20382F8124F04A"],["0x099AFDE6958169AB2657F472D52AD85DE8563BB42A2D808E42DBF518107BFD7A"]],[["0x0E179B328F2E7F8DEBDDB2437CE3CBDA2C6175E818CF64513871BB2419270F68"],["0x0B19BCABFF53FBCB9127ABF222B209B227E089929C6421F58E88459B06B76000"]],[["0x1A58AEF57A9F9BA577F04CA9927763B96B9F5AFA3FFC8EB913CD18C3C3DE54A8"],["0x02F917DD09F875F2E072759104FC41D2DAC9F0AF488B49EF1A93A4AE9743B972"]],[["0x12ADFC84F90D414470F2BDE264DDA3F56EC235D838EF44E5F13D543F1C9A24F4"],["0x36F23BA29C5C353A972331061247EDF4B96F57BC26F89BA8D4A25F39B19D3F22"]],[["0x004CA01CA7C8569A0B3F8F1F1376D3DF7363DB49BA8850E238011CF0ED7C6468"],["0x3A7547F645A2FC7E1BCC424C0888716F96786E1B4AAF3F85D85B372986598D64"]],[["0x063F03DA8485E039852CABC3D12C393F83E7968FF2F9FE054D11B5539CA81EFC"],["0x14B6BF5BDE6BD2459BE5CA48C7B7C74E1CE878E77E820C4038D75A17CCAD02ED"]]],"generic_selector":[["0x04D6903D024C7BC7A6AC0ADF87D1E83A1E0DEBC86488A7DC150FEA15301D125E"],["0x0780CA9B2791625820270C6BDFCAAC3BB0ACD4F521F919FC8F14404F4387F447"]],"poseidon_selector":[["0x32FCD3FDFB8D2C7D20686CE82C9C5782297D9287C0FE62535B3C3C385E0DD84D"],["0x228785F3F05C3629F6627DD67ABB46E2804B86F86F245840705CB8E3D924E272"]],"complete_add_selector":[["0x18156F13C903AE6BB200D81DAD69A09978A229E7D2474E5F790AB0C54783BAD8"],["0x0A1F9068C7B929AF507D0E72E96DCC25AAEE064520ABBCE744E02C6C736343FB"]],"mul_selector":[["0x37C8437336C3BF59BA008A1E8FF8DC6D1F095ACBF27B9480BCFF8770FC74A4FD"],["0x1DF52CD9FE5E2D0721D222BF75767E54C14E16DDA21E3D22625BDFCF2978B781"]],"emul_selector":[["0x17820A3D04492475AD417602FFF40B0FEB3AF930574822AB8E08B1C201A39D90"],["0x2692053D6C49543C7799208C7344CF6CB193B69A051AB5A9BB22589C9AC1A22E"]],"endomul_scalar_selector":[["0x2138114B1A5003F103FE3F45C7708732C845D1FFB43E49C9C1BA2309211E30AB"],["0x2790027E2765C10DE6D5E18270C1868DB0C4C0E6FCCD4EC6267EE1B5D9F0482C"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x393907BD13DBB20B1C7B6DEB95E2C28A580B8EEC81CC4AD221672AEDF34BAC2B"}}},{"public_input":["0x1C215117AD6C5C386EF478960BC8FCB9BDFDB9E0E8FC6A30B741A676F7871667","0x0000000000000000000000000000000000000000000000000000000000000001","0x16010D596F2D19954D659E268F75B7238E163ADE37413B4768F1FC208AD4D015","0x0000000000000000000000000000000000000000000000000000000000000001","0x184E681616C85257DACC3610FC669FB4F77C034FE034070B95A65F8332D9286B","0x0000000000000000000000000000000000000000000000000000000000000001","0x02A31705F3806CC83CD9995A0F74F42758283A17825B72FFC97CD31BE3A3CC97","0x0000000000000000000000000000000000000000000000000000000000000000","0x1238FF4FA01F1CCF66483ED49811BCBD275972D3D319592A3F8EA78457254431","0x0000000000000000000000000000000000000000000000000000000000000001","0x015F1DC7F3ED27BF1E972D175B62C90796876D2CF43F1F08AB9D0063E21F8D59","0x00000000000000000000000000000000950286013C82C21BAB69D4E478C42D1C","0x000000000000000000000000000000002EA90B419CB9D44F013F155AE293719D","0x000000000000000000000000000000008690BFE3F0AA6B071C36BF92D3022A21","0x0000000000000000000000000000000019A99A1BD0BC1267E6113D2A62139CA1","0x00000000000000000000000000000000F6F279BED5E8138366965966FF9BB20B","0x00000000000000000000000000000000655D3712C1A964C1F84CCC6FE35883B7","0x00000000000000000000000000000000AEF22B5B7E74F00B1B03CCA21E3C763E","0x00000000000000000000000000000000E6875793DF9DDACD369D38AD7B79E9E6","0x0000000000000000000000000000000038EDA599FBD954290850058E9826B1E5","0x00000000000000000000000000000000B567E9D8419817A0EB6921B6E5896484","0x00000000000000000000000000000000BE14CD5732F421E1A68F5458BDBA41E1","0x00000000000000000000000000000000ADFA816E8FC02CB26DE18ABE78E3CDA5","0x000000000000000000000000000000002DEDFC7620DEE21252F0B7A9288D76F5","0x00000000000000000000000000000000A0BCB8AA4F001BCE819F95328C263D15","0x000000000000000000000000000000004769251C8A9D51B339C75AFDBBD8C718","0x000000000000000000000000000000002CB260167AA5A4F929BF78DDD86B9527","0x00000000000000000000000000000000D9273D032539B0C699E44A8D4A4D081C","0x00000000000000000000000000000000DD5128ED1827FDE1D22B5519E019313F","0x000000000000000000000000000000008FCBB5786C5F6A87D09D6191B4944410","0x0000000000000000000000000000000052978C342ED2BD7F521A5D0583DBB2D7","0x0000000000000000000000000000000000000000000000000000000000000001","0x0EA3741251FF9E15D94B7AA8F7C18E6AD387056653C89F824FB3285982BC0DD1","0x0000000000000000000000000000000000000000000000000000000000000001","0x017C0D9ED21D1C38841030022B01B2FD95F2C42CB252995086CDE33FF9A65364","0x0000000000000000000000000000000000000000000000000000000000000001","0x07CF334E5E4C184FF5E509D72076273778FA7A2483BFC6EBDD296F4965419CB8","0x0000000000000000000000000000000000000000000000000000000000000000","0x042F9B962FD34E69D7A39912C1C0BA419F0A2ED3676360DDACE7BC593D2B02AE","0x0000000000000000000000000000000000000000000000000000000000000000","0x1D6366C79F3CFF70120A722C780D98E97950AB483E418640C7B07E3C5B3E3639","0x0000000000000000000000000000000000000000000000000000000000000000","0x0D0C28B20F587E64D8A8FF8E5E6B141C1E5370AD8EBC7A26C01A852B17C5B3CA","0x00000000000000000000000000000000707D4044971C9C3DD53916D085BCBBAF","0x0000000000000000000000000000000080BB0EAD37EB3EBFD743B33F19CD9369","0x00000000000000000000000000000000FAC0DF6D9D3B2E2C6D36494F80B0A17D","0x00000000000000000000000000000000026809135BEC3FAC228DD28EA197B4F4","0x000000000000000000000000000000001371718E5B75F9D9AFC2EFCBF507F123","0x00000000000000000000000000000000A4BC4D4EF9CD434DB12DC6ACC28802A6","0x00000000000000000000000000000000691A652E4952E0A865FF3E0F7D4970AA","0x00000000000000000000000000000000E84847E109E15C67630ED756487170D0","0x000000000000000000000000000000006728C459B3A9C112B0BEA29FEBD1F20E","0x00000000000000000000000000000000A78B6184DB32D4BF8192BCB1F0388041","0x00000000000000000000000000000000C5F5E05459420AC15CF25891D4CCF450","0x000000000000000000000000000000007113755D37EBCADF817DFE736B322435","0x000000000000000000000000000000005C040B0A981584627254308683DFC999","0x00000000000000000000000000000000D99B3AAC531EE9C7C6FA205BEDA33EDF","0x0000000000000000000000000000000000DC2994CBA45ED1FF92C8DD59C5E181","0x00000000000000000000000000000000DF61D43A054FF22775C8D10711C94498","0x000000000000000000000000000000002914B9C3AC3280E3507F5360329409D0","0x00000000000000000000000000000000450C33E5B38B5F77937B4D3A4CA780A2","0x00000000000000000000000000000000905277AA574B6363EA8B0C264B593888","0x00000000000000000000000000000000A35DFC3F88ED8ABBD453A7CB62B05C7D","0x0000000000000000000000000000000000000000000000000000000000000001","0x2125BF08823ADC525146E228B9AE75F942667F64F45B596DF48FC3FC158B839A","0x1A598569EE710299B992C4A4486A6D6E09C87510F4DA1DE99D9F9CE849CA9617","0x300AFC397485A792113478AB6C21C8FADA8F5C6C7FD690AFC191E05D1E9A1CD3"],"proof":{"messages":{"w_comm":[[["0x018957B0AF0D9F27256C135EA4F3C36BF6689DC472685235ADD314E5BC6B5B7D","0x355F3F547D23EA075727D49B37401D5D5BE8E050E35795CEB57EA09EFD0A5E98"]],[["0x32389289A4AEF72709B712279C466AEB102AEE9E98C1CE03A3C9008E2C3128BE","0x1C898187A8DD6DF534C006D8C4803269E3ADF7E192BB2581DA279E4B98379D6F"]],[["0x35E832EC4AA95434B37504E9A08B2D251CF19E603FB4EAD30E73D9B97D31CF9D","0x39251427608DF16639C25914AFDDE0B2A11F8F75C02FDDB67C7F39BAC580A7DD"]],[["0x09B11AB3EC7F6A883675580E6829C5EF5DE81FADA47651B24C4DA9D3E85A0029","0x06FD60B8C5B1D4442A3815080BE9ACD11BC08B4362B935639EA4C838322B13EB"]],[["0x0FC2ECE0631A1FAD813D84630124FEC1AC506238C72D6ECF9081347324A1C094","0x215DBE6F160F584997E16CEB33D766FAE5FF30DDD6CC89000CE2DB483B9BC529"]],[["0x1815959440EDD36A7D5F3F2F36FD5CB02DC7F95EC9CFB1AD28845502173F7132","0x15DE1F1B440162B31004B3FA2CC3AD55EFBA75DECC4C2D42C5AF54F3A8B4A7C1"]],[["0x3F2B69655DB3A974678D9D0A281963508388406F33056CE512908D301CEA0C2F","0x34BCD97BA23C5EE5B0A023BD445BDC059B4269C03244EB0739C2F6F89E4ED559"]],[["0x28E26C3292BEE960399FDACC2ED4B32D4B53A8FE1129E6DDE878E53C86EA863D","0x2E052C7C9F782002BFA3E3655849178DA09D71AB4D75EFF5F45CF68F42D77D22"]],[["0x09FEA3018E8055361375957D89DE19BBBB8A780D0793F27288EF40A00A77913E","0x18DED4D5CFD29F6BE308699AE2CC56C01D51B38F5D917FF80AB804AB815FFF83"]],[["0x2D96251715DA6872633B5A628622BDE8CF25A401D81238BD88361EF6F94F4714","0x201540147A51F8565E7C5BC5001E94E303CB62A3561C2AF8582913F15311234A"]],[["0x3B06EE3CA8642B7466DE59B259EC83E804898562B705AFCA5385B2A93320BD05","0x3C8CD4071F00A6C99AEB071DD4A34D5CD12AD0DA40F3FB416C48FAF3A3E3877B"]],[["0x2741017789D440F89BD1BE9BC16A0EAD5EE63DC1EB07DA31084FB5902F1CB1EB","0x1089D6EBD88D5E5D304AB3F4BE869AD265FC1824C59BEF6C81828D98F77CE2F9"]],[["0x374F7CB8D95EE933EB1CD4B9726A8704C506F5DFFDC786DA2FBB436AEB0A0D40","0x02212873E42F557EEA900C95AFD4A5C04872FCE4B6A63505835CABF37EC3ABC5"]],[["0x20C907B4C934D44D9107CA98327984F6DD9B5CEBA2A2F012D7CD3D8B7CF50E2C","0x0AC50ECE542107C24418BA63AE5AEF4C26DC74EC587D37BC4C115E617150C6DC"]],[["0x15881540BF16D47B37F380EDC911804919F5AD752D552574D5E7E7C14D790244","0x10A18C7B8231501144505C098BD6CD0543F41C28C241822A590A93CC6CBC980D"]]],"z_comm":[["0x19CC2ECB587ADC986349FEB64514C359B92C442DCF92E7F597BC48036BC86610","0x0C179C12311F5D1A41C90B907AFAEEE549DF69C76D3C4C82B96D4266363240B3"]],"t_comm":[["0x28EF03C03EE5E6D85D4247B1BB4CA0F1508AD03CF67A71E0B8B991B57CC3BD63","0x2E885914423E1BB1AA18270519CCFB4CE80797E74EC633C10352912E0AE03864"],["0x37DB7780ECA0900558A414ED47AA0C58C3C1E87DAC9FA041878C3C6F7069A7BF","0x3DBC078F3F3A23F93F6C07749598BFD407A7B4D7A281AEB06BBE937999C8A6B1"],["0x110768C5EB6A9DEBDDD67E7C37257B09AE8F0E9155875CCB3FAC39639FAA0F4E","0x3FA12B48B468A0C15049A7B564A52FBCAC814FEB7208F89838B8BEAB15FF2162"],["0x32489371A1ECC63B784B42F05D9D35E9B4B9F69F6F4CE4AAF6B514A931D391F8","0x2B4625C2695EEF6F30CFD20D14B3FC1DACEE06E0C3FB8D1E5376B66D135948F1"],["0x25CC0598044DA2378310BF325E6BFD1FB606ED7BD4420A3DADAF829BB82AB72F","0x3B62DDF57CE583E4DE162698DAEB677076AAD9053351F53717AFDFBE0DADF8B9"],["0x24F3A40F9EEEC1A6CCF914871DA58999891E8B1BB948C08F5D9112E87A439D52","0x035A468EA8A6FA0BDA6349F0BDAAB2736D77B6BA1BE701A8DE3BD35BAD5E369B"],["0x0E1D9133998719CE32E9A6BF413D9BCAFC24DB370123E8A26BC698A2FB4BC0E7","0x27BFE6E422DD0A974176D51F68D9A62C2D36ABCC260212B77623652E7EC9C7C4"]],"lookup":null},"openings":{"proof":{"lr":[[["0x36FD55DFAEA3307BB6B90FC733D1FA7779C62EE8C3BCCB62BBA6F8CE23110E4B","0x11BA1624C732DB14A1450CFEC7D670CB98EF4EA955AA7FDB1A1AA131B6A3D8C9"],["0x043842B4580B163007622ABD47897380AEAD3D9A6E3F0259AC312D80E91ABE35","0x074F94110E2F35E39E67D5D39D96308CCBE422603D939F35474AE3D68E89C602"]],[["0x1CA3AC6C570F68904CF824A19A36F2447B990D876DAD293146AB6D6251B69EBC","0x06615395360F8E7AA0F5A105959F4EC5E59791171D5E02116ADE2E8FE91A2D64"],["0x04A7146C2625FE3CDBC69606632E9BFE6DF4E06008DD0E9B3B499F79C616DDC1","0x22C71F9DC6E8F145DCE1F168E769829B7463AEF400EA7BAFDCA7BB3D806B7322"]],[["0x3DFA932460157B23D44B9955F832049AB582BD9B2EBB74F0202E378E748FE47E","0x3EE3C6D7F27A36E823A34609771807C4C699C692F7291BDAB5EFD5DBC15F9911"],["0x03418168CD45D0F6110139CB8E156616CE2C24A9D33BA5ECEACE2440B408A13C","0x093F6CF7F4B24A6E1DAF4ADC109EF0B5A724D06DFDD5675053F0C5D0D1157CA6"]],[["0x3D3692413425254A8CC07D48A21407CE7F156A49D5FDA4FEF075640BC3A7D725","0x33DD7C08C8BEAE559867A38EC3AEF57FDEAB492E71178201EDC5F940CC6F4ABD"],["0x3FEEE2961A67B15EB0E8783AB079562D9E58DF7A9C904BC5C4FB85F098D18445","0x3094F9AFEF7A0FCBB2B1974A4CF2F42AC3D6184B7829B2CA0D4F48A402A91ABD"]],[["0x394010F38A4339FAC2A24493259B1F1C0240C3D79C273B7FB38FED15CB2B7991","0x2AE08ACC63703F5E0A31035C4A2C122D23B6E1F14884D6AD88FF2CD959B2835C"],["0x0D239D82EA30C94B2668237CE8E7C637AEAFCD9C234FBD486B916B1D2936CF29","0x184512056A7B0A7371A539A035746CFEBEF4817DF6153F1423ADF2F6B47D091E"]],[["0x3E6C65694C9BCE1B2858B9809E949E5F6044CFF4CD7FBA44DF012104ADD554CB","0x35718226DEAA1B0152602CEA1568C6A6A14F07241EBACE14BA48C6D1D934055F"],["0x24B8C327E51B77FEAF9471E69CB15488F31FFBE4979D818A306340615385CAA1","0x3452B38970F5DBF14C32F63E0EB96E4CEED1D098E4CDB3B86FB08D778BB673F5"]],[["0x216C0DE342557F4EF2A3D7A548A6BF4DB47B9238E873AE41FD196DF61EF6DF42","0x291A116D90CEFF70A099E122BC42AD9CEA132F8F25B6CB93A35528E92C02D3D7"],["0x1222D504415691C40A896ECD270AE731027A2E0D418D8435BDFB0B8BD5BE1D9D","0x20E5FCC1EE637F888D679CF40EB2B22E9900D741F204A28863E7E7A44FD44EDD"]],[["0x01867A80E5C538BB0BC804E2B5BB0FCF800E3CCA13385CE4D078015C470FC6DF","0x23E78B902B4997A6EBE8F0200B9C1CA69E65C4A50DC17343B3A73B6AA9163741"],["0x1A364D31BCF2BB0B3D1F488566BF9A3FD36234BF52AD30B558AF9BC1102E858B","0x1868175F8C2930E4EB269BC570D6813F173A2392C7E353EA16C02F81A76AF931"]],[["0x130B2016D6679CFB62BB17A6A68BB295171A04756BA3CA39F9519918C8DB0A32","0x334014519F56BF3F02DA7B63DB56B1B70ABBB1A9F548A255945138CA1BEA0417"],["0x145A7D22A886B1716E59B0DB6C64952D7AA89372B1BB92B80E9CFFFCD9462C84","0x080A87CFE2C963C605F3C23585FE6AC1ACE923396305249ED2D7A529483802E3"]],[["0x2A08D7F395DCFA66E5163D28DF1ACC897EA2A879873D34D05F014829CCFB09F9","0x2F8E60CEF732685877693F40810B9C9E5DCB8082C7F0F58A5F96BE713D861D1D"],["0x1AFE3F7FEB55D4B1580CF3B737D1FD5A3927F3776BD6F40C1495A96EF8513561","0x07580B53A613BEFDD5DB039D48342AA8FC77DB06A44F3A65F7B7A3520032C4C2"]],[["0x1F1164AB5D45E3DD5ED10293669CB17E3BE6909F00933BEA3BB19110FB235E1D","0x13A4AC9251E33AC729DD48AC403BE48F9F288ADCA07B2A892D398883E172AB12"],["0x2D3692E61105104F8CD6CCFF1874D99E70A42A004C08D6B0D12562358090606E","0x2679E384623A606FB04C69168819FBEF5BBC9FAB5A240C436317F227C200A1EB"]],[["0x3EDF1CA10F32C883E90F996CBBB88D0324155A88252D0C405767524713A5E665","0x1183B322BD4F2D02B69B3A1570E2404E5DB41B461999B7C891874245222CBABA"],["0x1945DC7B12BD0CC37360890EBB429EA4F38D9A53820F27379B6317A373A8FBEE","0x3DDAB6035C7D3C8502910007E72B7FC1D0693687B803EE87F6F13B77EABB09A3"]],[["0x28064B7BCEF840E1080C80978311BB37AB6CFFF7AA2290B22CCFB3769C394249","0x3D152E4E47EA6C5B3483294CB7E04AF22C4F697F4A49DC57CBCCFB22486AA506"],["0x2E7528116E1E81318BCD8DC97330198CBAF21C607150F6427F71C5C0DE00309A","0x0915B1D0707E10C3DE6220BD223099D13F2A53983C4424846AE1EB0AB4051681"]],[["0x0834038D58FF79C5A9482E7708A927A8C386F375B2C4C6C9F86E2EBE70D56FE5","0x352193C52A46EF31907032F5CEF6E8D438C5E5F174CFC488469BA38FAEBCFEA0"],["0x3BC33F9B0755B658C55BA6F7197F0A8057FC6D116016D754DE1F6317B207AE94","0x1A1D8B74B6834F142F1363940ACC4665C29FFC30F1477809C46E5305A46D514A"]],[["0x3FD642DBB75492475EB3D6E743E9E81C6FE0B42C7D881DCF69DAD3874F7EE738","0x227D6C0B56AE1D9936070F0396EE4732847215A042686F2721C324C12FC5459D"],["0x0601302041709C6914C0C464AF19FEB712EC7A9A66DC8D2E3C2CD9A0C7E22EED","0x20EA8FF3113D67BE4646D40DCDB131FEC27AD1C2F88F0B63925647BF3D106B83"]],[["0x17D008D9F4791A51C5E0CBBDD5A11E61E2ABD9678E6C326B62DD67966D5575DD","0x00CD10EB0E0FD1536FAF77A19DDC5A6552CF97C24FBF90DADA8FE0D20F8D24E5"],["0x38725528E5C977C882C53C108E6A83987474D00727B6AE5DF696E1874C22325C","0x0EDB75DE601BC8A8363FF0F5B67AD6E07A0905609ACC174C08B327030638A7DC"]]],"z_1":"0x3FA20A4F451DB64772A95EA1DF8E71054F02D5C1BACB99C1A5DEB8E1D595FAB3","z_2":"0x0ABBC95060CCF70A3BAEE71394A4D6248E153123F1A716596D3F0BA2A82D2256","delta":["0x3EE058A52F521468AF48B75382F677CE92232E9F52BD71E66E4CC9FC94A7C0E2","0x382B8CCFA733C44350D7E7BD2B03299ED2D5E3EEA614D0B4D94B2A08E313A021"],"challenge_polynomial_commitment":["0x1F3FCDBBD9FD970DDC4F99AA213E7F5FA364E2AD687B09B2F6B0DD33505EADBA","0x2F9B2DB549356B281AFBEE1ADF47C0AF5A5641DC1EB705D8BE63D2CB0E8E8C2F"]},"evals":{"w":[[["0x3D282D719D51C959FCF8BBBD289970824937E3E9394D8214361F0A644A612C8D"],["0x1FFEEA2528CDF1C0CA39A3D784670F651861368D41E33F1405981B0F474F0C11"]],[["0x13CC372FA52D3E0B2BFA485A3346027702870F27EFD9D3E39FBA9352ACF7CC27"],["0x041DA22DA8A3ECDC4349D08BAE01C9E85EBB0B09C67CFBD8401187B03D514A78"]],[["0x1601D84E30A01A42ACAC105B43842DA2F826FC4D116CC70962F5D150C02E8EC5"],["0x0565CF2816FCA06A783E3B1D77BEAA65CE504CDCC39CADDC1E86338AE6ADED18"]],[["0x295C347B5079EBDF833E7C945243E91355839289A15EAA3C8DEC1A7B2F0E05B7"],["0x16A2223BF8B8CD658B6284C2D88DBE15F411DBFFA6982FB4E3A691D78EE39A7E"]],[["0x2DC6F226EBC9A051238844292C0B9F241E062228F330EA0927E0B98A3C34DAB2"],["0x1A97BE2B414B14789EA386F90C042E7E664A03F4C6428026D587E64F1FB403C9"]],[["0x01DCEB36B791DA1AA08D7D63550E60183A3E8C69FF5A44EECB3FD56576B85ADD"],["0x141F396CA5CD23A7549FFE70958B9358CF6AD3D44B4412AD93E6C1DF70049598"]],[["0x192E7DD3569EDA7675B537127B9F70C3775E0FE90E8DC621C6E6D972BE36AA8C"],["0x123C981B2D144E273380265BAD171ECD4206AD4655EBEA8778144D5526D43A36"]],[["0x288FD25E647DC632D939B177A5C3782725DD3E29BE7F78511F012984433FC4EB"],["0x2935B5926C25DC770482EF2DB4794D576FBA9D32A357B44FD390D6822DDD28BA"]],[["0x280A641063A79A5D6DA9E84C3FB5FE0A2CF53AC15FF6D9447D84370BB875FEE0"],["0x23AFC25DFAF2E071A36559E00292914C178CE67A00AE02A0FAC6F583E771B67E"]],[["0x09580EE3A774B86D99E8085AF64B6E7562D81433F12AAF27DDB39E156DF0692D"],["0x34768C531972B29D285C6810336E82099CEB1F326542F6173814777D85B839B0"]],[["0x29697190F64A67C38E1530D7200CE26C38DE493C4FF306FAD02E97F04EF9D512"],["0x0731257F19CD908CB37FEAA50816DBF7423667A316FEE33160C0ED958E53D6A0"]],[["0x30A89995DACE2AE255082E4B70D868D4A2A3F51DD9FBA78BA014F574A7BFAA24"],["0x35C1597B8AD0FA163CC6E3AB8D102FD1AF8695FA92B5497327B832E251E026A0"]],[["0x0263BF0DBB4F3F9F046370EF2AFFAB141E1C1A398E7928F9161B9D5CD96D19B5"],["0x07AB0659C63F51ED4E6B05C3BE4C93AC21C99E696EBC96FA37A5B5B7B86826D8"]],[["0x3BA2BCB58C10AEF26B8D8CD627D78DD3759A47A66AD976AF579462E985CD6240"],["0x1C756C8F88A87075A91D0F7E5EEA3FD6947175DC5311D7CB56BB1FF9AB9063B6"]],[["0x3C5716334682D4A5634CFE54F9200C5C17A273FC8BD7F85D040D7310D28D02E1"],["0x250FCDD10170DF9974A9134473B7F0A939103BB216486E5362A967DD5B331254"]]],"coefficients":[[["0x14C53FE9598914C77DB571CAB871A5790C71DD980CE833E3C4D905C773B8A694"],["0x3EE986EDE1E4F81E7DF024F64684D76DC074A7F3D06B62A682B9C98E46DCCF48"]],[["0x2D93A13807267DCF30077B5909EDFB615F3B376B0CDB8928C1E5D16BFCDDB191"],["0x25063F7D0FCE411328C492DC55A0205D18395821F6F8052EE0E3AD28C4D75D42"]],[["0x006A2EE86024099E0EA5B60E7F937CE3ECC721E593DD95B9748717662A826D55"],["0x0564327D45179FE029BF4ABDB80175097C18B126A2EA50354426072A4564E9B0"]],[["0x2C4B93E01735455697DA1D9E40E96BE8CF474FAFC8D322BCDCBC838E4D5B304F"],["0x2EB096F9F50C5E6FABCAEA38E0B6174E50985A31C41B02A1BFF03C480A37A242"]],[["0x102E31985EEE16C4BCDDBD45AC8BC93F335F89EFFA0E0F06640EBE2D0BB502D9"],["0x1217088AA19B922911D6F08E22B320DCC51E0099953AB1475C3FDEA72166C5C9"]],[["0x1467AFE6AA5D932076B0AD27F1B413400CB203EF2D7654C2C72DCC3174802B57"],["0x0A6915E3835551FE24F6C0FA00EA58A74E75B15DA8D3A33AE18DB6034CE2EBC8"]],[["0x202C28E5943DF50624B46F7A48188524D2572AB19F0E65B3AE7B5A05E02E5E71"],["0x25258C13C5733DF3C452B5756135B5EDEBA2EF1BE4ED87D227D2B9B6D5FF97C1"]],[["0x31A43132A866890A4E223FDA2708676970CB6599B7E78FE802CC63337DAD05FF"],["0x2C496F56D14D5EE6514B254BF49F6B1AC928BCBD87DB6E792F2B9B699C709E8D"]],[["0x1E8D412D478817EFE2366846BCB2B89FAAE333E8872A7F4CC9E69BE69F32BBA4"],["0x111F86014ECF58B0DCCC44D3ED581DB664B6BAD0C43D780DA6358D4FF2FC4802"]],[["0x212888FB5FEDD783B8FD870C35B9978E7AEC8BA2BB197B0C1128301EFEC04C8A"],["0x0BF7FEDE27C7399D232E3FF87902E12EBDFDD5717D35F435BD7EFFBED164BC17"]],[["0x254ED1A4A5CF45B7D06EED3B0DD0769DDDFC433EB7D7A23F3B7B3D727AFE25F9"],["0x15A77E36671132F390AD63FEB9AB536C6FA2FF5472272F2C773F235DFDB830F6"]],[["0x3981B739D36EAF8B70789E60FA2683432E00479C4473DAE7CD93C252F4016F46"],["0x28F82D41AA534EFEBB4F721CEABC61F64BFDFEB84E959829081D80DF21178513"]],[["0x2A88564A22C9F7D0D568FEC631AB1612DA40CCA666E20A06AA3E8EAA5B9C2BC5"],["0x265B54C532B450463872339223DE2AF2DE4937E7DA6C3102F2ABA74576763BA3"]],[["0x08C80D9608EAD4521D9ED24A650DE564184B3ACE15DB4EBE5407D67D312D2A38"],["0x0204C16E5FF3552EB8252C7F1571D354E7C4D69D4E8BFA18702919B4A9AA5EC5"]],[["0x20C0839E55886F543BCC64C4D97472C1C2643FE34FE7E47F2CB4B658B54B19A2"],["0x1126DF2964E408DCE6F41160BF3B0DA27A0126AE821A61FEB6E3E1597DC7E477"]]],"z":[["0x35C55331BBFE4EBBD89C910BFBC2E16A38ED5EC268E096AF9AD9C919CF2747DD"],["0x2ADAA53E33F02BECCF9F5C761C1DC1763A6CF35C467B503D402FBDEE844E3BA9"]],"s":[[["0x094342EC5D31C98FE4A81141EC6ACBCB6C2B386DFD09F385B03273BEC0B441E9"],["0x342BD0109D6D7B775A4DCCFC4283318884CA66B13C69E3B4EEA59F29E9083A2A"]],[["0x181599B265C35C149D4D90FE3B56F36E8CC32ACFCFB10FBBA131C2A8E9FB9A51"],["0x3C48726E1BFFDF320536BA6BFA3E52F10F71B9ED5717204E5410712A0137B229"]],[["0x0D7501D4A63FFCA3A3E6B3640ADB1CB079D0A6CEC360C126B4ECC3EE487F3A96"],["0x239255F85AAFFD2C8399E562B6EFB635E5F628F2727099ED76AE86477FC3A1AD"]],[["0x05F6BB3602B0D402FEDE138F3EAC6FAB63CA84A9F29CC8C7B26164C93219D733"],["0x2BADAEF8CF6D1D7DDABB84DD2F97D268BFFDCB19532280EA15C16D7EA295E3DF"]],[["0x19994D98851CC5DC032144D9D011336C5ECD3A6F0009EA3350BA723664A5A022"],["0x1B475C2BCC7DCD7FE7F2CEA5E2B39221DC58ED1F609980F156A19AD898ECB149"]],[["0x29087E6D8BFE7AD0A538A9C2BC310808FCD201DCBA32610137D7466B073B0CC2"],["0x249800B10822F39F1C41ECEF6B3EBBCDF5145F43935C297645A3838EF6E96A11"]]],"generic_selector":[["0x1ECF381554B72FD9C9CCCBB0E12AA06E4D780FB9164B64F33ABE9BD9E0D0F74D"],["0x29AD135DFDC08852C86956106D341C9E1E26CFAE52BF3B2264BAA5CDD874B8A1"]],"poseidon_selector":[["0x12B223AE343ACE3F02CC0C777E853FA2DC573F8F00DCB6DC48C8B88B25D08181"],["0x3BF3EE6372942A0135D10ECB53BC3EF8991530D68F428CD0EFBFEC11EF0BEE4A"]],"complete_add_selector":[["0x056BFBC7B88F465689E44BF96FEB6C58F68972D7BC8FA91A49C321E1AC043981"],["0x212F1AC84BD1CB3CC70D5E0722DAAA2B9C28420C65355DE9C032C58800B2771D"]],"mul_selector":[["0x3014D2657F7F09FC5E1639581AB431E6985123DC750FA1DAB0BA115E85D669C6"],["0x38795CF110144AA3A3DE5945117F0BF55C39290B3C9D5D61558F1BBA2622D1D1"]],"emul_selector":[["0x15D360852C7DDFDDE574341C5CEBE9032B780A93DBE4D93900B0378057F495A4"],["0x250634424E847208E7A28B16A97534E93CE99B344F95C06A01640E2C31AEF858"]],"endomul_scalar_selector":[["0x35AD57467FA852E6DFD5E5794B76A776939B449EEE2B7F099762564DC0DAE71F"],["0x2A2BB4283B05D95367AAE07E0B86337598AD262C4E051052670C980099FFC811"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x245059670520BADBC7ACB7706E07EEF8B3211AE0FFBBB4D508FC115EC4C7750F"}}},{"public_input":["0x1A1CE8940539EA725543D62F10709A4905954AA865A8EEF7A30749CB3F3FDAC4","0x0000000000000000000000000000000000000000000000000000000000000001","0x0510AE00E8CAAF61CB66C97A8F998B522BCFF9C614D43227CEE5261ABA7E9D6B","0x0000000000000000000000000000000000000000000000000000000000000001","0x112F4EF414107728F7183C4B51B51B3B3394E543136F8EBF216C8BF11F188439","0x0000000000000000000000000000000000000000000000000000000000000000","0x07190EB152B4BC9251A7AFA022E9DB91F464820C8CA9A7955C40C264925DDB16","0x0000000000000000000000000000000000000000000000000000000000000000","0x1D5A8A17E39EA80B9F23BBDF5CDD07CDB1DF703A00C0021C89FD962B43373CC4","0x0000000000000000000000000000000000000000000000000000000000000001","0x3C363ED3FC332949F1D4F35774B958E4EE397469FDA2F754FFFBD313494A6613","0x0000000000000000000000000000000066017130C8312950AFB68AB47FC7D2EB","0x00000000000000000000000000000000549FDEB218F720360B4A7091C9115444","0x000000000000000000000000000000008CDE0121F5AAEB92E7B1EE7AD4A09AD3","0x000000000000000000000000000000001927ABB51BD43E1D449045A64B4457E7","0x00000000000000000000000000000000399AE3025B375E65C31D9360A3DE6594","0x00000000000000000000000000000000AD53BAF9B81125F8CD6DA6A0AE86582B","0x00000000000000000000000000000000E3E9A47ED8F84F1EB7743501F2459A4E","0x000000000000000000000000000000005F3FD55727B1CD1B18590656BF4BD6EF","0x00000000000000000000000000000000F59C525BC308B194B3E8C248A9E2DC78","0x00000000000000000000000000000000F9204B9775C648C78A27E38EBEB0C59C","0x000000000000000000000000000000009ACFD7FDF78497E0B3B54DB85547CBE4","0x00000000000000000000000000000000EBC496170C0C57751C47E747DAE0828F","0x0000000000000000000000000000000008179D565BBCBC0A50ED8E334390B9E7","0x00000000000000000000000000000000873FBEF901086587F2ED9AC9C2511D41","0x000000000000000000000000000000006CCFDDE825AEBF13DDD6A5782982637B","0x000000000000000000000000000000005CEA15ADB999AD9E25B09735AFCABFC4","0x000000000000000000000000000000003FFF55F14118F8EE0AC2D3526CACE5ED","0x00000000000000000000000000000000591F2656DF68870F7A8D46D02BB1A9BB","0x000000000000000000000000000000005BC5614816B369B8DC868C59538C7478","0x00000000000000000000000000000000A459C3A627923851248C1BE356FDC56F","0x0000000000000000000000000000000000000000000000000000000000000001","0x12DE4BD8FDE48427D4C582B83621613F8F15C31ABEB00BD4A058D46410229F8A","0x0000000000000000000000000000000000000000000000000000000000000001","0x0081D25D5D487958021D683BA8227EA2F78007305D6A521FC11E3C484501B5D6","0x0000000000000000000000000000000000000000000000000000000000000000","0x1FB09235EECCB06F9C5A2DFB9C9CC8742D608524E9797CFC837FAC4FE3A18694","0x0000000000000000000000000000000000000000000000000000000000000001","0x119979ADEA79630345DAD07DA4643CE10C5392E79814446C52887417604844CC","0x0000000000000000000000000000000000000000000000000000000000000001","0x0F07C8C5AB3D839F8E7D4BD317F6AE55D283CECD529301433BEE5ED5E864C1D9","0x0000000000000000000000000000000000000000000000000000000000000000","0x22752343C446B1A84184A9719EC831FA5452A25AE3DFA2165D49210987608666","0x000000000000000000000000000000005D34828FB3A92E2CB0B77A66A0DB44C3","0x0000000000000000000000000000000075BD88CEC9813A6CC489837A2CE3947F","0x00000000000000000000000000000000B56DD9320FB95096CB281DED0F3AAC91","0x0000000000000000000000000000000061FD2E2B26B8CC625ED7C56725DD59B4","0x00000000000000000000000000000000DE9FF59DDEA3265C74F1203160F3613C","0x00000000000000000000000000000000352BBA431AF7DE61994FF9444382163D","0x0000000000000000000000000000000093FB708FE3BECF3AFF7136D78B03BBD0","0x00000000000000000000000000000000DE023ABF6A13A564A4B4E0BEE993D9FD","0x000000000000000000000000000000007924070DBA88D46C35944C0ADA16915D","0x0000000000000000000000000000000036E09E7E2C3D99E5B9279A11365B5FD8","0x000000000000000000000000000000002EAB3D7C9326F1CADA9C6CA4E7E6E5C2","0x00000000000000000000000000000000F4D351D2C0A1F105B829320C573FB06A","0x0000000000000000000000000000000065B4AD20AE18ADD38704229B7D991EEE","0x000000000000000000000000000000008014ACFD21515C76862D3F74C49DB8FD","0x00000000000000000000000000000000421B0B6C3F5AB331CD37BC0BB14AE09F","0x0000000000000000000000000000000083C3C3A6CB180FE84353F00674F5A046","0x00000000000000000000000000000000856A412F6B67F0C5B284171D11E3FB64","0x00000000000000000000000000000000204716BA9D51CFAF574E7259ED6BE5A8","0x00000000000000000000000000000000741A11EEAE85FB6D029DF95318A543CD","0x00000000000000000000000000000000DEE6AE8C11BF001DD453245FFAE623BC","0x0000000000000000000000000000000000000000000000000000000000000001","0x1D0CE9D695A92A1F073F9DC56324B8B9A1B55E08AB16FB2C5AD2149E630C9130","0x22779549FAE4D9F1E858AF234C417BF04FDE7DC8E0122AD229F34C0EEAA48D18","0x08284D9BB01EADA8CCA3E8FB6D6CC69E9B2E79F348D3F3FC4FD8BD1E3062C968"],"proof":{"messages":{"w_comm":[[["0x3EE57ED5AB3A96525FC33A5ED0B18C3C701767130E015CE6930884CEC11F7A9B","0x35103E99D1959E2DF9220F18F4CCA89F82738135FB52F920322A11B61CE96D78"]],[["0x04CB78ED44D1C3E1CF0583D6F26FAEC00F4E48BFB20A121507E385B41E650C46","0x088E3C92A514902C48D59510A08503B6DF8AB9704C0E03BEB3E767DF74A8F21D"]],[["0x306805E7D17F910DCD377233E5B956598E8BB19C153C540A695ED9E9D4DB17CC","0x35919B5813CC37CD727FFCB7FBDA54156018F39A24C9712A9B765E9795F5C168"]],[["0x19EA0104331ADDBCE2C447F05CDADADE635EEAE9A67DBF18AE1AFB0EE349F47A","0x3DC03918CF082000428F8CB4F53807024CB6C8C09D09D5D0961937D2B5D83473"]],[["0x08FCEFC3B13CF7DC8BADB9CE958BD1AB4501FF60725C45779D06F0EEC3BFCE86","0x2DCE64D941085C6B91136618FD0D3E10417366C6209860E797A516603CD43C76"]],[["0x2B3E7F8B6419A15353D47D09643F741FD28D3AF6FFCDC1729ABCE0BC70C0BF03","0x1407B4FD6FF8360A1A72FCF29D6DD0C4AA9BB80DAB3D6055F05E8BB534CF8DF8"]],[["0x17B433631680C86D87481A49643994E493C82F4E9A482CDE4CB7307F1DD552B7","0x3AEBF0AB3EAEFC9C82E3CEEC4A0A108477E909B370C0AB1C17E0FC4DC3F4E6BE"]],[["0x327C8C995914B63700A0A53199F8311DAC98BE81AE1E02CE19C99882115AADCF","0x128B376E65B84794EA602B4FBC0339BEC11572A5B33875D5A5A68C92F2E7475C"]],[["0x3008C7D4F14439CBD349453D78D069567BFABFC7FFA171E88B3B6D1B7C4DDCA0","0x29AD1B23D6BF75D0A5E0D667B2FEB6F4B8AC5F4A10F1645457153E89A0CBD6D6"]],[["0x222CE1783B06E9045E2E963B1942C648B3A11EB4A445162BDE3BCB374AF80D33","0x1753BCED5FBDAA830476C447CF888EBBA6AE73CA234A8DA227E206DFEF4B2822"]],[["0x21DB9AEAA99933A1E58A57409C2F3281543CA509C95384CD30DA6362A5888121","0x334CE65B6F298EBE45E528F90D14E116889B6CD235FE71C0A6FF5412AE8AD007"]],[["0x12B511161E835764D09C09F8C4B83E50AABBE99888DAA98645FBA63067C86D31","0x3B6A5FCF10294D30122CDD270D43E11D5F216006672F34AF21EB08024610EF55"]],[["0x0A8DB46DEA2F1BC6CBA40182825BB43E94E5D942936C72DDA10D5D40E7698234","0x09AA93B58280C318E02129BA473C9019B8E79203934345C884A2F35D52689990"]],[["0x3E84269844C5FBEE23F51023EABFD30BEFA7DFA40177F107BAE1075E33A72BAF","0x3244122003B0B214C2405D4C84481E357E0E1630EA30CEF0ECB36C20FA1E770E"]],[["0x225E71E2F3D16F3983B1DD8A2E8D8D49E014A42F9EC10F60813C94F93BB7A5D4","0x211F3110B2184F860E2D5F90FE9A29F90B759B727EB15D7282277ED63E48C930"]]],"z_comm":[["0x326623539E5B10F74B7B2665AA74CECFDF703FDC36E33D04C955B32B3C377E6E","0x05A49FE5F8A9B0431F934FE16B07D93858C0860C4A9A51C2FC69F4BB50FBFF00"]],"t_comm":[["0x33129EB1B995D7C50BF993A50C4C7A045CE9D6AF76BE78FC13F795EA1278F437","0x1A82279050BFC97557751BFF47F8AEE6B0961CCF7F135436692E6A2757E38E1B"],["0x13F6BAC1E88C2E8F868E023CC9DB7A2B57048A6917683EE7B7C49D7F1233627B","0x2FD9D793343E12FFCD0F34E31C59D5A55434668BA66D9D3B9DC2C4AE17D71CEC"],["0x3DC26BB6D0272F2ECB5126E187031CF1C7EC00E98ED7733648A713E3F1297D21","0x3CB2DF8687280C49970C794D0E4DD90861F24831950D2D1629CECC1E0F835726"],["0x37286D75234B6C1F837FE896EAE152CFF83690DA497E127E45F4BABFE83CC496","0x279A8F2DD18192444F6325643F511D78BD00AA00D6191A8FF1774922229C5C33"],["0x01920CEAE29399E3327552D14847D9788CB3B0B220BC14B293A5ACF59CC30B43","0x14B5F65A4B3BB068AFCD7C2A2E096D630FAD8CDF0487EFF8F9A804D79BB59DBD"],["0x0FF8C33954A024DAAEE7D4CA3C2571C8A593ECA959F7EE05175C96BB9332BA38","0x1EDEA2361CD4669DC22A452152D409C24D14F731021BB5171ED9A3CE708DD952"],["0x2B0430B8D653FA56EDC970169051DCDD158FD4229C982752D7179AAFFFFED02F","0x05E4E1F47F5DF3B9585CED9C638795336480FCEE6C6CA7B08375A15CF08B72A3"]],"lookup":null},"openings":{"proof":{"lr":[[["0x0EEBDA01356A4E91FA6416F07331058AF19D1DE71ADE3FD243F58B55FC693812","0x33800991F0C1845930904F173B024045C3D59281CF00FB1F53E7D0728FA327E8"],["0x216FF78EBC08C9702B53E2E3C5D88B6D864418AFA9CE9DAD63F3BF0C1019EB1D","0x27765943C410990D970919DDC7B2844E053539A36009A48A2AD6D61BAFBBF085"]],[["0x16E65E3C56D08BF6870374234FD1198EA95D3A4C93D5668C16534C4507713408","0x114816824BE44F3A76110CAA9BF299ADF53DBA22149AE6AFB63923E77837B291"],["0x1192B874359DAAE53E7852EC93C5889342D22A9263D655E65DE021512A8BF637","0x0CD9D5B6A6EF26DBF77C381686DCF0D1A089679195A4D9F52CB1ECF5B9E7AAB9"]],[["0x1E66A23D6E91D7F065A2EADE640D3554FEF26F02BC4AD8B8EFE6E40E21F8BDE4","0x063DC952C92C627E260FE398E4E973EE43C32FE3CB56B7008E1FF00E600B4462"],["0x0F8A33FC86FF87CF1E8150F37FB5775FE78017F316F155AC348B881E810242BC","0x334E29D84097524F51048E88009CB416E58CB99294CDA09F73DD50C6D85F33D4"]],[["0x3254492FDBD2B6704BFF9B47C11B83EDD2DD6B83D2093E181FFDDF5669D9BF5A","0x181A6FCB02489DF643B0EDA57F6BB6426FD5D155E9E3746ED8970CF562E14BD6"],["0x053089E42B16A964AD3FA8FD08002FC1F9D9900DEF00C96D11E3B27E941E48A8","0x302D7D8E9216C9EAACBFAF5E970BB829372F2D26D9FA989ED93F6748C917AF8D"]],[["0x100E4F2F707A513AA7E2B41C67A435A87B309BD09312849A2DA249C8929E394D","0x0EA86DD3C7ED0D5A04654A8AA57F19D5DDFD35BA77EE107E5B80363AC652F159"],["0x0D4215012F9204AAB7FBCB2498C9D165BACB5ACF30D1C6F90ACED31EF979E047","0x25957B5980E98B63A1EA3E32CD7D5651E6697CE2AE392CC4643B4BE796E17600"]],[["0x2197092D6DBC777E4D80F6D40D1356A4AA582BF7B7A33B789B0BA661147C8669","0x34B4A827C8EAEDC5E983EE9CA5E35E5C7B54D08E45F5C248B3ABE3EA2C3F746D"],["0x0AFB91E9CC574CFBF7F2D13853E20503EA76D1CEC38477D192F9E59184CAF57E","0x2A75979B62F73C9F1A0265D7CE3798B5DBFCFF5001B0499EC63618DEAE5FA123"]],[["0x1D1DA1C8DEE2CC7B22667C7E9F1EDF340A5DA31F28FA770879AA8797CB3DDDA0","0x3D17E343416C655235BA672D55129C576E3104464483592CC0B3DBF490BE11CC"],["0x301233C35B741A0ACFCD462867B0A8C5E33B0A4AA209DDCEADC5E0F78FB3D98C","0x220D52E09DEA36F174AB939CE0B16213DC32BDC7363E4F71194A9934544C4986"]],[["0x2F883F1944B8DBD444A8A1BA6BB63FE271699D1FD30C89B6D87387E9FB01241B","0x1AF71AD7F67099ABD5DF2E5FD506791385697BD32F4301E5D7E1DA89294A2A65"],["0x06FD08167580A0B22422C8F27390AFFF659A8DD0F36583E8EE98918F54F80DAD","0x10CF4CBEE953FD8AFA4F67D0886B627CAA392E8D37C99C1CE4A1F5C0D6F36BE9"]],[["0x123F9F960F01F139A0D5387C90955A2211D8A0A63BF2812C4327BC13048FDDAB","0x0B9899F47C73D8A9B4D8780E4C25EACA795672A8687612194CBB5DCE415F0713"],["0x2D10262B862EDCC55307099F5D2160226EA32890FB6E4184A931C65430B43EDA","0x37C12F0ECEF575F77206156B88E359B8A6A99F4915CF5D1FD4B247C45C84068E"]],[["0x044FDBEEBE36B6628D5B54C1EB0A5643A3DBB1174FB118E6927C416208C37E8B","0x16EB7C0D2121FD52AB3286F293DBBC2A312DD2FEA986F8F115369BBD91BA8F13"],["0x2AD06FA3A91D1E8B74A5FC7DB79D92193845CDA55A21632F25828C488F2729E9","0x007DB1BCC508B1D3D80B4D3221FF9349EE698F87DDE813F5C6F89F8AE2E308E3"]],[["0x34F5852B7D32DFDDB6B98D3539DC08FA96DAD254882D193786AA83EE363553B2","0x13452F03AB6500BCE2FF648C9963DAC04B72F92128C74478FF4AB5F74801F77F"],["0x330B76BD94B06E87C684188E1BADC3B492F9D7105140494B4C20B800EAF99631","0x0352C9256ACD60D4AE3E5AF7FBBE8D4558F5C98CBF5F8D15F8C094C8ED403A4F"]],[["0x349310B244488BB9292C384AF3D2138A7A68FCB7EB588F60A4001FBED366ABB9","0x28D542008B1D10D342FCA102535DA924C0EC5F37DE08A8CAF8EED08B65886E45"],["0x1D7E1A00FE8069E932A73942DD58E08D8A902369B22266DA15D3248AFDF9597E","0x289F001A5AB940FE5F721ADC01763DD425EBCC2AC5BA1F0AABC280AD2CA03432"]],[["0x0638E0531DE3D572CEF64EAB0DE80D3DFC7A35CB7D9D0B6D61BEF0A061A1E803","0x2CA50DC02DB4599A7C65A8C907A396322B2DED42AA5414A7F3480CBB77886AAC"],["0x336B64D1037C1D8B39CE1A1EE8945B1F7382AF483F43B600885B6AB79E6C852A","0x376409FDD75EBE35A7B821F639DB450B8ACF44CA6980A96197820A7DDB59D598"]],[["0x03F4624DCD7C1A21EFC7290D58DFA12D53CC9138990A0CFEA8A60F237EF77AB9","0x07D2945AF31EBB683D5F3E2001BED4687E1AA2DF4CC7449F6F65C99A81FA0215"],["0x2653068FF8176511C0C13B9D3C6191008795DB28562359CB0A307F15062385F1","0x15E5F10A4B34F3A484C0461DB651C7938D6409736412485DBBBE3323B6C498F0"]],[["0x1D654D0FCC3AAC3D4BF8E63F46BBEF878E075ADEF25B774912A77CB3561D4BB5","0x0BBB966F8C1BAAD2AD5650B55840E6502D514C543066B0BAFFE481F7B0CF7410"],["0x22DBF10FC0B6AEFF4C41B6D8A1F5A56AB413232CE27590B8D0F1661283AC160B","0x184806D101DDE64A8A2B59FF7AFD34F21229AE0DC5BABF1BE4322C0700DACD2C"]],[["0x22C53D09FEE4A1A16396B5433632358D2CBE59E8DAAC53B9FC5E2D61EF60E782","0x39B696B5A5450DEC2B3ADF44521D01F094846BBA040FE51A8CC462E5FA845CEA"],["0x3E554FCC08DD3997C1B03732B8FE35DA7411F2F611226C4B6675224564E57832","0x3AE669FC2B41128E536269B6E0DFB9DF578297FD1210D897E7A02AD60C305BDF"]]],"z_1":"0x28C7745D38C0B3978C798A0604637CE90CDEE942B45B1E54C1038AA443EB0997","z_2":"0x38158AC48C1C3E55955A887172AE1FB3604DCC75BD986F24FC15C33BFCFF7A37","delta":["0x3D99772BA83B49A90FAA9841C04E6C5CB5FC3C20740CE88482AE6194F1BBC522","0x1E60D911A1DEC0E9B04C8BFDF2EE4DB29D8F027AA10ED4E65AC52F188526A6A1"],"challenge_polynomial_commitment":["0x2713B03DBE332E211BD716C5D803B436A411ADDD6131116A4537ADFAB85E0A31","0x164B5321742C025C47970D91A4889ECD3AB93578FE231569F622252E607F0198"]},"evals":{"w":[[["0x39C84980F3EEF083D38D20DB29E9DC2A45AB5E0A08727956971030F66434BBDE"],["0x13DAB2F7281EF3B0116E7C5FCFB8F557823B4348E6A8F56ECC52B6B59DC6C040"]],[["0x16CB1CD1933ABBFE0F0EC98A172FD9FD922E3DADCDE0D8C0D8E8792845AB5379"],["0x214D5EA1687A1AA138A2123EB9B1194E94A7AAC67E1E0E118586F23F4067B5D2"]],[["0x0898E4A98877B7515F2421D1DDB928D492B5147D37B85577E2D94E25B49492E6"],["0x2CFD4F5BA8F2E7AA266CFB692E86B5B74ED8E0437EECC5761DAD348CC27FA860"]],[["0x3741F20F3243A91C91DD7DFB4507E37E2D850E959F50C4367C2709F97683893A"],["0x2EFFF17D161D626AC6A5FFC7B04B55DA968004ACBBDA9FAE53685057AA104353"]],[["0x11392C4830E9AB73707841F4521F27222026AEC6925FE59A01B8E9E2FD3615EF"],["0x0E2B52E29FF9B4C2B808B3950EB131CA9A5BB53D87EA14E1C8649414095DDEF5"]],[["0x2EB4A7A902163A278F9AEBD8DA9CF504054712F19EE00F02C78C3AD7310F7645"],["0x0F905086637D74C28FFDD2C39E8A3D7523F87ADBE5BC880BD58798530B141360"]],[["0x23359782AC9C03C59B24404F531CC5B660CD5A4BA0722EB579CDF5D14F286392"],["0x3936E2D4B9AD5562A79D347733A8362C73468682934CAF86C67D803D6BD4A5CF"]],[["0x1935A2D7C95C8D363F9170946203530E5AABEE8EE7D0B71F67BE95E81C9ECAC4"],["0x1210CA6A72254A7420DA8B43C7B4D84FCBC22C713735D0ECFF526C5ACFA4C04F"]],[["0x12C0DE0743AB18F66D914CD8A2DE0CB7515C731C27D94D1E10866A15A1D62DD1"],["0x15757E1DE1D524771FAA3891608D9D7B6DF85184AA4A2B05FF2EB99DD8D82BF3"]],[["0x27D587A4B172F7783A37FB238E2EBD76F86E2919FD5D0C443CB56AE442E8B219"],["0x3AF4D5B0B51A4D1560445F88CB2D95DD928C9A6A094E04A9E64CDD25B48B8C8C"]],[["0x094C3A0FBD3AF980F65845F1C5BC9F4A92600EC7B295C6231E3286B89C22BE98"],["0x2F9C744BD18440F9949DEAD5779E04520B544AB5E2FC6C916629F76B9E331C78"]],[["0x30CF19F46D0A702B891B3C9183211C5FC9A648C0B95BDF4F14A8280243F829EB"],["0x3119FFF9E5E90019EB237643C49CA8FF5FCABAFD57371DFD6D1E7A9810092DA3"]],[["0x28D6BFFD06D3302F6F8017BF58E82D3EEAFF106466DF63CBC183FAD1E95947B6"],["0x364289DFD42D3DD2DF9697B56AA16004CB04836752B4424EAD4E206A890AFCB2"]],[["0x32448EAF693A17575846DEF7CA7C04F6BB133A11A5AF2B4CDCFE46298B677BD6"],["0x34F5484A97113F533A09D6B9001609D94F805DD3445D62F0317AF96B8A19991D"]],[["0x2820A576F44D308281902F9178C7737F34D9225FE4522A8F6D0F14F21C0CA8E2"],["0x02CB2F441A81362BA6C9BB392DC033E8D5A57E60063E23452AA211CC66B4D03D"]]],"coefficients":[[["0x1E5F067D1CA0897CD316C6730C15E34C8FDCC050D5E2E72AEC2613993F76DB70"],["0x289B906F920D80E2AC0AF48CC76279437A2D78968C111F6B47A95A39D730559A"]],[["0x1EB9D290E2692D5BED0D2B8A386AEAE9480055F196BE046671247E5206F48548"],["0x1CBB52FB8DED0F96183747816B2BABCE0F7CD556414A82C0FA113D0918CA9EB6"]],[["0x3098DB643C57F37798ED750529AEDB8E32F504A6509BB0C943B47D1FED1C56D4"],["0x10A143721D80A69779E4157190083BD681804D82FE53C2446653C66A26B2BE36"]],[["0x19C9EA405A123AD9892A5F32B34774B8ACFBC6AD3B3519EDB4A72FB97BC64973"],["0x2F8516F09FBEE96AF1894ABEDC7B394B6F1B00F683940E326C037B085941F274"]],[["0x3E97CFBEB551DD2B5F12AE39AFEB559CD5515B9C647ED17F2A90F745CAAF361C"],["0x05EA7CCF9DA7D463062B87794148F4DF2829364146427E5819480328A54C6B6F"]],[["0x305CC3BE273EBCCF7758816ABB2DF14446B279629E21BB7E090792C1CBB7E03C"],["0x019A5E9055E3ADB90A4B4171B073821B8BC3C817408255A7DD053E683C948F0F"]],[["0x1581134B8767550D16B638BCF9369C8E21164114C200C6CD0DCC30A37F569844"],["0x35F7B78C81CE5BE6EDF07C169BCFDE0239C0F500B2AD3FEA68C2BD8C3D487745"]],[["0x0427250BC2B02FE78BBCE6466AAE273AF20E3C3146F23E886B4E3855B82A5F92"],["0x28716CA9592AF53FFB5DAC350A7E790BC285759D7755EC7D4ACF543B690E7072"]],[["0x159DA6EB14C417CDBC0F1272238514CF63D37A5993389EA2D406AE2F71B0C501"],["0x02AF1E341EF77F9721136139FE7D5B56EFEEA7A2828965349260D1065E34A20F"]],[["0x3555648A31BB4557E5405D48278FC994B4C781895299B159905CDD0F3E40510C"],["0x1984E42E07D54626C933666F0696A37318463C3FBCF2E66C58799DBC423AB33E"]],[["0x16B33DB1C63BAADE0F7AD42C1ABCDC864F9856CB9E206DD52736E596CE7BD460"],["0x034B764E3175DB59F144E01A8568423A67CAE8EA2591F215D7CF14EE73EED576"]],[["0x287F57CC60B34E4BDFC79CA5598626D030C339985C587D5D5E0CA7E361CD3C5C"],["0x03562AB3DFDAC7C011105063D8A18D751E31675CBDFA4F8048270F879C2B4EE3"]],[["0x2851149FEF1CDE5101217C740A422634E1405309EEE021093453DBE24E4D0A56"],["0x300BC541A96AC7E0A30ECD3EE415F6C399F11610381B069A4C5999C0EE04B5FC"]],[["0x148D176576291FFF44A87E8705CD6FFEB45383E126B27C102AB6346D774DF5D8"],["0x2A602B01C96F5935F56DBC830AD851147CB122245FC7CF15CEE3A3673303094E"]],[["0x25D5917EA9CBE08FA7F83C063A3F56F9A6A27CF9B26D69DBB2107420D512541B"],["0x229637F8A2B67CBD84E290094CB58953B4A2313652C3D3C7FA8935F442A02E90"]]],"z":[["0x0EA268A6400D0C2D91B4160149BA91676EED34C82039D8D5302C6BD667DE1830"],["0x144C0FC9EEE0127E85D12D27AE0404AE3A3A4014A747329FB67D1B7C0304183F"]],"s":[[["0x1DD13F56BA389478F65A59E5A78F0A8F1226413BBB3AFC9CC87BB8467EDB9B73"],["0x1E2E40CCCCF9E6085676D897B85738D5B512E887DEC2D576B876B435AABBFD69"]],[["0x25F046FA0E026F994A13591E92B4EFC8DD2767894E896A5A66F997E8C9EC24C0"],["0x31394AA4D99196C0937EEBDF262149EEA9E8C7B5C184451C27805634ED281B87"]],[["0x0C943834A2E6ADDFC7F99050F64A39C6B467E80B5A6549D712082949822CA580"],["0x16771A275C5F98C3716BC0F9F7B1E298E1FB027B6C5B7413E493F52399044E6B"]],[["0x10A3A42BA4F6B0472F9460A9DB18578C9195A7A6420B20D42F743385BB48AAF0"],["0x3AEC174AFA99EE058081BC59B6AE76906546FD4F58039B9BEB0B7924E95BB3F4"]],[["0x3D24DE21BE218DBDD4956A5D59524679E6461EDB57504F6C6E8515E02FB90192"],["0x05AEEB3C73E597936C6BC642CE2B8B2328F217129123D2CA401E378F18BCA9EF"]],[["0x100D23ED6D4361E00975032435B010F4D271A2F1EE900A8AED067132A23A46B1"],["0x0E91D9A30ADF97E2BF7822C93A5CB78D01ABE8E1781F1A5C3B9DB9A8036E0206"]]],"generic_selector":[["0x039267F698A0B1969991D3ABC6D3FA9BC5E9DCE59049233565A0F44145ADC2F2"],["0x25ED839037002C4DD9DC7518896086A51FB907BD104B61ED86E8DDFF22B37E0A"]],"poseidon_selector":[["0x27BCF3C0E2656EB60879DBC63B26D3840330121E5FFFDB32F7F9889FF7B6FD60"],["0x28AE918DDA8ED3163B88539C7B43F9546259B2DDB6CB78214C73EA90086D00BC"]],"complete_add_selector":[["0x14FF8BAD8F34E7F02DC5A65FB2C76D63AF8161618724D8FD5BBB2314B7A6D15A"],["0x362DA7A7F993C88B9929B96E465BE231BA1F2C2C9801C3AD2FCDF8B1E8DC468B"]],"mul_selector":[["0x14E071932A3A923E99D4C8A2E9D7FC68B7BACCF1D13EF18E503A70DF3BEA8997"],["0x1EBA59FD0799A381DD4173F73B909F1F0176A64DDDC3BBFDDDC1D851D4020CDC"]],"emul_selector":[["0x341446D00212AB1584DBA4A06B16A424AFAA69EC33ECA1DE9C3118E98F7B6ED1"],["0x245C92CA3AFB8A16B19E57B6C5338DDD83E088BC37F952977BAFFFBD8E76011B"]],"endomul_scalar_selector":[["0x296282BB7EFF24F2246A71D09E474900CC2407DCCC0492A872DFA04A17DFA5A9"],["0x2DA5F225D11A2C044F9CDB3A15952D1BD3E12A7DF759FE7A1334ADA16F481BD6"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x11527E74184571F23E905C0F616B54AFE935A796E5C3402F19C3E8B644DE7364"}}},{"public_input":["0x14CEC7C97FE583BA24EEC39B8A21E62EB95396192F5DDB71932EEA0729F99C82","0x0000000000000000000000000000000000000000000000000000000000000001","0x0DA1BBD7410A8323A8592B723B3F11111B1ECB5242E82B46FD5508DDA3A05681","0x0000000000000000000000000000000000000000000000000000000000000000","0x0CB3DB2A6EA8E153B752C2324379FBC387125D7DF9DB57950B6CF254ABF46922","0x0000000000000000000000000000000000000000000000000000000000000001","0x17886CDA9DB5F5A54E82290398997D2DB0EFCD31E5133678D871B2C29F7ECA4A","0x0000000000000000000000000000000000000000000000000000000000000000","0x06ED3F67D0D84BA82B2BEB0418DEDD8C6E7D8FD6294230FAF9BE34A250F53DB3","0x0000000000000000000000000000000000000000000000000000000000000001","0x1308B73488C9E8A7BE8319A06DB6F649E3B69BC463C102047CEFDB94CBE37DC3","0x00000000000000000000000000000000102E3410B2A8C19E33DF7412B08C52D8","0x0000000000000000000000000000000067A54F0A7AC46E39605FEC12E6513DA9","0x0000000000000000000000000000000096138A608CFF93112424BFBB6DFAA587","0x000000000000000000000000000000009F1B5C9CE719446E4DCC34C966409AE4","0x000000000000000000000000000000003633D6651876571D9C136A6BABFFD895","0x00000000000000000000000000000000DAFE5440229E23CC11C47776468EC88B","0x00000000000000000000000000000000018350AF14FEC27310D62AA8F6A2794B","0x000000000000000000000000000000006A844BCE603BA88E958E5558689149AD","0x00000000000000000000000000000000C0FA1FC6E7E7297A362C6976A3FCE807","0x00000000000000000000000000000000E156588FF4982F4D42ADADB7975BA409","0x00000000000000000000000000000000A91759E7719F1655233D03468EF722DF","0x000000000000000000000000000000002DBEFFA559F9C4C438F357830939A306","0x000000000000000000000000000000006FBEED9E2B9E3720191D23787E7539C0","0x0000000000000000000000000000000001C86C4481DC918E37F1E24165C21037","0x000000000000000000000000000000005BDE95BF50A502D446228F1EB1B9F175","0x00000000000000000000000000000000C8F85CCB2166C6A4455B0844CDEFCB50","0x0000000000000000000000000000000085A843ED2B731F19B1FE26ED2EC0286D","0x00000000000000000000000000000000C7505C3DCCED14AAA310F3D669B0B296","0x00000000000000000000000000000000B533D958D4411096430841BF4E5F1D51","0x00000000000000000000000000000000B88A9F5FA96E4F9FCD7E7A71A42F0356","0x0000000000000000000000000000000000000000000000000000000000000001","0x085EEC1B1D22933309337476E166C2CE9C8A0160A9FF5C85C2665A6BF1F614A8","0x0000000000000000000000000000000000000000000000000000000000000000","0x087480E8E163DDADD52B32D099186F002BEC4AE035B0A71517D5B47390597CE8","0x0000000000000000000000000000000000000000000000000000000000000000","0x114BD01BBCD01AD3CF01F63CECC148B0D3B248F2361DFF38742EFA4DBF37FD83","0x0000000000000000000000000000000000000000000000000000000000000001","0x133241C497D62FC82B833804D8D8C6A6215572E3E3428426AF642CAC7160F9B2","0x0000000000000000000000000000000000000000000000000000000000000001","0x190937E3F709364A6F04223D05A40DBCFE4F2002FCE1CCD9756C6566E2AAAAEE","0x0000000000000000000000000000000000000000000000000000000000000000","0x3B1F44250A2C18895C3A03508DF73F4FD17C3DCC3A10D441966E3F55BAFEF3BC","0x000000000000000000000000000000003D4AA8533C25433CD814E45C50AD723A","0x00000000000000000000000000000000653CC8AA8100274B53BE0BE85B1F497C","0x000000000000000000000000000000000B4C2DFDEF8573C9900C7872296DD6F6","0x00000000000000000000000000000000F3D0E55089613893FA5D00D4A6193FFD","0x000000000000000000000000000000005CDCDD58DBF36AAF32868C049B7B5110","0x0000000000000000000000000000000037AE996E083CF2079AE0744ACD2E183D","0x000000000000000000000000000000006921D4E69D3388436BC7D6123E2D4559","0x00000000000000000000000000000000ADDBBA5D76CE30F821FE377F0EEF6722","0x000000000000000000000000000000006594747547D61268182930C4F9066B31","0x00000000000000000000000000000000C86623A56D60A1BE3C59F19771691B1C","0x00000000000000000000000000000000C553E376FA5933C45EA0596F802A96D1","0x0000000000000000000000000000000016A9C116B3CABC3C5AA90D8FC6AA4B17","0x000000000000000000000000000000006C8401A82965DDC509833F5A5DA49496","0x000000000000000000000000000000005E7EE70ECFF6207DF5FA18C476B7F677","0x000000000000000000000000000000003926591FF344FF95EDB4B0399C3EFA26","0x00000000000000000000000000000000AE84D528E3A770EDC9857089C54385EB","0x00000000000000000000000000000000088E0AD079B334E8FFB8992544FB5199","0x0000000000000000000000000000000083CA0E900A3891F5E1F2DB811EC17A2E","0x00000000000000000000000000000000E62F2B16866EDB3D2A0DE8C04F840209","0x000000000000000000000000000000008C5CBB651F9B55ADFBB4F89E093CDA37","0x0000000000000000000000000000000000000000000000000000000000000001","0x381A33F0B319E40FD050A40795D50F1F257AFA750C3C21C1BEAD8D76C66C7BCC","0x158985E2B31D4C086F7AB1F11357B134BC4126E057CFA55BBC781F2C6D9E7A54","0x3174BF991AE2EE4C38919C0BB3FC3930E18134D669CDCE2820D941D2D732E00A"],"proof":{"messages":{"w_comm":[[["0x0027E6ED4CF730A18C7B6172B02A91E85350343F446963CC0200C70017E2CED8","0x231589A1454D188302ABE270CD357311D276485FCA2B4C37FF6BCB80AE146189"]],[["0x2E7238457BF70833CB8636C66740AA509FCA893C529451936C3DA856E5C8E85D","0x1F27B2751C00CB8ADB251980D89D5ADB63D9C10BBB419F58C77D4E4E9C31C8B3"]],[["0x0F22AB894117120B1297D2C8AE851BEAE7C151423EACE0EFCA2F5CDAC9FC069E","0x3996F23B7D09220706EFE058ABF5E66F6E2CDB2BDECA5E025EE2451B7BDC3F08"]],[["0x3713A1544D867987457F9656DAE5512568602FE2B7FE2383CD8BF5913ED2643B","0x0CA6FCAB9704730BAA9765245494B468FB5BE3074F603786DFE0EDDAF49E021C"]],[["0x347598A559C7FA678A04C3E3270F5C8B47A2D390F24A8FD87CD275D13A9FA417","0x0AD2087D21300D6C485950B9CA19F4937BB4BC17F14D8CFA94FF430A49CF191C"]],[["0x3485B7AABEDDE2CFD0539B7634EA0CF1F8D9D6E44D104FC98EFC3776ABAD9890","0x03C4DA782FAFB18515C04660207914DF68A8CCF509125D29C91698382A5A1E7B"]],[["0x27BAD1EB350E18477CF60F089402B2ADB12D5DD469214C201527B9C7E2FA4533","0x0C6B347FE22DFB396B590B31996AC9AFB523E261C40F968EE7E1A35DE08A2973"]],[["0x17295B718C6C69FE7FA55182DEE397EBB2E22379474CFE99C1BA6575EA68ECEE","0x1F96174B70F82D04D9A731F907FDCAF44BB5FDBAAAD6464E1B6C65459FD52D95"]],[["0x002BC7C9F1D493BC11C7026E245770860D477B2C5B62DB8C9EA3AC4C6B9F3A0B","0x3A857CA2C629EFF56542C77F839564979E8846099570D62BCEF9628BC23FE006"]],[["0x06014F5EAC5B4BAFE1697596A9674EC897E1C89F85D6F0CD758AE78BD39249C1","0x2A75334C6E40367A23880219DAB434E010FA11E62E827A91CF8ADA524F04D34A"]],[["0x206BB3C35DE41A61CFE9A27F29BC9DA19C566427AFF052E25F4FF309BF654623","0x155CBCA2A580D90B3F70B5B6E6CEDBD29084C428D7E63274BC7B7F90D38918C6"]],[["0x0196B75BCCC51ED2D2BDEA21D67506E371B5BEFC95120C695A4CE398A5354EA0","0x2E9920E0C69B9F6BF3F89E4717D958F8E5E650C2DE4DD13935F886C943E5D98E"]],[["0x233500F184D851C71C4B33D413B0E9D8A51E6E1292FD25196EF27730E583033A","0x133EF7795A20BBD890ADCDF6AB558D977AB4EBA70305066D8626B52667A6BE3F"]],[["0x3A4A12D128CE7851D676405CD593A3C9733E2937DD4EF88B8D29DFB496E385CA","0x007506A13B9F5D881327412C57A5C4539DAE2B38823831DF48A680017FDA0796"]],[["0x16264B60C29B2D0D65385278B45B8A16882BFF27C6147CEDA04E91854E2BC6BD","0x3B19C7A2AF93E91E4E7EED8959591A88C58F18BA81D13C8411FF4C4429C188EC"]]],"z_comm":[["0x17AB7C811D0C6C17F6634C9F3E73AE23DAE323EE43EB85A40F6C5BD561007C98","0x136A269B51F00262F4410294B768A66586519A83A10508FB074F1A7B533F701C"]],"t_comm":[["0x286B43A04900497BA8A485AEB69495586C259C2F61F3A17BC760D1F790B42481","0x2D429D86DA7CB7726F46310B7C07785B82A9E00F4B0C36AA9A28C763B0A81E28"],["0x0AC4675F583265BA16A9F67E09B49F1CB0837F44255719BDAF2048376DD5F871","0x0FC3BB13790F0F102990549A474CDFCBB37A9CFE80998DDAE4C322E5ABAADF6B"],["0x235A21F8FC05B4B98E9626EA62162B46141A7ADE4F76046956C289388C29F6BF","0x2FAC621BA42C48108006A7D199535102879D184F99F29380123C04A463F6E910"],["0x0088FB834835072B5C323D1153C7D031000F0100DCBB00382382130E9D5C3ABD","0x14EA8476AAD7B2D874F9639D0E632282085C75449263793D4CBDB9DBD99B6102"],["0x20772373DB0012C40E618DCA69FA54D398CDFFEA7FBE166DDD33A5873A5952EA","0x02D5FBEB100B20AE65A414F1DDE8319AA946F5BD22347BA2540935F5C6D60502"],["0x38F5AF7DF1A9B96180E9CE6B6C1E13858D5E9D40674B6DDD116BFD080C805EF9","0x12C3404F1F27A3B6C2283C66DEBE9514F49B7CE87BB26653BEA1D2915154EEFD"],["0x209D571290163FA7D22D9C4AEA39298166D16D852B5C3510E080BAB99BE93A45","0x342C49EF1059B66EC7F4DA79A1839D14A0E704D82AD72D849C1C589671182A47"]],"lookup":null},"openings":{"proof":{"lr":[[["0x1E614C3698A2BC5B72CE0F076B00E13041D1FF64F3FFB766272AB9565438D619","0x10E3E3D550ECA24BB2A344850DEEB798EE73B12D705AA2DDF43DC6A303318C30"],["0x2DA995F275CDC22AF9026B9EB0AD36559A605CA6B06F8CBE964C05D8B03430F3","0x171FCC70BAA037B382675B04F3C45C3B4E33BB103EDCA585B5F331D169FE1BC0"]],[["0x3DCAED00F1122723089690ADC258C76008D0BC19CA0DB306791EF3596245E2C2","0x0F6E94CA2CD2921888A8D032B10414E18F033C9EF134F913FBBF15AB6FA79C33"],["0x0415AC2B43025DDE17E6CB6E76BCB2C495F7643737E6D85E788F420BF136BDF1","0x33BB2A553DD1436F6D6FC2997319DBA3CBAB166B8FBF165C22B27F6399F55964"]],[["0x36078DE07B2A3F0D9EBE61C1667CB93A4304B68D6A71432E70095525B4F6854B","0x1AD8D6C4A81D0668C3A03D0D4B9B6867302494CA4ECA193130E101AD01EEA68A"],["0x027CA81E2CFA29983DB8E8C9E3D20E60F8D0D03E00C0732E7D645C98474F6C38","0x23F3C6B0BB43D099C01129D14DC5C4EBF100F75A14C12818C577DCDB0CFFF619"]],[["0x2E770FBC9639ED05D2E028155555C2AF773ACE17348FB53DC0F229FCE803BEB8","0x1C18B863CA0CCF6B2F1C51FCF5867209A825A90E5FE028020F7BD8B6A15626E1"],["0x18758BB07E44F1B12C8AEC2E7C86ADDC80D973D589938B29DA6742798C551F52","0x0170A9F0B09017874FEB7AA1454310388AE8C248E30B45FD542E14FD43B575FF"]],[["0x1C19567568DF5B745AB909FA7CC6908AD8043F71AFE093869942AAA26C38157F","0x00C8E01AB00204E62E4460275A9DB687E0A0E5B57174F9722C76DC0AA5C2739D"],["0x09B4245ADB50DB81CC34F4B0498AE8BEFD93903EF5758732EABB0C4CB55F8253","0x15A22A05F15C9C4F50D5EE22D26EE313F5A10F4D4DF91C5E4A3D189CC595F436"]],[["0x3F189562C3F5259A4714AD1E356E4B06CFDC3AE7F75D524909385EFC0F7992A4","0x10EDBDA400B0F5E054E82D3812ABD3E1B11025E259C2189CAD8710BC55135097"],["0x257E86C2AFF36EEC0AC8EC4343806CB3D2F2CD24DB0F02DCD7E6EA1FBEF730E1","0x331FF64961FBCA5E139D50D74D38BECC793B0CF7A47B9F286CA5E7A7AEABB943"]],[["0x257CAE90AAF5920BFF7C37878D3080F6CA16245D48C6B137D9441A5E68F1F5DA","0x292E6EC74CA9BD1FB522D4670DA0CE39A0552CDD98BD61AB5A075F19C68E8E24"],["0x1B44C933CDE6FDA78DF38AFCBACAD4B65AA0C2BF86294D4D795FF3744ACF7A68","0x37CEBB73B377F018BF125896975515BE984E583327F5322A069105B90D86F154"]],[["0x1A2AF1DE111C046D8D9E382C6A6E878EE22E4DB4CB3BEB3F2D7358905D42144F","0x2DC8876FACB6572FA820AF707B0F8D09C9A32F66BB31657665CB8EF3E99EB178"],["0x095747FD40A94ACA8029C1665B9652CA3C72584DAF74B83465A0AA599D746017","0x368F0E8C45CA2811D564F58893BF2A0ABFA43BA21565B98D9919C21F796DA6AB"]],[["0x2886E260F4F92819D4E567A6FE80FFACDFA42C88CD2D89D18C6BBE00BABA4767","0x345C035A9345E9ED8B3E14E9EF9D54F8D866C76ECF3E9ECC8B97434CBAE30A16"],["0x1BA488F21CE09BD5CBCB049737F34A72C399760DF5E60F190C09E70565E182D3","0x03740DB6D40AE145169877ABCFBC50A5DDE127A990668DBA5B3AED918C39B82B"]],[["0x21748FE97557E262D547B5941BEAF0B052AEE952E314B9C13D09F1FD0D31319A","0x1EC5FCB85F5BB2C2E28D8986EA75A4A47C5AB29F10D62E1154BA78B37C1B6FF8"],["0x0D22D0E9B9652D0427A12C310B8F34C88427EC07367B3ECD9DFB25118239D559","0x31620B5E119F048AD0FAA639AFDC176D8C6DE9845239701740C8488ADA6A0C9C"]],[["0x11D0DC33415E5C1484B8F85AA4923A2021E27803E9852F341F5E54591566FB41","0x23278EDB7AA0EFB4C3A72E6A944D53482F8BE36CFD4DC3B4C46F1848724675D2"],["0x13D8A6F4E85325D6580FF8867A56905F7B6031613AD8543F7E36B146F0595361","0x25573CEBD3BA4E02357A5ED2C9C817E588CF4FBF5A45722BB72776CC05BC872F"]],[["0x28498C37B320D022D6740839C5E453D3499BB6B6F49D1E935835FD3F06DE4550","0x2DF3D6AE29EBFB941D520447AC6396954A27F701D444AC4BE83FA65AD5CA5E37"],["0x1C31A4ACECDE491A7EF7B33F17B68B1810A9E87BA2599AB4CA319DA8EBA9FDDD","0x258EAC2CE4DFFF3B1FEF960AB58A014795E5D07C1F00697C3B0803E7EE13A7F5"]],[["0x1DC42B4C43274BF722DF3766ACB36C23CE931A23BCC1B4E78B0A91EC69A52DA0","0x24DB8E03133BFDA177596F3211464C27B4E02EA6A5B15EA5A5A0F7843054D1D6"],["0x08DEBE8D6A80C53F35367E146B1AA753E9D9B87E9C376401DD55615AF9E5A9C8","0x3226486915C8E3EFFE8A16E2C44D7365FBAC4D75687BDCDA6D464D7AF90949DB"]],[["0x07269BBC3E9F82CEC05932C9F8D8D2184D49B2673D5D00375DDA64167DD9A12A","0x222EDF78C08B431BAA7DE752EDECFAC7240ED1ECEF7B2BAF8EE91D784D52B97A"],["0x1B5E4635FC1EDF6BAB57FB542E9B1F155DA5A79BFF2941BE7ADBAE7E2081D299","0x1B8A30EDD46822C0559E08C7EC47BF72B1796B37BFBCBC9794DBCD6C041BBFE6"]],[["0x1BDA11382C3F3FE1A0083B95DB6B2572980FEC1E59171C6D1572DAA75DF63879","0x38B05FB303101ABD4BFF0D74697DD67160C83CB3CF9CBD99934F33D68CA20184"],["0x03DBE91F872709BE342E3D6314116905FA2F7A110CC9CD0476DD42AEAB729701","0x0C39F88FEAB26135B57FAF82401F5337D0B5F9D6BB548938B965789B54A36968"]],[["0x33B47DBE21D0CA02CB696CD724C59E501627AC1F000136628D735E0AF51B6F17","0x0081410F3901D843D86F74733F64C865F25A3F787541022F751BA25BEF3A45E1"],["0x3D1CC4BCFD4EFC5B65B6F072A9F1AB2C78A2202E979D56E7B28373D3355B000C","0x3AA1F4502085FB4CCD0FEDE0BADDD86DB118C6BB9C003410526DAA6880D75CD5"]]],"z_1":"0x3DCFC38DE568C57869C0CDB9111BBF3741B1B3656337C07CF0728CC0BC325963","z_2":"0x335183D4E6328CDE5523135F7E3C234F0D63828E0EA3A3B4E8AF29E8BCF8205D","delta":["0x21CAA86E8A41B0F879ECEEA4C7B2EADBB36A3FD2B96B8E141C888A63816692A9","0x2E8937257812D10662E93A22F32AE5B9B823AD9ACB9A0A6ADD16DCE556007650"],"challenge_polynomial_commitment":["0x2E309F860D359D1E1016E36E94EF9C551F3E06EF1A82ADA2B5358C461728B886","0x35028A0DACF8A470A6ACDAE40CDD4FF7F0A7F7BEECAFE825C6F9083D85F6738E"]},"evals":{"w":[[["0x286939B200E23929B550D2AB4163C8F5D5DC19722CFC19E1C43B0624D5B6462D"],["0x22219C35A7D8EBD078BE46613947448FABDDE6639E759361B88BCD0D554F9FB7"]],[["0x0C6640E0F3D8F8848B4B36274175294B258F1EDAAFB8B803540DB1431C90BD68"],["0x22472ADB76704680099F03B609AB4F610E0E1ED3105806B8C5494D7C8E82FBF8"]],[["0x177D694C554B22EBB890E72C00D8A6F33652B7FCA9392F0867A27B0C288F56F5"],["0x3438FE1CD1AC4DBCECAEE182DA179DCC5B472AACDDC48EAF008ECB905FCA340D"]],[["0x05569732B2580ADAD26433ADC46DC40C9D915D7F5E3065B58CFB79F836051461"],["0x31BF2671EBD58C06E590B69DC92E0F0FC9EE443C5D4BB55CACDF14C2AC51517E"]],[["0x10ACDB4740A2B859C3D2374C635C5F30FE31D691CF137DAFB1DECC81A9557279"],["0x00C4BBF873844B912D54767CA8905D17DE1323545B340DB0F174E4DC9DAAD9DB"]],[["0x0AAC276CA9EF64244AC4A0A67D6117F8C00486627AB2E5D4DAA2120A1F9463AF"],["0x27E2B6D5EBAEA14FFADF6C3D44F7B92D4CC3DB41655149A924CB6984BCF54EF5"]],[["0x20126002EE23B2D227F8856AD136FECBB766347A83DC5B52858C74C22ECBCA49"],["0x2DF2BD023BD727E9E5879239490D80DAAF4CAD307D013DF0E82AAE0D07F50F4E"]],[["0x09C381BD9EB6A59A7C149560BFFE8BDFE7736D0DCDD496BBE777484B97B9DD6C"],["0x128A5C2759F8A3B4FC177381F20616843E92F920990D3F688098DE24CC1EF5F9"]],[["0x2EA13E475889DE508420ACC56267140A16228A74F67CC64B5B18B097866AA79C"],["0x320C5D6DC0A094632025FF6DD2729D17FD89CAB81C1109C3CDF3D9711F9D1A8A"]],[["0x3EB95DBD9F7D48DC8516E5A61374D75B566A129E7FD1A47E4B133D6D613F73C8"],["0x0F5CE87803CCE9B7A5BEB43AE6ED58E42C92E3DA2C01839723C20AB3732A0328"]],[["0x04B62E8E5A230BB9CC7EC7FC69C12793697D13717955253F020244B0D9F74ABE"],["0x294AA5F483EB04A4C3D9C7AAFC22AED2DA79F9B7815DC27E5E6981FBCFDF0780"]],[["0x24737E7B602C8041F3F04349439158016C7A8688E425AFE8981841768BF94B2E"],["0x256664EAC30A1AF4CE5F789204C27FA55C020FE19092693FA93A504766529369"]],[["0x2CA11277A7414A0D7C987A45FE904D21251E457E54947CF23CF351EA3BA2BF3E"],["0x1EE189379088CAD6E696164BA292951A6CB53AC4BDE4DB2EA5F56D9213F77CF5"]],[["0x16C9119C440B376C6BBF82EACEAEB1EDE4D4A5F930935863D10D065B957F1653"],["0x35BEA7BF6FE0567767D156FDF5771604C713299C4BCCF400F6FDD9B533F0D5A3"]],[["0x219CAC71DCDEFC2A07AA57E70DEF765E26DFC160B0076FDAB53BF527E6A2C320"],["0x357331BD97EE5CF3A407EE138788AFDE02F7954A6125F38A997FCAECD9615F54"]]],"coefficients":[[["0x0DD80D2A18F1C3873314CD18BF6EF60959A56A7EEB15CDE459D0A5AF6A7100DD"],["0x2313E37AF001DA163FD0CF51436A0A3B88F2B3050AB57A4D188693CF4458DF12"]],[["0x3ABC751FC37A3AB0CBEEAF8E03CEB26A6BE821D3AC216A917D77CEDF6C811B76"],["0x231E128358B07389F5F72B5923A40825801F7D3857E7ADE0057B44C72420781F"]],[["0x2ECD38B3DA97EDC7948746829A0BC099C3FACCE496B87667F6535BCBD4BD5EDA"],["0x15984921789B31628AC00C7D49F0BC57784FA998A5D4B74E7245A9DA5976142E"]],[["0x3A6A164584E5190BF7F12EBC08BCC0C94A274E6FCFAD8B05681822B9CE9297B9"],["0x2BFCFA0A67147B2E03BCC6E9E43A017CD10C1904C40574BF1D30AC9D7D33C12B"]],[["0x0919794819CF94078245F3D305D0C2769CFFC35D105A1DBCDF2E1FA9C3E41364"],["0x0A402E0DB04B0A6415E6EB78108C05FC1BA412B84560CDE593A14CFE16EE0FAF"]],[["0x153A663AF15F2C4D38C419DAA6843C677B5AB458ECC9345AA6599653653448F6"],["0x3602F5DD73B8E03F8B3A60BC20780A4C2EAACD43F17B467F99509E605C427770"]],[["0x0A9C87A730C624317E93F149F5E97B3B02AF0FD10ADBF372F434736ED6EE2301"],["0x3D52ACBF5430E2CE7BAB732357BB5A318C098830491EE6A5279ECED997D680DF"]],[["0x3AD0D1EB0CF60ADBEF657B0785ED69694CF93FDD048A7F3BF0733C979E89363B"],["0x3B91206DC3AE76BECD297E00DBC997E9A428C214667C880429FD56515D3ABA92"]],[["0x21C145B58262519331919EA8B7BA75CC107F65EDD9C4708D52A60D74F522A17A"],["0x3C8DCC4DC229E9AA45D300B537270DBD1D88D3A7079A5517D4D45129970FFF48"]],[["0x0E08BF95DF859A8BDFEE0588107957FBCD2CA41339AAFAFC210883589227DA42"],["0x2D3C977133BD9590AD726F8B5E7B774F31C825B7D1BF949CE9FD80DF2799ED91"]],[["0x3EE02DC5199CFCED385F9ABCC33D3FCFD5BA5AFE9A906EC4B3EF28B14224F4BF"],["0x076BE38F17BD19ED212531F5EB589ADEC023D4F0F61BA05E571C447E5214D956"]],[["0x32A3B84E743359F0A7DCF2B33453C12F5A693310829CCDCE6DC95B896E6906A6"],["0x3689BB132BBA6C01C62A76E0DDB85ED8B3E57F4D4F680A6679E53C067DC269B8"]],[["0x139BADF2CA3E1F607AF3FAE018D13E611B6D43081CBDE543A25A3B953E5E1229"],["0x0E830B1849F3C66F3F591A3C531E24EFDEC6E978444E111D60CB257E225A9624"]],[["0x30928FE0BD442FFB4AFA878B28FA306CFBDCCD22F7A60F07E66BE242383AC787"],["0x2DEDE3F2E611FD9F8D4F48D2DE41C8D2C25AC83C46D8A7C78331FE96C8068126"]],[["0x03BECCFA82792ACDEA9F1DE796BFF1BD76A0E26DF8CBDE9B73F239ACA3351240"],["0x1B8FF4B4103DA6EE89DC7FF734E92D92D5786596D2CBDE4F46988CF38E034117"]]],"z":[["0x21851EB5C675DDE1AEC7548DA97CF62BBEFAA2354B0DE212DA8D0748F3789483"],["0x09E02A2CA34AF819A278015EB8F0901C6F2DDF739D6AA96CD24889515BFD4F57"]],"s":[[["0x3D9DB2F635A379FAEBF5EDAB4B914EDC9A2DA9A1A4A6C504CFE7A5D2AFEA237B"],["0x32FBC7443C79DA007B78095ECC42FFDD61F1F980F43C554CADF8F73D5670C87D"]],[["0x2A3D5C8C6692A681360B19787B7A43E0F964C2866B80CDC85862D35720F9017D"],["0x380F6824CD91A496A14B784B03C2A7B756EFE4A1856C8CED96F1F1B4AC570D18"]],[["0x0651344B45A186C7C3C9112338FDF5968BB045E685C6AC98FA2FCAC8BB8590D8"],["0x365CF57E9DF43DE54171D95A86C404663AE05520E52AA3F186C24B97F443976A"]],[["0x1488DF800894E13DFE114AE6F3B1CF948972F9584AF565AF6EBF3C61DA40CCB2"],["0x0FDDF6410829A4B8BA561294684F2A52E88CE87EB88EB48FCE41A82EFFC74900"]],[["0x26A08086DA71F49457248F85B2D2876D23920835CD9E184F1E66D7C3C9DD828D"],["0x2C3E99D472EF7C57BDF8CA0884C86DA777C81B2F9B5DB94985150F558DF4EA3B"]],[["0x3E42B9826876E223699887E90920859C7197526AE4FD379AD9D823D9C3D8DFC4"],["0x24327C4F6FD1188F81AB1B7236A9907A95A9042F1BBCEF60FE0C9024DF8915ED"]]],"generic_selector":[["0x2AB7E972BF66CD40BA91AE21F764292C66F9A3BF59CD33B47CC4C7BB3A070A8F"],["0x07C11D60033636FD3ADBE54603C9185B10275FE9128372128A3FA85899D73483"]],"poseidon_selector":[["0x3A0F63C6FED4414EB3E70BFB8EED96F768A3CBEC7FE36258DDE38E6E168DE41E"],["0x0CBDC9CFBE221BB332EB969CF4A4819FDBBA14372F0B53A912BD42B2DA7B8590"]],"complete_add_selector":[["0x24A34DA33DBAF86312126661B388CCAE33AFE7CC25D745A5D57FCD5357304C4C"],["0x3F18CD9F827217BC0E221A178FD0283C006E6A6875760E5F4C2FDE9FEE613240"]],"mul_selector":[["0x1DA6E809F95BBA5CAAFEDE98D35C6BEE534D1A80E7D10DAB50B113BE28D06C57"],["0x26AFEF01BB8ED59605D6B598A3649270E8432137D4D1EA0C5C7A7A52793A3B6B"]],"emul_selector":[["0x09CC43C5F33AE32C9156137CAD5B4F36C2E146705BF4E0DD6221ADD34AE3FE35"],["0x1AEC9179F20608A3036683268A091A0F5689C4BA58C5F9DD4FFDFFCBF6E19706"]],"endomul_scalar_selector":[["0x2369BF960CBC84C5E24B2E5B93438F90B6651FB636033D5B02DA4ADA68EF3195"],["0x3CD68A562804C101EDFBEABB75FF254CED2E9AA44F6DEB06734107E410A2CA81"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x3CDFE8630C656B298A7A67BD3CEB637B864A7B21373A81708715386852B73177"}}},{"public_input":["0x11984945A0E78B9A2C155274783A352FAA47816A838EA4A6FBDE2BE12E9F7FA7","0x0000000000000000000000000000000000000000000000000000000000000000","0x00331D87FD1E6B80668F8E6710E8CFBB84808ECD0D6F98230D32935670873568","0x0000000000000000000000000000000000000000000000000000000000000001","0x1D3F233DDAD7D8E0F7807C6C5C809FA8CB5812857358828285406EAE168DEF8A","0x0000000000000000000000000000000000000000000000000000000000000001","0x1D968A1EBF225F89C31E93396A41F4E92C1C52C5D4FA62A14099FE20799D4105","0x0000000000000000000000000000000000000000000000000000000000000001","0x07D76F07E4A75C8192D4EAF66BEA5CE87775255FF8B7F992F7101A8CF5778D02","0x0000000000000000000000000000000000000000000000000000000000000001","0x1DD66F767CCDBFBBF3181F3311506C958C211186CF61DF477A796ADAE32A1121","0x000000000000000000000000000000008C130EB6F15C91F0AB2108B297341C6B","0x0000000000000000000000000000000021B5AA04AA26C363C2A77663C3E25154","0x0000000000000000000000000000000044A622BEBEA8ECE2025E40A917E9FF21","0x00000000000000000000000000000000BE9F7D076A98940754EAD864CB20AFC1","0x0000000000000000000000000000000004489653115E4EDC00E7F9F28BD83CBE","0x00000000000000000000000000000000D923C6EFF2A7AC505E8E2764ACA7E6A4","0x0000000000000000000000000000000007E83F7F82EB45BCDED3DDBC10225E9C","0x00000000000000000000000000000000931B5D5E2D23E3012B725ECC254E55F9","0x000000000000000000000000000000005A371C5357BF91ACFB4F4DE406045EA7","0x00000000000000000000000000000000EE1ECAD3663F6703DC3A56E7088FCECE","0x00000000000000000000000000000000CE1D550696D24ED3504C6C4886C6A5AF","0x0000000000000000000000000000000034BFB53790C55947BAAFC244974DF2D2","0x00000000000000000000000000000000D7B27F268BCBBA62AE3780994AAAC83E","0x0000000000000000000000000000000040BD685D0398410112678D1FC6FADBAE","0x00000000000000000000000000000000357A1BEBEDA1B51116C6CD83DB24955A","0x000000000000000000000000000000004BA6D10028FA37AAA87D05D57155591E","0x00000000000000000000000000000000386856D323C90A3EE0F07ECCCDDD5BE6","0x00000000000000000000000000000000382EBEAC6F756A65EF7AB3A0B855AC25","0x000000000000000000000000000000008CC3A086DFF4A878906CCEE4B416152B","0x000000000000000000000000000000005100EBCE6AA7BC398FEE0B99329B28F2","0x0000000000000000000000000000000000000000000000000000000000000001","0x1DC9889DB8422CABCB260428AC007FFA65755BB1EC81C429EE434FE818F8B757","0x0000000000000000000000000000000000000000000000000000000000000001","0x061CA1BA859859C8F53F44C8E1BCCAD3D53D0EF60383478D99EA3B6DA66B4B26","0x0000000000000000000000000000000000000000000000000000000000000000","0x1B72148EC4AE88E83E490544943E1726A0745B8B138B45528FA3B0FA54A53BD5","0x0000000000000000000000000000000000000000000000000000000000000001","0x095A7109474C45812A996ACD6CC42ECE14F53B712A44387DE33AA6C22B07BF08","0x0000000000000000000000000000000000000000000000000000000000000001","0x1F40B4F9154C8513A70F044E35CEAB540D76EBDAA5B0D13865063F80B25E0C4C","0x0000000000000000000000000000000000000000000000000000000000000001","0x0620DD4719E01140C2F29C57673676BE45DBBA088C4C873FF5E024BDD60047E2","0x00000000000000000000000000000000077D60DA67C41E29BD341A82165A9AEE","0x0000000000000000000000000000000097F91981DF3DDBB196DED30F233F51FB","0x00000000000000000000000000000000B0E5DCBEDA7FE6A1227D332565B9F472","0x00000000000000000000000000000000E86D7CEA77B368167405F523CFFDF1CF","0x0000000000000000000000000000000056ACCFB4AE935D334F065ECCF410A880","0x000000000000000000000000000000001127BFFBBC37BF3E560203E342172826","0x00000000000000000000000000000000EB13B1D00AFC5D8CCA5A7893A873E4BC","0x00000000000000000000000000000000337769ABA1B2786F900ECAA203515F07","0x00000000000000000000000000000000F82F1D0B2701EE38C9ABFA2A4CD00AB9","0x000000000000000000000000000000009FE4EAA2FCF46D79A44B5E34A991CE1B","0x00000000000000000000000000000000EDD4CFC9101F7E5F6D8B616732D8256E","0x00000000000000000000000000000000CACF767CB8DB9FE0483E0F9346767CB0","0x00000000000000000000000000000000E0F2C1422020E5C597FFD5BD5C13C052","0x000000000000000000000000000000003D684B3C6D74E7E28E190C1C7FEFDAEE","0x00000000000000000000000000000000BDDF33BF88660B55E893E1FD962ED7CC","0x00000000000000000000000000000000E343DC8DE5A26EC92E67FEDD90D98421","0x00000000000000000000000000000000FA1D52E865BF1FCB23E4F1876EDC9513","0x00000000000000000000000000000000820EED59F6FC7849F9B121EDE878AD12","0x00000000000000000000000000000000974F4071F84664E2062936539A12FA88","0x00000000000000000000000000000000A3937E79367D5DA9C19F092F7FF4BFA7","0x0000000000000000000000000000000000000000000000000000000000000001","0x22549C93A736F8AC7542831566E00900C0BC66514C84C3BC5A80976291BCD033","0x0D60EE6CB64FAA6513B6BF3E9A003DAC14360FB8CFCE9904B33D5BD0200876B5","0x109443CCE392A5B9EA8768E4F7CE53229BE8727BE395AF70473D1E30DE023184"],"proof":{"messages":{"w_comm":[[["0x2A3F21E6DF01AF5F56021D0A1DAF2BE1259B0C07A9C69785A661C4165F2A086F","0x3FB25719E18711606C256CFF1195F7F1C31EB8116362EBEEAC525BA45CB70A7D"]],[["0x269F3CB82CD11B540CAB75AC3F3FF9E56015EB63FC5439C0580E7DCE68EFE27A","0x1273B535758218D397C10FC4CA865868AA1D51F946A124E6D93C94D0B599EA1C"]],[["0x399350DA89E34A863E8D94106684A5E2528B2683398E553FF106A269D679FBEB","0x1EDEE8B6324947DF79C02AFFA9F0458DFBD9A94AE242C65C24CA86D95D7719C0"]],[["0x09F8F26F280F117346E0AAA9AEED86C7C75BF5A430CAF976EE00A0EE72F29248","0x0704BC6BC7E3EB9615A48C67DAA675D12EBA529DEA78E9F01208CA3731649420"]],[["0x3202CD98B644833B662012BEDC3ECB6DF17CF203BFB033706AB4C15B9B0CA3D3","0x3F15C6BE387783282EDCBDEB5A125263D2921DDC1D8287642802EB6BC18D7637"]],[["0x2FD26EA5890D3F875776835A3B850741577E9897CBCB7A1A8047A63F8B2332FC","0x2555977A21F413071FA946AE68D9D5AF90860F0548795A0E153D7C32320A9561"]],[["0x3D3A7F09D440DE89D0CF45D989791B43A137D32957BBB1BFDA5D61D071139D29","0x1254D0EA351F5C9BA52D0EA862C4379258CC7B021EA85D31EB5F70EF2AC03EA0"]],[["0x1D3F9714BD4898DD2B3BA557AA8EF214DF91E84ECF582DA1544BAB16DD08732A","0x311090245327B34A615E4F51C0C53CFA21871C1D30A88D416D2D4112EE3B3968"]],[["0x12230B70F7C5B327CA47E1041571A699195228C5D65CF767FDAF7E837ADA78EC","0x0F2A0E1D1EEA54E3E08E756770FC14C84D9AAFF5B08215CF1B89B68D7B0CC290"]],[["0x3F6D337F36BAEA7A9546728532C2ABA47D2E7F068FE9F498733644048E87567D","0x2489CC18598C1C9CC20B305BCED9B58970E6580C138CFE2965497578C7135184"]],[["0x14D6C81ECACEFABC16614FB699A5B631C0A609D8977DB431045A95A8B2663712","0x07F03CF078E5C07016DC944A14304AC8753B9DAB675E7BE5E1405032BC6FAE18"]],[["0x10B73DA618A415BB29D11B5B5F7BC792318AC510C5B578A07B8146DD31C21AD0","0x314109DAD71D9D3AE962A0D0E094502C849B907F4539E3FE6A30D14F45B3EFDC"]],[["0x2B7A3D1647B5DD37F71B3EEFAF92473FB684AC87109696389400101B5E276272","0x12C1E9CDEAB95D708EDA5DB7A3F6266C83539F87E892BD0B139B7121FCB448BE"]],[["0x12D654465E7A76DC57DB7CACF070F9A5F9F6B52EB7E7DB942AEDD6673611342C","0x07E4F3D93DED59FC6003D9A98BBD4BFEF833EABE509E9E24F608309CCF01AEE6"]],[["0x06CB1F1A5D73609979FB9907C5F72DD8432B39AD0EBBF9DBA8DD5089BAD96948","0x18CFC4C2A96FEC6742611BB32D2EA7A7E27B7E75676963DD9EC20E489AD9BD85"]]],"z_comm":[["0x2C7B73FD03782C160F47147073E8C4EF3C4F9A3B836C6BCE8898C20862F6B096","0x17BF80E2DFBCDE06B3C00710149A0BA0B0ED44C95D57F3F55FCB0FFC9BB947F2"]],"t_comm":[["0x39F965A6D20AFE45FE840BF63677A7A1D166993C575F7F0CC995064729D0E72E","0x1002B4AFE85D90FC1EB456C17FDE0E07DBA235490D94C38562A23C3E789F63DA"],["0x2570B95556E073ABF78B6C54738A5B734361CD7D3AE91F0E18C4E897232EFD10","0x293C63AD42171B7A18846D853C885FFB9EDC200A711BC8670769947A2C96DAFB"],["0x083FE0FEF6A4D85A026AF7607DC7D0958AA78EE63D5C51883D76D9CFD84EF736","0x3540275EE836D57E4D72A6D05EB81FA2E523F9593095B81BABF5F4ABD85931E4"],["0x02900555C4A69EC87500780C56141C8D6DD4C896D0698683AC5A89A1DC03197E","0x24038A19F0B39C91B427A7431638989747364A1045BEC7B29792BAE4CB844443"],["0x113FF594D46ADBFDDFCC377AF8F018EDDDA7F0B6F62A188626C62C5FC18C0C25","0x00FA6E371810D4609DFB8F7ED23D39C28CC0FD046788A5085BB791BF48BD283B"],["0x3040DA61B4DB768214674BF2CA121CDC17B7500AEB65C784A74806E57070B268","0x2207A68492C58E002D95E7F55D11A1D1892219FCD6E758CC91F1723BE195725C"],["0x2A53072F5349FA30343F449F8FC3431C389B7D327C09B500F09D35357D839516","0x0135C8B6F2CB70ABA0A084A9965C35A864A6AB74D7064504FE6A5B440525E501"]],"lookup":null},"openings":{"proof":{"lr":[[["0x1CF599C6C00270DD210648289A93ABB03CB18491B07D7850BE73BD6DEA546C56","0x218E942F6E1767A9AA50434F6D8FBC72616D7E4CCE44FFD0B52A6E3002FEF49A"],["0x04EA998FFBD235FFEA568A9453FCF3E860208E8E445626B61EE660681E3DAC0A","0x2C4098868CAE98F7AA0692C36936D8BB56649EC824E2C4B0E736C20B2CE2DFE0"]],[["0x2D976F7CEB62DE6564D8DD230596CEBBE0FBF92563A1D5DCED59F6757B59F377","0x3743B50F54317C4FFC9D4EAAE79540AAF4D2C5AAB8C937964F97E122C9ECA043"],["0x2074A8B20FF1B8650FB3E7FC66F8A8F6439716E6513E20E31438280FDAC8BEC4","0x0DB0DD2FCCD0D4202FEBCE336E47FA29137CA9A984F49142FCA76AEC3E4466D0"]],[["0x32A86E39CE57D14D93133AB9EDE96707386E707B933F5C77FEE916C965425F29","0x3913471243FB8FFEF7B0166CA20A93279AC45826964295C27D276012C5F22814"],["0x28E24EEA84313DBD93880FB171615F014E906251AA56E9F9600EB01B10B37CAB","0x268D3F9A0D522115A0668CDA9DE17CD7EDCECFECAEDE6886733C7E4670B4B862"]],[["0x0A42A35F664035F084472C6D8EF9FB4644A4E7D0C754BACF62A693F642C09CEF","0x014008E057C3679A7952E6879613ADD86FB9973902CCD8915913CEA407CECF3B"],["0x267EC53CB6FC39FF2F66DFC11477E34655A96239E6DEE4A3C57E483FF2E00B85","0x072119FADC5DEA810C1B564FE9C077CF7E5B057EC5EEEBFE0E867DAC96F18ACB"]],[["0x3A930E79D0B51A26557C65707DA66227C1171D1FD12D061D661290502CB12206","0x16E68E6ADC08B3686E71FC1AD9060A3A21D42F39272A5F51B1C4785D8EB9C232"],["0x1A5DF92E28B9975D9AAF20EFE95ADE8178D373C188A0EF23849E164E1C138E80","0x3B6DB3F3136E722729AF2DB4368F3708E1D96CE60A5077A017B003C0A27C344A"]],[["0x06C57BE97279AB77A31DC539C597EAC4C19398B1FCA120383EE36E8D1E571C1D","0x345444325FC0AB33FE8128D5498B41BFEE89AA3C123F94F5B62FCF57191017BF"],["0x03DFCD1F3AD343893E51C6E77C92EAD6C7E7DC279E8B7F0872D56A8980BF3070","0x2183010F6338AAB9A0613CB0CB39A409EDF47D939DF7CCF7140951BC429F2B7E"]],[["0x2D908F8CF248ADDC4331F065A0FD6DD84D878E3AA81A0F5DE343DB430CAED9E7","0x2F1502238694EDB993C85B64CCAE9B64C461268170C1D3F77D04061EDAF734D6"],["0x122B2C0D7386D010EA52540C4B9477373BF294A8384D478B51178CE70F93D3CE","0x2A39759EFA25AD12F7D60D897A4ABE9B5A887F43CFFD3BE2400FBF876E8FF602"]],[["0x2CE89359C252728D30E80DDE04683712B92E268FB8825967E3471729B825620C","0x230E6508A90F2E0025B03E92B9740B9425B10D8193DF067F8DF1DD82602A2184"],["0x06A819E4F0A7CEEF44142F4C28D7224094193058513884BDC18ED4289D474DC0","0x39BD7DD2C2F22A05F167E738CE82277333B93CC05F0C948FFD96A7A300E7C43A"]],[["0x3B3B396AC98CEB2BC5D8C53A0636A9B403C5BA5820F88EFA567EAE0F7155BC29","0x2F59FD66D52CF2992DC5C6DED4C5AF40A85A6D48B244C176AA156504DD4B6164"],["0x3AEF4E505E232BD2CB62809E938B5C8195B3B14ECA8C60118B4A657310E1E62D","0x09EABB2564CDD9A7C87CACB3357C56AE85A14EA07E2B4355169A8A916027EF30"]],[["0x0BF73B5AC37800F74C25A49825EC07DED064ED00CC959FC4BB29E22F335D5667","0x253CF0BD618B78DDDCF241685CEFA6B9AEFF52DDF54473D5220D2F5A3D773ED6"],["0x08F1D2236513B91A041E51BDBF1F393F1E9840C312980295622592CBB4DAACF2","0x33B212BF943604DFAA6C5CBB4FC9E9E988751B8CEB7F889573B8174E9FAB3F94"]],[["0x11AD7A5CF4A2CD36C6F88EAD4EAEDA89B481B8CD890CC0C391E26338540B6404","0x1C205C8243E23B4A2C5F7E75838795C0518526FED1C7BC9DBF6D989042C89020"],["0x1B1C4D0CD9EF631C538366AED0FD794BD371DF961E563838822C7A77F25B10E2","0x0E6A196DB9A99E6A14D050A4156B1190823631AD182EE1E887A5B292ED91ABB4"]],[["0x1416ACF6167446A17A87B5EDF140CFED23DACEE3D8C4070CCE4E03A503168A60","0x0887F3CFEA8E7253ED4FB67AFA94078CC92C4A13678FC15DA41EA669522D377E"],["0x0B1A4EF2BC6C7A3CB9FE2F6D3B12EB34A4A8C4235D7394BDC90354552FC8A6B4","0x297B5982406F1B4E6044DBEA0F70708E1682CE1A43F96803F8B7803D7E91EE0A"]],[["0x21BC3FEFCC275BAA6337CEBAE92DA7BA72A7065458936E937A12E0A4C95644E6","0x1A4CE237811112A43CC16B4DC52E610BEFB6B7AE8E07B42857390118056F23CA"],["0x077C54214C6F7DA57AE919576996BB5C7FD226285E2D49DC864A331935A129F9","0x01F9D9BBFB1665858EA4C85B84B5BB175A84A0ADF0C80997FAC39C3D51E32CB8"]],[["0x00A2B31984C89D2D4E6486CBA0B79129C050725DD873C0F67AE09E8D426F93B3","0x104056F8D69C16BAC456BFA440EBB6DDDE96A46A735375255712F5986237E9EE"],["0x1CBF5408F38F884076815DA3ED32AD1F013CB75C29F16D1232F917737EB0CCC6","0x2B59347BF22A3A9D2E2BD162A49FDBD6DF3E4D410363A17EB50094798C1AAE9F"]],[["0x03897D73CB9D90DF5D0E32C9BA1481C901060818CEF8A3E5B0F53A811294B508","0x32B9ECF3662A6DD538D49FC87DF7ECC057E692C653273C5DB7B189C1C5DCDE1E"],["0x2DD29A6209C54357AD4CA2092D96E70332CF8E52CF3A7887394598770683CF4C","0x0F2409C8F17BC4108416092E3A50D681E3E8281AF47D06C1B4912F7DE3272854"]],[["0x3A48A72C98487134DC355776C8D1A35D67BF7B7AF53503C3995AC514C117C45C","0x014C10BB26DA2083A54D6DE107A04131E0ED3825EEA87D19F819AC0EDC56A52B"],["0x251AF163BEDDF4DDCCD08F51260B5DEC666FE6B519DB5A82EE237AB30458C8F5","0x37FDA450B5DEA5D613E1132FC3A63BDAAA3B18E8E97B19B1548CFD6E3B854EF3"]]],"z_1":"0x29BF962758F23E36349E25556B1830EFCBCBE2FE697E5F665580B431634A64E3","z_2":"0x263579502ECBCE2464AFC1AB90A659CDDF22FFE251E321536DC274E808182339","delta":["0x1C8E6AC479853AD30F6A1DAB0D697DBEA37B6061B933F24E3FB6C549DB95CBF8","0x3D0999865A857E9EB67D8EF4225DA88045B9995AFEAB63FA15A80FF64E97CA48"],"challenge_polynomial_commitment":["0x275A4EB1B676B086ADD2A4323A3EAF16FC621E254BA71BF0856482BE1ECFC182","0x16E790CF457DC3C18198870348D518F267877BA4BBD8A003339CADFD3EABE849"]},"evals":{"w":[[["0x3AA658BF8F4C6B6A944974CEDE272AAF375E18C59988C0845F53171F9B7649D3"],["0x09B5BE0B473BFAAE3E52611FFA38C442AE16887D091A7353B32407C7A25A1075"]],[["0x3EA7081EB18095232C659EA8E69C9F12AD82CC78920D5D2D7DD9D26AB01C5E59"],["0x23A55CDF9134A27CC98F6BB30B141E5D36EDB92967B70E647A9B2F6F691243A2"]],[["0x33995B22AED2DB15088A2A0314EEC29DD2791B6F7624E28B79FDAA930B11A00C"],["0x1B1F31DC0482828D6FBFF5770CAD05DAC8C5A241973E1ED10C267A26C6792AEC"]],[["0x13394EAAED4CFE192DB19F549835E870714635B2926D280DC98D942835C2F583"],["0x1270DD721B102736C46E82E61F053CCC1256CA11B062FA2393D39E735C2E2B97"]],[["0x3406ACDE25F0FA153AE37C5DFD835B8D46918BD103352D4478F282E77DED3428"],["0x0664D5A741ABC3899B94D66B0EBB20BDE7F6C79D2A7F1CD8BB56F98FBCB603CE"]],[["0x373013ADC35B8581190D25805C33F529879FAA5F47251941EA189D7798A2B72A"],["0x1A1219D52D33E67C3B00DBAD8F0EAD2878C790119407FD01D8324472F5FA232A"]],[["0x3AF810E5B8A53A6F3599B8607189D3A75AAC15256CCC91CB5B42C42D32855D53"],["0x09265B8DCB37350183F4E08E84B47CBE0C7A2DAA6B7CA594DAB874BDAB34EEB1"]],[["0x2E56F16ADBB21AE1670A329348D5A74513DF71AF4BBD86A13E70400D3DAEB086"],["0x188B0404CF2C1CE3214EEABC7E044D603B68321F3BD71D6AB20F520A31C96333"]],[["0x0C7FA2E003E76A82677ABCB50B7999B155995AE48DAA309679907DE8B86F3712"],["0x28FE46343AE27448D46A61724B44A606B7ECF95814EE622D7F12E095139DCCA7"]],[["0x3B690D65827D6784E98D0ECA6E7B95675E23BF5A08A422BFCEEF21A17EEE6115"],["0x03C9E5BF00D44CDF332200559185590B4D3D0FB65FD10E7B6BEB08ED6F096AC5"]],[["0x2D37582FF5696F8CDA634796C3220EC00024AA17197A32C653970853949440DD"],["0x07545009F881066DE5AB3E3A24D86B0B645F4F2917EE0751E70199C5CB69C326"]],[["0x3EA0517197CEB8E86509C5306DEE7EDE1DA886365627A3525BDACD2710A4B157"],["0x039C769CC2A21B9222091511349ED3C3C8D9E2B70CA4341DB55273BF8E415B9D"]],[["0x07389003136CFF4637B686DB0F988E8DD5C30F6EC61BA38834A22DD600D0E554"],["0x2978F36093B3C8CD2FBC72459971AC32B5548764EDD293B7F112A6CFE55A1CCA"]],[["0x09EF90503754CE2BCDE7E514205BABCDB4AC61945453A4823840A09A8D2F8374"],["0x2E731BE03D4DEB2DEC7A8457324E6B8BB45133F4C389965DD97926A61FD25A91"]],[["0x05B1BCF5158BBD2B65C78835DBF8ADE2CE2AE88408FCD8DC02FF213C22B0DC11"],["0x1B2709AAD303F11E776DD51068E5222A135570D1BEAA00AC1758A30DF96737CF"]]],"coefficients":[[["0x0B827E926AD977C5284DAFF90102FBE533EC3A1D25B79287260566F2A005A8D4"],["0x0E3E599A07AA687CDD8154F58A1F6EFDD2004E5E498D1AC78D0A088397F5E459"]],[["0x36999204DAB6B578A1D031C9C95A591231811AAAD273974189F2C4876FF98766"],["0x050C8CDEAC8B5FA7F93E0B4FD30BB5007EF4BC1A01A957715B42CA65DB232021"]],[["0x2E6D51CDC559946718B609815F1B934D0CDDF2994C9CB84447297D20DE7397F0"],["0x2D8AD8EB08EC3860F80E3B835909F356C7CACC336F87BE8005F75467D52D8DC8"]],[["0x21FA8A517B995A2BD1D46C9A2DF3C3094B7E1034FE9EFDF65F54799633F46F70"],["0x0DF5359569D08950006BF2BA86A17B3255BEAD7B29D38B3043409261063E6C98"]],[["0x0DC545C7082D310AA59F423E7216F3949485891AE0813E8869E70E340E0CA6F0"],["0x225F02B06B80AC5B4BEF8C2CE79D20FE34FE160693CC9AEA7882F709DCA4F6A5"]],[["0x37078724A663AD4D2F3BC23FB1943443727BBDE9554806DFD2BFE7D94914A022"],["0x1605EDC349558D6396A3AE750D62A8F567A797C259A61B63F93974B6230CAFD9"]],[["0x0F2231EFD6FC5A30161E8FE79D1C5F0D846769CA9B5F30FF5A640A14A8FDE927"],["0x1D8A8704EEF0031C3CB0E5DACF2BAEDB783362C32C149C76235639F3D47CB962"]],[["0x287C09DCF3BC78DFD91058160840FF175B08E2D05DFA05EEE134E7618A6959BE"],["0x36831E88DC01F60179FC52900ADD87620ADE0B7612BDECD51B72F08F5E29348F"]],[["0x3819F13BC37CC98218F1AF07A84063B8FFE5BC3877D252B34AB97415E2F7D7CF"],["0x3868ED6AF80BCAE85F53D663327A537913064B7C7F67CA7675A503B4840594C7"]],[["0x288B4FEFC39008A84FE5E3F2B7118C885773829164F0E40F35C6FCA05A5400CC"],["0x12E9527F6E24CE229C1607DC7FED5CC7B8A5571E229FAB901017652B828A011E"]],[["0x0175D944B52F7D32D7C231FD8AB5324861F3ED82D12D6D99EEFA8C643B04F193"],["0x277E20E420D703832AFFF244DA38F9E241836A60C467DF417E1832EB386BF6D3"]],[["0x0C49CAA3B7C32CC6F2E3B1E2809DFFDDBC2455BF54537AF41F35F9B96D35D334"],["0x38E025539EEEA5AA0DA452F41A8D746514EE4F644152CE1C1D102E14740A727A"]],[["0x3029F60631C6D85C459D16B7B4B673750C171573EB2B62E272FEEB8B38839706"],["0x1E54E654139F0A4D8A551C3183FFFD4EA6162B2C84CCDB1C5FD7F0A7DBC8F1BF"]],[["0x34ED399220DF51BB2059763F707570B66FD9505D52A7DBB23C738B4EA058C42A"],["0x273902CF51D6640F558AD46F55B802FCD017F2CE9F36EA8E32E86781CD9CAFF8"]],[["0x04941E0588C7D82E3F5252411E05B10A09FAA630A412524DAC166E2235895F9B"],["0x087DD2FCC33CA5FEBEA31ADCFCE1D64733FA7D144A1E6B78A06B421ECD7E693E"]]],"z":[["0x1701943CA14B454D7612A8DE1A07DB0995CA1B5F8DE28F44F51942AE7D6BE083"],["0x22B2EF6D3CFF87F0D6A4FDC4F7923A6A6D8A800AE38B73F4C77859F9C9BDE5DF"]],"s":[[["0x0A6419A9DF87004AE0F74E0DA6E1E5088FF81821ADDE8BFAEE4B80C1C4D5376E"],["0x3C227C5D955AE2B00F06CB398DFC815E690CE61EB1CF9EE29E6198B6F786383B"]],[["0x3118C1CAF128E814137B9540CDE78DD28ED447BBEE8774FA71D2B182AE608A4E"],["0x06104F636E9AE21F405A9FE66D5540E7D7D96BCD298F5488E99B23910B67B01B"]],[["0x396262B1B0734477AF94179B7CAE501E45C0270104DA15B37AE25463A656AFB7"],["0x0AEECC77B0A32BE3187DD1689B43B1580AAF096C43F381D1C3E22C6B64FECD11"]],[["0x2C7877F015C7F7AC3190EE69209B2D651B006F14AD8391A135493DEDD6143C0F"],["0x3A3BE058864A6EF532EB97EF79CC4BCB4D7F370BA17199BB2B26E5033C5C0298"]],[["0x1973B25763B8154B3095EC0BF754AD95F78AE1DBD55DC2AB9CE504A123975500"],["0x3DEBC291E91B0E3EF3251EE5B1802946027DA510243EA840D9EF3A370C236A75"]],[["0x139378D5D1BB616645A9C86D20168A251EE9861DA9065E2385D1313FD82BAD72"],["0x18F0C71DFBC95003500ACFE33C3E75E6723B83F01D50D00176F33711443066B7"]]],"generic_selector":[["0x3E0DCA615BC98018C3B2FBE08232320554782F5614C6C473764298C3CDE5B8A2"],["0x378EB87633A0830FB088C5E88C2E70A274527C603CF9B7801CA3EE28610384FE"]],"poseidon_selector":[["0x1874CD2A58577A983C3D5690F4DF1BC977586AF6192A307D845D5FF56D897829"],["0x2351B70ACAF14165274F30DBF9A96CFDB6954E84A21DF6256B842D68F2D9EAE3"]],"complete_add_selector":[["0x3EC78DAB0B1C271ECAEE9F70BD56DC588A27BA2BD3526571CEFFA656860A4EC9"],["0x35F56DF0D9029236F20A75956AE4B1B51A83374B841F2F382A3E17107A69A0BA"]],"mul_selector":[["0x2BAA9BFE45CFEA4F5F6A98C0CF880F8515E070FE0DB4A4BE8A2510DA39F6F87A"],["0x105AC3A860324B1928E6D0C40F4C06E128989FFF2C577E32F145ECBA8A23E4F2"]],"emul_selector":[["0x1DA3EA3252CFE1A611CA50953B9760441919296EEC028AB27F35EBDF16748EB6"],["0x1E048DD58199E871FE6A9EE2167B5F481B756A7A498941E58A1DDC60DEE2B4D3"]],"endomul_scalar_selector":[["0x279871C64A7ED5451A8312BE6DFBBAFDA27C52270463C620023956F1F5F32758"],["0x14814C0E8B66485EB68719891461D76C0D4E3C5BDF66460625AD4982A965417D"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x154D76396B950B75C7CE848DE31B0055DC4FDDEDD5C8DA5114CDC01C58397E6E"}}},{"public_input":["0x0B094667F34FFA5DA92E781998D986B282646DF172159BD45D3A6C1FDBF027CC","0x0000000000000000000000000000000000000000000000000000000000000001","0x0D69BA7E0B3881E5C4F6854EC9C3E9261D42EE9E9695F2345E345C3E59568BDF","0x0000000000000000000000000000000000000000000000000000000000000000","0x1A7C3F735E310E7451F81C1DDBBD570AD4C02FF6746C76007799EB8087513E63","0x0000000000000000000000000000000000000000000000000000000000000001","0x0F8B8E4615E48732C836F873BE08FD5F54F1EB5B8910B9ED9BFAE7D15DC17607","0x0000000000000000000000000000000000000000000000000000000000000000","0x07B7F5D108340E44A931F93615DB7A27BBA1DD52770803F6DF9EAB0ACD70DFB4","0x0000000000000000000000000000000000000000000000000000000000000000","0x0AB07997F4030C4C291A9689A1B39D2D3249008ABFED87786B666CF24AF3A68C","0x0000000000000000000000000000000063C6A15DA8C939564BEB4864B38FAFB1","0x000000000000000000000000000000001023515F0B26E9893C1FC813C7D8055F","0x00000000000000000000000000000000769E7D4E664083157C0CA8FEE6E76677","0x0000000000000000000000000000000093015CF5B786590658384E8EAE24D0C6","0x00000000000000000000000000000000A1CC4491A10BEF8B4C16069A10DD5C16","0x000000000000000000000000000000004B43A71341EE36636E29EAAC59935A48","0x00000000000000000000000000000000076D963FE8A5B1A1EAE0B4EFF0B6F4AC","0x0000000000000000000000000000000044ED6E01EE5A4CC270EE17C3C7A99361","0x00000000000000000000000000000000856C79BFC74434929BF514D153CBBDE7","0x00000000000000000000000000000000771BF0AE1F65D144DC43BE8C6A7DA6A0","0x0000000000000000000000000000000032F0ECCA3AF759ECC7553E8BE61BC663","0x00000000000000000000000000000000C7AE5E65108C3F467691AF79A3131085","0x000000000000000000000000000000001517E7C820FCC1AA5097E793771E4126","0x000000000000000000000000000000009810982F6FDBE1D8EBB00FAA9A231598","0x00000000000000000000000000000000F3A8A82802D4E0877543E8AFA6CA20A9","0x00000000000000000000000000000000CC2ECF69D66237C622C952F5FD52D672","0x0000000000000000000000000000000019615785A49013C05722AFE57E384C18","0x000000000000000000000000000000008CD2CBC932813183FB7E9479475CAE66","0x00000000000000000000000000000000E49EFD86C5276A0B23F4951CF95A0AC3","0x00000000000000000000000000000000AA13DEA6848C15D2D667E8DBBFE31C40","0x0000000000000000000000000000000000000000000000000000000000000001","0x09365AF88DA36F047A8B10722ECCA046DEBF637353B0741877D673199C95A896","0x0000000000000000000000000000000000000000000000000000000000000000","0x0C60F51DACBCABDA579E72F558BB8B81DC2B4689CDF9AC9148C4E74FF5929427","0x0000000000000000000000000000000000000000000000000000000000000000","0x0E7A5B95A24A729D05ACACCB5C2B99E087BE6DECE1DDEBEEA67528B1F4B0B183","0x0000000000000000000000000000000000000000000000000000000000000001","0x0E5554FE05F7A9D84E7B40CD690A7B5DBDFB3F06239A4B6CD3719FF9C5EEA118","0x0000000000000000000000000000000000000000000000000000000000000000","0x1C3E8D0C41860954B17918914DE6990F04A2EB0FE9495BDCE34341850D980604","0x0000000000000000000000000000000000000000000000000000000000000000","0x188D94197DDDBF1CE3E42566804F3BE0A22BFA0576384E642FFF9B1A5BC1FEE6","0x00000000000000000000000000000000C11ACF6F04D6C48BC5C9C5CE2224033D","0x000000000000000000000000000000000E53AFDE37B407736DCD3BFA6EE45646","0x00000000000000000000000000000000E0E8DCC8421DFAA0ADB04C5B3F4C27D9","0x000000000000000000000000000000000854A5B4813E419C6201ABBF139F8DE8","0x00000000000000000000000000000000E7385E497BAF250BA8318638050146E5","0x00000000000000000000000000000000C34D6442B67E7848E00418002BEAB5A7","0x00000000000000000000000000000000A4D8432B625830CF913C655588F3CA59","0x0000000000000000000000000000000046F3E3CC1AB9FD1FA56F48B6C610BEA2","0x0000000000000000000000000000000010AEC6FF91663814705F83D440CA2556","0x00000000000000000000000000000000B527960F7394C9819F4680B3923BE418","0x00000000000000000000000000000000D77331332B572D154D3FA941E4E6A873","0x0000000000000000000000000000000097D8047D94738A9977DC913493A1CD2A","0x00000000000000000000000000000000EC9A03D0BDEECFD80FD97D13A89160B4","0x000000000000000000000000000000002822C54E7AC77317CE1D258EAEAF78CA","0x000000000000000000000000000000002F3B695A4612F8250200D7D0D1B96DD2","0x00000000000000000000000000000000B5F91970D096304B4A071A69DCA7F62F","0x000000000000000000000000000000007A03333D7B6D808C7DF55F5447D05611","0x0000000000000000000000000000000066D7B3ACAFB97BB9E226390F50AF13B0","0x00000000000000000000000000000000B4A45E2EBB8EA3AAA817993214507373","0x000000000000000000000000000000000962A91E19B5A513DE082323BD788B9B","0x0000000000000000000000000000000000000000000000000000000000000001","0x2CC283A0B7BFA2E4EA87EC95F972E50853AA92EFD2BA9ED144F6F78A2FC3EE3E","0x2510A5669C5B4CF04709C6A1436FA9BCEF05025113624C13FDB503403D92927B","0x3585B5D3522F0A86CABCCB2BF133D1590D794DDF08197EE8337986AC9EBF8ABB"],"proof":{"messages":{"w_comm":[[["0x338E899B0729A9F71668F5E57029C44BAAABF80C098EE98B4E50B5B925A5FC43","0x073BB9F29FE7EFD4E5A2316108D3E20B0FA7F8BDDD2BA4179C1B0BF6CD585DB3"]],[["0x39B47996380CE831ECC743D7D86111C397AE088911AAC1B5A7574C235686C3F4","0x231A14EC68D70E078B0341F0256E3F70E7A98C82C01F1EB8227E881FD7C6B214"]],[["0x3DB6B998053C0002ABCF97B28B0B8BD69FA9365B8EDFD2E60753F2DAF1EF7C26","0x11EAB694D11B1DF6407E5B4691A48902F5499C608E8F60EA30FC2E748D2EE3C5"]],[["0x13744D613EAA3B0F7E48F611EADD49E2987AEE74ABAA12B6C19E80C25FE53D18","0x261CE18DAAB8AAA907B25C20B223ABC4DD9389A8A555C879A9BC0CF26D7ECA23"]],[["0x316CC808FE6B0B0C863D4A77EA7AE9EF0CA16C9C84F035557E0CF94AA85C1DEE","0x200317EDD6187B59313320974BD5ED7230627D018C33763BB8A2914B30502335"]],[["0x316AB8BA0349B542238A00E276CF92D3C36FF22D001B9CDC9D2D3971B35B365C","0x365198A542D6CBA9481B45C53F0B3217DC9320EC1201AA248342B3439E6F2F58"]],[["0x19CA53754C793F454D85C7B91A4DF268B20D525127B62F39F1789FB0C82680FA","0x3E6F9CB914867D49FAC4C3BCEC024A26FAC2AE0BA75F12DB3F6E0E80DB889B1A"]],[["0x12D008C1A9BA0BF5B8C8951B43FAB81549579CA1BB82A17FFAB595629F94B297","0x2F3E7EBBD9B1AC74A77F9491C56BCC3D691B26B6CC54B8B1DEECB03329827227"]],[["0x0C40F9F0B58D3C09BF57CD74F1D4FCC8BA3B69D5B6AFD97142C2614E6CC3CCE3","0x1310697253D4314903D534E9119C5F20867631703019D2934FA795F71AA8C76C"]],[["0x35547CFC2CB755C22937F4AC48ACF9751A619842506A3BACCFDD0EA29EB22E71","0x0B5EE9CCACAAA01ECB05AF866B649F9597C8B072A8B47C996243AF7B57AABAB1"]],[["0x06619F616D54D8651B0A2F526265E903D4306033EEF52A5B85E72A004D682AE6","0x368132E0C3CDE86DBD96AB07D415526DC43D9126E260D8BF5377CB6EB6EE6959"]],[["0x14B731380DC2E22B7C71E5AA1931947D44C957F062085806AA2340A2DF5BD10F","0x117B3D3C9CA6BF3630D11EF7BF5D9D0921E81693CE9AD648402F24330A53B9B2"]],[["0x18F22AB42D44FFD0E4B75B597690F8E3681623C33CB8BBEE2548FA1461073829","0x0F5AFFA2A5B09D839D2286D0BEDC1EF012F47698C834802C9C9520F437496518"]],[["0x0437B73C08109F7980E6F1020FB4DEBC92348043B391F6B412B1C8B2658DB1B1","0x1B7FD3F6B646E50A243925319E0FA23C3DE7C4FD3FFA441BC9F913B03CD100A2"]],[["0x16A0F1EF6B74AB6F0EA78EA28B87C405AA4D5F5B326299E9A0ACAE96D7695D11","0x2E56A47370333027E4E98719C8781F5A0567297D93DC5EA8C55EC7061B2F96D2"]]],"z_comm":[["0x13135C17633D7327AE7A98733574F332BB215D58A762773D7D4980DD4E309A77","0x244A7162705F29B4173FEC6FA38DA7AEC739D638D73085E4EB9190B448F02B76"]],"t_comm":[["0x1C1F57439D0B82EE0B9CE1D26F381E713966B85B1E6EE873C1AC8829BFDE4ED3","0x2ABB45A0F16FEDE33862A16F6D3CE45AC0DB315CF91D29567B3883DEED5F4F72"],["0x1D3E5453D608D4C3E57D170BA491DB18414750FC81A5E5F78520B6D6B3D9E0CF","0x0400BEB776E677F68DF588651D27204C94620BD269902F6079FB16223A972F55"],["0x3210BFF8EA1E043974DAA01FFBD87A63DB41EB8B8DC6886A3340C13A7D5B19F6","0x030FE1D36D064B4A6FB08D3BF066B7584FC90BDC184A22078ADA8428D491DD2D"],["0x1D85D4558ED834AD46CF0F1132F3A33DD01328D842907EB45F071785F4A801FE","0x31AA89EE8C62881B59BC0966D42EFF4F2104954FF67B0444B8DD2C1817E0EC97"],["0x1D832B7806F93116D2C2CFC13C6C6E67C4392A0CE0FA592ACA88CA9AC52F8587","0x18DB13BD5496E0B3DF340BF21E4731B8B5A494A890B656865BFDD9C06A16AC03"],["0x3283E224B6A2822FDEC3556BD438097EF5A3AC927842868F802DAB5FBDA3CAE6","0x358A92F94246F39EC64ACDF0A3647164055CEEA624190D8ACF0922D1A938D75B"],["0x1D25F03ADDD6E4DD2704C4AA3031C20799BFAF06DF78296819E6F4ECBF4A5BA6","0x0229F1FEB9E7A8F926B2F8770150BCDDB4040D1CBA55E533A2293E7FF4678365"]],"lookup":null},"openings":{"proof":{"lr":[[["0x07647C9828CFE6D278262FBAC694CF1E4BBC96F09F4AE40C8426EE53426B1E96","0x2329E00D5E14F84B7CF657E0410A6E823AECF267E333EF439EF3D4100103A0D0"],["0x328C57A711CC70032AAE2A2D5824009DE1CFA12552AD2D57624AD9115A7CD946","0x3BCB5273B89E1A66DC646952E616841E05D84DC3CBBC6E85D36C67FCC085266A"]],[["0x10912755D37E661B7D07ECBB09A81DCBA9BFE1FD2B23F41C1CF784E732662607","0x2DD09E7628F9DFFB3613B13A8707464E105A6727A0EDF5ADEB97310CC99EBAE9"],["0x0BCED1DF257D0D1CB341972BB4FFEE9C1EF86EFFD0F7AC355A495EB718076796","0x0B3EFAFA277AD33D0520D7B23A7006BEE583CF91A1ADA2323A9C57B94692A515"]],[["0x009999492C0855FD8EFA2B1F2226835AA2165E9D785764B095E89E7DD969C170","0x01C6BD2D9C492E79E42284F0C27A74D7F7501A5FE5C5912E1C8E048490870825"],["0x394ED6EB32BE180E89F1F77D4DED112702976C5E51F12CFB32E2A720A45EF0BC","0x253E9D7CE60A1CF8175472CF5D87BDEC58A083D8E307CFCFFBAE6F6B678536E9"]],[["0x29CF3A6925FC858C1EF40196F04D26B8C6DC700751BC579AAA9472D3862EA2C2","0x264B73D5D78E9BEE801A8DED9F9185A844811718CDE3B9C93659B527531E8169"],["0x164E76CD55C5AC57CE0633F389AC36C5850B4E7A4C7EA6D97DAB92E02C25EFE9","0x3A37C6D6B20C18A5633423BCB16C23A5909B1607F79185D43BAA63131F4E43D5"]],[["0x3E991EDAFE991E6FCC02E091ADBA9D6768984210712B5AECD6B5CB6F50AA2FD4","0x1841E6692BEE242E0DC714FE04D8C0524D5FD04E090FEBB869044B207FDE8938"],["0x064427BFD36E7193D11D3170F222CAECF24B666F0F0906128D9ECAB4F286DBE4","0x2A9D489849CEDE0FF4318A5D236C601FD90016C50A8C7E687DE01B0C67DB4DBE"]],[["0x148D68935003D81B94C666D240876A2EBC0B5FA630F9435A158B464F1640FF44","0x098CAE5B0633EEA160970F183A2C9768838868E9D2E6464CF9E7C8EA0C5C8F40"],["0x10CAB902AF8734F5B331685F0CD2A76B4531804E02AB01DB7E2462EB22B3BA86","0x30BC1556B9905B2E01C5C5E316F69936FA62F80CAAA33A9ABAF1CAAF1D4724DF"]],[["0x0E54C8EF1FD8AEE39BBD5CF531D8BF4BDF96A82B3CE817CA7E20442E4BC6ECD8","0x11EB958F81C498C207BB5578DE6DA0FCF558CA27B685CA7423B08F897C2F3E8D"],["0x2F97A70D82D1E8FED165D9CCFCA04590BBFF54C4500F45049484EE152AC16739","0x109DE98EDF9835CA81DE85A4C30D435F510C20683538C8F8567480DF3FACAB94"]],[["0x152394BBEA502C0034A06F7D1A4B8DBE7529C58D81AA027549FA082BB164EAAF","0x3E9AE497DF503143C8191903A6229BD4BB5D8506F2E3B79177DD57447375372E"],["0x2F81B9DBA6175986B8D24F653BE0CCF7F35FD24BEC64F2E1B8832F460162C8FA","0x3078CA8C4DE6C9DDD71AEAB7175882DEA898F47B86AA10D264F8DD819E8A3888"]],[["0x3C39E35C67A2ED4EB1AC9ACC409CA5CF0B83A8DA999881AC194B10B4170F00AC","0x317592A8E8ADFB507E5787ED1758F10721BE5CE4223363D312ACF8700F48E5B6"],["0x2AFD72DFCE0324C4EA73895E3DAF058D1D6129A2B1DBA4ED7C0ADD1C365A310C","0x2692553FA7AA098055A6F9E085A1449FD63B0980D5B5CC0A5EC2CF942EA81689"]],[["0x01A2EE9940956036E0EAEF710C3562DF3D8FF6C3871D8183FF4992CE765138E4","0x28D8A7F6AE85EB7225F090EC938125A6F5C32EFBE2549F70988CED058BE08626"],["0x215F66482DEBE1614AE96CA9A635BAF805696E731908F50AFE02B9A4BF0B012A","0x25C9CF3EFC666963107BDB565D46959E213D8B74C07F9A0C6DDED3B820C130D6"]],[["0x025B132E798FF9E802DC2DE892F28345CD7C53409157D5CEA08A4FDB54DE7DB6","0x1E3DBFF5A9AA28BB5BB82F9A6614B9A98FF0B31F46CA21B7B4F58737AEF1A87B"],["0x13868E8DB45666A5CCAB139B751DB27C8373889243948799E989CDB2A7E814D6","0x320A282DAAD4D7921A586E186930BADA635AC6C6A70D49883CD25A2CFBD66C29"]],[["0x0C01F862F5C5B79AEBC31DAE035A7E17F4A9F7E82AB409EF2D27159D5E79B586","0x1297EAEBCB89C8BF09DE8AD90C8486C63B86AD525D44A930953EB3B14916210A"],["0x20196A52013AE8DBB56DFFFD2689E746E279A56ADB8367F7FCD7144A631D88E1","0x24D4C7573492160B563B889BA7A7CDCE19544259B2BA7D2AAA283DBC1ACA8BE6"]],[["0x26AC2AEDA2CF2C17DCA95AD84A6FC6F2C316ED60ECC0EA247079389F24DE9455","0x076832DFB192CEBC6D239A7E294A7B949E5FF4DD646B8295C8852D7219AA22F0"],["0x27A2B81C42236243CF69A790E5BA8B95F556522BFAA3935C6D0866E1EA7321F8","0x19560FD323224E6E768A6FF67EB6EE400D1FC2F2D2DB8F3F8438D3B359DBB28C"]],[["0x15DE72DCDBD6F4DEFD450ECD1D531D9CCB516954B2D505AEC714779D8908043D","0x3611BD64BD80C95E5C730A8E03DDE5033E8C691F4293EAAF9FFD951BF276D85F"],["0x3011B46FEDC186686A57FA05BA46C699521D41D0C3BD2082A5028A390BD85364","0x218B951A5BED06411D89DBA0943AD5B98C0095BBCE981E13C132B1536A031D3A"]],[["0x3097773875CA6A5DBE6CC4455A6ED5194E7CBBF953ABC19AFB9ECC7931AAD44C","0x295CEC2CFFC701A669CEB55D1D3421604CE5FC67828CF3DA92D5779FA840023E"],["0x1F5F19FEA2E2F2DD5568C80861D6F7012A3EE242958B846F2647D9391048D6A9","0x0235C0F26E3478C5FBC4ABC4E533D1BD2E25E1E3C329194F227DA67B500E9034"]],[["0x37D904E17E96358F87568BA58B473D83F406E725B268EEA2BD8CA0A6119594CF","0x2FE6AD0AC1AD5AB0F06FE8C3C6E900FB93275E3C69085F068AE26665D2F78271"],["0x1C52A306F230DD8EE682B452D4CA580E8FFD637AFFBDBDA2C20FE57BC3F6965E","0x0FC72923389A0452AF1A9ADB1D8740FD45A24BA6BD2DB73067498B5490D794D0"]]],"z_1":"0x3985A2463B6AFB7EAA49C0FE21A26AC291F7A3E889745625F68BDE885CCA1C65","z_2":"0x17A4943E8CA071827CD258E51216C9ED933733D6EFC8BBA7FA2E0D152481444D","delta":["0x3CAFBE4A4BC571E9EADC7E5C6DCBFFF457BCFD4C40EB7CBD3EEDBDAF3FA35087","0x17718C8E7CEC2DF1FC25A6A7FE4EBBBE1376FF852000F505E1A3378ADA6ED301"],"challenge_polynomial_commitment":["0x32C6967C9481B9A0A459D247B4C71858DD164790C7FCE25657C069FA26619DA0","0x1F9099EEDEE46F9E3F4E65043873F4B76812963FAC6B59D0ABA4376678093830"]},"evals":{"w":[[["0x174EFD311DFE4D65420BE77BC8BFEA113295FC6D22BA9ECDE55D5020478A229C"],["0x0116AB41A72AA4196AA4242872928072AACCC3001B6553B0037C65D2AE42D741"]],[["0x33D8A8FDF0E30965F3D1B70E1D0C45FD8086852924E167A31821AE4A0F6B6DC2"],["0x18488C4704139466E582CFF5C399406D6B126115DDF8F25BACC3DA60FAC44740"]],[["0x2EF3C636F35D17145B847F77ADBA6B05B13A96CDC867701521CF616DF6DE3CAD"],["0x39B0670CE0AFBE283FFED928A9496205C55CF2F970EFC1EF20CA4009FFC57168"]],[["0x304904F443FF24F000D511F731402390562525AECE16F5B06C4C419C319AD536"],["0x3F197F9AE8293EC1A09620C599F770F100C9041ACC120393963E5DE5C970E247"]],[["0x381BBE04BC442E5782AFA1E6460B0184CAF1A9A8128883380B78B9E91FB0A16C"],["0x010692DF60A65A0922C52917DAE2B068F9A1F57370DF1D355FFE15DBDB6D8625"]],[["0x3C9ADF32B0B123A01A3A631E443CF1DE8585E9C3E57F7D4719ED610EADF8FC3E"],["0x1C34D1AC1050390C2DAF0FA8912DE6EB5D26A55401DB4EDDFD633041AC69A39C"]],[["0x14B6D6D2345B9B1CBE278D282211F025C96F2740BBBE521EF000E99766A1CFD3"],["0x26A68F61E8C9E8B90FA43A63F3522582967F440C81347AB62006C27DDC6BEEA5"]],[["0x2B07209630B1779D992B9447E65641DAF80025C6C98688D6208617C66FB541AC"],["0x38DD47B1F15115DCD9CA91BD8753C1B0065A30A112257B6A8871A6A8AD001E1B"]],[["0x346CCF801BBB385C292C51C5EDED83582B3480561CCC5581E70D8C4F4C6A4B49"],["0x1B1BD1BE8B061B63D20C80BF4F67D65AA537FD2E324F8F4972256F69BD9734EA"]],[["0x32317D3EDE7A060B953564A2E7AB7D1A8F5E225BBE7DDC64CE803B32F55CA7CB"],["0x268536869D8DE73EADCBE531142CE55D2F8795F5001130320213C68269D2F3D5"]],[["0x2650DD9762E0A5B5502FE4922A25A99CB1BB789B59ADE2ED492F4E515C98CCF6"],["0x10E35F4037646EC09A269D3196EC7A8C6FBA6304E4B995C9747C6F0E58BC6995"]],[["0x32D51C308E59CA82CBD8777A7E9E2DD399E8A80B08C8B2C54633B70234B22A60"],["0x30CDAD52BF479CDE75DD4F3D1D6DDBF9936304614D0C893C36294471ECCDCD37"]],[["0x2D3CE837F9441D2C2E92C48591394BC529100E451A5D1824155D260D0DA8D246"],["0x2C2ED5D75A28FD7A3CF2C0890E7E920D6ABE103D1F29587FF3DF4667A0FBCA2B"]],[["0x3E335CB0ABEE5DFCCF4F0EA4A3AB14E54893E42F29984A875DECF56EE013C310"],["0x374BA0B8F01243D1B95B26FFE08AB7CF29E8B350670836CD3D16C1829A593644"]],[["0x2BA3B7197A26E0818799C8CEE42BAD24A52DE805C0BC45038B96BE3288BBBE10"],["0x091D359B60DB1082BA7FC65293CA3B52E1A41359B558182E74AE8DD56BE7C91A"]]],"coefficients":[[["0x2547E1F11DA43AFE180D5BDB285E9774A6A8C89AE7E8EB50230ED23D672638F8"],["0x01E446E4FF84AA7418B88651A81ECE7B11A5515015BCC73D475424FA2BE24811"]],[["0x3BB5F8A4A870D0E69FEC06DEB2A89B88E0566866E3AFA34EFA3D91F2202E6B59"],["0x0698257E7830AD424309AFE588F37FB76810C28A3A9BCF096EFB7407D22474D1"]],[["0x3964DEF5F29F92293118D25222FA618FB2722836AA08B20B2E9467E0A53C30B3"],["0x2D825708DCC96259CF4AF3C15DC5ADB195A55E31C87EAF52411DDA1E08D0C625"]],[["0x018BEECA9C768A8CB55A3BB74E544D3069A689AB47FCE1627BAC8345CD7F7840"],["0x0DB5DE7CCC39422E01982B4D1FB6D45CF59003A3AA6C89D6A795F6F772AB213E"]],[["0x2EEF066951175F9287D0164733F604618AFB6553DDD5FD32AC4ABCC6461FFE40"],["0x2B9F4BB77F2FAC00E27F4241E94EE5B22782AB5D99DC35911B3224CC1E6F0003"]],[["0x31DB943253AEF8C6B01577E782BA9BE089681CEF5E6B09FA16670FB710F80811"],["0x24C610E7F04EF2BD4D0108B43B0F34706F8DAB09B07BBCB307D1C654BDF4FAF2"]],[["0x38DC6CA0E87A1B8E014BC4B1DD0C8B3DD567B2F004B19A0CE733B67A3F545D89"],["0x33EFEF27B830540F3EA02C4135B6FD2B98CDF9D0A6B51187DEC365DF87DBF5F1"]],[["0x2CA1CDDBD2421F280CCB65F86114FA6CEA27128D19FCD17A26F0929238257CA1"],["0x11FB7E78D5982C9D16EF24612B31C2021F453EA2B30CC38EEAD0F9814CF50391"]],[["0x306EAAA31BF53F2720A22DF2FAF8EFD735162BF4726E40F4BFF651C475826FE5"],["0x03EF488DA5E468A80FD36DEAAD7E83D070973E9DFBC4615B5F992C08D5A3021A"]],[["0x322FA7D4845F430C61C858F529B3BAFE1D696B1879A90E700CE5A3A51D2BD3B7"],["0x19CED5526589D5004083102AF2F2FD4479D85B6A230D31677ECB857F0D8DE493"]],[["0x137A0314A27567403A8F5CD766392D5FEC81591611FC5911265BC7E23676846E"],["0x33A17A36F32A23986C3BCE2B84B5B1EA6C67A1692F59E4D53BD1E1D40E238251"]],[["0x341BB4C1545C92990FDBF84D0764ED540CE05F26B84EF2873B9F725402AC36E3"],["0x0A1DB77C2A226FE895305EBDC90411635668DA8C2FAE7776E8E650AA71402CE9"]],[["0x14CE5862E53AFC5EA2953197D5BD9954F69AC808284BF70991426CBD30CE1EF0"],["0x3DC3CBB1719DC5D30676D3A5DCAA2DB4846067FEF5A850679D3D97F5D75D6C46"]],[["0x328AFF5728148F28B47EACD23FE7604C2FAFB2609D89D8C3F7594C75AF0B9C51"],["0x04938E61F74AAED9285F3B6EE1C42AD9D5D99C8315ABC91E4EDD4550612BE397"]],[["0x3F601E155556D66901F8840F02B9A4CD0A56E81F092FEDE8F3EBFB9F82CE7234"],["0x3892231FCCF145BDED1D818389DB4CE82948329CCA095EB5002F2C5E71F142B3"]]],"z":[["0x322B21DB00807439F90CFF8703B8EB5C028E23E2E96A4A87C1AF5BBA86CFB9BC"],["0x351E61F3D078EC76C1CE61B6CA9314501733AD095EBB61BB89A3830F8BDBC98F"]],"s":[[["0x2D0043196AB5DE922D2E04A7F67F3FC93F087AD2B8F8D36D0DF0078195269B1B"],["0x321A799734422BC7CCAA2226E63395A971C791723D421D8EA0F60C962A2165E4"]],[["0x24295FC4120ECB2B089E8DD121A8C6BC26D1FCAE5324026ED1E607B00AFE85B9"],["0x0A2217B934B51703C3CAE625E077E7E93E5E59C11D31D0E5A44813BA8AF46BB7"]],[["0x1F8AC9BE9D14A5C116DFD5AB5996985F4FCC7F3A6F31D4C7278B36DBDA2C3599"],["0x1E78C0746D533DCCAE6D4C0E2F928F577B0D0E5FFEE6A8F9570BE06779EE766B"]],[["0x24CDFD898DD706BE6F4E96E7392CE8D6C99DD9317AC6618041D8761119B05D8C"],["0x2FE45085A82CD9436A0585FCABF1A09F08F4F0EFCF028566D038928370E8DB77"]],[["0x0A75F9DF3320A042C21762F377301300232CB656ECF173031977E01F084E4741"],["0x0ACA67006E85C1730A0C51441EB72B33E39E91EB6477382E94003A18423B9147"]],[["0x116DCEDC54E2D2D3F9FA0D3E7CBA01407E16A727AFF873084129A11988219EA5"],["0x364C6E3D214082E252F978D55B0858DB2EF61A7AB140F31A95178C180B428F2D"]]],"generic_selector":[["0x25E7633BDA0302BD6B5A6AC8522D573C90C76329A42DC059D2D916A6653FD862"],["0x14CBDE9BE716F30ACFB52604830234200AE88A0C6C6A9C713427EE6094E46314"]],"poseidon_selector":[["0x0711747046D45C8E6140D92DFA14C8F3B541AFD5F27C6E1E41BC442D41E3FC52"],["0x1CA1D9BDF3AC859E3AB7E6457B998E6A9AFF4F0E30ACCECE34EA719D70C44937"]],"complete_add_selector":[["0x056E535465E36A8F8D82C22B0ADA15C1F070391182754FFED7077BDAA9A4DDF4"],["0x3E968F450CBDE5F6C1BF99F1A5A30DAE6DEB93F5460F405EBCD103FB8E048774"]],"mul_selector":[["0x087E6CDB99074F8EA9EE89A5B397F3F33255A79270213E91009617DA955B636A"],["0x35643B38E9A3A8018A38110F259682DADEAB7A224DF10FD1F7C9D9020B90B8D1"]],"emul_selector":[["0x395001BF260D05CCEC02C6E887CB980C6C6C3C63A2C81FE08285A2409ECC1BBF"],["0x31283EB33A12F1F775250AA96E1A0A4E9551424A42592EBF63CACD08F91D9CBB"]],"endomul_scalar_selector":[["0x241223827DAA3BFEB4B0F31F355F8E0C76B377C109CEB88344494DC511D017CF"],["0x30B8AD41E3088A6E1B1CE4E1131DAEEFDE0E40C04462DE6E1B9198E62D0AEF0D"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x29C0029F337781ACDFC6B9180375D06CF587ADFE7F17CEBF2F32F14DD235E5F3"}}},{"public_input":["0x09D5F0841E974C5B435C9D5F01686E8A43F92CF6A177C6216347621637087691","0x0000000000000000000000000000000000000000000000000000000000000001","0x12BFED64D9BDEAA50879D402EF9D3D41516C52FCCD43FF1F6B671381F7C242D9","0x0000000000000000000000000000000000000000000000000000000000000001","0x19CADCDA82E173643D53936CE97B92EA684ED61E810ABEAED4AF1CAFCC1AC0B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x0308B1680A7FBC655885B237FC6A5AC8F210B78F0180A77EE78B870923BAF20B","0x0000000000000000000000000000000000000000000000000000000000000000","0x14BA937491920883E7674FB1CB3728196A1EFB68A34DCE0BD919A7E85A312AF6","0x0000000000000000000000000000000000000000000000000000000000000001","0x04026EAED12DCCB3CC8D93CDF82A6AA95705BEF378B0FBE6906E3E638BF19C55","0x00000000000000000000000000000000265E785CC2076B8854885FFE5B9B2933","0x0000000000000000000000000000000036B3CEBB153AACC6C0C259A59F1C0F62","0x00000000000000000000000000000000C15DBC1F5655DB861285C35459688040","0x00000000000000000000000000000000C657C9523AFA48091B24E1E67A728198","0x0000000000000000000000000000000024DB20A366722AF77D186938B9EF8815","0x00000000000000000000000000000000055331442D508E98C60EBAFAD4EBCF2C","0x00000000000000000000000000000000FD73E134361B56DACA5018270D5724B6","0x000000000000000000000000000000002A5D291C55E078CB9BE83400C72C6667","0x000000000000000000000000000000004BDCBC270FCD797ECD0463FDCFA95751","0x00000000000000000000000000000000DB48123291D306E05F2208A003FB5C06","0x0000000000000000000000000000000079886100AAEE87E42BFCA5764420433B","0x00000000000000000000000000000000544714510C2A822A93D6C1A81C45C1D6","0x000000000000000000000000000000005A47843750E2E492AFE220B3D318F5F6","0x0000000000000000000000000000000068F240F3FE15867DBF4B606B0D49CC71","0x00000000000000000000000000000000C59A59796E86CA4FD1F1963C5841E146","0x000000000000000000000000000000004E827D323AFAAAFDAD9F6E10A2EABFDC","0x000000000000000000000000000000004D0F02921439B4B08DF1A14FE8E6A1BA","0x000000000000000000000000000000002D5C083952D7B4A3EE983787D83B6B9B","0x0000000000000000000000000000000040ED170961C37A39705FC77C4DCDC926","0x0000000000000000000000000000000022BF847029AB1103DC0EC303F6CB0CE3","0x0000000000000000000000000000000000000000000000000000000000000001","0x0870C3A4C375DE683AC1A6CD27BF5BD0783FE0E83B958CB68CB4BAAF20CD5E66","0x0000000000000000000000000000000000000000000000000000000000000000","0x1928A3CCB31761CCF9F67672E874759E28D3923AAB8438F6FD784B96F07B29AB","0x0000000000000000000000000000000000000000000000000000000000000001","0x1249A40FC7FD4AE735243C9CA64DF780D4B11DAD8BB76D584CD05A3981A99987","0x0000000000000000000000000000000000000000000000000000000000000000","0x01DCE813D5F5DFCF0AAEEBC7EC2151F7B7E823098974696D21A210B0412022DE","0x0000000000000000000000000000000000000000000000000000000000000001","0x18B2BF5EA795EBC5A3FB6324E419D37E6061DE27073B82282F56B6277095F430","0x0000000000000000000000000000000000000000000000000000000000000000","0x33CB1F0EE382B2BA0A1B65B6201109DF7C284FC270CACC41E15D6D036811B60D","0x000000000000000000000000000000000D0749D17645E8C0AB485969BCF61FE2","0x00000000000000000000000000000000FD6A896CD78D43E4AAA853021E9F41CC","0x00000000000000000000000000000000D6BF2041AF1C8BB848AAEC2CF533CD1A","0x0000000000000000000000000000000090D8193B08504427B03E85B053D817C3","0x000000000000000000000000000000009B734FA6833969E49FA0C735BBF089CD","0x00000000000000000000000000000000E11C3D03061C45727DE078758FF1A108","0x000000000000000000000000000000006F043C168492B73210F13989B0811309","0x00000000000000000000000000000000DD561F7FB7B38C52F6E7F739DE59921E","0x00000000000000000000000000000000F904AC26F17CB0E253625EEEB85001DE","0x00000000000000000000000000000000B4A5445BAE2372BD05FD56A9FFE31470","0x000000000000000000000000000000005E1F3CD9DB8501B2238C207819376D67","0x000000000000000000000000000000003702F8CAC170EB6ECB0F8C55AA7B3065","0x00000000000000000000000000000000E4C48687DB66E39305EC6CF59CF975A7","0x0000000000000000000000000000000008017A3D1B006060CD9AFC6D145888D6","0x00000000000000000000000000000000198CDE592CA92589F4B50D5E65687A83","0x0000000000000000000000000000000093906906C7FB51942E14B0EF61E7A131","0x000000000000000000000000000000004E5C021B73E6AA2D36FCF0CF0FA05B97","0x0000000000000000000000000000000043DF45F774E9C708E4A29AD9723AEE88","0x00000000000000000000000000000000A02A45235D621850C2FCBDF6E57B9E96","0x00000000000000000000000000000000CB0CE7767921C13090D4136F009A148C","0x0000000000000000000000000000000000000000000000000000000000000001","0x39E4E7E1EFB787337B9E3072DE3FFF6D8C5EF662A0C3F9471F2DF110C3336BA4","0x2031BF3A601F915B32DD5E92876D70C4475F74A92F9E63810D5AFB89361848D8","0x01D5885D4A389C94B371862298FB2BA366ED1BB6DE888DD58088040B961BA6AA"],"proof":{"messages":{"w_comm":[[["0x1D1CDE8DBC1EA6367C229553F8123C6B37A3A6D53F4FFC4AE7A20B6708A681A3","0x3D2FD0B6AFCEB00EBB427077CA2BEA11822F8379D3D82A83AA2AFB09CCB0FBC7"]],[["0x113CCED19D62BD57FA0D1E074EAB23571553109AA2D447B78D3480CA4E052672","0x13C35770A144875DFBF1FEED1C2B38139FF2E4BC5832E79BA11EC85380D47F82"]],[["0x306FFDA8154A9EE5BE710E679477F5D9EF9399D9D2E711A42E0F8A938D998096","0x2E06FCCF2D9557654648E521CA03117A8623C01F734ED2F42A9C3DD262AD0021"]],[["0x044913FDBC529E54239AA68F406E6E9BAFD1AF54E7E97A75C722CFF7B9A73664","0x181D3445FF7B937707FA349574F600C014136DE66C876C396503F3F8A0AF18C1"]],[["0x22F7C0E7993308D8E12A2B9873C85BFC559D92DD86C4614E9E774E73812DB090","0x1CEF426C90C5737149FA0DB0D83529EC074BD95792B6A5260306BADEAFD54D90"]],[["0x1FDCBDEF0F9096867F266AA1E60B296E0B9A379F83111D1539E761889FD35783","0x091AA597E16148532D1121BA94272BFBF97CF680E2B267613DA3EB147B83EA6B"]],[["0x1F2E9BACF36F4B09B6B98BB15B99818BCE632FF03C9EC07E0B12E420AA8B70BF","0x2CC72F6C93B3DB9B0DDB172658910CA636A8775CA276879A7B09DF4F71C8D70A"]],[["0x0C62E86FE4405E1FB952F4981BD32DB81341E49D476315B40E4DBA6B340145C5","0x28381A4DB29484D92912EECE45EF23B7D7904025A171001FEC22955F952FC0F2"]],[["0x023F75C7E944230F54E32D846BFBD398E46CACF582A5B0252BA8DCD67FC524EB","0x3DD783673ADF01B169FD17C4F5A8D02924DC3A096D034112084374B9070DB953"]],[["0x1789FABF33967869209EFF4B89A616514EFCC313447C41F99B1B53B1DF7FEA3B","0x318C3C9B8BAED2254A7BC72D23230871A9651D4326B1426A75E9EDD53A4018F2"]],[["0x06C82580E1F26B30A5265A5B8832DC9327EE1C38A34DBC25657EE0B5BE9DCF4E","0x292D03E43D63044F9E36E4B5093FD52CC806F2FD1339C29EDB19326DD6C74743"]],[["0x2694EE7A1B2AD82D8E1A93B7ABC4235EEB60617D7782A5C4D21DADE1BC74D65A","0x2C8FD3D328C4975590F364F615AC6AC54AC8984D7BCEC4197DD724EB29E67319"]],[["0x1B05608D7C4E4471918A4A6DB9FFB82FA5134092F90C2733221CF3D49EDC0982","0x368125A399B2C539CF14B19D26FF38347F569C146AA7762858BA004E7BA7AE47"]],[["0x0BF54EC8A07E72859173C86A60C8AFF332E7DD4248A0C22C41C01D6FF783D9A9","0x2451C450A87CBE54573FB0A9C06068AC008985E0798BF7A7ED834522062AEF81"]],[["0x20E4902E7354823DA9AF41E942ACDC1CB4214FCF16BEB0B4ED52726960756939","0x3DCBA98CB912C9FBA11DE0336B4A11D443732552EDD7B8FC4CB2253D36A69D11"]]],"z_comm":[["0x25F15468643994F8A21C3971BC9B2E4F6030E29E729C70072E21BCF1F97BCA35","0x0F51913D82BDB9FEE16D1155F810DA22AB1DA47AD0DE8D62151B7D051D7E93D4"]],"t_comm":[["0x29F6747970E26B9D73E65607C502BF04690A7FD1E3E9FDD6F3467069E3B004E1","0x304602E52FACE7C8712E529E4009A6D715C3702CFCE0870DB9C092A7B52EE157"],["0x0282E1CA00CE1D3605EB7C39BD85F9A6F8AC40117906F8A300B7A461DB07D6E8","0x1E85D23274B18A6D284233291FBAF8C33EB48135883FABE52989229985813AE8"],["0x0FFCF6488D6B592465392F662DBB1087FD055FED0866EA9756BC9950A8ABA21A","0x30C5C914CBCE9BB9C8C7F630DE192294AA6AE3614BF39E7B03862B47DAB11A7B"],["0x3E2A30FE476349806C3E82686DC00FC2928833B02A70C080E9961A39903CCA8A","0x304A0E8DF95E1AAE662F60F6358FD12E2D385FDAA91DE3B8AC356A624945ED2E"],["0x0E65DC528E2AD9BEBE8DC5EB421621F68E27EA2C81076250CF97E73A00F80BFB","0x0B59A7FD08208D0BCE7D5E3971823BFED2EBA51A417E99B011E80DD8ABB41ED4"],["0x32C6348522BC416073055477487A98BE55E2924DDBC81F84FE67E83632553667","0x354BA1DB508CD90DFC702E61B60FDD8D8142B918D8464E9A25A350A0F4FC9E35"],["0x38838276D94680E1683558E29DD5DACFAF6341F0C6C89E4971A258D7A20CF145","0x0128324BD4F79D15EBAAF2E67E244797A46339F3FD9C65370D338CAF566E3F75"]],"lookup":null},"openings":{"proof":{"lr":[[["0x3DC04F9B55D2FEA50852CBCA7B3CF8CD1AB54BA0C48339C82CA122DDF6F5ECBA","0x2121E658E6CF053D498C6D2C160B3C81E30190A65163D5BA624E6A669FEC967F"],["0x38DC22530F4023FAC779B01428055706C61AEA2F1038148E779DDAB6264A2EF4","0x312F628A5FDEDF4E0D1B44375220EF1055F8CB5224DEEF1CC1A2346D8BD0E7B9"]],[["0x0FFF3C39BE6B1A31AB08A93771607109F3E1EF6FA2586ECCE1A6FB898F250C06","0x3EE693CC529460520E2CB783F5F970095AA6E04DF4FEE18722DDCE7A4B7B30DB"],["0x218D73CB2033C1CE15F2A8E33928EF2D07C33CB8881EF1C106DD96E6F3458D95","0x34EDEF73664F3067E92C5D417B882B0B7C84A5E2F61800148FF49567A1CAF255"]],[["0x04A4F0C815852F6B60C6674424413AAD5739D6649384C02B47492CCC0ED3BC88","0x057CC145C3E2AA157AE866774F64CC5C14579C303AF6854431C9A1E38A2FF855"],["0x1DA4F600BFD56A9F6D2E6E370920D30555227E3F93773B7B0D81D8F8B54FE523","0x3E0CC314BED55BE4A9D2C9AEBB6C5E4729E8562F6F8B2DE26711C8651D32D1CC"]],[["0x35C8E74033BCD47450D1293A980114F40A4A4259EC453EB7377CB93D47669F0A","0x13968A1E3280C6E9002D3D8080E4F578A05872692C8E991574B777F2EB43A501"],["0x1620B4B9E09A0D2E31B8FFCF2D804474FABE1B7B9C8DC58331DFC53BB4B0C584","0x18FDAC8E4451F7DE6DDB95C1BED0303896E42907B117BABF7A9B5AB8AC5B229B"]],[["0x25A0592ACFDB40819AE4BC17D49F4117C374E80BF77216B6013578A150BA0687","0x021B8EB8762A29AB6F16CF05F5150F948642B4D0755AA280F011D47C2D19DDBF"],["0x1B143E13C3A64F8992C850E88EA6F5869C74F40EE7636D8F102984C01D3E5C37","0x1C39939C7DBE529296415A917C92466FAF57B0783E1201C04B48F43CCFC1A6D5"]],[["0x3AAA2DD18C79439E97ED8963B9D7BBD182823C85FFB5561C87FFDFC8ED983D54","0x0EF257C75337885DDFE0BAB3A9499C56E4B26E335FE3691178FAD0CFB4D77713"],["0x3C8BC2E594F70E90F3C50227595505E194FC996098BB8418E2ABA7F0007DA22B","0x0B855B2EF600AC06157AF082BB18CBE41F69DDC22EB6E87CB8788D5266AF8D21"]],[["0x35C245DE7858E4A144B66DB72B398C4530CB8BEDED330391874EEFF8885A53B9","0x27A019DE65D7ADBEE4B6B548BD7D522A9C202AAF2E7238DD6CB887ED70150480"],["0x2834D3C95D9703324E53747B80875F493EFB2A4CA4AD89555F1BCCB5F878D71F","0x2E4971E5AA2AF9A644707095DC876C65B718E84BAAEF3675169FFD50DEA0E778"]],[["0x33A6672DB43857C2076717A32E1086DB7423BB6C28E08B10DABE18BB3E5206A1","0x124F8BB64DC583ABD6335E73F545540091CE6E173E0FB17445257C153FF49986"],["0x1D66F97A85A566A7D38B55E98488E3AD12E176AFFF05A8BB316EA5EC885C6C43","0x19323F58E1289983947B722B3959227206EE5546AD0ED8B9ED25E9812E272E0B"]],[["0x2D01FD419496A7A683DFCC15E6B4411617EA1F38D20D7C71373F1259E0517CBF","0x255452EBABB2BAF491C283FE3FB2165184CFB0567E6728489DA9F5E74CABF236"],["0x2C30C5075569490F1E0A9DE0FD22F776389D32FD07693B51093A5D5F7646535E","0x0C9FCCB29F09B1D8AD452FBA46E1F169F1FE63300FB22C7D3CDCDE94EF42A694"]],[["0x3E3F1A3BAFB15BAF603B1A57E7DFA5FBEE758F7FFDC7D49F8C380AA06097084D","0x31AC77DBA9496E1738897A0BD69B6CC12B534C6CCC45B4D3BD86ABD4963FB2F5"],["0x2C763C414855C99D9392E2994AE1816CD6A62105D1A77C27B425D88C27E17D91","0x30FFD6A442062D8FC29D4948400D7964662354EACF01F6EEF118D7AD4E3F8701"]],[["0x06EC662F701E915CFBD4839872610125B13BE43FBCF2324537D174E01973039C","0x2131CAE22D8D22B537CD30E74550A5CC75C075C696C5D1EA6E3E599838292238"],["0x33891C78753DDB3B557CBE29B5E7524198B9C068714EE4D04D6E02B605744130","0x3EA21C75EBE7E0E1EE55E79016D59B97068AE75FD815CCBFA954F6F24A224A7C"]],[["0x33CBDBBFAF8324B59CF06DF77B4C4BCBC660A7C2DAC555B5D6C1EC3DBC36BBC6","0x25E8F5B642BC9EF779985593CEAC973CF852E683EDD72D81809B267070A30C15"],["0x173546BE6AF23BD0D830ED72B2A86C12C68B716B805BE4FF990EB4B69530591A","0x3F025EDFA4952EEE59BB9D7AC662ABE9199D84BC8FCFC582EA3A884C081D6851"]],[["0x2FEA4F3B0685A30D89F3FC6127981CE25A724651B49226084AD8FC0B9BF6DCB7","0x3DBF4C4BEF4BC7CB28AE5A404F742F188FC28E6313162C116429B30F047CD59E"],["0x31BC036B6292732A225F53A6A0EA482FDC9B03C585217E6F52AF79434221F87F","0x37EC502C176412FF9CDEA0C76DF4ABFECC87A4976A5961E8B8045790268073C5"]],[["0x04AEF92376484B4F0060CC2B7377461E2E24B98831F86101D8F60B5DFAD16AFD","0x3DB01254B7EAD416BF7C4DAA4A0AF1E9ECBD88804B24964A86A3F677F8F7FF90"],["0x3DF88832863AB13C7F6E65A61FECCCFC01D5DD8FF6A0F207524E6B120A044F1A","0x1BD7A17174F9F0AB9FCD04E387B352B49A5250EAD06A04430CF7BCB519E94783"]],[["0x139DE6B1D7EDEDAEE66EEE01A797F9BD81EF67FCED4AD77F65D2CA9BFCF96B50","0x2BADF43BB6CD46F89E4AFA6BBD5E5C26AA5B43FE2A9B3AB0DAE0DEE49AD9EE88"],["0x05C42B472AB20AE44BC8C1028A03368434C9069F457B1FF2F7995F5396E12D43","0x04E1B764C299AF8A86FB61C08DF15B3FA2C54B794F7C9911934FB5C70D75550F"]],[["0x17F55AFA1C92136172EE23319D94A2871D6B4397264D30FD37987D6F565E7009","0x22706C6C7436524E8C6958DC2CEB1B92CB11647B184C87BE03D537A6AA01A910"],["0x397158EBB205FE22F8E8E294570FC73D4CAEFC136CEBE853891D841D00B82DCE","0x018BD2306D15B325ABAF93496FCD78496A05F31DAF879F8DEF9D4567D0641F48"]]],"z_1":"0x13DC5FC428BA6DF1AB043AC98962B61F3766FDE13DA2B794CCAAD94FCDC20AB4","z_2":"0x0733FBEF98EB13FDE7973CE96E476EBD5D10EB6720696BE5DF9F99B249049075","delta":["0x119688687F2B8611847A87BABB0074998C0572707AE0077EE4DD4DE391B66AFF","0x10B9C3C6933BD91246667F7412A528761120927451293F157FB83F28747D6FFD"],"challenge_polynomial_commitment":["0x3596683A4F00B71937D27DABFFC859D37B728177E8269A7F400A020FA9862438","0x3BDD1FA3A9FBC2C326CE22EB8D60C74C1C3943B37B4E96AB2F81FE481A786B26"]},"evals":{"w":[[["0x0E8B17E822CAC7CDEA8316A3FCB7B8E651EE1A5E5710CB1BA02620369A099D44"],["0x2698F2D7092E21F9BB9745D190EACF1FBEF64137C5797042CD6FC1E8D5E95BC2"]],[["0x0F4317E5A0219E1480F90B40366ED55E74068914E131FD321C3C61252D81A679"],["0x0322D256149F6C5D839E94821BB54EBC088765A433361058B550BFE52AD77319"]],[["0x274F6BF5F43C4A39CE6ED4DD8C2139952C7FDB70112FE15045D7AFACFA9331D5"],["0x3A5CEC25D9E24AE97974309ED052FE64AC880CDFA3FE2E86EC8E751A8C9B3D04"]],[["0x056B890282C7CBD7D1006AA0ED152CA5EB947C6E7BBA2BD66E179565490904F2"],["0x0C744197D10824C0A431D8A46D2307F6139AF39E66F1ABBA329971403F1D2278"]],[["0x31C41CCC083289A0C5031E714FCD48ADDF74635BF1C8B1E973BE81E90D73898D"],["0x38C976A73F9258D6A09554931FA0D8F088654CC861C2D5563B1B9F8BDD497ECE"]],[["0x120E2A37874539CB4622136E5E5BA1BDCDC2F38ECFCFBF73942187D90AFA57EE"],["0x0611E7FC980E15FB980FAE08878F3BCF77647D3BAA08260F5B6376DB74085021"]],[["0x2E938FC94BDFCDFC5568C1920F18E564CF28AB1865867222999F51AF50D8D087"],["0x19ED59ADA4ECD4AFFB4773ABBE43ED834E6BAE1A34B99ADF35A6F28D248D0AF0"]],[["0x31E1277A788DB9016853F2B4385A79DD581E1C438075740878CEED9C2D98A707"],["0x1D14496FF409981D45A339F9A6549B6836BEA96404086B425E0CDA6B2AFD0799"]],[["0x01DCF71599646F030A099438CB486E2934D487F6A8D49D5380C2837A8762869C"],["0x08C050B1CA09736358C45B28632C34503A570C77BFAEC1973400BB91DFB3814F"]],[["0x2C611A7A82FF4F9AEE1271FE0600CA312BC4921F17F0AB3D978BF5E01C80EDCB"],["0x26DD1D0DD4857C1C5B69160E5A165B210CCB7E2CA5F81B19E7996E38D4570636"]],[["0x3A113A421238DE29956ED0125E5D2FA217B19D92FBEB1B74EFB1F0044DE0C547"],["0x116DF23DB7657F1C88D240272601BD45B8974F03C68A1EA6D9778C8F532ABE62"]],[["0x2CAC45A8966D861135E2A5EC838E12605B60AC760D38D195FA25D02B08EBB11A"],["0x37518B96F1735CCB6E42EDA1048BFEA29EF46497D8CDA191931CAB6391C8B889"]],[["0x0461A3145626E7CC3CFC0F7BBF93DE0FF94063E0689C0E04EE5F67600D4039B2"],["0x38F9EE30B644F9869228D79049E0BA3291E4CF13059085B487960B900054557A"]],[["0x26EB5EB1EA79F0BA9A2622E8E23C1001BF9CC63B1A0C8BF8152A58013E98369A"],["0x0C5F2674DA39503786501D1011CD0A5DE1155010A9F83EC02939CE414BB71FC4"]],[["0x062A83EA8BDFEA94708ECEC6419CE2C0A609EDC2E31E285D5A4A5BB782FDD523"],["0x0C90FDDC46B812D931B8017E119AEDB2411C3997E5F6F98904364686FD8482EF"]]],"coefficients":[[["0x2B7AE4BD82E7396DF1C4C565D90E8E8F1EE380410981F9144A1898AA828ED985"],["0x277458F955D9FFFDFCBD6704D3ECD54F65608A5AD466303AF9EF845F1D09F6E2"]],[["0x1587D5D50A9F32D79265B09DB3C55E11C5696C33028E024A2675AF6D24A4D1CB"],["0x03D9766622ACE5747FE084E36BD77A60DF0E392E8C6422F3672D876AFDECDCCD"]],[["0x31B7856B3AA21F50FA3AD18583A2FA289E94A6B2BFD2291877E6FB5D31C02DA1"],["0x143D62982AE63B5D76A4068B9915460D1C1392FE9FA32D51656F0DE9F0D4B592"]],[["0x111CFADA25DF49A3BC455BD9759424852B82E8151E2F2CBCE787337A2775F8FE"],["0x3708AC02118BD9D4B28E3568BC416E51E5306634BDF8AADF1CF1BE8CA69E6C1A"]],[["0x0FB6130F0118AA88C15F2AD152E2CDE4722C0856CD734F7F4D393DC109DCA5AA"],["0x3273AF9075EEBA02907E314BDAB3D9F61875C0CC54EE49416082BCBD5438BB63"]],[["0x083A9A30878A923BE11BB66029C60A27A331FA07E39F6E31204C3922A129F3A6"],["0x05F0848E551B3619C7262019BA0206BA49E050F74544ED71C6B225501F307F85"]],[["0x249C134711F3FB8C265524BEF62F3CC2313FA7F2751BE37B970AD5E365409664"],["0x0001653A1FC76170DDADBEF03EDE723A89C47ED85AF6DC5F856127B0643759B6"]],[["0x214654C94F3DAA461AAA2F2884D38B7D1C6FCDB368B8E7DC52598256E57F7CA5"],["0x22C7BF84D024DC28236A7822F77E500E54CEA096821DDE5CE7F70FA3ABCBA88E"]],[["0x366A3D165C1CEF0FF5958278EC6179F46A87124A86098871A17EFD44B59118A8"],["0x1E5333481C4716EDF45E382603F29AC7C836F2236DF3183D7C76DE65E2CF2167"]],[["0x27B0A4386237A9BC38312619AF9089BA710479C4D81E2419963BCBD4D3F74B40"],["0x1B38FB88B5A96807ACD1F58EB76801F174523B5B0BFDD854EA06D8B7481FE8E0"]],[["0x1FCE533C7E22E706AF36C21C561F125D3782249D7000C3A44C8E50FFBD83BA9D"],["0x330684E0B0369EF9B085FDF1574A2D3AC82F370C5530906ACA1701B8DB2A6B34"]],[["0x07494200F97D5410458B348341AE838904D87A5E4B93F60313E44289FD18A411"],["0x3BD45C1230735C0E7875650B12ED4711BB3A3EA079E30DEB660281BC8455F45F"]],[["0x29981130847172B1B1E96A0048B5D12196064F575F7C950B107B713195D307DB"],["0x3257A70FCA60B833CCDBFB210C950B0125F4F9CCA38B4614C543E6288CAD7261"]],[["0x0F5DC2521EEFEB340397AC0146F1874E243AFF9CD1DDC0C73208A05FA316C7E3"],["0x076AD215CA9EC20B7A177054E07660679B93BF0F6326B0EC9A408619C631208D"]],[["0x01160DD4CAA46ADC6AD69208B3559D100EE0E84553C3A7813135E612A032FCCC"],["0x2743D069E62117A31C5453F9DB1DE65CEC8B9D6A747E5584AF2055F149F9365E"]]],"z":[["0x39972D66E1F4E1CC1323F927F21F50DA2B01739EAF8CE8DC353BADA128E047C7"],["0x1AB70A50CA3FD4C957C309482AC341A67CB22F8DC2B34AB0E664943486A9672B"]],"s":[[["0x196A191CA3F7F58FA1846ED44E17AD998D79FEB570A0A4E3643A61C196129BD7"],["0x164575400FF9966F8DFDABD2C3A96C8AA9C8BF43C9F48ABA6CEC14B1551DE6DD"]],[["0x1D9FFC41DF8B16BED4FB0EBC7E333C2C83A8096764333C899FA3A95789A67E2D"],["0x0CDF8621F18A9633DC26C243A437E3E4CE42B373536CF7880B62CC2C0FB6AD15"]],[["0x022A33239A325B9C493BFCBF1A3F1A2B04E36540F295AC4576E0BBF911C47A87"],["0x129BBC5990B4C3BFD41C3F74788234D8478D513596F8AAEF6FE0AB6775304785"]],[["0x0780023708B4BAD38EC1B3212D9F14D2792BDCA1F90B09436698855531B85861"],["0x1F50DA2F4E781EC57CA4E6C1583757C176679C02112DDC6B8D886984160C4151"]],[["0x251C51B0D66CD8D0F9E380A306064CC411C2C4AA71C9855CF4F34C430BEFBD4E"],["0x2155C09251168845B125F65BB507F1E0A94B7E2611EB5FF6BC4DB2BD77FD7FAD"]],[["0x2BAC5F0AFF87783262D053AA6119C531AFF61DA3206F77D933C3A6D3694C23E5"],["0x27A36C8000FF4088F2679C55AB8B2D9C75CF8CD107C86FE571DD7EB56462DF12"]]],"generic_selector":[["0x0C7D629913D514FE53F8B3133245C266113A42479B4136BA6A1AF41A62614CFA"],["0x2DA2612B4C48AE17EB3ADC8A5A947B259C68AFFDCEF8D273F56A7C44D8ADEFF7"]],"poseidon_selector":[["0x379DC240079FF34137C7FAE0FF623457A952753CAEFB552C77DA3E7D2237EA16"],["0x1FDB3881A0C8DA9EBECC572D502A1421ED473FFB21209CD73C86D161C9085E02"]],"complete_add_selector":[["0x282AE50A899C8FEE5D00A1C57ADEEA59326F59F849A8C91F0A1FEE964074CF06"],["0x38E056A7EC9CDE6A1160563D64250D5B1FC5914BF9CF394A2E79A71E97FC3AF8"]],"mul_selector":[["0x1B148C3CF0928113A26FA6D3905F56F3C1B1703F0E0A1E374FFD9709AEB0E503"],["0x380C441EB6775141CC55ED87B9480001868C6A112744A91860B1ABC7C72DAB53"]],"emul_selector":[["0x241912F9954AADAD1F2585F5F58A8EAEEBD6F832AF58865D462ABC610900E441"],["0x1F5652145E15372699CB1AD84849348A37318E4ECFB37C8D0FC015F952A6B6E7"]],"endomul_scalar_selector":[["0x1E2C9E546E838DC7BAF8136478CAA9CE18DAC1192ADB229FF07401754390BA5D"],["0x00F3FC9FC73E5557405C892699661447E34CDAE82A8BA18DFA286AE7A6D39501"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x2856ECB6C9B87B1EBBE9E78419516C4EF4014D6C9610DD040151ADB95BBD8757"}}},{"public_input":["0x0739788E70E9494E38449CC9326FD89FC45B98E36F414B30FC807BDA9F7D9490","0x0000000000000000000000000000000000000000000000000000000000000000","0x1FC284340DE7CCAF89BE26468A36E945D5D87B011AAB98DB656DB8B530BFF02D","0x0000000000000000000000000000000000000000000000000000000000000001","0x1668B7F1C1D301211BE510DF28D8CF674425A953DE76779F2A2E4DD0C5D1CC43","0x0000000000000000000000000000000000000000000000000000000000000000","0x0030BC5CB599743A08A3FFB9EE5C33995F9C87D76498752F262D3C0D35AE0750","0x0000000000000000000000000000000000000000000000000000000000000000","0x153D3647DF77387526B1C1F7868E6DFB76465AD018E21FDDAC514D25C0D3438A","0x0000000000000000000000000000000000000000000000000000000000000000","0x0CB87935CF1CE6251A26CD12DC6C17BF6B0D29E306DC14F1347DC3E8E038709A","0x000000000000000000000000000000000F55F0F6DBEBF8F6DAAB8E5D37740141","0x00000000000000000000000000000000B9A5C839EA8E1860BF22F7FFD59E967A","0x00000000000000000000000000000000CA5149EEB4716C77EAF4F763DECD2C4F","0x00000000000000000000000000000000F79C9F3BC869170980F7D018EA159C6D","0x000000000000000000000000000000006A116867E8C222DD7EF774D9E506B6B7","0x00000000000000000000000000000000C75C94A2A1324A45FE310527DC3F6F7A","0x000000000000000000000000000000005AD349361288DBBD295DF67F6147AB22","0x00000000000000000000000000000000B85FF4A199B226FE065787A3A5A33945","0x000000000000000000000000000000002E02E3A58DFC3409481E733655B31C1F","0x000000000000000000000000000000004995B9B3E015349395B779795E24BA5B","0x00000000000000000000000000000000C8EAE0C99EDD01A418948B3C2758B202","0x00000000000000000000000000000000F085AE4C2E31970C0F9E0E7E0336A6A5","0x00000000000000000000000000000000A2ECD93EF5457660F98EF544E110E5AB","0x00000000000000000000000000000000FFC8875F4EE11ED79E3F48B71042186C","0x0000000000000000000000000000000007A49B9963DA0DA13DB4FCB8B7E329D1","0x00000000000000000000000000000000D9454C75FA64D44122F2470E334F8479","0x000000000000000000000000000000004B7C2C06047CCD0F493266BDCD61C500","0x00000000000000000000000000000000FE6813D406C253DFF083424A73569EB6","0x00000000000000000000000000000000BDE502B1F49B8053C1F93E20F433A4FB","0x00000000000000000000000000000000972450EC3115B1D405774DE3EF9CDFDD","0x0000000000000000000000000000000000000000000000000000000000000001","0x0B812483718A3F09800325AD2E56B0C0B0FD34AC2CE2ED440ACD698113E5C635","0x0000000000000000000000000000000000000000000000000000000000000000","0x178C4BD214B81E7DB8BB2105A3E025DAF63E52A31C578CE2FCA97AF6309DCA37","0x0000000000000000000000000000000000000000000000000000000000000001","0x1748B2F58FA32634186EAC764F630B8E5AD6677BB7B3B637687E8C78A444DF27","0x0000000000000000000000000000000000000000000000000000000000000001","0x07BB2D37ED8A65982C9498810AF959DCD98ACA96C09FFE341DC8B9B90ED854DE","0x0000000000000000000000000000000000000000000000000000000000000000","0x142752082EC4AA0DAB4B5364A30104939DF58A792386558E2C8A90B8A96F790A","0x0000000000000000000000000000000000000000000000000000000000000000","0x3D6526C886A99BD335F8BBB665F459BD6F80EAE37418B3E3B266A71675A933B9","0x00000000000000000000000000000000FE2B1ACCF35E77193FBF87ED8E33F758","0x00000000000000000000000000000000771C9445BDC8BC0D6D8E57C300E6BB56","0x00000000000000000000000000000000A72C0A182099558945423B1D4F160E8E","0x00000000000000000000000000000000BB9D7225D7E0080EB0C12F0FC0B72595","0x00000000000000000000000000000000B7D0100E4CF68A918358DCBC6CB213A5","0x00000000000000000000000000000000DA373252F15F6EA208830A09F3787FA8","0x00000000000000000000000000000000ECC99F62F447C0955356872BDD4BFBFB","0x000000000000000000000000000000001324A9AFC83606D95379ACEBE05992C0","0x00000000000000000000000000000000C1EC2AC77896C9E0C6E44EDAAD0F9F9C","0x000000000000000000000000000000008609B6572C8293F1982DEE14422E9DA8","0x00000000000000000000000000000000F3EC85C1DC65A6CC8C061443723CDF08","0x0000000000000000000000000000000095A9B216B20D6EB0E66B98DDCF0C14C8","0x00000000000000000000000000000000A2D1D2F98D7DC0CC2CA62181C1915601","0x000000000000000000000000000000007C4ED8983E748472B5E8AD5D79E2F5E1","0x00000000000000000000000000000000E5E7F476ED2A461C0C19AE27E764ED83","0x00000000000000000000000000000000A6974A885BE6B0269869251A9F77F1AF","0x00000000000000000000000000000000A12FB5DE1DC3B79296320448F6F1B832","0x000000000000000000000000000000008E3183B49BE5920F47BB6DA40B430294","0x00000000000000000000000000000000F1A26B8A2218BB915912D0F1DCAD1525","0x0000000000000000000000000000000019A93739F762610D477B2D4C134E8970","0x0000000000000000000000000000000000000000000000000000000000000001","0x0D599E41FC8C84F298D14A5B221A27874D4A18F99E9A5E64BC18E951384B6043","0x190AB8565ECAC7106F52662B5DFC94E219EEE407675AF98B7670BAE2600496A2","0x07EE362BE3B49B25C4552811D66AA6E4E84FA4CFFDE1A9D1A05D5B188CF4A573"],"proof":{"messages":{"w_comm":[[["0x0BA1FC8B72A9AE3420F11D6B2483C309CFF139B22F6FA41489B409D408974F47","0x1E2B34DFD266BAFDAF464186B90C25B3BEE2372E62E2FDA11255D2353B44EE2F"]],[["0x1F2789D912FD8678A495D4E8567989A5A5F8DA59B73E09EA15CF0C2B9EEFE520","0x183652832AC049FE29A949253319A33D87A5B9ED332AA6B35D4D3B21B29BF4FB"]],[["0x06A1756A41859D32B8980C83B126F0D7C7EC9588B09C4C07E26129430C91B3AF","0x17C4615A1EEE8413BC89E8386D12DF0F7B98D62B7A0C8E0F39A268359B953909"]],[["0x03B193E11B09F42383A18B581BCBE1AFF19BCB2CFF27382861CE0C978977CDB6","0x1306C4E21214AB64F31D71BF5AE07109541E1262521320F7FA3B6379BFCB1A59"]],[["0x2A9E253B2DAE2A47BE0E462A01AD4377690C019B26032638A3969F7B20B396E5","0x2BC884A17178B8B65F3C88A57A2593DC99B83216A41CED394E0D2BFBFB5AA633"]],[["0x135EB56AC14E4F123ECC9C444C1AC9BCD0ED62126D6AC1571B9FF47269EE8DCB","0x05D03D66DBE33790B8077E45600F540B3D69F246F8859429EE8B721B0157E133"]],[["0x2E14E334AFCA4E64A4C86BED33294E6F9C349F7C4838F7DD3D31A6C60B0EDEB1","0x231EF760555C5DA8EDF50AE33817CF7D818C4B3C7F4906C335FD29335BE4F90C"]],[["0x1497643F79912311D6D012A25C5E3FD86208B066AD91A773D27345B5024A97C2","0x1782A5FAA66D9D4598D2493B6775BDE0D47DB08C2A39E83865B9E86ABA0CEF1E"]],[["0x3AFBE1C531C02DA501D51DA148C5087958C890F7030255432D82A1C81E463E7C","0x33657F390DF106B55E4A0F703775FDD4B3EF481C7F977422E19FD2711D962064"]],[["0x2E26B6C9BE4687D463C253875A8DBCEA0F3B1247CC37474FE8AA83DACA7FEAE2","0x2780682EF912E43860EB581DB9EB68ACF4BE1E0363F7508DABE9D44FF233B9A1"]],[["0x1582F55225D376B0DD96D5E557729ABDB6906161024168E63384A0F3761C2D10","0x24D44371D1B4D5CA07B866E5EA558E698D508B70DA647CB4C3231DE741C3E1E6"]],[["0x205EF98AC625D96D1C66B0504B65C24537D66113D43753F6000BD24022A10D15","0x2D4B7F66AAA09DEB8EFD487295D782F443BD7F9F7C6376930FCA28499E86EFA6"]],[["0x29110EB2F43B008914FA3DC03C924ED59B701BCC6C0333289E9F8F6FF4A0811A","0x1D078CEE6E367CBEFB96CF6964603C7509B730A50D7CD548E203004EF56870B1"]],[["0x12EF84C8EFADE0479828BB906A7B91F9C5A81952FE9EE552AC4AAA917E8C1DAE","0x30C395159108598A74AA99520F58165D9A2BAFEB8E43B70FC64652957BFAFD46"]],[["0x2DB247A2FFE0AF6FBA1ECA44B9698B8CAE8CF34F4792695E714187A1A83A4E7F","0x14DC0E2A7586FA81D87348CCD6A62B1B8B24BD7ED298D8E1DAC2F2834D7CA476"]]],"z_comm":[["0x30BA5B2490C2DD9A8AA8780560B4D01275E82F5AB21654CF24BB66628D12E067","0x3F2E73F631790375CC1659AEC235E62DF99BAD069788C3C02449D34EAF473A04"]],"t_comm":[["0x17C4E5301C63C79B15D4385A5006934868C5412B8F833C4D24B4502EF70DC69E","0x1FB5F166175F9B8786FB2B31F874EA969FC3B3C3A02DFBF13F189A5BBBFF5527"],["0x2442E022E9C3F90DB4CC976C6AD537DEB418290FE193CAE651AB8491D851AFA8","0x1285148A2D7F993BD8D33216471792E3480C6686FEDCF4C44731D269FD834E91"],["0x26726C2A2A40AF727E7161A2DA6870E8AAA8B7170EC0B2B2E3504C4ED05E5A04","0x37689465CF8678D7C48BA244C56145448F0172CE4FFF5C89EE9BCE1CF09ADCEA"],["0x2B9BA714D76CF0B5293774C155DDFECDC6807C1B2805E12FE6B8C03C8C78654D","0x2F077486E8B0A02EC0EC4B9F2A22A7A8D630E72641D378244C365A53F41B5791"],["0x21A9DC1BF96326B3F13B66644317A7EB0BBB5C428722525AC9016685E8534C09","0x34941C171E63A64EC8C49CD0562C6EADFE1992D9DD4040516079EA92DB020713"],["0x3411D8022BD71FEB513F3814C852D86E7F93F49795AA4071831905D77792461B","0x15AAF2A0F5ACC2E7D33EC72DFF9A56B78CEF6933A5DBEF164579DB6827BFB077"],["0x1DCC9991B0C69E23E40E3AA29FE6DE3CA9D27DB512AFC54C5709B0C83E6D778A","0x3D0BA1EBB6BA58265295AD406F7A520395AA745D3BCA873E54C3F9B4E30F2679"]],"lookup":null},"openings":{"proof":{"lr":[[["0x20A286325AFA5B9EA3D1A8C06004264D0685E755931E846B0B8568F4A8E8FB5E","0x1B19EC0AF25339CB229FD405083B4C2AF6ED868E1FEA6B031E6559EFE322D38F"],["0x11D8B668A856C661B2ABA2BDE88CE20CDDFE0E868F44CEE900CC374114CF734D","0x2BB5783508BAF323E1CAD0DA8BA60CECBDCBE6205F110614629AABDC66D576DE"]],[["0x3E43BFBBE100A78B1D0BB440E6D8F60683C8D790C5B26D77B06C8CDE632917CC","0x04A64B1FC3BD9C3A36D12E9A537FDABEF01E96D88F3B853E1E9D7BBE3F81C7BD"],["0x09C7806BD4112D2579AD1A56B38500B5F5705F848441E47E67A8468C3718D287","0x2170A9A922C4942F9D8CF3084EF350E593E552E8FBD0EF0535A3C3BB21328579"]],[["0x14BC951DAAC104620E3032F7827CCA21FD93A7159B86B8E4DC11A4960C57A3C2","0x1A3B8D8F53C0F53409B96DEFAC6EF842DFF40D5040F3AB2587833E816A0CCD1D"],["0x2FAD5D066DA6A8AE687C610D38D6B35E9C11DC086483F1943373F4522155CFEF","0x3E690BAF29F9D3B618D9D8A8B705CD4EC1FEF8CDD2479E6085A9463896278D84"]],[["0x13350A33A463A638E739D23AF8AFBC46BA4A187E65C7BAD9C6E36477DB305792","0x388CDF2CC872FBF6A99BC7FE24AB2EF805A5715007A4F13AFCC70FF010461B45"],["0x21EB1E87FC1C8FF6C70CA5021C5730C6EEA9A868C89F94C668954E2E673DAF72","0x39F2C1DBBE7FA797981241DB088171428DF53564FF62C8B0DACBFEE268A07512"]],[["0x3E945B9696FBA5DF969A1F1B981DCB8EE171B6F66527F3135F3AC7CE43F83633","0x311634D24506487025C9D179252B94C73E2180F1B3A4919B6ECE331F7983AA6C"],["0x2FC5BF67C2E48D8325BC345392F98BA9172CF517B83CFCC9098D04505FF7C280","0x3AB7EFC2AA1FE4D808D5C62858B98E7EC899C6953E177F7420CCEB32034FA98F"]],[["0x3B1D69085082144E4958B9D307EA495B534E3B7D9315BE8960B751935AE93DFC","0x1E13AC6DBE18CCD18E0EE252E0C8DB8AB680ED9DA68AFFB5BE720C01830F0C48"],["0x3226206978CBC6D6C943DE8CE2940FA02C6D3682F9F568D217CA045C4792FCDD","0x2CEA7FC69935BF5DF7974A1583EF3702F2AEADA42DDFFFB339264EBADD277F4A"]],[["0x334A8D8A37C41EE4ABFFB8DF7731A976013299AB03CF9C388077B40CBC46423C","0x03BBF6FC95E6C565C4FACA50825132423C1D8EC1434B0C6D3CF41F989F4F52E4"],["0x33D571FCA26D0F626D1891C88B3E030F92D219466F9F913619549BD9A8A96B81","0x1B4FACA7CE736860222D9F1EED463858AB1D7B7BEB7E42C14AE3AC1E4E44E369"]],[["0x1C91901026F8BA49685408139126B2CB1A1F9D3EE59A0AAEFA1836C9A1FA1239","0x0D5CCC76758B9EB8077DBE7B2DB6F90658216BBF7037CF39AD22BAA105F90170"],["0x1116A9E892A3D6EE0BEA07409B2548EB63D5912E8E5A4219BFC230EBFB4DA0D9","0x18BE3686AACBBDFBECD99994077CF729588D1544497ECC7C9CC34A57E442FCAF"]],[["0x2788BB193C42B3C6836B06E4FB2CF84F724B5ED9BB5FF8BF94ED4264AF7887C4","0x25F643AD9A8C78F6E340CEB89464A70C58B0DE556CB40FD0B8FAFCD26099FB83"],["0x3EA2B68251740B8538057C0493D76AFD4177467D4D9AB23F907FFA49F780E9FF","0x050DBDC7548925D8F1CC80500EC24F24412BE5CB9FA74DC3E5331D4984C73DDA"]],[["0x1E7577DA6C1A472BDBFC8205DC3FACFC3570EDB1975C3368A2C9DA060ADF75B7","0x27C191272E8871F99CAD6555CF7CD52A76643E69283F7899A9F5673899FD7D09"],["0x0A32E914CB9FA02310EE3C6E433E32DB8798726C6357ED112F1C2AB2F11DC17C","0x1BC4A35B35B48229946EBE70C641E904606FB4D2C6E8DEB2B834F2C18DD345D5"]],[["0x3B141AC69331E8C74EFB17829B970E4E619EC3BBCA3FA0D2974D4E07143CF088","0x25FB88FCB53EB19E219977C5EEF0092AA0E5A8AFC6BA9834CB43A7560177B169"],["0x2E68B969F205CFBDAA3C4B26DA8E5C4B3A60340AE128629956377E7DDBB1ECDC","0x11CCECB44D5FE27F713EBAC5F19C4D875CEE881B15AC2CD0081FEB37DC6EB76B"]],[["0x054376CA0E1E3A0BE74DD810F029FD8A1263E23C95102DA1E7A32907B058337E","0x25ED50838F336D2866AB9E17B32B214244879546C6D439A166E07DC40FFCA18C"],["0x0E276702C8F7D392E23BE09A923E88232AFC424253470D1FF8099E84C8511188","0x323A6961E5D331B52E3634AF4FED00F4D485DA4657626E363379BB9397835C0A"]],[["0x07A8097D89CD10CD96604FE3C8972E8F1523D5E7AC54D45EB930BC3372B4420A","0x14A82782FCD7D1F90622F7EB59B205352932AFC1BFB1D0DEF84B9461BB5B383D"],["0x126E9F74BF8EB16F64D8169E7EA1E00DF627FF8F8C259DCA43129B36186731B4","0x227A86A0A29D73A2C2B6882CF85AA05441FB684DD5AB713788D2013B97655E03"]],[["0x37D25948DB6AF4865632C7EE8D51DBAA068903F516ECBCEE9D472945830A121F","0x2045EBA4E6C179936EB118F2364E85AABDFED52F144FA413CD764C4AAF299B6D"],["0x200C92BCD9538E922A43C97E014346D25B9D8E70D2F22BAB9CBA347DCCB22470","0x18B4DB13EE233C172B0955D2D758FDABE8FB12BE02C22B8F10F77C0775A4B196"]],[["0x113AB8636F4C48877ADB8AD7A019C1A893264D78CA9BBB58E9AAE1B979EED6D3","0x37B136B15E22EFA0056561570058A117E4ED515BFB0799D543470B27C21E149E"],["0x09F74AA5E0AAD8D77BD723D2348777E0A3654F331BA7D33CD1E8646A7D414DF5","0x17AAB30A842AF08ACEC951FE08D71B4E38FB7740FC81807C53146AB85ED425ED"]],[["0x171E66FF5E2A4B3889BFCC0FB61C38EC260B306B6ECF75A63A91B888D0C5854C","0x010C20C00AC2C3A7ECD849A30552B7BD15EF686B47E88E53792B154ACD6DA997"],["0x0D61BAC485C55DBA7BC74A191BB1D54CFAC61EE3015090A38A36E2CA338717EA","0x021CCF4C5C8E97C10B3C6DA66BFDEBCE475ACB3F09DE872326197D86ED6F13E4"]]],"z_1":"0x024915477C15939697A5E85853F0F8CDD0BC9D147828C19B35EC6388BFC8BEA4","z_2":"0x2D85F5DCEF327157D45AF39287CA48A2B269D323936A9440A1ECEBD29E56E2CC","delta":["0x094AD47E4C06AC8BB9C257AF5D501436115DB6CD73FBE6FC61347627EB7D3297","0x372976EFDFC04DE980194588A5BE54412084E84D599BA809FC0411510F8939F2"],"challenge_polynomial_commitment":["0x2943DA8AF116F77DCE5B240F97F19976A39342E7D5AA2BC88F50820270493FD6","0x03708017F97E2D74E65EC8E3185D93E232385BE8F6570C2B5DFD4C23AA790D87"]},"evals":{"w":[[["0x2AFFCE3D63AD744E7AC93E09FDF789E9CEB3EFA97089212BA6C410CC706B74D4"],["0x0C57791485B7001B2B8297F89ED12D762BC01AA2D00487D245B277ADCB0FE6DF"]],[["0x21768484F740C087734AF7231414FEEDD66483E1A28BE5527B8C1DFC75FEE830"],["0x001D9126BFEDF26353E016FF5DE083D3ECD553E05EF7E95206CA02F78C823B7E"]],[["0x005AB4A42DC59B77E851ABD0588C10762C1AFC7856A7E01F85FDD479F958501B"],["0x388E4623CD90329C41B42F368CBEBD2FC32D5FB52B3F82C7C629A96D448E068B"]],[["0x1EEEF442A2DD5F8E689EECAA4C8032A1786DE6365321E1C97715AD82DC8E066C"],["0x1FDAA61F832EEFDD81764C4FB9C81549F5C8A7B3BE69EF144AB8C21927990638"]],[["0x18FBCB1A60C87B08D88A5CD4577B61B331EDB8A274BC896E4BBA1EE6321D0BC9"],["0x01574833CBF5A231E90ACBE479F92978ACDC0907C836C264FB17B66E859EF8F4"]],[["0x164C7C9503994D611064DDE80E25FC83B01F0BCCBC21DB2DF3326F071D94DDDC"],["0x1290720AEEE0050764986FC6D0711290A6063535097BFA313CE5836E0F32E157"]],[["0x3A053E4CD97E1D8719FA68A562A130ED5450C4AB67981797884D3D134A151B22"],["0x07DB3891378C0BA313E19EE99E18CF3FFA63F3D3B0D9EEA690E906403C749A0F"]],[["0x2E0D01BB37FA6339478EC20AEE55275549EB7F0E8AFF8D29BB8B12846B31161C"],["0x0734982089F340CECE667A326FD65A31FA5C5E603E20C5B00BAE514ACCA7FA8F"]],[["0x36293D30F637F99EEAF3FAAA07695B3DA06D9DCFAF4235EF4AED1D5B114357FC"],["0x3FA17DB4180275A97CFB7171844B1CC8275083EDE0E962F4F6C90E9057CA4552"]],[["0x38DDA450AF7DF9B713AD130F733A6A245739F6047702568EA3A400F80615E631"],["0x19A1DBD21FBD0C19401A10CE8DF4CD853304D5907826B1564B13E9A0971E31E4"]],[["0x0606F7118126F9B6F98EE2932FE9C233C46309D1728F2D2A28A6398C157ADBCF"],["0x051D918D15EE30F75433F4849100A606824B49C8E677E1471462671A75562739"]],[["0x1181757034A1C59846EB20A14E59FDF9BF54E40D06E40647CDB83E4CF205E62B"],["0x0A3ED02D17CBF20120A87387C7883D44B41993DC68EE0D7B36F3F5708CAE43CB"]],[["0x374398566CB29DC4F56980603F9B4A27A42CE1DE2CC53E0737D369FC7E8BDA16"],["0x22095012D654F0A431159D3E4665AC5D3F2E203F41FF87AFFFF7DC6F2797B668"]],[["0x33BE16607519651409BBF7ABC268E11219848493EF131B30DE555D585532E50C"],["0x04CD9E180DCA3DC4A4C8A83BDC1C0D1DE520AFDABE813A2C3193A62A4D6F8ADF"]],[["0x09923854475D56044FF39A3822EC8F4B00B40DB4315F33452AB55282D26B6612"],["0x0B35C16213C5C4314F0B3765E666178CC924649398598C2C902B48686AB7A320"]]],"coefficients":[[["0x3D24F0A0B20038BF9310CE2828D584EAD720F59EA862A8033A4B97CFCFCE8654"],["0x3E77F83082096C092DC41908F06CEEE3EE1C506BFC8658DFE1738B889E775304"]],[["0x39D9C8629BB861B06D0FA1F6DECC3B354A82668DD96D437CBCA9B1552B85E836"],["0x081A9AB44F644EB723727504E1BFBB2601AB94C7B4923F49F140E68CC4E45874"]],[["0x3D7A26F9C50AC14945530FD8235ED1F58FE9810A27CAEC72DB369EBFD0FD86C9"],["0x0A64F55FEDEEB223E8D4288C7AD4A6EE1A284A696AC30A175110B35E538C2642"]],[["0x20AF970123302411D1C7DCDD80DB21422D51DA2DEF7021506336F9848DE68197"],["0x0847E166122CD7EF54C22E8F54FBFDF2F04B63C7281B6B856BB489EEF39FF647"]],[["0x314E9A3ED76DC5592488CA86CF35EF9503BDF754114D4E8DDCB14CADB2155799"],["0x33E0E1C73294E46D5C7904C98B7E3DD7E7577413DF37571080DEC2614C698C3B"]],[["0x30FFD17980174880690FCF33A2261AA48193418332521550BCF86AEAD91AE7A0"],["0x3AE62D91C844E9A09F5D817D0573209086C5D6271EF4390ACD8F0B07BB1FA114"]],[["0x35825EE5F29905D465AFEB3A5BA1310FA8517882441B27E815982DC4985D50F2"],["0x2C6E20730FBEE7EA426A82F85F381757D0DB938BAF7383DB52DE2B9CADAA05CA"]],[["0x1A12DF5D943E3C82836A3A27443302052B4B887C5401C4545281F113CB09F3EE"],["0x159832299BA41698FD8D00C5D9B2E4B96C119C70051F15CD811C8FD14CE481E3"]],[["0x1E8DB8242C2F74552A9BC08722022DE6DD3621F8F89743DD13EB6F5E024FD893"],["0x2E8BDA05494E24B6B5C2F2CB3433C1FC76B491616241F7FB9D51A66659A8C10A"]],[["0x15CCA68C696358FDBC11EECE9544E739056364F8206733AB854040953DE67D8F"],["0x2EFF43E39A1775555B924E465A62AF55EBBF46EA8DB5CB86004B555AC60B753D"]],[["0x2287FF4DAE87DFFBEBA8783D9D9FE5BC10E9091FF81A4DD631B11B4EEEC7192A"],["0x0165ACDE921FC39697D53C17D39A0372264DF9A5835EF0930C5CCE435F734521"]],[["0x05010539C23F8563C7E3892A641244234B9603EDE12329902876DF1164EC29F2"],["0x07C717727320013614EEB60BF5A2EDA0B7EABEC638B287A26E23CF54CC283337"]],[["0x0DB947333C097D82D43F3DFAC2A3A4CD2885C2273E2C96B918E31ED70458E4F2"],["0x181526BC7E2016FC9C8E95F0865561F7B67DB0846B7E14CFE3BE97C3322ECA8B"]],[["0x0EBD4A4EE1A328CEFBFB5D2AE3802CAE57FC5D883B59FBEF618A4A3578614BB8"],["0x0B9C3BC79A614FC03C2580940DD8C16AF92F867874F3A576FB883211C32D1FC3"]],[["0x2FEB3939F3D9C785A1AA740181265216A72D54DD1D2ADD1617F5EF925D23C26A"],["0x00A2F2451792C8A3805D5D429FA14EACBA087235E8E4F38EA8450159CAB47E49"]]],"z":[["0x159AF489F726104AA5A62A89FD569D7F93120C2A85E29AE8A83F24E1037E8F1E"],["0x1703E6246D21FB6D5B1431C441810CA9557B589A688C328158325F4FB2C36CFC"]],"s":[[["0x0E07E12E113CCF645FA7ACEB48C20B804541851D78CC7ED0BA2A3C2FB04E5D82"],["0x36B349BAA61A6227FB32DC3B9B9F3A309B3E55340FB28C170F5EE78B616E9A75"]],[["0x26796AAD5B925FF4EE2E0E0F3555DEF3046E3A0603B0D80D23B2FF32315BEC18"],["0x3E90F48F5E28054FEA8DDC75F9EC1B29F647598F2896FB09858EBF16279A1DB7"]],[["0x0E134C0D70F54B10F8DA321335E2BE1F931DD620BBADB3367753D5D90B483623"],["0x01B25CE40B0DA47D44F55E2469EB3AFC364E5D73078FE6E5332565A8EF6D30A5"]],[["0x3B2FA87299D1FB6432801EAF53D3E00692F787BCBDA047D4CE6C943AA2A7A6F3"],["0x272F84473C6C7871060BCB99F1F2FE89B5B840BC13E125186A08967FC2290B6B"]],[["0x1DC863B01DC840DEADA1BAD7B5B44F40FBFD0C5AE3B6CF53947AE47AFE2A36B8"],["0x1200383AE1ADB4D9B2FB4F46165DB421B5F9F082E7171BC84FF1CAD1FB37C7E8"]],[["0x2E9E7238D2FD91E9357DF7797EE1D23D0EEC58C5A187C68988893AAD78C44449"],["0x38E0771A969CC2C7FC83BF87762AF2BE3B906475AE09A1F7E208CD55D350C279"]]],"generic_selector":[["0x13EC1828D9A1F9DF17C76CF0B79CA47C12E0E37E2616B7BFD13800A6E1B62AB6"],["0x1BE7409EEBF2CD5565CB322DBAC7EA18DFFD9307364CEA29BA2F8642B8B7981A"]],"poseidon_selector":[["0x119AA727CDBBE766F2ADE34957205F75EABB7268A194D7D8EBDB2571E004E06D"],["0x2B4C9D572AC36D77156EE5EAC6748EB5D4EE88EDD08F38E50B452AFBA095DB2D"]],"complete_add_selector":[["0x1EBC59740ED77AB8B59863B6041ED2747BADE5DD530AB17052163292EA25D23B"],["0x348270F3FC9BCD3523B74BED25C2F295320F9A6740AF0FAEC65DB955FBD9DFA5"]],"mul_selector":[["0x014D3184DDA7648D0F6EDDAC5449315D43F65F388F80B0D38CAB968A2249D3BF"],["0x1B764AC7162C7506393B282EE9AD25A6FE9BF989D27A089D0B568B731AD8CC0D"]],"emul_selector":[["0x25E4E5E72E5D5706EEDFF252780850D86C4CA3C8647E95D8615516767DDE3CE9"],["0x288EF0F01D25017A92037BDE16F0951F90AC55D790A04BEFD7AA2281602AEF5D"]],"endomul_scalar_selector":[["0x33E3E24F7603B469CDB6E565E6880CD0E8B54FD8954884E3A3DA5137DCFE018A"],["0x1559E0443416EFD207132A2B9C82D9DE3CAE40863A155F301A02F5464A08DAD4"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x138E3DE9B6BDCDEC90DF2DDFAF7D45F4BA6F3672D1C98913D435F58097687C7B"}}},{"public_input":["0x0692B632942E28C7554E16EE4C4D63A87896051EB020D765BC81153ECF8B12C5","0x0000000000000000000000000000000000000000000000000000000000000001","0x040B3E3DBDDFE704F0D90A5DAA54871A4DDAB39A71EBA0142C3A35F53460343B","0x0000000000000000000000000000000000000000000000000000000000000000","0x19E7890DBFD78467CA05DA3D397C983327DD6C38CF6F379E25ECAD12AA3C0D55","0x0000000000000000000000000000000000000000000000000000000000000001","0x093CFC5D6FFF87507D8D06B8C2C8D6CC76225DF95589D9763914FBA201668203","0x0000000000000000000000000000000000000000000000000000000000000001","0x1CABA7B446C683836006D7C8622C858AB5805EA2B726504ED066002D5BD979A9","0x0000000000000000000000000000000000000000000000000000000000000001","0x29D5EA8DA5912D7E67AF8B36972A35C8A2B8B74EE978C7B8D87AE0E81CBE3BCA","0x000000000000000000000000000000006B16466EC64C6543362AACE36B0A5D4D","0x000000000000000000000000000000009820891C08EAC97F1F38D040E1122AAB","0x00000000000000000000000000000000736D383496A3621FD697720D8AC935E0","0x00000000000000000000000000000000A46C8FCA9FB9F2F64D0DB758DC2D9AB8","0x000000000000000000000000000000007B180D60DE9D671902E3CCAF808F1BE4","0x00000000000000000000000000000000F7774E3BE73470A67F34541809259D51","0x0000000000000000000000000000000084C956B68DB3A8796B8280720F74AB4A","0x0000000000000000000000000000000066C3235302B217C0C603CEF970A3E085","0x00000000000000000000000000000000B1E9DDCA3A7E7AD6DE6E32819CB60F6C","0x00000000000000000000000000000000A244A952ADB240AAD88E2513B916088D","0x000000000000000000000000000000004E1C53A74896949C101F2D71BB2ACC4C","0x00000000000000000000000000000000FFBBE199054E1ECF027F3F4DAAF0D6D3","0x0000000000000000000000000000000028E97873488EC22AA19194FA2A9C2D3F","0x0000000000000000000000000000000067851712F8801E7E59737F4D47AC8FEA","0x00000000000000000000000000000000678D64FAC6D964E03C88EB49A68DE1B0","0x00000000000000000000000000000000E3C860BCE3EBC7573495EE9CC6B28DB5","0x000000000000000000000000000000000CDB9952F83BAE3BB4AA2E5528859E8E","0x00000000000000000000000000000000390ECEA4CE857BA8E44B4A1D68636A0F","0x000000000000000000000000000000007F29F4833A438747C26DE29270AC441F","0x00000000000000000000000000000000AC4CB94C23C8B3C9B364AB3CF633309C","0x0000000000000000000000000000000000000000000000000000000000000001","0x170FFB0B76234D16CA0E4C8C37597E18CBE84B2232B366276DD8B29B29ACF832","0x0000000000000000000000000000000000000000000000000000000000000000","0x0A179CD902141B15103D31375D3CE5E8DD77E338E612447751BBF03AFF0EE99D","0x0000000000000000000000000000000000000000000000000000000000000000","0x19C18DCFC6FDB784C4FDB7A8469C70317DB3224CD6CA485B250364271EBB8551","0x0000000000000000000000000000000000000000000000000000000000000000","0x114B2E57271895C1B19F146668B5C569C213D9291F744A159AAD422AB9E03F94","0x0000000000000000000000000000000000000000000000000000000000000001","0x124FFF7486A6D5D49055B3F9CB501C0EE991988C4906D920CC05B7E0C1306EDC","0x0000000000000000000000000000000000000000000000000000000000000000","0x14C4855C4286292D52A67362CDFDAE045F5D972BA102C44CEDBE6D17723D8CB1","0x00000000000000000000000000000000A06D3464546EE6E55AF94885AA9CC17E","0x00000000000000000000000000000000296D7448DCE3C6FAA792EE2C69E045A0","0x00000000000000000000000000000000B08D37E2BD9BB5797B61CF042314ED89","0x0000000000000000000000000000000081DBB909072821E6FA8092060B6A5EA0","0x00000000000000000000000000000000DA3CCDA84EAB9E5D8241D8B3698C524A","0x00000000000000000000000000000000825E2D9A44BA0941228A33541D6AAF01","0x00000000000000000000000000000000A84C9E21B568CF4061E133EA57D73267","0x0000000000000000000000000000000021DCAB5D55E0C77496F9ED72435C065E","0x0000000000000000000000000000000039D6B38DC956E485FEB4F1B8AAE860D0","0x0000000000000000000000000000000019818A2BBEEBF5FC0F0B77E07DD53BB9","0x000000000000000000000000000000005E46EE4D6BB131BF775499939E602A5B","0x000000000000000000000000000000004E73961A198A7FCE173F268513597392","0x000000000000000000000000000000005772D8E2BBB023A8982A06EB0EDD214F","0x00000000000000000000000000000000A6F578EE2BFA717EC06917A81CE755AA","0x000000000000000000000000000000000CDC4693E003F9D2276157B49200A250","0x00000000000000000000000000000000B67B922A189C82AD50AC218E08CD0F62","0x00000000000000000000000000000000F945FA92FE19BCD3916A51F2D5FE839E","0x00000000000000000000000000000000EDC35FE554AB697E8B579E0012763AC2","0x00000000000000000000000000000000D1A739F186672CD171D2C2B555A6B36B","0x00000000000000000000000000000000B0E38679C3D55BE31A7949B1F1EFA187","0x0000000000000000000000000000000000000000000000000000000000000001","0x3A047927503C7B4646E86DF88146B03D3B435E4840EA2D101068637F1C12E69A","0x11D6CEAA2240F25F02680E1E533F7FD3D566CA02C722129070AF06C1281EFB95","0x255C5816593793AFEBEBA81035A5E12353AD51681CE4AE6767DE1001A45D44D5"],"proof":{"messages":{"w_comm":[[["0x1E793741C6CB2872934DFAD007A8CC7A611B6514AD0A7EE8B20CE1378CAE348E","0x26DF39815D34BA3ADDBE88ABCD7E37447D64F9C8AE29845FBC7EB94D0E2F8C1E"]],[["0x07FC8B1EA2DD2CEED3498FDB7ED7C7E6155006089F8132B7F2DA92A79DE5A016","0x15D44F035EB5F3248209F7ED29F595B562C89779A155B7D709B3C0CC48CB903A"]],[["0x0FA460BB15394E3999FD97413F70DBE01D423CDE8FF998D1CB20CDD5DB2B731A","0x1AF9B0654F514D3B472EB28EBD0386602EF0C2A92FCAEB4203C8B18E9DFF239A"]],[["0x057A8920E0B46FB69EAA98A430DE1543141B024CD6986B7001EC58728C090AEC","0x262647CE797198F3513827B2F4CDB51C0676F8BEF387FE7704861D69EE3DE19C"]],[["0x2E542AB110AB124F3D855E5467545C230C026F8BA020556638456F99099598A3","0x30D852FE69A89FDCE3457A28736F12ED9435501F00708227B35CBADBB6BE1E41"]],[["0x3CE8F00EA49CAB5F9598970B9FE8EDE10F423093BEF1B6000F45E27F51C3CF79","0x2A1A8F3799DC9789E391E8A0D50B11D8166360A33950E2E75416B248ABA4A1E8"]],[["0x1451F48DB976D1D56D54AD111D0930697A267F13B29158602316B9FA22B094F8","0x0C2A01E831957A2F0DABC609D57F9AC73DFEB593980C1F50C711DA25B8F47512"]],[["0x242EE2590F2BD0957A337CABB2E5562892F572C00946FBF5AC7425A3091929E6","0x30034CBE5A88646EE15571CDE9B6A6E49010F5853C5AF00BDDA4B0C68896120B"]],[["0x3C0AB45FCAF415756F965CE9DDC4B943E4170E9642C59A7CAE8CB448F77757DB","0x05A6E757A82ED458DC15B0CBA94B615B9342B992D48F177378996C4CE5FD0BC8"]],[["0x305C423D895399ED7E5664BCB2EB5C116460DDB95A4A9182A25093D95E8693DC","0x19D2CEDDB73AA5A2EB6D1FFA8E720924B734F6DA0D932B83857AA5F8EC9ED6B6"]],[["0x333967F61DB123C4975F8B5CAE2158C63BEE37FCC74BE414AA06F0EC2ADC6236","0x2C0438EE9A285C0E0412AD05D90D3F8FD2777B3C4712769CF616491D69ECFEEC"]],[["0x0DB36322EF5C577327C719B8D561EA3C28C7C79533DEEE95245247E7C81F2563","0x373A4DF33A1BD3659E74F7717AADD34D7CF365F7133382970C26F1FC1F33F6CC"]],[["0x270A83FB6F4EE329CAE5B6550CA08054A9DBD064E720AE055FE0B1CE25155DB9","0x2E1D9BF794474D89D31DB88B929B86576B2A958951483994176B807C4FDC3375"]],[["0x3A3FAE08CEDC515EBF884A99E4BE37A044F0675BA7F088D0C51D8B2F3C9655A5","0x1923F29B142E2482C4D37AEAA958E0E643D7E838BAB0FBEDB5490D70C6C3670E"]],[["0x08F7F145793371AB83BD0DED9513A472CDB9EFEEA2B7094F948E15D5CC19D1AE","0x3704314BE37456C2000DAB2BE5FECD670567A392ECF459EC0D655F0044F5706F"]]],"z_comm":[["0x194CDAA294A107038A1E4F834FC9E121D484AE2C2EFD76D076ADEDD98F17996A","0x071C072E0226A6D6318B01A4956329E70079BC636935994317B78E729C87DD4A"]],"t_comm":[["0x066FC1A5E2D6A4B5AA740BD0FAAF6EBA3C0DCA53A298E818F54CE26A2E84BE26","0x1E3841006D2717CCF000150D3069CC99B7165CE738BB617259C9625DC4D68BB9"],["0x01991350882DC36DDD69BC20F6864681705A0B9BB447F44ADB371E6BC756ECE8","0x12071149CF6E0C6BC9A1624AA23BFAFC77DBCF88D6E84466186AD05AACBED58D"],["0x09860ED339C7CA83E27648090F8303E2F7982A58727F72420D2E95807BA08F97","0x1F4E5F0F65EA17CF7CDDBFA6932F366DF7F6690F96C8BF9990B4D34CB9A68CAC"],["0x38BCB7A52A63E832B243DBE8A94D75C89EAFB52906F83C371F1538D002743769","0x39EA6A02A3211B66F40D77E30F4B1C7F3F23B0BBCC34F1E9D925F6F4F896142F"],["0x3A355CF5B484A5C0FAA2C32F61B8EFAED5ADC2FEFF954C03D1ACBF9BB401082A","0x3B22DBCCDD0E3BDD62A7C504392419BE92F95D62C76235ECFAE507B10925418C"],["0x177551956C7D61E948CFFD50B5A1CBC46F27883C280C5D199194EF8537EBC9AC","0x0F35E99756C43C8F5C5F159DA29A09445D3923B5A5BCD5FBFB8B5D2EB52FA15D"],["0x2D21FEF0CC0E2B9472D709E384EDC3783CD9504B3FD19F4552E4D4567F83D1CB","0x22EC9C68D6D583EBCAA7620A4C34DB51200D9B9A1929E024FF2B2D417D726170"]],"lookup":null},"openings":{"proof":{"lr":[[["0x2C493B31ECCDE01F3D796CE97CC3C353C03AFED5BEFBC005DD5EFE528FE93A5D","0x1EF5B71D9934DA31D32DA952E38BA05DC258964E90FAB0591264A8086DC6E960"],["0x10174370A9750D95C05B3F82E05FFB1DB4DDECE8775C09CF01A9FD71B297A473","0x03A52DC9DA6C4294337349A546611D19273DE2A54BA0BABBA918673746EC238E"]],[["0x06A399F6B3A3D1E97E5B179999D4CDD6733C3583D72F82656F2ED0F2C679CA46","0x30CBA9EDA2D5365CFDF7084AF8BEF1A0098EA962E01793B6F0D73F26A35F6374"],["0x0416EA9BF7927991200657B2D4C6EE65A65DD6233477EF74818753A55A2F7E15","0x1452D6EDBE2D22B82375C7A7FC2C4B1CC6EE4461B9F940A8992C53F5F9B24A02"]],[["0x12ADAD253AF0E245B1C7A4448394DF78C33A502725AD340BDC0489D3EF85EABB","0x39739126F2DE400FD2C0553E5CFAAC659616EFC33403CEB0DB3EB52912DD93CC"],["0x3C7CC178E129864A335DB1B874131E0FA864B8890EEC2D884827585BB161FDC6","0x04456916D7F7F7BD4B64D54DAA6ADC64F55689068929FD84645E1060FA32A106"]],[["0x2A90F4F27CC81489F8F2CCE455FCD0E7A95EDF9D7BA1EE249B334796E5CE07FA","0x0004EADDC3FE13FB7259817F065E51326A10AD955ECB79E9BCC1D4A8A96B8EA8"],["0x166516FE22EB13AA4E40D05505B9BA5970B76E42FA52A4F7C1A14624A707FC2E","0x10DE0AF33FBFC3EBF43930381E97C298118F3067ED64BA74474A9675B70D0204"]],[["0x3953760E66A729F0A4B9E263A4F4FD2D7B6C83267FC14B6FE62B4B9370C00A3E","0x266096E0D87C32D067A2CA2DE2D203ED0574C269F835CBB8D035E1C7649F4B8C"],["0x2DDEC1C515C14923BA2BACDBC827D3B3995176CBD293B961FBD6B2DFA13CB55A","0x0ADE59CA8695F901160EC45C81FB5FC101729ECC9A994229A368E7A19C92E31B"]],[["0x2C3FFDCD792E1CFA658AB85482E7FB2B8D7E9147469BFF8FB94518B8C4E446E8","0x2D53F7AC9C3C75085E16B0322EA1764BBB23386947CB67CCA758E2236ABB20B7"],["0x3A00AD743539149CCB7226F8E6402957B4B618DCFB8DCB0CD5139DB683FE4619","0x2438F3C09150F111452B02F442EBB16186F78185D1381C5F435E5E3B483BBE92"]],[["0x2493979892967BBBB2EF9BEDCD3E8069E8137BD5FC41DFA90011EA9326047A35","0x32E892EA599F19AAC82CE60DC9ED0EFD3FDF888DBBA711A7C9AADEC2FAB043ED"],["0x1761E68976E60AD35A11C5B50FA1405C5B510F4E37DD0573B2EC844C7D70CD1D","0x098E767F2437C3715ACB0F3C0D30D413D3F54AF5F9C4AC3B866F61C4AAEF6EE0"]],[["0x09556CFCAED154DEB4D14341CAF29152C54122BB51C765F6A3C4109414AF5040","0x3B6309382D12C027DACFDE673E517317F185FE1FD7F8FCD11863ACCECCAABAFD"],["0x3B5E5057BA8D4DFCBDC59C60F9F273A76AB10230E092B22C6CB8E11C65034E8B","0x3D7B503A1AE82B6DB3B1C4C55403FF4E4086822542C3A840A28154C950B133D0"]],[["0x30D1821250633E7AFA1D824CFAF619FF7995A59D3C843536CB138A3793134B6E","0x212314EF82718E2E51302B27D9ED45DBF40C14A361BC8847C758CCB2D8914DFB"],["0x35042989C53388EF59D02AB59490B9482EDA845BF56E21B653F8E5E5C838A4E5","0x16E1A4714079D7CC758F8884255F6F8C9254DD5F293E8D63CF53A4D3F3E4970F"]],[["0x1FE3FC788D120C3929651960C1821F3F1020135DCD4F08921D84F14DD4F18B3F","0x2B65A2B5D1F2A77F12E336DEBECFFC1281BB67911E8BA6053E3C49C85EF3F43E"],["0x3919EBBFA223D38ED9EB802730739B96FD70C6B0E6C7B63D096FCE884C626D3B","0x11DED2A0A5DA7064286025AD94C984B42DBBF6E3850EF8B80922D48182F9CE2C"]],[["0x1449F186148DEEE4AF0ADA78BC890B3A3FD0E615D1EB28B0B58E50E6F446F559","0x3CBF0A3B787939465354225A1201E7E12DA81A277CB408673425BD7FBF80248E"],["0x21AC24F3EFCA6417A6B0B4133D8455CF31E34BD41F09D66420FD38DC3F02802A","0x345012719B186549789352A561F9B99CD258A2BC173D1537C4BC3C4DAE8232CE"]],[["0x3CE575C2F669C916203855872BE07067D26927DA618E4880417B60412E45B86E","0x3F3BB0615973FAABDDCB57AE26AA8C699BCB7EC5FF6E6BA60A05ED4A767A0562"],["0x2E04D7C78D91B67B71F2804F34161F338BD99A484F816C6B317660BD5B821002","0x37DEB93A0A07BD793C0A9D7D6B7AA36E4CD250842B8254E7486B12A02ECD1C35"]],[["0x2ACF064FEDDF496FA2C728EC55FD2EB332725359E0CA3849BA13A8CA1DDB4EDD","0x2D58D76F149DE8138B3DE555E2357DBE997866FCB62BD407C1414542C1407F5B"],["0x1E4F34CD3A1EBE962A431AA1229074D52C090787572383E8620A2CC497F412B0","0x29B9471CADBC2CC6B5B840B081539BCA94AB64DA729763D5A67E4FF33CD097A0"]],[["0x10C646EE5B9319419D381AE26D22048471431F5E8BFA524B7D0442A390D67239","0x049B76A8F87BDB062DE46A410673AA6978FE26DDEBE449927194096418745F91"],["0x37A4D256E269A0765215511975233C39D230891C7EF29D3F86588CEB10EF18EA","0x1AA9A5E725AA8095D1D36D25BC5AB0675098FC8218A55D5A4105D552E0EA6E1C"]],[["0x1224F424B5D030B510477FE3B511F8ADE0DB6BDCD37A3D94FFBE00C5A1298554","0x19747CC515D37CBBF1E554FA70B9E95FA50461A8E7ECB66E5EC621B80C9E6FC0"],["0x34B48A10B88BF480CA1A534F92AAFF7B31D1DE737410EDFBD8483A4F963CE470","0x0C506C29BFC27364C40EB4109F1A2A1742D3B391B4B154E996C8AC00E613D602"]],[["0x3B8595EA88423F6B625403E58813567074FB20802A40D4FEA827EE5534CFF416","0x0E0691BDB81E5A6C556D6EFA6FF8523A6DFC7E50A2148C1B064C84D57F1C10EC"],["0x1D7808DFBB238C02C4717710E9EE32F8B5C1CB7C43432FE90D9CD63CDFB3CD84","0x3235611061A7E19784DCF9665538F1811D8AB47E43FA57D92A0CCC4D81BCDF8F"]]],"z_1":"0x18F271CD5DAE5132621F12A57A4499B9AA26C5625D4D523D7B1FD5A8D6D8828A","z_2":"0x26615D9572ED8B7423D5D938EF22A4C43C3EA2A1173F69AA0C85C98FD185FF12","delta":["0x0D2AB53A9670038A8D6580B85CC1796FA52FD09F583B52A39E8D216F422C7BE8","0x1BB3042570A3EC4C7DBE407F2A0DCC7E641A5E2A901F2949462C840514FAED7B"],"challenge_polynomial_commitment":["0x0BDAB607830F1808A813CDA298E09D5B46B020CF7B6AC38479A9ECBFFF385A82","0x06D155E44DC0FC14ABE6C7AC0F8D12944368968A6DB0FB97086D9BF93958100F"]},"evals":{"w":[[["0x25464293A320159BD0166752C51B882EB97E67C30D07203544A8A1F4448B2FDF"],["0x31716AD22AD7B7880B4807DCA5E34EA03520A82BE35EF3C70322E87B16EC7FB3"]],[["0x02EE15CCB9ACDC04228DA6CDF305BB6FA660E97BEEA6FEE25613C512E1C09B91"],["0x20604E3DDF57088D7D13DE5C7DB5BD018E75BE03CAACE7B42FCCC954A2FC5057"]],[["0x15106473F53CF5E815B795EA8147E3C78741ECC5CCAC8BB6D0A4C05C8938E7B4"],["0x237931EDA839E15623C87B8651959AAA54D077B23EFAC6FA0CD1CF783E6651F5"]],[["0x2B9F7C2AC5073B20D161FE619935A3575AC680F2B377840FAB7D59067B18020F"],["0x0011B109235F137323EC950032836A793720CBD01D74CF98F00834A632E9F406"]],[["0x380EAF0D5933D609F13C52F1C754A1594B5CDC189112396FBCDAEC7FEB1B2D02"],["0x29AA9A43A303D7E7D06F5FA3B8B3F5FCEF9F985CBE5F8AF01AD34F70D03C5BBB"]],[["0x1C20E2A1D334ED95B89BEBFE65E090D8EEFF1F78B142EF0DD1381E3D9E3E0B15"],["0x1D354F87D3BD9D610DDAF13CB9C53833E85CE0993ED4FE2B422FCBE505EC261D"]],[["0x105C18B5E5CB5BBC1BDAF4199DC6A41CC7213291F896BE699FF113A339325E9C"],["0x3E585D41776046BF7B698EF856D8A97305B72528EFC210D32F36FB85988F0EBD"]],[["0x390855412A4E58E4A3466B794A99D3C4FC9C2715E8EBA052448EF3E2474C86A6"],["0x04D04002517F2DB6924E2C7EE954F8CA5A769EB98AFCEA8899529D1BABBEE963"]],[["0x1E0DB38611994493EDBA1B60FE3876645D8ED13205B234E05D3458FB217DFEFB"],["0x28BFA3055586D58955ED132A8DF85A4F7232EAB6B824A6B8B9401F03F52C4462"]],[["0x13C2FC2888B4D97AE007BEF4F4D0CC01293D43942CCDD3F666BA9DE774AB03D3"],["0x02E5B0479A9CF9CBD2FFDABBD5AFDEA4488E561AC67EA5C9DB36BFFF835A5EC0"]],[["0x096EE1F6E46BD604A93CC50A64B4AFD95B0B3B1591BAE77D1A9123D7B476CE28"],["0x16C8F21BECCB00C64D2939FE7F4B069C06155A53F83E194590F605081ADF2873"]],[["0x074F8383C1F9810A0EB58ABC1D23215A857B635FAFC0A184AD4BBB64508DAB12"],["0x2AC2F56262FC56A8A23506336573C02303C23998AF19DD250EBF44EC2A6162B6"]],[["0x0851C0A4A1DC317A73BB29703131DCECB8D0B9F8921EDBE637194A6121D9EA8F"],["0x2DFFC16BF292593C069E3C9D7E407AD44AD02B54F0049D83184E0200E4D08726"]],[["0x00CBFC87D5065B0AFA1F8C3F330211DC9D54947BBF15C934E825590DE374EE76"],["0x2DFF4F51F0EC0973614505B04879CBE92CD24778E864941150D02BDFD736C1A9"]],[["0x1DDC39B673C0F6CF46A43BF4BCAE44750C98EA9ABB8A6EAF4308BDA4EF8B2F91"],["0x14024E51A8D29C48044E8748E444D82E9995335855E43E0534D6FE2E4E803A58"]]],"coefficients":[[["0x3CD3D7C16ECA61BE72FFD15A0A22ABEF6B4C5ED1E19B8A8E8A1B66ECD2D42A00"],["0x2AEC1DAF2F9F37E96097F8BEB46CE77A0A877EE797DB01B5582A48FE36AFA8EA"]],[["0x0ABA5D31F7E28D74A31BA5DEF6E97FA8ED258080254FA58C08214DE55FF326E1"],["0x161922E2B600F105A493D03D8A96A600345933223D4D6FA0F2534970F7A570DC"]],[["0x3609DC3EE0971148AAFBB54BAC867A0F8AD9AAADD64BF7684DACABCCB920B45A"],["0x3B829CAF3A7F1AA28CE8CCE0762E31A8CDB4AFF7520F6FF3916DB3AF2141505E"]],[["0x35B2A29CD70FBCA41ABB09CF7FF456538409E928E87FFBDE1FF483ACB8C1CDCA"],["0x0F5210D6B7CD0EB655A08BAC9268388DA3B91C018E4798B5203287B63A78069E"]],[["0x28F54E2A8A82C09D14761DA55CC96E2997E98C1EA8F212158DE7801DCF7CBADF"],["0x12AE120EBBD15F4E8A22200776745566E45EC85331EAADA3B32DC1C5237B2BE3"]],[["0x07DF0CF07272C004E2F2CADE45B2BFE48F7C3EACA3378F2F211ABB598F2D7C3A"],["0x330E981DEB66B6D349B23D9E5D714F220E58D25C33A217A415F2A1E82AD9EF01"]],[["0x384413A47E7E958DEA609C4EAD2ED55F52EFC536AE1B661A3C79DA8C477C8EB8"],["0x3118D37C5546DA6CD5E962EBD48A32C970428B1EF3E4799162EEB2131CDDCE64"]],[["0x265CDA36C99540278AF2F749F96B3068314BFD100CDFE72697F01080AB1358E4"],["0x27A8470F94C8DC69EBF047E888F9777AD365FE656A70BE012E57EA39BBD8E857"]],[["0x29310FC889376D8350738CDE546DCDFD64C395A837D4BE89BB9F98BDDEDB1110"],["0x087E105F2F8EB0BD2CD322EF48E6E5376D3F6103CB0E09134CC6841436551058"]],[["0x13B1E789DECB63D839E4951A9968441D0F4BF864F94C53745730B9C93CCA1893"],["0x3BA41A43069CB9FCF07A6DE585640C3D845F6E471470ABB19025C028D59BED59"]],[["0x0070562736CE1B556276EA0962CA6DD992A2D00398DC9D59618C274FE8F6CC7B"],["0x3F46E89B652A10291CC365632D131F05897E8A7710113795A088FD597C7D8DA0"]],[["0x3455CA24BAD48DDB659C8CCEB3B7C8D8286C28DC9494615435637201F4B3D785"],["0x1BE052DF147C94111D2B45549CD22D7C5B22A1932F696907605979669D9D6FF0"]],[["0x0D126F9F28C41C49A789D32DE6E3B90F817280C2DDBE06DCA26C6CDC37A8B7D4"],["0x2D1AC8DB1480AB104AE9A71E947EE8583ADC472EBAFADFA344EABE526E1E527C"]],[["0x0E926FFDE853924CE596125438490AF205667A234801395990B44C0EC29706CA"],["0x3EEF1A7703C4ECFC0F6BBAF9B1019FE7D26EBC371A99BB69B62D5DF134343319"]],[["0x192609FB279CF66EBF75F4F284E11BAA0F92DF2499E7564A7FEB8FB80E60B754"],["0x14327B55AB839843970A939C72D55D3D3C01E3FCD5056FF5EECD810968FDD81D"]]],"z":[["0x128F11C6C68C584D5A81594488098AA87445F81F0E4C6A434CBCEC282A2E6D00"],["0x1CE07C0815B2481CFC9DD932445C70F6B608C865C693BC554CE476AC4D6C2B69"]],"s":[[["0x0003795DF89A4FCF5C39E82021125849DB5B0196BF28B22D5058B94136A55811"],["0x142C4B6ADC4B154E6D02692F1556B5BC14F681DE61D8C93EDD74AF83196F6858"]],[["0x1F7575F5934E629883A5DF7488D1535FB1216B1F6CAD0301A7AA754F53920733"],["0x31F98F6DA52B14762CEFAFF92C80C062FFD416B56C6C1565600A6DCAF52184C2"]],[["0x376DB25B1390D0CEDCE3C1294FC15148889B329D113C508F55F6F6C84E9769EC"],["0x09E3BAF88F8D82E2F57F1D0F6DADB11CA8D42ABFE0629ACC12CB4C4EFCA035E8"]],[["0x13B4393D9FD7FDD319707FDCFBD84417578C4A937B6F42D5E614640596C2AAD2"],["0x1D28FB266345A8E08D90C252DE80649672F37EF720A9566B18BF317AB222A530"]],[["0x0C12E8F587D9F44F8126722E8A025EEC55A67C4CAB19F4423FB284BFC97473E7"],["0x1992D2251471F0863D481834E18FB2B9F2FDC558E486C6326D854B3AC5C44A7F"]],[["0x0FBE53E9DDE428FC302A1882B9FF4A8D67705CA6B3E2A1FA0EEEB25082B62EC5"],["0x0264EF8FB082DAD4196140025AA8D6ACBB3A17E1A44C7193F1F1A374FC4CF1ED"]]],"generic_selector":[["0x27CD4CB5528F5244C5B75ECE78DEF0A08FEB945221374516DBBC291579DEF828"],["0x221C3060FE3BDB4AD1AED9D4C45C0682C61F2F07F53BC682A4F070044EA7E32F"]],"poseidon_selector":[["0x3ACCC283B56D331A6B5E504F417C665573795D8920185F9DDC235C0C65E3B3E1"],["0x3AFF5DE0318A73AAC111C319B294ADD956A73C3437ACEBEBADD2BDDA1DADA275"]],"complete_add_selector":[["0x0F920AA3F5210520C3A9A966638822B990DD04CAE84C187A2AEA1C612C5DC5EC"],["0x3AD866D086EE20FEA9D18BC8069B1E9FFB0490A29EAFB8AD3453F5AAA7EF5817"]],"mul_selector":[["0x0FA60AC411443F1C5E746B1AFD88A4AC94E4CE3AFD58EE56CB0D1BFE2B042E08"],["0x0641691B30DF7F4A688738F37B186B9A77E219A61476C37FD1DDF7E7280E5909"]],"emul_selector":[["0x1DA2B377D8C3C325A9000B15ECC8BCE56A556F8D250D7E878D6578F4E2737A52"],["0x0F7C8A40C3D55893D4A777E3A22F31CAEE8E8CE35CBAEAD20AA044F327B4BF46"]],"endomul_scalar_selector":[["0x143816C6D816164D0AC279EB7DE074B1513190BF3FF43FCC349785F7BB830906"],["0x079D6F27BEF5C4EF1AAA6C41B17E9C91DFAB64FFEBDC31258AC0B17E409B3FBB"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x098AEA43F39FC26F5A5844EC66FEDCBF0AA229B21EC4BAC49105C9222B9841EF"}}}]},{"verification_key":{"domain":{"log_size_of_group":15,"group_gen":"0x2FD0767705FA5B03402039FC9E89AD1DE3C85D25401FD8DD898DCE603D1C0F3E"},"max_poly_size":65536,"public":67,"prev_challenges":0,"srs":null,"evals":{"sigma_comm":[{"unshifted":[["Finite",["0x39B19602BBB6FF2045C22304D9AD642A10D39914E07C15A398219814C1972416","0x338C6A7C3CAFD94B5ED8B54AA382E7C4F27DC80D6C7194C4191AE4B7EA11DE68"]]],"shifted":null},{"unshifted":[["Finite",["0x1DF3FF9AAB0E2331CB4F561BACCDDDBA605468F11C7D381C23993CC489DEBBE9","0x2251C32CA5C69589C2C1113CA8480A4C3F53EC83334FE15401508C96296A4CB8"]]],"shifted":null},{"unshifted":[["Finite",["0x0D6B47180F1DEC76999A04DF35C0127F9D2850DACF1930D66CCEFB026FA3D111","0x214956A685F06E5F63D1D59A51C85CA39A504B24196357AC0AAA91456B86B795"]]],"shifted":null},{"unshifted":[["Finite",["0x0CDF505C173E0CDC572F15A499C2DA226446180E4879D55BFD0E9A74FC2AAE98","0x1B4D5CB33E057396A8B49094EFAF4EF0E4761A090CBFC366AA7B8BC11C21AB1B"]]],"shifted":null},{"unshifted":[["Finite",["0x0EBAB0F90693F18ED91B71164369ECF4524514D951D785FD80F3BD148948EFEC","0x1518E22183719112E29356BFD627522AFB9C9CD7724AE6C2E8B440D0B3FF010B"]]],"shifted":null},{"unshifted":[["Finite",["0x1919835D54042E57FC1007B012B23976C5D14F1D482F523DC58C77BFAD2C7D61","0x376C55521505A0EE5F24F1BE04969133D667395CD2C5D553405317B2EC45AB95"]]],"shifted":null},{"unshifted":[["Finite",["0x20920B8C4FD25601B453506DAB562C1660D113705C2B96A36BCFEE463EBADC70","0x0C29571E8A9EC1927090AC6986E42442CD499563267EE86A6BD187C45333460A"]]],"shifted":null}],"coefficients_comm":[{"unshifted":[["Finite",["0x1264E11888953458BA4EBD34C47FDE1AA87503F105B108C3A2921A26E103C4F0","0x2AA8232CCA28DBE232AE5C362D1CFF46989FFE797532C6D1B685678F0D4C126C"]]],"shifted":null},{"unshifted":[["Finite",["0x3933AD32989E64FCAE331B6BE0E848134B6BDEE65F1D172BA593E4C42F829FC9","0x0A13D2D7083C7CF3A4C1393A0E65B8CBBF65C03BB26A50556A467EA700665DD8"]]],"shifted":null},{"unshifted":[["Finite",["0x2A59B834BB372F760197B5BC9228FC0FC5801B5A256CAE5623729ADD8779097E","0x0A3BBCD75F234AA73FE25739679CA2CAD0B8F5BA899ADB55D3D1A7FB5147B72A"]]],"shifted":null},{"unshifted":[["Finite",["0x1592E1B62E41CC2BF3EC878CBE6451335D57FDE61A647374E7BE322E8594788A","0x27D2705D4062B66B102CDBBA0901D89169906CB288369E2E6F20176AB73407F3"]]],"shifted":null},{"unshifted":[["Finite",["0x28FC279C1852019344ACEFD1F015BB46E25E3AE4A427C95B250F447C97A084E4","0x08E2BFE6E3EB01B461448C870040BE86EF04AC564477569834364A9AFA23951B"]]],"shifted":null},{"unshifted":[["Finite",["0x2E70E2182F870166E244B9FDD1E4127731AF4241467D142ADB0E03C34782B76C","0x343CE620238BC98D0EECE55F1EBA46C18A7A5D1C77A391C6F9C6A062FEDC17F5"]]],"shifted":null},{"unshifted":[["Finite",["0x139DC38E3A799F6E30F2AC62F98D8DF6641CF2C6605D82ADF7AF5758C7B41300","0x058F7972E4273613C64DC28E6FC953919303F5DEF3C68CF59D7F1AF3A0DE5B36"]]],"shifted":null},{"unshifted":[["Finite",["0x20A9CA522B20565C72A3B817262B1606725395FC8E1D9876AD9F50724D06E643","0x21EEEA9726E1FB2B40FB42DC00871E9632E8516FC2F2A57B04ACAE05BB38139F"]]],"shifted":null},{"unshifted":[["Finite",["0x04C0873DCA8EDA652386DEF75BEB0AE2A0F6A11B530EA5EB8255D591A339D65B","0x236920505E1BE2879D27504FDEC96E65E3F57AB10A99FFF6EAC5574503021CF0"]]],"shifted":null},{"unshifted":[["Finite",["0x1FF8387F0076ED8EDCE6A24A645F2AA7B0EE46287C42849338DE48F7CE936B8C","0x1BA910152077F38AC1782B850143849B16D2164EB2CBAF9E789C5ABAF19E6DE9"]]],"shifted":null},{"unshifted":[["Finite",["0x30B7A82AEE3590AADF6619ED741A1C8F065F637E60CE23B757719F5DCD433102","0x1EBCB0360A2D090ABFA832FA942D54046AB3E128DE785DD47207A810E78B9DC4"]]],"shifted":null},{"unshifted":[["Finite",["0x397C82375C480822AC83F758E3CFAA85C7DD6CB4D357DA074406867A098386C3","0x24B25709B4E6981DDB1452233112FF5077A63B11A3AE139AEDB887A6E6AB3227"]]],"shifted":null},{"unshifted":[["Finite",["0x1A9A53148C642F8E9A04163866F412A073FA7EB866E094F5D132F5CF47BD8A5F","0x35B2FF5CE7ACA8283B270E35B50A730A74D25E7D8A3D498A6C010ABB3DF8EEF2"]]],"shifted":null},{"unshifted":[["Finite",["0x08DA24B20362337EE633FCF127897A2B8D1951E7CA49B5A187C55EBBC5A2BE54","0x318E6B4CBEDCE1B796026E7A565CA472A18CCF69D206FFA033910A6029278713"]]],"shifted":null},{"unshifted":[["Finite",["0x13B6CBD6D5C7939F287C5E1B35A30A8757F75EDB6B22557BA347B9D089DA49FB","0x2788AEBA4D5BD7E6377E8BB4E35B561DFAD3CE8221A57B24D401CB719DFACCD0"]]],"shifted":null}],"generic_comm":{"unshifted":[["Finite",["0x02DF9CC20F36269B369E8EC8E3CF7E86BAA550D393273F8159FFF54DEF0415C7","0x22391E403C8BFAF16FE490D435CF8E9BA2CCB9A1C4C625420655C68F9DF1E0AE"]]],"shifted":null},"psm_comm":{"unshifted":[["Finite",["0x32E604993EA6037D6AB03EF2EB2CD6E9AF983275354B5588DCD66FF5153B44A1","0x192DACB567CA84A2C2C497571CA0DD85CD0B6F9AE5188C5E3EE0F622DB1CFED3"]]],"shifted":null},"complete_add_comm":{"unshifted":[["Finite",["0x299F6722CAFC921F9AC98B20F751D8598A592F9E67B1E0ABA217BA2B4240B54B","0x02DE5E2793D2B2378C3608D805313CB3231758AB6A72E7198817F8F634864A8E"]]],"shifted":null},"mul_comm":{"unshifted":[["Finite",["0x107E8881205935A975CA5AC5B30C7929AED157D1AE168F9BB59F83684768937D","0x15D73F622A8F9135E91150ABB5A7C7BA0ADFB6BDC91B0A76D9DDA47062C30245"]]],"shifted":null},"emul_comm":{"unshifted":[["Finite",["0x0921142D0BC761F28182E68A1474A55286BD5259E83F898557E2BF624F7B31B2","0x3A29F7D052A21E0BD4B69C3D9BA6793C94ECE76A8E9CD2C2652E41F85D939B3B"]]],"shifted":null},"endomul_scalar_comm":{"unshifted":[["Finite",["0x1583D49CF5DF068EF0E0ECF9D4FFB9EB780A3DDDD9F1F14AFCC7FDD9247D2B31","0x11A97C16DDA4EB62CBE0711121AA68386CBE0BA22ACAD4059F15AA9F56525426"]]],"shifted":null}},"shifts":["0x0000000000000000000000000000000000000000000000000000000000000001","0x00B9CDC8FD0BD4B27E2A74AF7AEBD5734D52D75BDF85EBF1CAD03413E914A2E3","0x0033BFCF8112720332825BD83D44D92CADC0C30466E8102C419C30FA2665695A","0x0087F4BB29954E16960F2DE3A1FA5AC7B62146DB348C7C9F0E8BF10B2C8E8411","0x00EC71373B9F6CF15ED1949647365DB60B2E26C3A8ABBA5BB06BF23E9DBE5893","0x00F39197CC4C55084C68D31F64F1A172406B585CB86445F00C248C721C496D10","0x00B8DD039799DBEE12D2E6A4299A83E067353C0143C5DFD203190C239159EEA3"],"lookup_index":null},"proofs":[{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x3C8B2527E1058099FF9111AF79405E137D8563D810D8C5F7E87B76F7EADCB845","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x2902635EB9DA73AE4C81043909A26BA723114810A6CA21AAD0BB022F5F049598","0x27AAA272B4317CFF0B0FE328BC11AE63506C38B30F7D88A0183FDEC66F650F3A"]],[["0x2138BAC3EA8B199839D288DC652BBA8513457BD3D52C906B0BEA98D85074EE7F","0x102D034FC5190CD5570C7AFB3A3E44A0B1BB1DBEF96895776ECEC1FE6D706EB4"]],[["0x14512723BFAFDF855CE2BCBC732638994E9DA04D502E632269957A48534A988D","0x2289DB4C836F7CBDA567742713FF045600CA89B3ACD1B5F38BBCF65A73D3C849"]],[["0x2E6263DF968026FE96C4E6D785F653E4E6284929DB97F32A68A6BF21058E5627","0x0F80B14A9370565C847B283722216BC7955FDD23314D60BF05F44D877EA4B307"]],[["0x32BF4F98601449ACCCD9797D62C1F8134009C46BAC07523E559D69C2BC25517E","0x18989D10D509B6A5D93A73E4EF25D5E2C4F5A62293E193CC7F21DD59C400EF0E"]],[["0x09B7B64BC97D7DD6E4F00DF58A3179645699301A3B4AE12E33260BA1A4D0D7BA","0x3C2E153190F56CF2ECB057D5D89DED1EFC003C4C80424153EA6F38EF29B503DC"]],[["0x1050FC3E2F1667FF74838CFB9F2269A874882946BCDE280120C98F00CFA6936D","0x208B41E46B8000F604C7B1420B8AC81B2BAD1A1E2B87772037D83FAAC3971C69"]],[["0x0C25F2778068B7CB7E3C87B0D7401208B7BC2E5F73D02EB6374774E3DBE53D1F","0x24D9A457A639EEB0D3F57E99D4081214D280CACD9214156D905CDAC2CEE7E14F"]],[["0x020EA2413FAD1886B75570D1C510A307B13356456D0A140073E33B474FA7D865","0x3EB4C4DB9A550D717F2811D31E7EFD4A14066A5195351F3E74504F17BFFAAFF9"]],[["0x3C91DE7313239C48A57ED73C7E65E162C59277A051B326F02B87B23E8454B41E","0x34E62EA5690B10B943823594067A0F8C6F1EBF8C4C278A92662EBD377417EADE"]],[["0x3B86C5C4B8FBDB37198CD91AB64A5E2DD49485439669187A5F8CFE8ED00EEDD1","0x3C23C3E8676CA08B74315CDAD31F3D7F23FC5EE5B192CD23DFCB61486289284B"]],[["0x01D94ED9F831FE84D72FC2CD13687962CB449BDD3B93871C5764D4F7F7C4848A","0x26DA134B05B0BC7DC162F5045F4C76E300DE9092D37071B0FFC1E6B400B7F1FA"]],[["0x34520635376E31B3A1A7452EFF2AF01DE6065E86357B4E0E205DEAD5B5AB4150","0x0BF7DE7D92853D04B1EFB70E179006B3866FBE2A102575A186E6ABEC7F209914"]],[["0x1105B5BC9E136003D2BDB3AFFCCD2AF57A6063484CE86A5934E65C8176391137","0x288267C13D7E1D47D30B57D2605F201058966411706BC8BB823F4E0D6CAFD113"]],[["0x34F18766C9B84AA987C24C6D6354D48490CFEDD1B0B012041B9EC1AC6AFE7F23","0x0172E2E08735269EFF906DD1510B1730A03E8D951A3B85E3CFF00767391892C4"]]],"z_comm":[["0x24BDEFB47A7B839673987DC3F08D74B2FCBB1D78B76E3FF9F1804EA9DCF5CD89","0x03C91EC38C3FCD5142FFB4C910250BE363A3130E9059E4066E7382510D25720C"]],"t_comm":[["0x2B7F7FA4FDE6BA9BF1882B267AA6FFA663A57FAD2B07B4E46A32F29738F1E3D4","0x1CE14A0DF9BE520473F3138851DB5FD2288E310DD570BE93E473F4590A55EC7A"],["0x36732308E9A5E064A31351F3C7842AB19EC87AB3B17BD3044D93F7CA08AFA260","0x0CAFE573A07DDB3BE2BD4DD2D1C4515D444D7765FC2E7CBBBBCA21BBAF255BA3"],["0x2FD2D975627D7B72FFBB09D1848559232939752258A3688962964D9F28EA8C27","0x28BF3DA92525AA74B5FE085788C662FFE9927B775E157D9CC530519F1A88B216"],["0x303CBDB0503E3B80281355D5A67EFBCA43EDC25E2CB55994DF7AE2C19EF40C58","0x10CA986ED0F0EAB9BE7FDBC0B6D9638B42B99C8C285D10D1148C85FB0EAEEE25"],["0x03CF02BE14408E1359ADD186F0D316FC085C3427C7F936924DE1DE6FC7814358","0x307B28CAD31F155459E1F2A189DED1776BA58F99EEADD28885A5CA12BBF33CD5"],["0x20A2FE903C273609D0ABE8BFDA6A37C93AF455903D636267B5DC52E19ED01B1E","0x1E33B4B567B8E680891A69FB8424A2C1EC79D86C3F82EB7AAB934C66E0326A89"],["0x04F7E94B7EE85D65868B810C2364122B79BD65F8D5DC1D2E04597F54D90390E8","0x0F63E4CE4EABA180B370DDE3191A45773014B7B712307085E7AE03BDCF931228"]],"lookup":null},"openings":{"proof":{"lr":[[["0x08916EFE5D46DD3B6B2C377F228E5FE6345A4C532A3F1F77F602003EF2D589F3","0x17B763AA6DA4B0E8A7900B9DB8006B8A08660DA338B3A09F56EA98AB1F5CCFC8"],["0x3BE656D1769BAA9C772191EA3DAC73AD6232D2954BB3326DD78E458D54E39B9A","0x316107110C7F33BF4D687352A07D7D548AA1553BC0D7F663F0DE7C592AFE1E01"]],[["0x2CAF82EA1F8DA96CDC7C74BF38D38791B16A86588975D602B7FE6313666EC2C7","0x134129C2BFC11FA04F95F4EB879F8278C90AA0B9279CD1CAA2EA59B47F627EA9"],["0x34C8BEFBDB6370DF1D599E351A4312B7CE8B01D9E5A47931902B6081D93BBC41","0x2F947366958A97AD8E3B29D0CB913EC2C480EEBFC4F25888BC464AF550572DB9"]],[["0x0581554E29554987694EBBED0A8587A7D1DF91BAA1BACC76739727FD755273DB","0x2FA28ECC576556D4989329E2E27DDE7915D0DF46F1CD8D33B88FFE2607710764"],["0x3186F9E85D40BA55150D2B1F64C96D4B29A2E0AC77562A27BF9813725D8462AA","0x3F11A79423EF1C610744B517C2F68533DC757B21721A27F7530E92315D4E3012"]],[["0x11F55B58987E16AF4085919687A0E9BB9BDA24C49D854C196BD40CC339DC4DD6","0x1A21E2FB837D48F07DA85D872A3AE1BACBAAE3435C7909398AD09F83671C78FE"],["0x2C20448701B363D12F171522548E817201E16D45C0D6103976A572CB3545A594","0x14DC526DFCB57FC7A3BFEC8EE69614F254150CD0377A4593282FB42583F93A66"]],[["0x1B99A50C45EE497C6D152C11098B6142B8E5F2BD0306546D38D5A52450180526","0x1EF8BD9D45FF977AA330CC58CE6C222AD7F7B83A2CD6DC09EBE04E29E31C599F"],["0x18C0C491B8DB4E090DB79E57E084E4C7A9CCCE93B0183F48E9609A9584B6CBA1","0x1CC022366A04C08973D96EEF46D26D0DB122E380312623730FDA521C30765131"]],[["0x1AA1670096D9D4E8D0DF3DA8A9716F3DCF702500C11F4FC1315E6B8BDCC38AD8","0x0066C4D0D992A5955EF26B68E34B0C0215DADD6EDB437A37A361E18F5E406032"],["0x2068360BF7368D4584E46DE37595BC22E1CEBDFAB3C60DC0444824379B2FCE1A","0x1421A93AD52BD8170C4E526658D48E92E484D68E4135155BE234EF7992463222"]],[["0x1D08AB64C31652A09739E2F52DFFA68126C8E32FBB0B21F0E9E9614A1F70F457","0x3FFD40EDE084CF3E08E6FB19373E15686A6ED41AE933E1B32E8BF7B4C29E0562"],["0x22A89E1FD47ABCF3EC57685532DC5B4992A438E9B6836E6BD295C5FB438E3E82","0x0FD48BF4053B6C0D408FA4A3C063B7725491E20E8F50B4FC38AE54D437B46958"]],[["0x3D6D489C44C6CA8A50C70EF62C67E944A8AFB6685BD9EBC8F24DBC21B4708337","0x09EFB207DE64542FEA062EF89E697A3DF966C0CFED0FE3F23A3F22D5CA92B22D"],["0x0F679FDE1214D85D34DF67F8350B6585DD5656B0D7B4B6F8339A309CA4E594FC","0x007DA055FBE83CDA9DE43A041C21443EBE8DBF3CA8C273CF42124F536E97DCD8"]],[["0x12FF339EFD3947CCA2AC86AF6EB13938A8EE03A6BB88A2DE725BDDF65B4DFE59","0x0C4938B1E331A86694F92CAAF98D2DF4DD4242F532D4B009370E55B84A41B617"],["0x3FB05A8DC9DFA7C151C8249919FCAF2B118BE7018DBC60D6F5267A8DEE6AC158","0x0D806B123F80E075F8DAD337D0BDDF9A1D0208A0832BBE483B95EE800914CD76"]],[["0x02B48AEF588906836EB59E3C46C290500D466C05D2146959BA0DB200DB7B08F1","0x302BA91145FD0DC7C4E2778370A48DCE0EC6AF5555E06AF3BFB022DE2EF6301E"],["0x3E234F624F056A6185FC116BEE888546F2A4AC2DCF6876C5DE30661AE7E764F5","0x220119ABB91E392C7FA0348E7AF7DEDAAEBE63245E5917277276212C6573162B"]],[["0x38E0EEC9F882C4460DBDC94637893D8A6866EBBFB486F5A7BF9E5DA10C948C05","0x1E9384495801BD5510275F39240020AF91049621DC82B1B3B959EA854D4C03E8"],["0x1F0CCA4E6A7ED71D81D081E5AEC38F34A397158BDCE58EC9890FC9D0914F0D20","0x331430F2436F35CD1A9883EF6CB3838C106C188EDAEB16050256F9D0613DA5B7"]],[["0x34CDBA7C8C97D7DE41E6AC840B1FC401329B46159E0EC58FA5DD83A2FBDDE745","0x173E36DC9C580F2ADED7B0016E61A25E30F0B3906B4EBD7025389B6D38571A52"],["0x091528F1DBFF40655A1372596C3447A474DF8C38D1158428BBA8E26ADEC55A12","0x31A6FC3507251D00D34F814D50D64A2D024DFD698C45DB9B1652B1E0E4B3F127"]],[["0x16444C33D40226FD6ABE5956BEE8BE9A85A32BF9A5DBCF69E9F2C29DA9C503F2","0x1A4610C8C4F03592487FB5BD454BF5C632668A52B57818D0B9FCCC373CE83177"],["0x0814E2C76210451E130C2CA1A19679D622EA26CE0DD4259CF637A82F2B7507F8","0x302ACC2CEB0AD1048E6778364A2F0D01F1AA740A60604E3922F0652D9084D62B"]],[["0x22552D31FA67FC73BFB9FFFD44637F5F43D1B8A0CEF4C161496AE8837598B9CD","0x094C19DD46179026342622239866716FE1277A6350F25608A17B5691E0FE4723"],["0x3418B9AAF430334FAC4EFD8B61B718975A99ED90D67F6024540FBC6C54110CFF","0x239565F8CC9AC7D273E01C82D9A2F52E41CEE67763D3B1570C155D77A2048723"]],[["0x133C0193C24AE7F4438674B539163498009B3295368E1FD00590EA31F794E338","0x19C6D7A8AEBFFE7B8AA0624AEAA7D0BDA6E4D2117E35A2FB112012C554EF3F2E"],["0x19B7059770C64EDA6FA6C37A19FCF4F52D64759DCEEEE444539FEC3B8EFDC857","0x10155F665E36C907C8E92ACE8F69246FD9A3F59BD2BEB6ED846CBE5C6A7752A3"]],[["0x11D599BB07E3CB92765F0EA9288F7C3DE3FDC078406E94B2A387AB46BE02E4A1","0x1EFA85909E7FA763C2CAD546F376724A7DD5B17034C4E25817DE807D82E360D8"],["0x2FA9C23B54DE508792FBF019C2404989143909F91AE2E7FBC3CAB51C52D07C5A","0x21DD0B6563BEDE4A9E34AF8165D61DDA57B88172F6DA35770BFE34188E99CBC3"]]],"z_1":"0x3F0ADDD3AEF19CF29F067DDCFBBA2EF6D75A1E029513BB84B329416FE0A6EA61","z_2":"0x32150941475A79915F5C897DDC27C248290753B335EDB835F803CF3583281C68","delta":["0x1E351191B996E521929BDB7536FBB95CC7FF787A8624CC8B9C62221A682843AC","0x19E0A44790872021F5B0A026F014D0CCCCA8280557D74BD1AD8E11A69FACCA0B"],"challenge_polynomial_commitment":["0x3BC22C7C71771552C5710087559D64DC3F3829B1B7BF96A91254BACD5ABD8C72","0x3DDED80874AE30904A3DC414429B974B175E36AA857787291318EDC5CD2F7361"]},"evals":{"w":[[["0x02D7D857C2AB57BBCAC71320ADC9927E77D33D63BC90A4A46F384FA6F63F0AD2"],["0x110FD80C5F2C718EE4FBDFB670A03DE882FDC2D70FAA2249822D3EC5E4C4FCF5"]],[["0x37C6F5B9AFA16E112EBA4CA86F9A023C3F92EBE624709E10C0EE6E94E9E44340"],["0x201AD5AC1569FDA1196419587212553F1318536D99CFDA4A6744650183A6D57A"]],[["0x13E21B3FA6D14E6829F395FDD72BBF9F78C979E8F865B69D455ED2A4310467ED"],["0x0E57A0A3BC88A9779EDD9BAA04C1B9EF7779557A7324FEC64AF1788B49186D36"]],[["0x284C459D05B55F74148E72F326D0B066C636A69E9C2865E1BE63437E8F652A89"],["0x1CB52980F89FA6E7CF82B2E774AE102E1B29D43AE14897ACBEA104EB9E556C00"]],[["0x3F0525130C98C43018E9B3928C5AA1AE5FB2DAD423C73E655FA4D1979E9D066A"],["0x30974A68C0CDCD48757E9AE14D0BCAAF1B1736B8230647CA350F17859115E67B"]],[["0x3E91A437CE1D3011574540CD598BCF901914C27FFE0CBD52BC498ABC15CA5C0A"],["0x16F4618294847ACAB24DE7F18CC1A7DFA49507E1FF9E721399CDB117D330EBF0"]],[["0x16B2FC49B2B21BDEA58B9F337EEBABEDF0A2B4F3D2D99D2BF4703CA49E666FD3"],["0x1A5B206C97C53A13DD9B883C20CC8833488B802EADBD77250ACAA0DAA9EE61B9"]],[["0x0995CDD97729882D0AAF067616801FBEE51EA3B206B57EC89D97A7646F9CA1DC"],["0x144F412EC9A44C93A41887324C57C5CFED7DB1EBBD1802135791078CBD15FBE7"]],[["0x3C7C274CAC8A5463443B7274992D1B2F2DE0CCFD52B33ABDD1E9AD0FB81233EB"],["0x221F4562503ECEF23549372C9632643E9AF1E6E39ECE2F09D26C4B3B217124BB"]],[["0x37C1D50FBADE3E9C4E5F7E84A8436A073EC54B72E35A2791133840CB5B9D611A"],["0x200DA1332945C52F34E9F7C925AFC236B88EB192355090AD4581FAC49967DF83"]],[["0x1E1D16081DABFA2DC6BFFE1EB163AFEC4F97A7BFC1CDF48589927EF3EFF5D837"],["0x35B245E3C86B171CDAE248169434066892510BBA4973450BF06C1FC57B526FA8"]],[["0x131BD5039FA4511D22414FEDAADB0B2A9A0DB166EE8A3EF7B1F9DF0423F769A0"],["0x353A06588299027C3BA9B9603B8172B629B9AF4B6425A10B0658BBFF4AC122AD"]],[["0x1B141DF1ECC00D7C85D58CC3C880AFB46BAFEF4C99F2F43FB48C7B8B2E542128"],["0x0EFDE7AB2AD43430CBEAF46AF0716C664A21F54AEE02C062B4A09BAAFCB1F424"]],[["0x095D3EE3992CD5A8DBD441BB78CB78F976464413F1D78D571FCC222A950D5C21"],["0x26D9A73D6FB8663DBF2704BEAB9F48DA6003F5016EEA15386D4B7838E6ED4C58"]],[["0x3AD042C5AE68C20297CA7D8E36274E211D1C5E7CC6F45CDFBCF0C5CDF12737B1"],["0x02EB52784F2B66F5DC3C494F1FEABEC6D58E6CC33DFF4E53C13EAAFD09F6DC30"]]],"coefficients":[[["0x0102A57DB644EE7E1F89181263210E1C0E79A161E4E779BCE3E97161FC12CD51"],["0x1028A19989400BDEC3E19BE2F2E5AF033D0D71EF4779CA172AE5011B790D94B8"]],[["0x307CCE953CFBEA298B29C71AB14DA8B68E5CB0F6471D289768D3F98C10FDCF31"],["0x3AFB994D8100FCE8911117369F888F98C04F135AE468ED13866879288980CE47"]],[["0x186F50E7A37F2C1027644A3CC5B61561635FD7510BE290C22185188C5A355BF4"],["0x304EC97E9E7B4C9DB9CECF78B7D54919C0961A869E713E9D0FB1A7B6267FB8B0"]],[["0x2B47BBB8AB5FE2010C88E344100BB4EE014F28A04AD744C2154C83BA76BE65D2"],["0x3D87CCFEFD9D91E371BCC75EF9CFA361E4BB34EFC9AF124FAC4B73C49CFDC43B"]],[["0x130EA6491377F03C12F6D850D45ADD36A5EA45772CD8DD361397E794F5390E04"],["0x2C29F064FAC6A8A95DBE3BF1AE12EE0A548B9627D35E47E9B94B49006CA941DF"]],[["0x3ACAF4D1F42A7D58775DD242776E9B1F355CB39CED3C57E53D3720A310E7B31E"],["0x1316CFC347104870FC21CB950C31BDC4CC1F64A5B368E10CBAE4C8166E502296"]],[["0x04D091732FC5142FD9400420377A0CA4A5AD5C6914C37A750E2761A541FC05E7"],["0x0189EBE349F62CB9A96842FA30CEDA6CFC8BD1429E7BDD8178E9DFCBA682DA49"]],[["0x08CC0D450560025998AAA852CF86B0CD92FB7223A923C1B46D7BBB1F3D95C4E6"],["0x04369EE0E0E05C453AF8AD44EEC0B3A109967DEF93FB39BAE58BBE5B63D0FB14"]],[["0x31E9673A33B5015FE56E51898F742177C47AE0091A5B76ACA7C544A87CD90445"],["0x247BF55C99BB76EA436A7F0548D89D94C9446A266EBDAE2F970DBA4A04BDC4BF"]],[["0x20BBA42875B45357B5698EFA0A358AF5692B36E1653A4B5B2E4840AC7B3C8B3E"],["0x23A4ED72B81CE2911C731F255A24DA85AFBE2ECD4631D655E93BA9C1F1114E9D"]],[["0x1BA5801E9D124E691B39F81BE8F89EBFF7466119D3FA0286637212A7B717F3F4"],["0x066C780E58C08BFADBDF7EF9FD9BD4DC9A61C8EF8165B718882ECA2CDFAD7930"]],[["0x3A362C3BBD9E475CA1E0CADC1F2BE8F66A04D4A6A5DAB1D6A06CF049A95842B0"],["0x3B9A932546E1D923A17C73F0E244EADC3049D72AF80EB04DDEC81385D4939FE2"]],[["0x27C88DA5767D45E63FFD5B105576320B93F23179490113012A29823F86DD2A00"],["0x3DCA50D5DF5CCC39C2996F1C41F601EA2C957CAC80B7C3B4163D17055C7487EF"]],[["0x3F1B63B16897B7317A02435B08CB9D62037E9DB8B260EC144CA58A93E51A734A"],["0x3ADB2B6EE839523BB7A22085D855168A588E4518ED31ABB76DB088F7ED6F0548"]],[["0x0FBE20B8F4769B359152413AC9F2E076DB5460E1F71A4CEAA5839D8246EDB5BD"],["0x277A78974302EFFA82B0607844F82321D53DF6DFEFAA3A4A8E213D1E76FB6DBE"]]],"z":[["0x16349B42C9E491F4C130436E18F150BB1CA9E9E1FE1FA03465C5B7EE35952446"],["0x22E642E1126C10EF5D5FDA3DB82F3CB98A89024E724059B4973A13F192EEA057"]],"s":[[["0x284291181D28208085A0CAC71851DB68CED6D48B6F86039D27348A40E76980E2"],["0x126D8E936ABAC84807B09C5A81A8304DBF2159EA34F5F60CD4DDC19A972ED3CF"]],[["0x23E7C00E4CF38415D66CD9F0959B492CD48215D0CE4D8F386EADAA0A1FC9AF74"],["0x16EAEC88CB4175D3A6CF54A5237A53FA8D5DCCF331169F0A599369393531CB57"]],[["0x36B45BB19F9E70142242E9E91DFB8BFDE29A0F58CCE8D7AF236E1F0C55439752"],["0x140BA39545962E0C0962418435C4FF46371760BED5D8CA20D589196683B7C5C4"]],[["0x23FEF2D58FACF4EA7E1CF84FAF8C4ED19CB6268A64D16F63F5B3DB5579AB263C"],["0x3416CE270360B7B9DCD3F9BCDF7E9FB2425043EE385F8531332DDF5DF4D47281"]],[["0x07676AFEA4BD74B1A47942FE3770BC3780B00364A1A41AB67E824F103C267429"],["0x01E49BDB82B9532100856590AFABF1698A2B085C9BF65B0C7CC7773C33811236"]],[["0x34FBE8E32A7926914272F6F66629AC93E9AC2A94642EEADFD985042868872549"],["0x3A4FAC3FFF61ADFE46B52205AD9B5861DE0AFA439A7C863CB7E5DD8A089FCD20"]]],"generic_selector":[["0x08743CC6367D3E91AC9AFB47ECBDC50F5CD47BFE56191E193D8A0EA7FED52200"],["0x34A18546F325DB7D98A2CF31BB3E99AED646980A489514A8ACB4D7E4C5937830"]],"poseidon_selector":[["0x29535C21C91ABCB8E735F276DE606D65A83BCBDEB46178A513846A83CCD93AF9"],["0x2D7088ED975DEF45A6FB2E6346A7375AB6F85C7B4881C06DF93827CFAB252509"]],"complete_add_selector":[["0x23B5D5FD653554EE25C9004EE32529E087216854702D3AB24A3B6C868128BE7F"],["0x0A4D86299E5FF9EE243E48E373237BC33FADFC8CB85D9C494E4A7051F960E261"]],"mul_selector":[["0x1F62708CEE8B8A2D2392E26B87D02076B486D37767C47F6057BDD417AA6C031F"],["0x0E1F1249512948111F51233CFFE839CD859ACD023916E360D9871EE9F36FB693"]],"emul_selector":[["0x39D2FF44D8DB965815C0BF9C5B401F63DFA912DEDD46CAFF67A694E29B50518B"],["0x203BF1B6D917A2CC205E6B4C4E82C46F89CF19E1F24AB0EE0AD8E894BADBE5CD"]],"endomul_scalar_selector":[["0x37BFB71F435457B4DB40E64569EBDAF5E6D936C2A101A9A1EF5E16E201F0F881"],["0x33362023348E117713656A686D63358EC3B79F205F6F37758B4B899141F9D3FC"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x2690849643AADF4E0985205EC05B84FFE82979E8041F6C9A05165A19DF9A973F"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x2F7A6B13F8C76D962E5EF97BF5ED3337637CEF45A2BF56439128FFBCE0F9E714","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x2421091BC0EA55EF66374B269CD0D38A907CAC94063CD9B1567C0EC50917346D","0x34F444F98826C6EE62D117D4750FA4B6AA4F4DB2F7337AB86DF52262DAF83FA2"]],[["0x14A6F86868520E6E276D798E59E84EECE72326C487C032EDDD2192CB705C2E04","0x26B7BB94407051668D39969717710D1593F67F98EC577EC3448F29D1A2370F8F"]],[["0x11C95AC893AEB9813275410BAE164D655637C3473F6C14A6F2F8D1AF27E04ED2","0x2E3B5BD6091610425D4F5B28D957D5BE599AD0AD5697E9533B0FB4F1295E1AD4"]],[["0x0139A413DB753FA88D163652EF877408C6A8C53133AD14536C8EC303DDA44870","0x0445AB9012717C53F0E8C2161BB2F480E233A948C7C882DB3C2281916D852C8E"]],[["0x22C2897BFEC8C82BF2F78D1414B684E01ADA94AFC8BBFC810BCE44623F8DDDA9","0x282C3D14D5C27A8E805FFEEA078FE92F8A9AECEFC5FB9AFBB2A1AC3FD7B454D8"]],[["0x13A764899E29F1924F514F5B1528A5D8408A83A8B768DBC1A6961C0268E191F6","0x39724FCD36E94EFECFF418CB95FB375F264CB1BA758B200EC773901D7E74F17A"]],[["0x1ED4B890FC4098CD5FEEC7C2BD51A23DDC12C53F172D25C6F8E8D83A80E973C1","0x2D0ACC477069C594E44FA59B0C31623B8F0297B52FD4920C9887A2B6A70EF0AB"]],[["0x39068EC31D80991EDA967705396739FCD760BF4101E63B1C12C41F3E875813D1","0x3FC97D36172362E077132C47B91CF88E4D8FD9972C9DA544B8906F58D2A29F37"]],[["0x325F8BE8F5F0432CA2B7FEC2A9EBB625C8B6707558D3D621039E2EEA9B41281E","0x0B2D299BC5D81084B6382D0A6594124C869692075BF14B6838EE04842C89F4F8"]],[["0x191EF8834174F76F3829B8D6D12496AFFB92FC8928681305CAA97F3F3BFFE39C","0x2BAD55726D26DE14B0648E1AB964268EF5468297B56E619728086C5C6621FE87"]],[["0x311355EC7AA3C6915CFE43F2ADCE8539DB3D99596FFB6E7E9CBBAA4C99BDF077","0x1E054E5DA9D1DA49B0437EDEEFC250CA9D493619A62835A8714D475F81B5D764"]],[["0x1A6C79193C7DDA0ABA3DA8E7FD1F66DC4B1E708702E248F5FAF730729D7DD406","0x095DA0FDDB315DC98E51562CDAD5AAA519201B3E1E4D1ADD02E3B96A4D1DBADD"]],[["0x089ABC5A716F3A0AD801038066A2B0B895E8D7B8E0D888FDF4668757DECF7C93","0x397011EBF67468150DD28D702EE5411FF726B2D51DA9873851735A791C588B38"]],[["0x2493E9E1ED5D262FE867504B0AC1BDBF20DAE60BADD2074AABE8D12DD0357D65","0x0B070735F34AEED6847808ED4BC54F02306328CF554F897298D8CA9E56E3CCDE"]],[["0x3D2CF13A3F9580F0C138BD22BC62FC96500C37544357DB181870720121EF8D72","0x1DD4DA8A62F2F6773DFAA803D2C1E9A0A610A1BD2C282263ED1837A6D21992B0"]]],"z_comm":[["0x3472F71959251DB98F23E18BC2A5A8D69454C930BCE73D34A12DF2BF1879E16D","0x1488D8DF760EC1BAD518DC1FC9639DA84279B76EE20148C0C73867F5A978DC70"]],"t_comm":[["0x0E958D509B328139ECD3F2D95019F173FA45F23F7B6C31B6B7A1AFDF3D8A6FED","0x317A6A9C1BC4AEC865B595B230AEBB7F547B3CFC91F978C0863F51BF3ED7D5BE"],["0x007B6EE3DE241505EFA357422E1666697C12BBD21DDED3DCB469B6333A3EFBB8","0x05813DDB81183AC3E284D8916E7922C9B64FA25AFDF115C17F74091ED44FAFAE"],["0x156D40CFB8E29703DD6A569C54C4B2F51A3D1E12C4C73E9ABE16FA7DE41243A7","0x0AA036F3DCAAE96972FA1AE63E01F7A86FF623AF6F4E586D5B808835C6ADDE99"],["0x0C9F20150271B7D08DFB714D18A2549E22641C2DCAF876C78A05E04C49CCF08A","0x191B6DBE0DC3360FD5A2823258201324A02213797C252298EBECAB51A3B7A67E"],["0x2D38B9638046B242DFEF400B933D6021134F49DCF8C939FD3A3D773311007160","0x2B9A313082832A899EA3B028557D2E8D5C9C40A76DB45C7AE10E2025972DE4B0"],["0x0017964E4C6D2622F58BABDB3C6310B23737F4D1E77FD74E5510E77142A0D458","0x31765322983A3DAA6C74D166608785D8C8AB1A33B8C523E85BD72CE3C1F95568"],["0x24E698E05C735E60B2F4E48F6BF02A1BC73679369051BEA2E657E1770B56C399","0x09EA57E6D2F356B713EA1FB0FB9423D88542EE234CC7B5575F85F46E52530001"]],"lookup":null},"openings":{"proof":{"lr":[[["0x0BAEC3B2DC996A156983FBACBC39AF7D7FE4E95D22A1795C6CD9D0DF71035D3F","0x0F3EF30CA072ACDE3757C143DA6A3FDADB34C773EADA1EEAECCA6AE8C1314BE3"],["0x3F2333C46AD605AA2B153587BCC85B6F5E6D4F9E5E9819BEEFF1DA03546B0788","0x0F6B3EEF7120E6FE0B7C1F629040CF435717C03A4923C4A3EBD0B08104A81528"]],[["0x2168E8B2F4B34B500E16771E3FE49B38950B76BF6A02DA69FBECA931A5C65983","0x3D69556E86018619D2E0626B724EB6DC66996AA17016CFE5AE0A8471492B0E18"],["0x0F4A09F9E3BDD8A0FC193AFAF1443558996AE353F54D16DD6064046067A0B1A2","0x278D7A3E402E9C46D483D688D6596FCFF7B876436EC06991697CB9CE7FC68702"]],[["0x235FDC583B1547E9C9F8C5A3FAB1F57F0E8956AD7DEE5CE1F5E4D6C3D89230FB","0x2C74D01FDCEB23AF2D8711A0F787A51869870FF87040E5E178991E04C22BFD96"],["0x018AD9D4797E2BBFDCCC44AA0D93B3545EF1B13D41E54737FE11F22FCE642A9F","0x1529A8B505AF807809A6B9273C351EFB1F77E5D785FDBD43F11FC4C355E234DD"]],[["0x16B5E8566A17121B4165770A038205253CFAF85537E80C7360CE394B72B8C594","0x0901A9283BE811BDA5A4E16FD7F557836C74D25CCB4907C871167B7785EECBD6"],["0x08294B76F48E2DD3463531D0D377BCCF423CC28DAA46E9A9667B1C4375F811A9","0x29019C1DF78B2EF134C31CB10771B196D789AF319DFA348C6995B00A68303F80"]],[["0x057CBF34AB3AD6E4FE4EB7B02D2684A2AED5E27F84C45B9AE2031BF1297F435B","0x3FFB3246DE68E21A8E5E0F509B8B509F2EF67133C4274D3EB06F5E5E1C082163"],["0x033D994410CC396ACBB0C8575FAC9255DDDA871B97C90F035F7D786239C95889","0x3D41B3494CEF41E8B01C2DCFF59A4CB7D52057780EBE7A6A34B4943A1E4F24B6"]],[["0x0C9B7D1CB3C4F2CE39EF2605AACF0CA0E722F33ED9C3EB726A28ABF88448BFE7","0x39D06B274FFA42BA647F0055B290B1F786117D2D24D69C3EF1D0247E88AD064F"],["0x39372E63F44C6E588FA219C4EAE9FF882B324C5F04A13B50C17E741A5B68E1E8","0x068C2109163A6E1A50F3D154A0E06A5EC3B5A435E635A0E1392BA352EA91BC24"]],[["0x1227D8635336776B20BE182ED9821A6926521DC1C668EC3F9A6C8D31A90E3088","0x381D2A70DA1BDADD72345330EEC61BA4A82740298CC879837A3BE41010B1975F"],["0x0003E286D0E822CD5898F20E437970925CE94C661E0E0FE666DDD71144FD6773","0x229872F96207B3B3B3C51765E45A1D7C4A8137C2D2184D296BBFB304BAF8E137"]],[["0x30C85FB931CFE37FF794D1996A4C48061A006A4CE2E59A85E388A947A8705131","0x347951E36E77F164EF6170C26DBADA17BEF23B91FB3A786A0AF10C42E964F08D"],["0x0BC6C17B0CB810A6C5DC026B6401A12C8ECE3859B8E58D72548B511D4F447D51","0x0BE5AB82A1FB0D76FA387840C5ACA3A7672539D3D2240C5575225C2068646DCB"]],[["0x2FDED9DC6F820F4535C5EA0F01BE89FC45FBF8E39A57845B97D91B0552C17623","0x1A6B26A25220ACDA5B204B1470001DD4D1304526C1A44B60194A7FF3E384074A"],["0x1622CAF0030E6C7C591A7B3FFC0739845CB89931B807545538B688C10218C05C","0x1B6AC19BAFABB6C3964748744CCEA1EBE06B1DF6C371519811F129D9BB79354A"]],[["0x32DF177ED4913705A9FD3362F2B990533F22A719B52C83F910149382855DC78C","0x3991728B5D492E08FB705264D4F464BB0C1B4EB59E728B8E72E109070DD55728"],["0x2D15A382D9A422B571ECAA33351CCCB11F928C878DBDCADA6C7B3A8B9F3D5AE2","0x0E39323DA5970BB074C7D3C1CD3A2C791157E270CA6EAD2804967584271D7053"]],[["0x141C0195939FBA92A64DC0ECCDFF5996F59AC199E4A642EC7A934B343EDED7B5","0x370B1D7F7FE887536D66FA5DCC89568A257CF5FD01750D26EA06DD0A922EF0A0"],["0x24FB27C93192077D8E74B6EBFA11A6D02BD473BA0EC9EC448E4990C466A73191","0x2F5F573C85A2069BEEA07849BA7EE26F1DC79F7D98033BBED397148681918B66"]],[["0x0B475DB6ED3CB89767065034B4E46C987F01D2A5EF14CC10C3145C999DCE9DA3","0x31B5ECBBD1B8AD0D34519857B5D4FE6B4A38585FA4CE06C9DAB5B279F3554788"],["0x042CB516DB2A1BC0001442202FC617BD4DCCDFF94584523AB63E8101FF3ED607","0x14C95CE976856DAB1C49877E46D0DFC8BD8E467DC8170C2D386051A9DD718BD0"]],[["0x1E6AD89514A8102A056A0A6A86C6C9F178BF5F7892AF1A705FEBB7C0AEA38519","0x0313E0562C5DABE283CB711C019665009A71893630A57B4649C07391A6BD5D8E"],["0x1E2DC46636AC176B8FE5E5BC868B222A33744DB3BB2D0177D77834E22A79475A","0x1087626CCAC65D7A42D944323765363BD0B8B9815EA297DC487F56F5EF48EDA5"]],[["0x3FF8B2AD243E031047BA14C8A99D066EFC54CCE76D863498888D78B0807BD131","0x1292780B80619B8018C529014C7B3F465B0A511012DA993FCF8D0C2E25B3E44E"],["0x2C8DCACF8DE6DABF7B4C85F441CB1393AA011B7AC5E2704534FAE7D3D569DF18","0x2824D8C3F5CCB1EE67B5D5C97AF3C22D0930D798098FF0467538F26CE94F47E3"]],[["0x0F50858002A173E8970C68E46FA992AC70B88D1B80FE5AAC3694E3320DB5A23E","0x1441A150A1E8FECA8D395B0D790F56AC9302A345C67E82DCA27BF538680841C2"],["0x237F8E58A9350D014E13C716CF210F2C47A71644193306E826BD6D02E0254814","0x3445B53D6E6371E651F2AC3E5561BF12E17A461B8DA741E38AFBA215E3416DC5"]],[["0x07E8D56454A0712D24B66CFC42BA89209ADD2594B333D73AC0AA410E566278D6","0x2DA32A4EE2C4139E4CED667464FFAD0815C0E6961720E98919CB00CC76C5EB22"],["0x26E579243D15D5473A1B3233E7FF3C75438D12BD9FCB617F0F4DF1287F40F603","0x11B6C4033DD918043468D198D06A03C69997A31E393307045B950CC2B88AD146"]]],"z_1":"0x3FCE682D549A625053F26DE90EC37DC4F14F239E4192F1BA434810D26E958A80","z_2":"0x30903808E90E6E949DE4AABCECEB58174D4D9A85DEA0419C7CB143D2D8403840","delta":["0x3BD38FB386E97E5D6A4201803EAE0B16BFB193742E259263D47BD569390D448C","0x391602F497A1E4883DF828A2A970D9E768BD2DEB2217FE7D6840721ED83C623B"],"challenge_polynomial_commitment":["0x12CA7469BEC081C7C479AC595400FD49F90A0BAE5B4D41AE7C128B1E3FE24DFB","0x2CDA45EA96F2AABDDC4809BCBCD20933570919B59CAD801310F748BE3C54458E"]},"evals":{"w":[[["0x37584FCB05C1F3E67827576B49F4BEADB097720879C219E04CE21C542E216A58"],["0x27BE7162F2522EB683BA5E9C7BD8DA5E7814DF1444BDA1453143CDAF87CB89BF"]],[["0x004E0D1A82215A17CEA821074980C93E288438D6FF2B81DE1AD3FCDE30DB9655"],["0x3D6ADEF1EF688B1371ECB0120F47A157B06A8DBB280106480EF53F4B873D311E"]],[["0x29BDA35EDF4A4EFD4E440A64D048C31BB170B8AC587B162B8410C4109C5F86D9"],["0x3EE9CA73FF7D232CED71F83805460867FF679A5168AF18EA64C02673EFBF081A"]],[["0x287C290F840FE2A3716C5BCDFE1B8F48EA389CE0ACCED29F559C57FA64929863"],["0x3C10909FE01A597DC43EE3B54A237F222A73E776E3D2CEB8A554AF12B4946467"]],[["0x2C25452220C21922FF8C1435CAD7561B60C19511B6D866271903147C4E09E23E"],["0x1F12B14D0218944669ADE92DBA52927CA4AED01EC55160336F1EEE4D20A7A32C"]],[["0x2B9CEF43B68E0A061737A0598F6FC6063008DCB48BE9E19EEC0242E5ACE3BA57"],["0x050B65EB4B702ACEC1F6E4F11F59229DC11F441450221075E86934689B6BC031"]],[["0x0CCCE03970541C088D9C07C5AC4EB0CDAA8AD0431C85B4E1764AB7CF1109BEB7"],["0x30E77573421F2C57FD94055F7B69B7EBBF16BAFC3E78B0A4C8EDE1B82064AF33"]],[["0x038FB60953978BCDAE22765C1229EFBD4A851B9C5BAD3059FC55EEDD44411B37"],["0x3BEA22CBBD6D07B175B54D6AED512603841C7DA1D3E5B438CE980319C5179C54"]],[["0x12D40C95B5FF2A60F5CB875D4101631881B2B2BB6286EBABCDEF58863F1300ED"],["0x1D341E03D056D99D7DF379976FDA22EEDA628204A956C4F3F365444375F7422E"]],[["0x049DCCC06043DBDC1B3DD320EC12984676F1EBC4208C2F7D52290C74D4B41DF7"],["0x27284D3D8E118F8D297F983D1C9736DF44226C3A2CFA532B5754AD9988406450"]],[["0x2E48E131C26CFD591ACC12B56C1505B7ABCDA082D899688CBF665FB5F3028667"],["0x1D9CAEF87A4D56965017D9A8484500CDA680A3C146C0F49854C9066940CE64F2"]],[["0x05DB6F2CCCC6B5F973B0951E5A6CFCB109C34C33A09FD021F09E02CD8FC574D9"],["0x3AB9A0F6862BBE537469648446E04A8622E2BE2F4A5C15DCA0F8056AF08C434E"]],[["0x0C749F6D00C0405BFB35880AB72603711F167471492D830C668ED60FFE262ACB"],["0x0C535664286413FBCD193C5E30B923C5F31A017A6B1AE5EF041A15E193F044F9"]],[["0x2D4B7292CEB625BCC2410E135132049C9C760E5A676CC0EEBB01F130B6AA0CCB"],["0x345024CC169305295465AE465462437A9E2CB482447644D1D06034A44E020AFA"]],[["0x2A409B9BBB0A0BB8394B37756D615095999FB854DE036B446DC33F3E3913F026"],["0x391248DBD4BAAF5AEB70F22D215D34FE5FE7B87F85475B2640D3B8FE2A04F69E"]]],"coefficients":[[["0x0E436E67B87AC28843983027260E8C8F1EE8617BDBA05873C8408B8F2F326099"],["0x16C72A1E4E20C978DAFC8F22900826C0D4EB231084D361670E971BCBD20306DC"]],[["0x2905EEA6752A665A7C0E8AA59A88E87E2186FF618CD9BF6F267645E60B0E49F1"],["0x0DF698FBCDA239E1D3BC35B0A8997EC35CA3242F9C1DD8112E3DD9BCE77DA341"]],[["0x05B4ACC9BDA3359A83297ED3968148133E91B29EEB2FECCA4FFB8D5A1D5A311E"],["0x135499F7847B6B9A27AAB32C3268376C91516128044B9ECAF1C64DD42C59E4B3"]],[["0x3C2104C4652E67B6C3CCD3F40424335DE843067CA1181AB78A8F00C150A86527"],["0x2DC8F702F5F84DAD31D2FB97BF4A516DC683FE4C2A6611E4D85E31D20FC4B8E3"]],[["0x3733EF52927AEED4F81C1B47164BF0709A9F4983ED0E43CD3852A500E44F4DAF"],["0x255FCC5BE07AD6CA81AFAA3457DFC823010FE4222B509B8E97AFB50C95A31FD6"]],[["0x352C8CB91E02C165F0FFEA7AB48C709701F122A1129599DAED71241E8D5C0045"],["0x33EE48B17186C07C61F5D9FF6B5C0C15967809342647EB0B684413D30144FC5C"]],[["0x07116B1BF9D575EF15F82F958B0C4DE4A79AB23897D4FE1BAE56562A5165B16F"],["0x2FE6ABA20C5AD64372F5E6D108BDB7FCF1828C26F7312FF3D39F839530031717"]],[["0x31E8D949C73C33E633ED4F8F7E76B10DC7997AD7F93BA1D05FF0498C8BED19A0"],["0x0047FE1664526781D0BAB3B36A0D8954936C73AF8F699FA47B58BCF562577C6E"]],[["0x17C9549B1730A4283BDAFFD6A0B6A0D2A596F10FB1C063BEE5103F077749816A"],["0x3341E42AB1D46DECF41CFD32A06EB60CED8A1C39FF24C193628D86E0AF2151BD"]],[["0x06B845AF8F38165DA3138B41F622884ADF2C3B6CB94D9915D77A5F3003C779E3"],["0x1A7E593AA5BD7B487410634B38E84D4E8BA2C14787BBB9E863E3EF4F1F98D984"]],[["0x3EEF59C2FDBC12DCAAA2678B4D48490145B8DA2450E28892A347B855860C21AB"],["0x06476D628EDECFD7C9C0275AEF4ECABF6B78EF558671CE7FE5E8C43B31E05776"]],[["0x31B641A683EF6256D0DC3DD6926CB88FEFF2DABCD7C82295D074F4C023986DEA"],["0x11A7A8BA2FF86751772D1EB37118005E2F7FED4E7BA2318A456155DB343059DE"]],[["0x1489DECA86E7DC0329F669A141681BDBC5EDC88FECFAE519EE60362E5FC64566"],["0x274F062E5636BB454DFFE57F8839FB8F5FAB8369F0193225592E59E720217590"]],[["0x044A15D4212F7D3C2EE3EA018FC9406B834F742DCACDBA366F802BCA6D166C16"],["0x2FC0CBF8EA6065A8450E7C5DB132A4F8410CA7B7F61D204548EEDE172786DE7A"]],[["0x1C328DF1A540FC09845A559F97798E3BDCAAAA189F398248F3C04A6A48491443"],["0x11D898FC1F4CBFE1EE28FA99DDF4E741195E32912A28B65FB2722766F056D394"]]],"z":[["0x0F0A2D03ACBCA9B0755C5B2BE9FF0CCF2FCFB49F9D80C95F69EE3BDA12D34A9C"],["0x175A412A8E80DAAB755F803EC248BA0AC6BA83441E1E0C3F0B07CCC0B9B1F2D4"]],"s":[[["0x3FF8BE1F9C356C4F759A10DA13633A1028FD8E88AFCF32C2E69FA232FB42D9EA"],["0x2C6DCDE8083EB5BDD9AB04B1646B15C2A37CFDBC9D0B7056909EAE507812F673"]],[["0x2CC77A7D2C9C8AA3AF615ECE247B671DF38D86678FAFD27AE29A92BD76CA3130"],["0x28D5841004A3434CB99DE1BB8E1BC26A9F776B1258A4923E37588A9715035CC7"]],[["0x27F86677FD410EAB56E6A35D129B7705FE449965531053F026533FC44B52E4FF"],["0x3699FC3117418081AC51B44A9F9E260615FC930B2D4D30D09894A8105C56F605"]],[["0x37DD64CF9424BAF243D755ABAEA25D340975A5B90AE845429C70A2112E85C7FD"],["0x395967A362C25E0D7F7513A01A8E4F24DA7FFC6F7D86F56B672FF000FC14376C"]],[["0x1CEE9ABBD1948DBB57A2F2C4D635F0B2D4CA4FC3EB393CF9B9D4E644879A2B2E"],["0x2348B127F53C9B8F39454A6E12024DFA163DCDD3F6B47D231AACDEEB18434545"]],[["0x1580C9E259F301258D8DA2A599CAD20208B06E58DEA05F8C83381E9DBDAB26F6"],["0x278B55F3B3FE72ECE97AE3BD22A33F120B266BE7D9F5FE719524AA56C1C3F40F"]]],"generic_selector":[["0x0648E3F164D6F419D20AA810A50980EAABA280ACA8978209C7888DF5DEEE0B2D"],["0x3F73A9EF73F909C76D359ECFE95B1214D2780DC5C435165DCCC0C31F2C1C0D83"]],"poseidon_selector":[["0x38E34273C2013D969E0E51B691ACBDCB1974C83D6137319E615D136E72A03FCA"],["0x08EF6F4D5516ADCEA1F860B26D6D6787C14CC8BF716DEB8AC76FB0C650621B9F"]],"complete_add_selector":[["0x3585B58F179B9377374BC1DE43330BB1EB0982B553ABC71E7C44D247722CAE79"],["0x10C5EB44004296DCB95E4B53956E9270FE32B2CDD32A617AF5EF00C3F1F96837"]],"mul_selector":[["0x3209774FC8B2AC0CB64DB2DD7E55691D8ECDBB66B3D66439ADEDBC9E9D179560"],["0x10D6A2CDE5DA8FFDCC1C4F8CD38E1996136C28D47716DCBEC4F816D184610598"]],"emul_selector":[["0x1AEBF23F7BAAB22F95E93F9CCE7364A6AAFA0772563E78324287271E1B5AE62B"],["0x1B9BC11AD199CACA24BE9813DDCE5A14395CE6E9B24117894A0123E5408C2788"]],"endomul_scalar_selector":[["0x2A01E1005BE134A58023B5A1FCB229E189C061A6036B896161D646709B42BDB3"],["0x0BEE5B5B6F9E5F52B068FE31B3DA6B8A8A856520906C73E653FB93C1F1FA6B02"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x27B7984DB6BB8F1724AF1D116FD47DDE93E96E50A494156D913BCF74801C8415"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x2739637B27321A6FEDED3CA07F62D111C51F569D20AB8A57EEDD81E14B7B6CEF","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x02DDDEBB9AF6972ECFBF7CC3F5CDB0FA8D1CBF7AF977457C90F8FBEB7FA90E67","0x3AD0C87543315A1B93D7DE710315792F9AFDDE449561BD9D9572E0FBEF0501F8"]],[["0x321173F892FB2FF5440BE49D530AC52AD9C7A8A1B973BDEBA308AA3518FCB415","0x1D5EBB9D1746B953EF856EDF0FD5F1E5A06744168846139F1FDC55829100B9AD"]],[["0x3FF836AEAE4EFF95ADCFA6700DF13DDD74A5FD3128D160060A4AF99F8DBD7ACB","0x34362782AC0670E99B63101DA8BCF1A2050845B7B82612ED83CD8AD6AFCCCA29"]],[["0x20B1608DACAD1B054E3B9AE1706A3C7C1F6094E20D40E85AEC23A9721AF82AE1","0x32F9DDDC7E475B3A03991679C1716A235DF77844A664EB451677D9BBC17A7351"]],[["0x333DE9E7531139D66C945601358C63472B0D1B938BB3465018124CD7537C05AE","0x1B3F68F93F6E40FC8DB4BEDD77D521A727B9607245EB75E4D2F625C7818EE132"]],[["0x2A0E7B072FE894CFE75336C4F7B5871D596DC146E578B8A8A08784211E9B75A5","0x0FEC478AEC6B70323BE1DBAB0875D47CC72C8CAA8D85E58A882FD80F3A95EAC7"]],[["0x07B4D50361B86F35997920E07064661B6BECD54E6A5124B0BA6FDCE7B83CE7E3","0x084C66D51C3DFC336D359649D9415816C8E7DE08F649AB4B46506D81CA358EE3"]],[["0x0B646784F394A332B96C2B65A3F77D44359B8F7219AE2A7718F78FD36D0507F3","0x1B48160DE846D9E79A76AB2CF91AAAFAA9AACF3C39E90791DAED2E6BC849869D"]],[["0x238EE03DCB0345D718C5DB7F8C4E48DB0F7B8D9A3D598797B722A8D4DEAD567D","0x19643C069F5889FEE62E369EE2C0650512C9FEF4160448ADDB772016C51789C7"]],[["0x179595CEBAD2764450A494933A354CBAEB469E5D31574E53CE0A4431E8E43276","0x03DC7D4BCECFF72D5F0607C730AF343D3EF14EC30628F95BB86A55CF90D18635"]],[["0x139217AE7F357C8493617F602EFFDDD49AF3711E857BF5B5C592FE63F28270CC","0x328C129DF07ADD96C8C81638B9B4A46C57D42DC85E8D202C5F5043DEBAD6A5F5"]],[["0x0E3FAF02C76ABCEAC88C747D60B92ABD0FBCE2CBDD085B9CB04A97403B4D236C","0x24DDA238BED1C3D1A4A1603819E85DC728550453B89551846A3DD0D84596A6B2"]],[["0x0FB3C9DAF726094DC09DD4E6B8C297E8DBDBBA0D354FDA64886429A4A1F858DF","0x27964C23B993EA88236F5CB392C5CE53C51F654C838A8D51DF14851D4A29EB3B"]],[["0x0B73AAA425D70F4C4B66D1418121B8B41E6310279AA357B493F624E95FDFFCB7","0x36503D5D8F744E00FFDBB51C18931CC4FC1DE290FBFB672AFE13D4BB667FD8E6"]],[["0x0B15A3EB8DA6144E6A060F7FAD9CDDA0BD491E23CBCFDBD7864D501125F22BA4","0x1C8956CD37B5F889230F6FFF8CC338872F381DC5BFB43357E60522DF90F63DBC"]]],"z_comm":[["0x2848EA42764E0433DB42F644096AE7FE4F3427B8BBD61D268792252F490BBD8B","0x129BCAF9E35213549C96175B954B1C4F578B2E6AE75F30C960084F5ED883FD68"]],"t_comm":[["0x2DD194B808C883D8953358E0898D01D962DB1E19385C7C532FD237933EF0041C","0x1B513B6FEB988FE3143704A87FE195A6EDC7B243FFF5A935EE6A3D6DB77DB491"],["0x2FDA093EBB444E7730B3353ED73F50488B1AE755E1374CE608C4796A40C8E88C","0x173F60D90A4E4DB29D84B4F08B0D47C15D06C167A8D494BEAEA58367062023AE"],["0x06BADB0A5FDC5DBC6F4C7B9BFA9B2B16D4A8FE9FAC46AC8112E0E072F7EE8129","0x1B4A0FE9038C59F3FFE3F417882481D7AD8A11DEB7BE1C2B969D4F25629D5859"],["0x0B0A571FB0A9B0D5D09A29255E750E3F02A9F389A40E117378494521F04F8577","0x12BCCEB319F6B3AE604DA906F5F4EEA9EAA8D249967440B84E32C2AA6292EE19"],["0x13BD99BE79CE463A3EB6578F9DE72EC3C53FF361860595F88C6F7EE29DEF8698","0x3EA076225CF2D383F41E958DB4B401B8E1406F7278BFCDEB443D4F81C49AFB8D"],["0x2EDBF962872C0A307B0A8D7664374959A27D4969B9BF5A26ADE86211A2C71631","0x190A8768D2BE6805D34E5D90E21CE08911B507E71BD8FA484EEB6244FFEA7598"],["0x0964389FEA7E3C382C5610A90FB355C08B159336AE7087D09109BBF3877BBAC0","0x22F693098D4F0350630388DDDBA52ECE32676AB048F7163827D0091C3B2122F0"]],"lookup":null},"openings":{"proof":{"lr":[[["0x1F7DC7ED32661F0E9830FC633B2ADAAA78CCDCAF0DE35ACD6B395559C3B2BD7D","0x29E754A759FEADE13789444B1C7EB8CADDA57CBEFF2388C8923612EDF6FA7DDA"],["0x15A5A7D414100C800B1215F71613F9698649FAFCA38864B098B42873CDB55A3A","0x2BD772D7A73E1E726CC8ED09C78CF23FE7EA3F4357D853058EA35D46E95273BC"]],[["0x190971BE7C859299193E14D865E367C285E892C6FD510EB9F98AB2AA9DDB7E3A","0x3324EFCD0040DF1BCA5C143366ED33238B31F9F63E9986379A870E23F2A6162D"],["0x3FA1992C8AEDF2E9208B5783E11C1CBBFDD925B78C6CB7846D48A7AC290A845C","0x02D36513F02612E4143C96537D10A77A76614B3A9BDA0ABBE559384B8E6A7720"]],[["0x049CFA3090DFE25887558B17D5BEA7B48245F9BB37880D8E723DF21DE84C4A0D","0x3128C550642F66EC540AFB1F9221EB30EAFDC9432A612D7A02B508D91E7042F1"],["0x3654FDFA889B3142DCA845F7D4EB2A389792E1E0B25E6F717B262C2E16ABA074","0x2332611E27C3F333E92C25A78A68562866C56204CE05CC86BA46EA914430F474"]],[["0x1F317D17B471EF3D5640B4ACECC98F98CB3B876EE8DF890F3C8D765B1915A90D","0x36084DD293EDA547642BF87AD850DC2F2B7EE6914811857A5012FC041DC5797C"],["0x3C8EFCC1DE40B1845A3C002794CD29378B170C16B8A0791A2E2918CA3E6E816A","0x1A45EF31E9A44C3E4B14A2FAEFF7C119265241F136F7EED93359CEF98EB1CEB7"]],[["0x3FA56798D3B6B34C8A1D17B97FEC4F8674C2A5CAEB49B93006527E249C6BE11F","0x1300AA91445510E5AD05227148A911162C32CBC032BC9D335C817DC231029647"],["0x39B92BF4B124396F439BCC389B058B736110C26A670A689516341E62C03D3179","0x2886D19FCD6E613E17DBCA376B23EA16E11F748544463F61F710F7545D6F9342"]],[["0x3F9D26326BF31FFBE8729F26435994F381B6CE3108EFF67979D046A2D9D9B70B","0x16D7120E85BBC1D2AAD5B2976B2858F45662E7C9670E373802DFE2581A6941E6"],["0x186278BB46BC204A49A39CF1873E70C70A112481C457F720FCA34FCBDB2BA76F","0x152B34CE3340C0C3CD174AB85B7A869901672880B7069B3D195F538E76F9E25B"]],[["0x0BF39F4C7DB695843AABDC0D0810683B74D1B26D119EC89BC74196E90CD1EA88","0x3CB42A2FC1AACF66847E951E3D53557960985150002ED6AEBDC586E2A4FAB071"],["0x02CE251493B95B932A2106430A64C248A287711CC7B223EDB4F29EEECECDDDAE","0x101EB6B9844A5B04DF5EA24383B172359B4550CB53C91A9EB08400382B7D6BD1"]],[["0x31683011C259DE7ADA0BBA7669EE5641121BAC3567E0AA7D86AFA8D937EFFA57","0x00534593DE1C1DFEC2C0B2EA366D05FDAE7736DC27AD0F7D59F642379C3C423C"],["0x0D4ED9A8068FFA4D99D2C9F2E634369BEC895DDC9BFCA49D3960B7159FFBE637","0x0964051FA676C931D55699DD4BF7B771D994B8EFD5CA16E764F6C2F4973438BF"]],[["0x1AA286DD99BCD5DCB189030CE73B07C5E388E7F8364E01EE003C5681C2429EE2","0x301B1EAB3C902EF06E84022D6CA0F662039A60EAF2A6EAD71CB91BC6806F9D1A"],["0x10CDA2048909A2DBB2DE8CD578C827A12B0551FFB3833140B10D3DC06082F399","0x3913D52845230DC59D0CBC0AA83666987D5DFD009015072720FA372CFCF88257"]],[["0x09C5C4CBE56BC076ADF937BC7A39CE9806DAD5B0BFA4C2663A9B7FB64CFA19A6","0x3517DCA7D1A6B80F13E99111B71267A28655B27AD264393E8C54F98B6230AFFB"],["0x3A240A65AE46BBB1E08024CEA242028C05756262F69E1FA9D3236B9E03C76E6E","0x3E824D849CC4EC3EB0672CB0D8D69821AE97A9485BA143A58D81D3D8BD5E6A64"]],[["0x2857B2356E7074147FD3F9ABD0EEAFE78DBC76BD0B740108E9E643F926A67403","0x01B964DB18FA516EBBBF7EC7E4FF54FD1096BE8A282ECDAE3CAA27555ABC443A"],["0x3CDC48D9BF3621612996E2C8A5CCA852E312FCA794BC93B83406332474EDA0E7","0x2C332CAF5C78C201106FDFF6F9D64344D3771FAA428C49E3EE53C3324AC73D71"]],[["0x05AF951E9D06292E68F9F2051237054BAC2B6BE970406E9B601D8E197B209F50","0x159105FEF610D1B18EEFD306C2404EDC0761FE20C96C22C13A4E43B1F096B825"],["0x144841E78C1C1FA82A598B8376FCF6D64D86B7A5D8DF52DA719EDEAD567241A4","0x34220818BDBC24B7F4258AE4B4230D9E3F9CC7B40D74C813A40C25D88DB5F726"]],[["0x1FA52EDCDA1E156AB37DB67C2AC64E6B3DC3B1C75087BCE69EC16EAEB3F885D4","0x0F8F35C1AEC56DF6EC77CFFE5CDF5DE10C6DD67823EEA6490228A5F388EA6A51"],["0x0F573B76BC0A7FAC29FEED8C9389CE1296DA1429AC0691D72F876C127864B721","0x281E871E5237C396F6B83EDADE946A5A7A2CB2EA5E661A08D70E96E23E52F0D6"]],[["0x07F8E26223A4D33EE071640B64371DF0A7F1AD5905141DE479716DB73747A687","0x19F423CE7B225D4DFB588626DEC00DF0FD58AB3CF580641F836DD15DCCBD0644"],["0x1E1A5D64B52F81F8F57BCC07A9FF3F741EBA51687E2C6F378B8A40997180EF16","0x0BEF6104501E8D669313572BF9C2DA2FD3E9EDF7096E367DD2BEAAB6440A6605"]],[["0x1348F3F60D7F63FC1179D2EA07B6963BCE2742A13937042A6E0B60F2C7178E5A","0x115D10A0486EFE2CC3E8A7B1B63FE86851C091B6138A5A68E3A6246E0B75944D"],["0x14ADB4101C803B30975B8648BE6DB96E7998A4103759DA6533749A2422C2FA17","0x2D1421AF6B08FDAC53FFEA849F80C103818D0EE62AC8378BE77141FD8AA9B4B2"]],[["0x15C79FE5C317401F7079C759A9F602CA3F41C816120C8DC2A802837E4D1EDB8E","0x0E0595D0EE4E834DBEC79A8119BB44A1570C75555A8FAD11BCA4D7F50158BE53"],["0x2E7C98BE21C659861E3328D1477241FA063C2FCC512D3E699C7381B134E70EA7","0x18F6F2C70A4395FC2EB56917E0D58A0510B2E75A49F803DCDCB337A898441B2C"]]],"z_1":"0x109016456437EA887ED1FD101A7CA253750F4F11EEC7323555F4D87199774DDD","z_2":"0x3E812DC3BDF4421DD9F288F1CD89DFD830348CB32D20CCE7FF9FD0B1BD24DBB0","delta":["0x26C0F636919F1081F4BE300A274F70EEF18DA2A65A66DB24C102543B51039A0B","0x059E2ACDA79CC3D282DE2707032DA046686E07A853FEA585CB3D16A01E44A1E3"],"challenge_polynomial_commitment":["0x3237461818F5A8B3FADEF6AA83358943F9784EC69E3C07530C2263AA40E19CAF","0x10B10D1DCD822DAEFA7603734C166D3915F1C35E1B9558B5ADBE159D0476F6BA"]},"evals":{"w":[[["0x2F0B7492838342F71BA481F9E9161CABCE9CF9FC0543AD817A34BC3F20B86ADC"],["0x304397829DA258330A58A33B4B40FD77FD8E48927A0485501716DF3D27A77F3A"]],[["0x0790934F5E10E0D0D1C233FB474F533D6F4D8F3A03DD17DEDBBF9557AB5E8E23"],["0x3C6BBF7D4725B90E13E0B472A416671ED87A9BBEB57B9AC438725582AD2CDAB5"]],[["0x1F5581B3253740CEE7473403DE54995978BA0EE892CEF42BD8A938F53D337FE6"],["0x257BEDFB300128324463320699AB48BAC06980EDB2DF181FD8B6BAB2F11851DE"]],[["0x36EB697021FEA4DEB3B4703B5680DD8E1FD436E9877697E393B50A5386801560"],["0x37D7F1B1E8CFB4F674F236E3FE5F03C24AF4E786C93FF890FFE5D4A04AECC0EF"]],[["0x06973C55EECA949E706DE668AFB6799B1C79F563A8D79B05E025B94EFC376D0F"],["0x0301CEE3FB4BD95E31E9FA8AE2D1A2A17995BC86D40EEDDCEE63A4B36C4CC1EE"]],[["0x0E0616C7AF3A7B445CEE4D84A7C681BAA1A5FE3EC1CE40366C204D4E8BA208FB"],["0x025CCED1AAE9BA8F6896305829D9B876D5CEFFE91357CE4D7CFAE606FF1C7D5F"]],[["0x0F4F7FF7A4108B83A684792986A74C17345102CF4E4DC42351FDBBEDC3964E03"],["0x2BD267CB8F09771346F7CFDACEBB360EEFB57ABDCDF3C7FFE2DF8A7595525106"]],[["0x0C3021AE41798AB4E8B01CEC743E30D6C7ED9952DE53DD232692CCB7A7B3C829"],["0x3F34E003E69A7A910A871BF880E4EC6E722350261FC93CF4E0F4DD52B075BFF9"]],[["0x3C1E572F7CD28AE7E7CE6ABBA3E8E8C436921EC58A13527127E655C3A8A5B46A"],["0x13A0992B6586721837D3E1A68438CCC7EDCD13030200E914AD88F6003C0D405C"]],[["0x0F01C49B86E7F44AB1F972B4F9B9DD881EE1AF77362C571F9662B65E5D240E1D"],["0x2E8E987038436116E23E051067E3E8E4B2489FCA083285E97EB0B82BF418B3B7"]],[["0x05027A9E994489164E658C8E84AAFC42F6264C414928C6599186416BF93BD5EB"],["0x25B1CD13E36B14FA592CDC4FE11EA7F09354EA589C34255E3CD027433122C979"]],[["0x3999C80B62ED0FB6FA00D6E06AEA4BF32F56938D64EBAACB3DB77A075A4F46AE"],["0x2C666D0F26A60B31A33E70E5FADEBCE5621F4F92BBDF1410213E00BA189CC68B"]],[["0x1D7A4D4880DFE26BA2366B943F3F7A87BDDDAE9BA257891CEA7C6964A97F3198"],["0x37397C5C6191A07BEEC7F266EC15E87D5F8610250DA4794FD33D47C113F34714"]],[["0x3FA4CF0423EC9FFD638036C62CF7FE7501E06458F7100B77E879D44ADAA788C6"],["0x1339D7D8C2D5873069C449A4A3B140CCA50F4D601EB8F548E65AD89B93D96CC1"]],[["0x23ED48D97EAA0E4F9712BA5C8533A8093DEA5ADA9B517749872A693EE2440450"],["0x3BA50A6BF233DEF8C39C594E9A6F8E285B62C970760F8BC621FCDAB196AA3563"]]],"coefficients":[[["0x0A0FF4B2CE3725DBBCDD3EDC5FFF2A35301972A5BD0A0183902FD2E233304C73"],["0x2399B53F23E9AA71668DEF399A3C56517C85664C63BBB219921AE0B381B571E6"]],[["0x002BD06FCD366CB8D5A33CB8A64ABE805F7120D6E4C08B164150600BB5B8BBBC"],["0x1681015D1F7A4E1A3EB277B6879CBFEC2A601EA278D83BF5E9F9A5D42CD688EC"]],[["0x0021CC7AD60400D7BBF0FD11251DF3410D74E5D1FBE844C86B4FA8DA4939D616"],["0x12FD266EEC832A7E69D8304C808919A040D6B5BEB941B4620E9DA2C1C9986FCA"]],[["0x2BF86FF966ACDF54EFAB3D4CC329097D3F5700F051007E69C131EBBF525F67A3"],["0x279F2291E682CB302BD89B0B8C1A5E1B27DA100D1155F3337C8045A487998941"]],[["0x155F51F2A802EAE79E60806A153236C607541034B98195DAEFCC68A0E7132F72"],["0x0AC4B32DB555014845F5D9B640EC06E2FE2C44214FF74EDD9B8CF8FB12D2C48C"]],[["0x2183D1828403A732BEC26D079264BE6474B87CC4A04E0E719E3FE9602A01BCA1"],["0x30F0BE65B1E62E7CCF815EFF4A582BB50EEDAE76C7EFBA60654B546D0EAE8C40"]],[["0x3EE661FC365A5927CA25F3EE644BE740BB46EF585A9AC5C42B3305F35F8041A4"],["0x006AA7430DA8A03F3A9D6D6653C6BBC701EAFE0E0CFC2671AE5741233E2CF9DB"]],[["0x0A21A281198DB576B48E0FE24B974D97781E3E13BCDA009A3DFA6B22A34B3E90"],["0x09D90067FFBAD6379BAD309E0F39088A734322DC3757F06E61014B4DFF3CAD9B"]],[["0x1513E1D8B51AAB063278F47CBF572EFEF311D846CB758CD523283D90751352B6"],["0x32BEE7A80B7CAEA413443FCCAC783C3C7AA8106B4DED39FBD8110F297F6558BD"]],[["0x0EE37B9005F2E538285F47EDB1A7B4DFD9202B9741E3AF133A390463555AA034"],["0x3112457B24B0A304574F55940671697048DE59C32DD9F68EC62DB68FB6B0548B"]],[["0x2A4D5B917089AB081FD498714611EFF8EE93E9C6799204859B0FEF0BE111BE7D"],["0x20F97ADA46D573F24A273ECF5377B5FC2E6E6D81504F65FF066D1482ABDD5816"]],[["0x197905350CC6457A0FCC88E26777B54497DC035D92F702E948C6E3B29718588B"],["0x0E595999863B8FEED07BB234C6B8C0D5415AF979E69862C180D6D79B29B89B0A"]],[["0x1F368AA5309C8D0C5EADCB6DBA4C4EEC323364FD7BE871CEB30B2552B93D51BB"],["0x11E84AC5E8587283216CEDAF1946DF2DA3EF85D7FE1BDD695717825C61BD0FE3"]],[["0x1FAE6916CBDF25E4E29EA69172A31569FDAED0ADD24F211717C77BB7A3864BC4"],["0x19A6528C42B800F1544658B2B38F3BB8239C9BB6011DBC18976452D6CBE88E66"]],[["0x33529EF335D1A0E7F36AD436F46B11BA7A50543616418CB54FD1C027CEA404A1"],["0x16C4BB27B344F13AE70AB303FE9DB8FED17ECDB718FB4580BD98B7EC2A4A96C0"]]],"z":[["0x11F916AE962B29DB30C9916D7E05ADBAA6BE36106EDAFA5687DEF6C530524E24"],["0x28E6F7A76CED5E53A12E020A1713E0D2A3A9EA063C18DCD00E6B3A95DC5B0935"]],"s":[[["0x3C533F8C5837D5796F7C1802CAC2C8D39AF00129E508A77033BA111514CC64B2"],["0x0FA7277A9DA9B9AD1837B8044BFA78667CFA91CC7CCBC9123F62755DA0223E09"]],[["0x333BA4A0BB54F155DFAF63805CC9684DA9B07FB58DEFA6A13E86FE8B6027B800"],["0x29614BA427EA5E4BE2009D84E1621007C00DE23DD739BFE24ACE19EFE654299B"]],[["0x1EE406F15BB63DF852ED83EC472FA2406F7F24E56BF9073F8541AC04CF38F535"],["0x3B7F85CCF3E9EE9A9EA35050E6382B66349E7C11C218EA607007390147DC5431"]],[["0x07D280D2C2C603E0FA14365B9286202C2DAF76A221AD8B86D57BE21B49C1300A"],["0x064CF7CAD3D06425948BDA16BB0D496A620A06C019CE0C282318C446ED106D86"]],[["0x3285067852C0B9B08FD43960627AC66FCD431116D675AF84443A02A931DCE881"],["0x2BD487DF9636E8AD560063C19EB439C87CBADF4D678F3E4174FECB86DD1EE39A"]],[["0x01FF4F35F0F12A5EBD869E8F91A7B60C263FAA42CB6EA592E05B9ED93E35083B"],["0x11B15A2DADE889140C70EC56F4E98B8D6C78E7BC15579C04E0AA0F494393A111"]]],"generic_selector":[["0x1DA95CD98ED9E9DDB864621058CB0265409FD50F14CDBDA0F0CCA92996E76A85"],["0x13A7CA902A4F934DCA4AC3F8BEC322A61230185CC27639FB7BB0FD86BDED3223"]],"poseidon_selector":[["0x188F9D62EC21861E109D1D33C1A5037E5CCE707AD79CBD05D28A7D9BD11FEFF7"],["0x1274BBD76BFDC1A0BE2A5D240D17366C59A10B76E1EC80E4FF08CCAB90BEBD38"]],"complete_add_selector":[["0x3F9EB79DD30D8A908FFB70B3FBD25E0F8AA4DD002277175D4B6614B38453A363"],["0x2B6DF40CE33A9A87E18BC91BF5D43A6073A9CD8CB309C24D10288F3E31F7D824"]],"mul_selector":[["0x36F26CEA43A1D4806D21F00D442234544764577BCC218462649C66D83FAF9E44"],["0x30F809BE112D908EC666263321880EE7C2C44E4BCD5B816F403CC9201FB98346"]],"emul_selector":[["0x326F52299030653753652C4904121BB1F5E1B80A499F3FB9DD4D6898D2B06E70"],["0x3C8A139B8549598E26D768033902DDBEE798DA3E6ED8E93BC59EDA4B1C4640CD"]],"endomul_scalar_selector":[["0x14CC95A72A4B612483851D076F1CA5C2166A938876DAD533C26BDD4DC4E9F087"],["0x208AD0BB036944460B7625C2DD61ECBC7F90FD9B41EC4DD0BB30958C78C2A105"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x1C9BE7F7B5FDE029F9CC5D3085205CD7E4CCCA15E658A849C782A609D1B4B51B"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x206954BD7487721E62A9762ED94FFBD11D240409C6D58DB5D725CCA667A8A83A","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x1E8467E7B42221A9D6A3B8D601963E96633E50C62C46F41FBB77F1ABFB13F71D","0x0A09EAF7C45305C2A263E9FA12FC1874FA4AF2792BB55EAD185C8371C2111993"]],[["0x339C324FB509FC9AF057882CC871254B1C3D39687C8BCC72FFC05A19DF980DF9","0x3AE43B22FB60B2551E714A8B1C124836821EF90559170DECB2E2202D7919CA92"]],[["0x0458422CFD7D7D8564B9F0DBEDC99F7C79D1688C76FD797BAB6B4E4CD1D22B81","0x34A0B80FBDD6AED4F2F3E244C015FFA7D839D701BC0C76CB50EADF0147E75524"]],[["0x0ADA0CA8904930DCAFC0BA5E3C60D8FA4F2A6B4F07B450111773A6AEE3D97EA3","0x30024EB485D96D0955F4BAD8B9A7E2AFEE5ACAA19169EE7CA507646025066496"]],[["0x17C674240EE01ED5B7DD0626D4FFE3924CDA94CCEB20ACDE02BCA666CD2166B2","0x0CA1E1FE62F705427C21FE90801599C530F810FA20C452AFC75FAC1A4028309A"]],[["0x21AB1827B8888338F7511C5A72E8584EFA299B6C360D89F1C6521CA70DF31D43","0x2E8097484B5BE1438AB3F46C3947804443DC9A6470D67F97D75CFC83C8B46E43"]],[["0x28AFD7DBFF3B3BB1889870A2D730E0BF43FC542CFF5FD278FEA681CB86525C30","0x0F0F8C146EFD8F6926788BF32C12220392CC6E5F7CD79FED83D866513C9E3744"]],[["0x1BF970AF5A5894D2E4A10C8C7BA87D684D45F3D4E0FD15E3E243859D4F59D947","0x1B79295BB5E701CC0D2FBEBF0E5D716FBA245B061EC6C77B6B241C116A2FDECD"]],[["0x1EE8A8728546304C897FD0BCE12298E5A470D4A6D04E8074F39E8D9FEE7D688B","0x006B0FB59E1B5EF861AA718DFD7AEB624AA4B4A917C44B9CBBA9BB6AA952A75F"]],[["0x0770495241942F54EADE5E89C3C1757B150B681A01A9A70BCC4FCB35EADC377A","0x23C65E6AB1AFB2691C22A6CC83D6354FDBFF7B5D480B33404E7DE4F105BF57E8"]],[["0x1CCECC3ACF222EE8550BE45DF713721B2E180EC137B477CCDD02B8DD8C9728D1","0x2A084D55C5BC9EF10C11FC262FA2BB1D99ABA7521A3155231E73C6DDDE264609"]],[["0x3D27BB467739402FA2061F48433248DFFD19DC329C2A9692F65A0683899069E2","0x2B8281EF9AB5284306B2B4158297F852AF2B6DBABB37DA32454450271BFCFD6F"]],[["0x1D5CE29EDA09D6F2B96496FB1EBFE8415835A3C13A27977392BA86A87B401ED5","0x3CCCC7B4F861B8564A62BBFB5A12437F6AC299E4A2CAD72AFF500E4F6B723B68"]],[["0x0A9F2A0E2453AD54E1EAE7EAA7480D61C8B6F13FAD217783EDC38E849C4889AB","0x1755E1390ACDD52B050BB2D3BFC13246BF9F4EB64CECE8B8B765CC5B44936BF2"]],[["0x18133BED8FC490702C71C5A2530A28359646B80C92A20B05A3E05E898A94B049","0x0106C808F3052ABDCE8659B5BC2E34D9173BB89AB62985CC86E7227A54264F2A"]]],"z_comm":[["0x3617038B11EA06098E0655F2BE5F3056E62DDB1555244CE9065B0B37FC03128D","0x350E5F6B70F91C4FD7D27A00C2FBD3EA50889704A2696991F9C8C3944BC87F52"]],"t_comm":[["0x03754182242B4F61EAFB91B09735BDB0A62A23D8C7B6A5C72AC552FF03CAF06B","0x123C10229065AC53C3376A1566A43CE4A3CC794A447C46D1EBC7E13F61B23367"],["0x0E67834155BA5C7507A14E3EEBA43D56D72C97C64411EEE6A9B8FCED810EAF21","0x00EF5BB481B2114AECE81ED485227B632F974DD9BF9C857484059A33E94C787D"],["0x09688639CE16A234A0B007CFE0964B994B0F686DD9D48C3F4B799D177463991F","0x0576F92FF44E0C0F87A419943F66E0989B533AE0FC9FA17B6EF1C6A461D53C39"],["0x07C437BDBA71B5793C1055544C1A898044CD197DBF71BD90C7E68BC9BBF76863","0x0189478808A97630A323F6AE50582E720A2878AC0342BB0A649C7E980D364C62"],["0x2E0EB4053198EABB9D1F14F946CBFC9CED552BF4AC98B178B4BA6DD47A60FD94","0x02FE1C19792EEC87C8DA8BA7C6264BF239A6594B1D62E8C564028B98DD22E78B"],["0x18DB61E59EFF5BEF3AC634FF867391E802DFAEAC155C856F8B86DD1FA2493B32","0x1EF31821A107D2A207E284CCE0420255DC73401E363C209202FD896EDC6DF589"],["0x2F159C1F4A6154E5707783D92C68EC7B16BA5D37849836EDECAC4D8162D29BE3","0x0E3562881F043DB2C6B4006870C4DA15D73D1F30D7050A351FDEC9706F402084"]],"lookup":null},"openings":{"proof":{"lr":[[["0x16AF249B601F8ACA49C8AAA65553303288B1CA7C8E875B39B0E6A910A224BE2D","0x0EDFDCA66BE96D17B106BF06E936DE5598CC286E2413CF5E52B1E284464EF953"],["0x3FBB99F14CAF3904171A5AB8F72D38F45861A9F3D38799AEFD58B9A22304454E","0x14FB1AE105D40EEA017A95A67CE2B4BA6D102150BFD56A222C0A8D4A5A365CA6"]],[["0x3E776538511758E1ADD7DCDCF50C057488F86191D81FF405A33C77DC084C9BD8","0x21C8C83BAA88284331D04C4441B0CD14C0C13B6004AC3527B5DF8D0E046E78F6"],["0x0D40A90A0F8EC3C2D8C24FBC73D885FC629ED6D67FE31C4B59225B977239EBFD","0x3245A81F5136C18060FB618D238594521F4FF42AEAAD885963E9800261517E0F"]],[["0x1C2174D6430C2732F7A9CD18D37D5DAD6E15CECC76C5A0057A51E509C816B929","0x01C941DE8C4671CEB42EFD91DF5574D507CDEB43AFDBEEB8A6991C6BEC0DD77E"],["0x070A5786435F0CA2261D8080DE11B6F912A3362C5F5801AD79E1B95BA9C36755","0x3DE8F7A5AF6B63AD5E42C8BED48F9FB543F9976076AB78ED80681D9341FF4E9D"]],[["0x3BAFC5B6585BEEA7A00BD58E156AB5FBC7B9C96AF6398BEE4785D744BC9FB77D","0x241402FE480FD0D8778F8357A42B3E3BBE01F942203F60661FE17477383FA7B5"],["0x2E60825E4FD434F9E6756BF153D595CCA987BCE293B283D5536CAAF48788337B","0x0325654825D8FF8BB0866A408518A97F85ADBA88ED688065FD6CDBECF9806280"]],[["0x073D9D5C65199D37DDEA7BD28990CDC11ACA9AB0F8368AD22874B9FC146C0F7E","0x39B1CFA0458A2CE87529048804789899AF05D364E652C7A0CDAFA0572D657D70"],["0x11707DBAFEAA07C1643F4A9D4BB2B99FB61221B868E83F3F53352616854B3DA1","0x1801738CE72FFB4BDDC8056AA79A6B17EE263BE73DC640453749BA069EEE2608"]],[["0x2ABC6EBC1D005B7215DB9FBFC45C8092110084116E32535B923EC067807E5FAC","0x2C70C7B2E0F58CD4A0D230878281C7737575BDF2D109A36B6CA7E4E79163A6BE"],["0x3AED743725A391E3DF7EC07CD340DA03FEBD08BCFB42FBAD820DC782C59F32CC","0x0520E9A1DB03DEB54B17906FCBCAADED78B2CC2B3B16C1E863F942A18BF0F6DC"]],[["0x1106CA4D75068B8A1E10AE789A8A28468EBD899FFED99671EFD3026AAD298C12","0x33233AB788FA4741621BC3DF555665ECF49AA9815A12469F1BFA816852576912"],["0x1FDBE63154DB76D6244370901C3C9365D981AEEA71C22E0C7629797B92817F07","0x224A8481C7A1FFEA22863ABF82FD9F9E45A891D8D67777438E086E3A3CAD8469"]],[["0x2E4CBC2BD3B9B0012E1C4280DB80BBA3E65426229CF8D85CF4C9A249FFB5DB07","0x1CD604704E7155B633B1A6232A1275C66AAF82F9431A84AC562CD740C45CDE6E"],["0x2562184C8B266A94FB6091E4D519A3FD7CE47CBDDC62B118219949C5A4DBCAE8","0x206D0C33D1CFD1E7F4B88EAB7119022F9568B4174D6438CB639D4DD48D8AEED5"]],[["0x3B1E156837F6A6CE256C19C6E76EE792689548FB71677AF1A0FE683A5E6C8B5B","0x28103317AE19FF3669EF3CDEC924BF74C05410B534B51CB9EEC1BA09CD233CBB"],["0x2AA68272AB8C8260948E17494586C9297626B17E7966E606808DA66C3CFD756F","0x2133C3F393244244455234DACB314C6D5EE39B2CAD8A109414F2D46319E17B3F"]],[["0x06B6A2497601857065D038BFE2C4B97E1F4DA76F9D99A6AC9E61C87CCE2679B9","0x02C19E4832833637B48986F15C361F29F4922B5401D895A5C2B9F923872622D7"],["0x0BE1BCD8CD0C9A394A96DF1AB375030DBFD190410AF87AD6CE1065F6D2538CCF","0x0DE05205A79F13FF249613B6DF351C1FA975B114F7AA49D1E100BB943D073DE7"]],[["0x353142A6FD5C9B748AB9D67D02D0CC79653E5989A50A8429E3FA791045EAADD1","0x37D92367A3AA4DC1B5EA8AA318CD3A3390D930EBBB857C87EAD07CFF39B874F8"],["0x37B5DB2D2B43C01AC6E20036439EEF8F66179653C275090DFCD8898BFFFCFC3C","0x0987DF43210CE085ABE4DD198AED591FA9C4E58E9BA2251B595A93BB665F067B"]],[["0x1BC042CE92F1B2332F548DB394BCEABB27FAD2752608EDE0DE2CD85F9AF286D0","0x16B2743A4534659695343BB494A5DD26F35559190A8DD90A6F9F9825A236CEA2"],["0x04CB637FFE1F2BDC9DC7CF970BE0B12DE2BEB01F6A5D4BAD1D1DCE076B7357F8","0x06DBFF212DC5BEE15E5B6F17BF6E3DE2A42434DB6D270091AA0A5F00AC1E66A3"]],[["0x2C6724EBB0EF256B58DAA472083D02CADE4266AC204C8503DD2AEDCD3A8FF8AD","0x1CCAAEA64C9B6158EA9DF965C38DCDD33951A7C02B9D180D8A0AFB3E670E8240"],["0x09583CB3D69169E14F45A9422B6DAB7D0A161FDB8DDCAA771A38EA06D8A4B770","0x3BBC931EB26A70D7C813D6613F60EF2074B6190F7B326349AE07F71FEF50F900"]],[["0x395483742B2CC7B4DDFE44BDC81C662F3849D64D5BA0E5BB6F9DB23D097CD529","0x38BA4D3E8D89A117694F24BB0A9BAC8240F0CAC10E91BD0F8F0199C2C1B3B74B"],["0x048D8EA44A9D48D81F74E74F58A9C2F6C6FD91818D7443AB88B17D87FD4FCCB5","0x079564264F4F9726BF50BE4B3F9AE9239F89C3D1E3F4145312E0DE523B579480"]],[["0x22D0A2AD1D9B9AF8539DB3A6A5D288BADB0125036A14B2144B39957B60BD9DBE","0x3B7C59C57894EC3E3A5B2DD835507F056472A6D2DF6C75100B0C82D8864D4A0E"],["0x0D989D02584D048738D1D6E62D1F41F17A5015EDA33704414B6BF182BEBD72D2","0x3D5E5DF9448FA0CC2CA1FFD4BC63D9B4FAE30D5BA17D2D23A2B2DDAF9420B1B6"]],[["0x38D91D64217225E8ACDE4ED54C7337BD2B4E26DDA61F30A1ABC0F3C21B01B22C","0x0D5F024814FCC0E3BA83EFABF2C426359D48376742AC30A32EF39F6CC0BFF740"],["0x146EB9FA513316A79EF0B563BADC55733856745A5B4FB6DCBFA858F7A3CC7C27","0x3472D174D6E088DCCFDEE9EAC3C6865785B8CBEACE8F38F4B8B8FB1225E39446"]]],"z_1":"0x1981C81CFA18DFE0E3ECDB681AD6E51D9C7656CBF8BE5FC517A53BC70BBDB7A5","z_2":"0x0936853DC0A7A5372BFF85D0106E35E538272F3515C221FF31D54D3F733A103B","delta":["0x04F54CE16F070A9C9ADB3025FE4D85B8BEB33D768E29A8BE47117104031121D5","0x2B4506E60B65A91ADEAC35ACFBC339FA405756CF27F29C1EBAB7EC100FAC7BE1"],"challenge_polynomial_commitment":["0x2709303480B31C8051DC108F07FAA856B702F91EBE02D8A39898036F3F7705A8","0x39972E2D2EB6E6758E7EA7BEA64A39B02D5AC9413E9010F14393BD561661D60A"]},"evals":{"w":[[["0x1E358B0995F45B7422B49D349EFA08C3A4DB6C0DA37D341EC14169C28FF839FB"],["0x2CE4F7B6C4B61E194A117E34D2F69BD7B87E069998A8751DBD40165FCE4778CA"]],[["0x3AC7DA9EBCCD32C9432775CCF9517CAA49E81CB45EDAE73FF3493038056012A0"],["0x3A19E8EDCBEC1F850A8FB6095F033B35C979A4FE9CC0173101319E26A91DCF3B"]],[["0x37D269C13DB29C5C590F4FB79A9D5203ECF04A9CCBDA8C41A3D63BD9CC3760BE"],["0x0A84E3897905FF07BFF3BF1105040808D3E195D0B6C984C464C2EE2786AC3261"]],[["0x384B34265B5485618A968A651B860FA69C06676DD59BBF900468EEC3567AF1A7"],["0x106BD35E4F268D0E40BEF1C2D61AE1E2049E19928EE2AA6A6B6B4C89B8D1B5B1"]],[["0x3933D23079194ED281193C41301C0F371C874833E1318C0D4CF11BBF6B629F6C"],["0x37238CA00AE1B13ADE76C0828622348706E3631F6F6B6F91D00649D711A0BE8E"]],[["0x14042379F4EDD13DEDC9FB5DCDA3D905784F1DC40698BD63FA8AE792206ECB40"],["0x08CA6312683338575AA0EA1F88E8274C8E8F57E9B93F4332516E0DAFCC0242BA"]],[["0x200ED2E8B17286D366D6704AB9BE3221FAEFDDD5F2A18815966F352822810548"],["0x10E2C142A11C62F2A55B585592F1B5D26222F6ABDE69D51B8676F62841DC919D"]],[["0x1F01A5D2D5AA0BDE3D506FE25DAD2AF651ADD3D3FF5E841418B79A19272E0BC1"],["0x12D9937228C0D5D96578ABCF79C5002AAA16148C2C56D98690718147D46D393A"]],[["0x358A596C8033F74A1B8E7ACABC3295D61A5C5EEC31ADC3FB4F7542DFB5AC2328"],["0x1CA83F71D012924359263C6A11AB360148CEA4AAA7357E9C3ECF95A767320CF9"]],[["0x021935B2721EF3A39581FE936B7987F8A557DCAB8711E0ED4C6DD6C4EDBD82D5"],["0x03F1F55FD90FAEB2CCF310DE1E9C88B0818D4EC3319DDF5BD1A21414C1AF9221"]],[["0x07A04DF7E9B33ECFF21C9F9B3DDDC8B4E9A5775CB82C854628F1222254AD0BED"],["0x15C3D2D189AE36724BDF316B08EF4E6F10F1B5402B92B92EBA84988D69FEE76A"]],[["0x35CCA8433811F45502202E52731A9EF81D802C74144ECB15BD26E0FB8CEF1699"],["0x0D17D82F03128DF9392DD52589EC36719B0CCCF85B3C3A973C094E1EFC22AE21"]],[["0x251C7E4BE364FBE77C5A66940FD4A693358D8A6FEB1E69AF22582B851BA52A59"],["0x17C7CEAFD5CF0FCFE45CCDD1214436CF26B512238F89EE71984A87BA995C8F4E"]],[["0x051D245EDCCB2B4C36711724E970B1BD7FF210AC6D8CE6A55D78FA7EAED23164"],["0x2F6B2B1B8C6958E0A8DF1CFFDFD6700BC5DB7C1A7103974E2391C5958AA08152"]],[["0x39CEB20104CDE0FF0F270E755037A1A50E520B142A67656734A0707A976FE8F1"],["0x31A0C45AEF9456421D8142FCD462E7C7044F6E7C958B0F367A4E794143A0ADCE"]]],"coefficients":[[["0x2EB51BA7A3F8A97653C49A5EA9322CF0B11D8E144AE0D225BBAD15A5EAE48478"],["0x0CF50964D720EC9667769413BA4B9F2EA110493CD3A6556B4217713617915DA0"]],[["0x325D499C421E0AF0937312DF9F67CC7E6C0BCEF90AD1276F471B2CC7E342FFB0"],["0x068BF9C448BB4FE370657B1084BBD1B8F659D2790826A944D81D081AFA278398"]],[["0x120290F84CF7F157D7F2165A629A249FCCD6E891D5AD279C64875A0B1066BB08"],["0x256CA3C4C6F8CA3DA97E18F588BF86B58B9E82A80B0F95CE256DB5CE686C770B"]],[["0x0283FD8A320DC5EE8631959F7C68D6FE5942A157376FD1467F124483AB2BA644"],["0x2FF6D6E7315EF693DEC4C3359AC3E4B8EDD840BAB1C059EFA4C4366CA6C1D826"]],[["0x0B66CDEEFCDBA571E82818FCE4793B1D5B5E5DC8FBF48C5D1D04DD988CE91958"],["0x173BB53D8F73DCB48F031DC6EB9843CECB5164AD3AD5A0A2B12CECF910768321"]],[["0x218B21CF3196146132DD7E9252AD41F665E3EB6E1F6A2CE788E2BE4B8197AE95"],["0x3F5479C389750879B2968CD358AEA1AD5030120317B2739ED950371FA93CC0BE"]],[["0x1F13EBC904AB839FF570335BC29A7FF8716A62DEA13C34D346A78F81B3BDE4CA"],["0x38B2B113D6B8534BB2BC3ED93682C48A0DA29E5B9C365FD008E5F1FC75564A25"]],[["0x295FEEADB47635A0F0D530AD4B39FBF2872879E956039399A54157AFC4D33681"],["0x2A76F51FEB18A8EAEE050DCAE7ED2F5B649CC57C3EBAF704BBCE73AFA42A5DAE"]],[["0x10F97E59213502B965AE3FAE6227E95B871453B041E385C90D88510B0CBDEF14"],["0x2340589AFFDD30A07ADC58DCD76F22C4F90401D08B781C09F7A2FFE87CAA497F"]],[["0x0E36DE5F13D7496F7C66096BE427CBEF3ABD11CB1951E993D362E77B044579A3"],["0x1705433A79C418F6CD0F9DCE9C28C4F5807D19F374369733C6C87FEB09D7EBDA"]],[["0x39A94714B138268A30F571516DC0D28BA31CB6D8D5AB67F165AF1D7806A7DCDF"],["0x0AEA924C63832822A7FB6A27AB1A2EAEB28E1CF09DDEBFC0FA6B7DCD4CE7BD41"]],[["0x0C440832099FE1C2247CEFC07A2472C036A1858C30DD36789B40400983DF3C2A"],["0x36300ED41EF0786F4309446CDB61E1ED7B01A7D936AA5B519E026A5BA363C762"]],[["0x155B9B1DC32E534573BF1689A0E056FEA85AB25D4FC09E71506A9C582E4817CC"],["0x2533F79E2872FF359F1AAF0A253536438D312861A82DA5BD064F95E8B49329A7"]],[["0x216B49E8654C569CDD792AF3463C57F1FCD631F60AC11DB67092E2B909276978"],["0x3022430BB8B9890DD35BDAD264F81AA355F0A547209790E03B707F63788A4408"]],[["0x18EA6270CFEC1D16BDC14A754D8241F813C9767FB088CB7439AAAC14FFA361C4"],["0x1E6E10CA240E7C7FA6160D03A8B4BC9CE51DAF8FBD43CE6BF4D5C49B1F72D17F"]]],"z":[["0x19F39BA6D413E991AF2F5DB607C27BD8C11DFC6268F29C0478AB8E4E8BC8B9D8"],["0x06B8D908DDE89400FC6C9135D69FAB4EAF7B4E1BBBC55C16B5CB686EA894A4A5"]],"s":[[["0x352F42411DA0D641AF163A32EF193D7634852EA34D23B085F2767DC2F40D311D"],["0x20540867C3F30519CA7FFCE2D8CF8FE4EC831AA10175663C37F83F46577DA39E"]],[["0x21F4BC7DCD4D1DFA511447CA220DC09886E79204AA341451A5DFD44E6C354F30"],["0x0D6E1FCA2A8911204A72857D1C178491B7DBE14EDA33B454D294C80C57A10E8A"]],[["0x240FF4601FB468765F58A4CED89FE7EED197EF2FE34ECADDC840541CF775DE58"],["0x3FA1C0C14762DF13E4C7B51750B1DF00AF24A687585871DBCCBCBDC36930E655"]],[["0x0002A986D2FF2725F3E02897578662DB453A49A8A9B68E9FE47BBF61D3DAC349"],["0x13E28125A9653A21AD35952B3BB5A0B0BEF9D815FBB463D7E16F6A39F7FEDD66"]],[["0x081A6EF4525469E020E80DF34B59CAD673BFF7DF8683FD05BBD458E59EAC6767"],["0x1E7B7D794207C1D751CCCD4851D1E910089E0385C6EF0C81E08F6D1FBAE7FE80"]],[["0x02DE76C018E568CFA5C34886D84DA790CD9991C0C7C1F8416D74D2EADD1877B2"],["0x2C4820D0DBF5CC963CCE55126ED5A03904C2844987DC55AC6F1C64B99F904239"]]],"generic_selector":[["0x1223FA12B1D886C000692CF483213798A751A4040D2566C7CEEBEA7EB6A323C7"],["0x091D27DD65A0C7DFB5741FD5764F335A5C4DFDAB3A5DA81859DF4D89DFAF96F3"]],"poseidon_selector":[["0x24C7CB20C537352E21224D6DDF493A5AB7574D0CD4D1E1469E740B8ED8371EF9"],["0x0E40AC80163948CB521E1C9541E41FDCE201EC8ADE90919E84FA3316C353B5CC"]],"complete_add_selector":[["0x256AE07EE1F24B6DD2825FEAE078146ED5C017B5BD0C4E9E72C87F057BA6E883"],["0x07243B1347B774155CC78A97BBD561F19F1EA33325CB28076ABE2DC78E36D1E2"]],"mul_selector":[["0x1B92DB5B0053BB6133BF2CB851AFEB29CF017B0DDA54551A2DB2F71E004CADF6"],["0x349CA6FBEB2B0A063A7A0C61468B4C5BCE19A52ACF78AD6CDA4144F60294DC5A"]],"emul_selector":[["0x26A940FFDB8091CD8AA126E25639605075778AB4AFD629278EAA5CC40CA780A8"],["0x0C8D1B256DC8BF83452A96D52605728BDAEF2874DE70CAD1C3A1844E8ECB68DC"]],"endomul_scalar_selector":[["0x13016185C966644A8C85A47C8AAC59C6008BEA410C937C9CCF235B6EF4B2CA1C"],["0x1689F31F9C81DB48EE33F6E6979AE1E70BEFAB9E5FE96C5C4C1966FB7BC53DFD"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x2AB52D9D491ED7153D8C1DFDA6FE4B5EE8818F15A8A6C677423A401651DC5A42"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x1E08C37B4A108DD4A4C7C59D710C73B7DA565E45293420F37AFF587C2AF96AF6","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x3A1077EF53CB6919CA18328E7876D3B14BE7040A782F08C7974310F27AF4ADB1","0x2568CDFC4B5F5964255E855CA8A5DA36BB5D5C3FD025A47B58952CE3528FBEA5"]],[["0x06B35380B76548F3953F3E9A99F654E6E635DEB20733ABB130A00F723C49BEAF","0x03F027F8B1CFDBC206C672636019DEB427270EF820489985CA6EF5BF1E28E6E3"]],[["0x0287C5C235FDD5DC0B63B2BD9402A3A52A85DD2E7CB0C0E0640D2A0DA7DDDF7C","0x27DC31F2B0E72858D937891786FA8E85A22AD998F799F430125AB216759FB7F8"]],[["0x261712330DAC32D8CA3FA4B5DF45E3240AE4DB306D6591B4B44C409D00051907","0x235146DF5A166A8FEF536763C3A14CDDFFAD0D336B28633D49FBB21767327210"]],[["0x2D929D699DF0F3B209AD5C53AD2D59548D83A8088E92A9796BBE366626C92CC9","0x3047E03F7FB5EA8B9626C789D0A4B30DC318E3960BC6D5D841D77B42C24A6E55"]],[["0x35A73516CFCC27071439D884FACA30B20D63B6F3A5DB3205BED49D9A18A15283","0x3075FD1D17DC9B458FA6D265D373D07EE563D2059743A5DC77BBCD0D4408ED01"]],[["0x2A06379A02A9A179D3D5A156A125C7886339C787C7CF21155F276AC25A92531A","0x10BE25EAD290B6A178702D2C5680E687EFF145E28636690CC6C717840C56B23C"]],[["0x1E452D16178D95C37D2AD0CBAD8C8673F5539DCC24823DB04E75F389BE83A801","0x3739AD2D70DFF894A97513A84CB37BBC65A48C7C58F9B268883FFFEAFC037CC6"]],[["0x103D61A01F1507CEF83E8BB4DCD5A50A2D84C775EB9E28EDC0BF51DE2A115803","0x34C31C29F4301CCE02DE81596140E8F59580181251C164BA22A2409911CEC45D"]],[["0x11E37EE94B320AA41BD8A7B684B7DCDDD459DEA6EA55CC2C8FB71C7D30EFE87C","0x0F343AF07C26DB014C43B0457FA0F08FAB6B5C92744EB56A870071DCBF3FF2BC"]],[["0x36AA81E844495616A34F2D1A69BD9795CB279F4951092580D5A6D0566D0E08F5","0x0D2898BF6F853EFB3E3BD5F271155CE37BEE846638108B4887BC96CC8777819E"]],[["0x364B0B79FDF05D5C7315BE569F4E82ADE457A52BA0623FAACE65BFEF27B4A6B6","0x3F34B88813025989D1F6BF0FCE2BEE68F949E0BDC716B96EE54FA73F4A7AA073"]],[["0x0E686D42A6AA1959C70B35C253DAA574A46789A74455602445C5DFA5136053DC","0x0B5EEA26C37CFA8D8327341303468CF9AF8EEF8590A8B5EC2576F09D8BB0C574"]],[["0x11E7888D472831EA779985BF5DB7DED0F7DE455988AD9F2DB9E91B6FCDD30937","0x07A696011CFA1D51249090517753B560B14247ABA1B70C60B42B6C8F9ADA7700"]],[["0x04BA173C01D533914B8293E9FAF4AAA9DA60B403EB370754CF8AA909415A70A9","0x099CDE6563C4DB835C562654735B8ACF4D45DDABB8B8CD373539E18D53A77B6B"]]],"z_comm":[["0x3F2EB87C3AE2BF6B3C0EF52842B965F052BCAAF3876944DB84218A4DD996AE43","0x0A8EB9CF1BFC792273A5697A53B2FE738EC273979D600A29924542EE61F93A84"]],"t_comm":[["0x1CE7B31C81E2A8D18391802D6F4DC42AA29A0DE7CEB0E6CC802F5964B5F067B1","0x0F143F8BDCFEB0B16180CF8E219CF2DEE4285CCFBB8249A8B5339FFE04711345"],["0x39AE05E2BF4116B5273B886C315F5FD1464548C274F3FA2F741569800F0E43D9","0x38B99D9E421673F3854541B6C7156179DB299CC6207244DA90B845AC5D4E06EC"],["0x33B64E3D40E4A41A1A25257D8D681C003F86C3373710CD00C7C2EE2934BDFEBE","0x2809E646302BE66F036A6F78E6305C92CD9A1AD48F93E8349EAC41F67AB73D04"],["0x164CEE178147C4B48B08B24C5CA86B2B884086145265ED33889133A4AF8738F0","0x19564CE337C61B60D88D2C9E92EF12C454E4EE96838C4CE36EBF6E068BF94388"],["0x38A937D3A960972302E3D249B90C00163966934E954ECC60AD5DC359A45AA21C","0x1160D4D32143DAC297DE8DC8EEAB1914925A46E94B1242416E79A774A2A5C35F"],["0x1593B2817CF8F70A73A9212DD30D2103D71988D05AC94800BC8FEF02E4CC7AD4","0x006087E829C4AE5460EDE43FB39F37A15D1FCE143C4E71964B89544652011C07"],["0x0FB60BBDAC992FF2E4875413DBDEC69F1E706CA9EF7D248DFCD4A50E912D6503","0x17C9B957C8A592604E66A1048C956B8BF05A64DB8998EA9D618594020AE1EE47"]],"lookup":null},"openings":{"proof":{"lr":[[["0x3C30608C44BBE59F8AF43EE9E094FCF3A28BDBA04C56E6D19280349BE7AC77E9","0x041C212366EE41D0B72F751E5CBBAF6AEFFAF179795772266C7B2FE280D7C186"],["0x20BB46AE49503B960226842094532F80EDDB80F69679D0B961D0B5F5F4DB5DDC","0x1233471ED47DBC0FDF23397BF3DC9CBCB7D70B77646DEA54663DCEE9B12A9FE1"]],[["0x2D15A8F7F8156424C940F6FBD13C96123BE742E28A31A77C41531C59BCAAD447","0x39B51CB8D573A2EA9B5C772267CAFB690AF293F1374B4469CAAC85154973403A"],["0x02D869C9672334CCB69EC8C24F2992889229DC4D8833D0737956AB54D2D90930","0x26A1174D71372574FE4CCB3F18270A2B48711C2F9DEAE7A2DFCC091360E04347"]],[["0x23FDC30F1CE01FF2FF2411FCDF33323123192C93E075D947CB9D88FA7937FC57","0x21E7838A0011453EC7B001607996B5B7F9E3B5FD1828FEEB00531C0AAD803DFC"],["0x01766EF80D5A89040BAC299391DB1EBF0FD9A9CD60F5554561A6CDDCA278FA4D","0x04D150977A9CB0185E6A198B89E35F8A3919F1D2C3C507A73DF6ED858A6ECB83"]],[["0x2511DAEBFF20B2552461D3266975877CE260CAC94558AEDF18F28A68EC9D2131","0x3AD404E530E38D67833DC380FD907FD8B486640B7C793F1386179596F1D6DCA6"],["0x12A7F15A04F83B44530EB619EE6D8BFA27CF039F1746241BD411FEFEFA3F834A","0x0768BAAFF242FBF42D22FB1B8EDE575E3335612BB11440FEE43D724BFAEDA6EE"]],[["0x0CF69AAC7C0BB8CB7444413B8B2F85FD76EDE7281083B68EB28E3FBC722CB1B8","0x04F36B7A2839865AA344D3EA274FF336615772D96924EC548584D71C1268FB90"],["0x2CE83F902C549DE102F17FA0AC215DEA7108A025D16F0DE7B730C60DD300D908","0x320A07B73B7CCC21F106601F7A81CE85EC2021CDA27ACFACB7D06569102B90A0"]],[["0x0E42D048569645628F02C667295D7ED1FD653538D9868F926EEAB585194AD54A","0x1D88FFA546429A8EF16A7D394C39DFFFB85AE3E9C4FA7D771CC7D00502EFC415"],["0x015E3E9C8EA4F5AE2C052A453985403711D73252E867AA77F8FCEA3C61F8F5C2","0x0C1F61E893F2EBF0735D1E65B8C703305BDF5E6FFD396533693EA6143CDFD75F"]],[["0x37CCBF8A84EC16EC469F989FF4A7BD67DAD1D6429F432CA0924FB9676AC85FFC","0x24B0A93F2F9227E02A0375E8FF1AAAC7290C66E4BAD79A4E303366F19059530C"],["0x1F6FFECB0C8439595D471D393864AFEF578FB7B514F388E84351259D16A804AC","0x3D57078781DF2207A2DB8A0B47D9C719AB237FD70A7DBDB2E6715421A25E3469"]],[["0x3A97B0C1599B26BC90750E100D3FABE89E3F8CF266043822C00125CBFB87880F","0x284BA579456BF63D2B9FB442245FBF454A3FB01279E065D9BDC70E778B4A7C03"],["0x0EF5B07AA0EA78F8784A86393A0CDB831CBDBA2726002207DABD9BD4E23AC04F","0x0B2732038E182E7DB599B17686D7EFB1B7ABAA0471BD723DAB470ED9AB3523EF"]],[["0x275BCEA4B54540B556BB6A147B19EE2FE4E1ACCF5C2466BA02356133CA085AC4","0x3447B6EF23C4CF3AEFB3FAFE4489E3BF48F751140C3B1F04A9B5FAAC0DAD144C"],["0x0616AB10B00618186593DCD8D4C415B9CBCD61F9B7FB7BB79F7C6560067CC66B","0x0609818CFBF497ECE5EAFADD1D9474DAB4FC8EC7000219AA2BA6096D0D114E74"]],[["0x297F197A2C232AFB7373E0B51DB090334913C95DD73D3D3265D1A989F2430DF0","0x31C4F0E1FFE41B7842E60D7EAAD9EA9C618A90E225ADB76A4B78BC1C3F3C4CE8"],["0x366CC6B583A8D8D97166775AA0E7982F03C49A7A403DF0658C5234C6C9C01133","0x1E8D406664D4CB8CAF098CD5D191856F679412BC9289CD5ACB4ED984C73D137A"]],[["0x151ED88FD3B431CBBC106D88BB24DE66EA77EF47837FC3CEF5720924F3B93BA3","0x268FCD3CC4F35A5FECE7A68144FC57BBF4E40AB14B1DEC273FE0D3D1D3B4EF0D"],["0x2698A021E9DBFBAE4835E854061560C717CA3912D0CC2E3E4A6D72EEC078CE7F","0x0722D11FA05F8259CE0346B9BE17BFBB3F1B77FFB73BA249FE97ADFE34E2F02D"]],[["0x111A665347E3F25129642DC744A5119C16DBC5FFCE57E7C5ACE9FA94DEE438AF","0x3713877E1954E7FB757BE6863C6B50DE28114A02A88D55E5571A3012503E1C6A"],["0x22EF9AC251905E540A1F4E8F74B74ED7AD34F9EE8704351C1F47CB7E6E251393","0x24E92391B6A556C7FE90C519F7E157924C501A0279711905B064E06AD590A80F"]],[["0x03024FF9B5FA190DAC28453CF7787CC68681353392535E60682C397926B18D54","0x34B4C48DBE78F57844B8976D4832953CDA99E02EDF92DE4A908CC5CE15B7D27F"],["0x009D020FAD0D895378392006A5C075754D7F0F7CF9F5C6E555E2DCCE5DEFCE5F","0x330BF83513003968DB8D2811A06EFA2BA4692E2D592AE848CCA3385B6C90E853"]],[["0x2A7F24FA678E250467D5A27BE34F181C5D0C02F5A50654043AB52F28B3E46842","0x08FCF61C107E342B0FF925CB58C1268FDE9DE8EC3508EE2DE01D55ECD3786893"],["0x3B3211A5A300CC8D7121F8E61A1ED2968E83BAAD9E804F78DB7D77C64B9A29DF","0x09EA88E6BF3745D733663A3A56212759FF43F58F230B5165A763F2C01E1EF4C3"]],[["0x0C2ACA08BC0CE94C12D8CAEC0A35F9C7ABB2066F448ED36ABF2E75D7DE0AF7EE","0x050299D5A338192A6C9B92A3FCF7ADFD441E55A3511A7399128F3E679D275547"],["0x06DBDC8EBF1D0040DBBDCD9FA318993A7060E1E468AAE82E87339C506BE0A1A2","0x365A946D720D6536B133DFAA2A3CF9E14DC7576CAD7582C23C290F56EC7901DB"]],[["0x168F93064C304731A14FE57199168238D0FB86BD9A14D165289627247C70C07C","0x378EEA494EA8CAA85B5DEE95B59887F9C6D47CEFA0DB242B8A7DEB0B63D4247C"],["0x072639DE712ADAFC14205CEA569FC5FB233CE8CF9F82E2C00B71266F73C9B92D","0x229CB8E1B11C4E1448039EBEDDD11D0D8356772D6DFF3EFE548F102CF13AA8B2"]]],"z_1":"0x39C936F84CA4087B17E4C3EA02C74C3CE984B84BBE0F0C3A1BB9ED9EC1CF735F","z_2":"0x2FF2DDF6841F4AB9B2A33EFAB6B09E8885D55821D1A3CC7B27410F6900961329","delta":["0x061879675CE5FBBEFE26D7901096445AA2B84959B55A419022900B5013A6A4A5","0x398D7C521C68450D9D7921013885FD46C0249A95EA03F82D5E98A7F578A548F7"],"challenge_polynomial_commitment":["0x13527940353B229D71B5C920419B0CBB4EE21C9AC63332E414A12E2F3E7A67C9","0x0582BE24CDB2FB9FE9FBCB1284C9010A83B53401EA6FA783F166566180C277D5"]},"evals":{"w":[[["0x2BB4F62FBC1EC12B4EA2E85CB58A4A55830998F7701AE4D6C8D1D25188CC50A3"],["0x150EDAA29691E1EF7A10B77E5309F078849001E81F07556F14DB2D08998F6577"]],[["0x266B664DF0EDD8A90D0726B519E79228F869B6C7F61CFEC944301C634B375842"],["0x30A944A2DB0170A4915455B5FF4F9D148677B0A17CA6EE04532549AD7CC9DBEC"]],[["0x11BB11B1D8DE44C5B86E9C43263006D05CA6B1F300B15C2CE74F83935338404C"],["0x01F021F950298C8BAC5B10644904EF07438182016BE5E2C36D1B8F1B987DF444"]],[["0x270772DAE4BEA0FFCCDFA08732A782260F26A228C9564CF465700212B8285BDC"],["0x23C80D9D6C65B27D68993EE4FDBF0F2AE1A1D1C45BC0EB872CD65DEA41C9CB85"]],[["0x18C9E33F1CC4DE2DFA320FE27328673DBA81CDE7E44C530877B2ECD293E39548"],["0x39593096B727654B1DFCCA604BD2AEBF4C16FD09DE1091A1C36B5E370E41CCB4"]],[["0x0C3A8900AB58C59A9E85BBF67E6000D5AB1D8F7119586276349F4639E35A7BD6"],["0x033A8A954C0DC0E4FE3F2A05CEE009EB659E8EBA6BFADA244921633BA9A9BC74"]],[["0x28B96AD3B4275549BDF355C2384C0C8447998D52F27E1C717A74AF9806160DA8"],["0x0D72CAFE1BD307A89DC2B4516CD9C1169F8A721F9A89F7ACC986E116599DCC47"]],[["0x117FDB59FE8C1237C124B7C8D98DD6F83D2D28B0373AC4A8C302A718FCB121F9"],["0x202FC11DC586A9DE546A91649D5CBC36A5F21D1B87B68B7AF3925CE80F316F7E"]],[["0x3B63A6F809467FAD46F0A5526F6E3FE1D89442F1C668AAC6F658FBE30AAF33EC"],["0x28193BDD57470F7F3BF7BDFEFB6F4BC72F838BEF56995DDE85C6773A61A901E6"]],[["0x2666B729C665DCF7161CBCCD41E062AAE06FE2CC249F06893A56BE2A806EA88D"],["0x080C29B3920909FC9BCE3327191FEAE980692B2F6AB6840914439C749043FA91"]],[["0x3F90FC43402250597BCC105CBF8DB1B2B593C2F04617233312EDE1334AFC9736"],["0x1C9FE4788EB776B77F15ECC37940B6435B7B568EDE8A80F62BABE962E93FB706"]],[["0x173928D1D8FAA9D70306803F15C8F001D4F4EA06201F72F2460321E0FA125DE0"],["0x3206A3F295B12F9D876AD8B4D1FA3464C5A46D4DA89C27884DC326CFEAF178C5"]],[["0x06B6A13F7A7FDAE921E6D3EE804C6ABE0E71D127EB52B11C195ED837AB631F21"],["0x2957392723A87091DB21E4B5AC7A33AF742ADFB2265AF858DD09902397AABA7C"]],[["0x0BB674AA2286605B31E85E243FF4BF8842E67001EF0A38DFC29FC8DF145A8D0D"],["0x1BD2456AF868CC55FCDE35DCA55E1194446A1F32F76A17922DE7A0205DB4CB25"]],[["0x1FD61A520A5CB619009DEFE9279E303A43DC2BED18180F41D43F105FCBEC8243"],["0x08C12D35B9B0B687E465EA1A78B38F832E9961D034240EA74B309A9F639D2A57"]]],"coefficients":[[["0x0627A94FB7A8F244C41D3280E4C99AEEE5A29A7D70B0CB94CDB262CA8B7F3C28"],["0x2DB3F5C377D755F2B358AA8C3EA4F243E0DFA720AF189424AD6F7127FA18EBA2"]],[["0x3BD738C4D0775CE197E8B458A60C4C3AC4C68C50EA60D51F52D6B427D5407890"],["0x2EE745037D61319750CC184116DE97A4EFB87B6CAF6B1D9177B12BE1FF2FD54D"]],[["0x2F299EE9ACD8DDC7197ACEE4B6ABAEEEB92BE6EC6F463B95DBDB39150C6B6CB2"],["0x18214ED1B8FC70FD8CD76D6DD5A21066B89BB60E2ECFDFB0680D2493A19DDA26"]],[["0x1FDDCAE00D1E2E049837FC633DE7EB0A8B3514B29AF5334C0A57FB874DA7E116"],["0x01995751B0603C2FEBB6D726561342F006174BA9F26E8F7489059E1808312948"]],[["0x02459CCB436D7D8FD7A205C8887669946A502D95BB6D642AB73498F8384E12AF"],["0x271C5BAA4C12C26C47BF3F0344B4C6E9CAEF2CC5308904CF3A391AC275B5547B"]],[["0x3A16A354B851DB460BB6FFF81F30170B15C2F7C9EA64D4786E963A541B5D31AF"],["0x2FCC8A62CDE9C5CC097B6054016BFFE47ED99C15D0F44EF78DEFC09A718A606B"]],[["0x3A14C996A023409FB80141379029DE1A7F8A24B6D08B7BCB1A28D218A437F691"],["0x3F8A1603F939F1E59D23759D7051825658575231B58F5F1206BD5C850D1B012C"]],[["0x394BDA12E7AD1D420554B8606AB4E65BA38A075F1EBD170C13CED572F4B19E91"],["0x22A9D7641FFDFF77AAD87F1075C4223636AD44A78AF191484C54FC0853DF9B94"]],[["0x1EEE3803A0B1BF05A48515ADDE533F87C65CCF98ED3279A2356586839D4E3CBB"],["0x1640F58882CB79514CF2FAA5CEBD539D4050582756056F90A2503B7802275B33"]],[["0x065D67AE6820139FA8D0C6A5D94EF1FF0599711FAEDDA0CA044786D6527C4956"],["0x07787351966EE64DB407FEBD9FABF7489FA00E6CEA2C08CFBD1507AFAE90F600"]],[["0x0AE674A2D61E49EE2B35A576899B310990862967CE49DDD582D506EA160BFA38"],["0x3BC0915DB44072FE918DF6332FE795A93AE72A3AC099E611BE7508B0D90F6B2E"]],[["0x33BCFCA96302A81B98147DAA8BEEB34604C4E00039FAB4A95027DBC90A418226"],["0x061E14698CF755FF2DDFE1276B703D651E246C27A93A0C2008885FB2DADBA859"]],[["0x0DB05051ACFE9A5F4EDFBA5BB78B3FEC6068AB2E03B4ADEC5C354531B8495C1C"],["0x3095428117052AF44A24AEC103FE230AC73020490A8FDE9C19E1902D02EE23F7"]],[["0x0C464EADADB75936A013B994C73BC809E04CA98FD8A0C91F96E2D29B11387D29"],["0x09E3B68822091F34A87FFD30ADA30142863C8B2AFCFD004CA306D6AD9578E010"]],[["0x3AB0B23ABB1E66265D24BB545728EFAAD639A180D5C2BF7DCB31CC151AF0CEDC"],["0x3C6161B20D65ACEB0F41C28062820A792CD9EDFAAC8B26777067A03D1554784D"]]],"z":[["0x385F507AA04EB8A4211BFD2FE29EEF376226A9AF7396BD8E3AE098EE34D58AA9"],["0x3B28FA777CCBBDAC5D84B4C23F213611F79515D472FFFDAEEC219D7A47F57E08"]],"s":[[["0x292320001594E036CD089062123125770BA0DE80586A1C6CDC5F753C067256A1"],["0x2D48BDF734D829B60E397AEB8BD88557437E3E9C2469E721A7713A5E6D2A0B23"]],[["0x2C630EDEAED636BBA329C38E61602E7FB30EEE8EBEA7576E19B477E43BA5CB9A"],["0x3E4AD24BF86473D6C12E699EFD85DBD05DC2CB734A43C09EC89784702BE84386"]],[["0x0C16831491EEB19C38EC60C58F8CC5CEFFED55D76998B514BF7909E708463440"],["0x3FB52B5FCC60F3A160C9D757F3D6181A77BE2246F61C44E10B67991F90408027"]],[["0x3CC4D351E06F04DB03314FC3478ADE9CA544D3A9CD3DD98A2CE135A1C196F9F6"],["0x3D90FE4492552A8A2D960F619020A4AB08065C193D31EEC163C76536C4D8537E"]],[["0x00D890D4D9202578841AAAE15327562A1BFDBDAF351C7429F6363F04DBB04774"],["0x02CA3A63AE0B3241D73B7A9A378CA514CA6909C4CAD11722BEB1723B7E527C0B"]],[["0x1C4E0B1AD6C5BF46395089ECFEAEEB3144E09B646D6ECF9824651021CA87EDEF"],["0x2E4F024527D60C952CFCB7152F3A734A952A351B68B4AAF189F4CE61C2F93898"]]],"generic_selector":[["0x1DBBFBD1CC7774C11EC4669CBA5D7938D08F33D16714B0EA1BC5A3FE3FCDF8B2"],["0x029B1E96C98B7C94E19DAFDFB99D44EC83D75A1BCBC9D775F5B70A7216F6BB07"]],"poseidon_selector":[["0x28E3F367C1C2F1C35D866784A0FB5AB9F6F016E77735B58A3A02D41D32CEDD66"],["0x315397247ABBEA297AA880F7D0070590451A13BF84D4BA344AEB1C6A85F581B2"]],"complete_add_selector":[["0x0BA7CFD2184372F3F14100331338D874D43C3E325EE924E7BE560D646A357F4B"],["0x04557733BF7C2AB212C9DE06A4D3CADB602F1BF335AD76DB9D10A1471F476361"]],"mul_selector":[["0x2A1CCC5FEDEC1F97074FD2E841856CFB987D6099AD7CA7C22808AC3D5607B7D5"],["0x1A3757396C13361C7EB00342DD5DD1E8EE9409701DDB8C3ED0289F53EA89398B"]],"emul_selector":[["0x3B8787A793BFE72C5DCF1083634A4F168A46761BD9C358A184BC081B00020CA5"],["0x0BD96BAABE1B694F45CC1888BDCCE166895D08B377E8C744729BEE4A0D834E7F"]],"endomul_scalar_selector":[["0x10FB985768C6090712801D393CC8B45BA549395A75D1013380A94445197FECCA"],["0x14BBD369FB379A8F113A13AC54FE33E0A7F3EE2F3280F062DEFFD509980E7EE5"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x0ED8647725396A8B61BD38AC6E25492EA4C78F297B681F80BCDE7310563BB87D"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x169C131472DA5BFFD57EF788BF5BF81934483ED35FDDF09FC40091C59EC34BE0","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x187B2D0F00F7700F15317DDDFF51B384FBD65E27EDA9A095CB9099A5A6C5A6DA","0x3FCF9C90C6447C8EF962C77CE4B241DFB1048152A23425371CBE072A68856245"]],[["0x0ADBB3D6924EF3D1FD9E66B67C5F845B7EAED6FC6D0B8842B3DEC084F3F34D21","0x38781DA62046CADFF0990E39E922ECF2F3A42D2D800DC7BB62C91B84A92E5695"]],[["0x28D2D88EF807DD7140301DD25CF6C685DB598BEA8F6F46E35525CD9B7667196C","0x23A68D2D2C0FA32BD54B243DB636F64E1C3B9189C28573D2AE6790F32F7BBB0C"]],[["0x13E33CF3130068A2970C53168EE17C597B2E941A7232C637DF7E3117D20A212B","0x175FC276BF3BD7413CEFF12420EDE522DF7116A4EAF44F81FD3BFB2212DFB8B2"]],[["0x390ED43F036FF820CD92362DCE5A1BEF08CCC531886584F5FEE3DFF789DBE6F5","0x0508276CEAEF815176E420CDF35CBA8CE26FDB32D661509E57224769FBF88E11"]],[["0x002C14EC6F895A60CAC7C1A0016A710DDAC3B9F9E284CAE874F02DD09D008ABB","0x24D9E605EB68EAE18B29019394AFB52088B3150D18113526565D431B22486B96"]],[["0x0C7CC2BD3D231FECC4902B91BC3B66E2C92E7AFB4C13E5949381605BF4FB75EC","0x2F0172F67BBD4ED9DC67163DDBC2BB76161E0DC64325746B8AF23C0B8106EF77"]],[["0x22EEDD56D1BB27659B22A298027A4AD6DD84F0211C5FD320519AE78FE6159A32","0x2F0C39E34FE233BC8866498B7A655F58008A666B7CF6882746953EBFA8750873"]],[["0x246ED0F98A4310830F376BC9E1D332941D69873323EB0490D88E8A68CD2C6649","0x3D2753107FC6DA171C9609338CA6E976E74B86716A9F27C28DA05A0E08F28FF4"]],[["0x33C3A01DC4CFB23F50E18E67FB09700FB68AB2A781A2C276384750EEDED951C1","0x25F10C0125456C0BE42CC38AD1318B02758784082D2117C0A78F8B28E99BD7CA"]],[["0x1F801009A7DE9735397590C957AAD89E754A31FAA6AADC4898E049FB803181A9","0x0B51946C76553C54AA942B29057A94F6B86FE58CEB05E3A6104AACECC418C8D6"]],[["0x2A62D351ADEE1BFD66F3D4353ADE79F1A520551C0517D89E2207676CFB79A400","0x099DD4ECAE39203F9DB2DB2FF9CB7D78714E007F019089C011DF34D4D8E7E886"]],[["0x07282A946B70EAB43D8931068A3759AA72C7106D0A0BB5BEE58FB7369484DCA5","0x3C33944F46A0A4A2E47E21C29F10CB9A24D5B1C042FB254E4CAA68A45721DA62"]],[["0x16C1CEB6AF845C318B08CB4E45132E5A441F689907514C26E912A2217BAF5351","0x01809B0D0B951C04AE1D3808CA90929A5776172E98553190DA5442533F258159"]],[["0x384C5EEB1A3086902A219C39BB2F4BFBFB2D6EC4134FC6E868086CDA66C96AE9","0x29A4F60789D12CF1BA44764FA013906420677D1175220F8EC69F930D3426C9EE"]]],"z_comm":[["0x2217D813B8E0CA9188224B41AFEA5DA15D1FE46F03784AABB866AAD3FE69980E","0x03F54B17F94602D6E081D659BC93E905C4B57B53F8B7FCC929C4B1ACEBBC6F18"]],"t_comm":[["0x08A75C6791C76EFD55858FB4B5C082FCDBAD71FCB062DE88AC53C85C6A0F3DBC","0x312F83FBC152F918889CE5F1D1DE86F55C24D456222922F3B8061D2D066A86F7"],["0x13FBC2906CCF860F07AB0ED65F737E1E6DB131F6CBB5A80B07C5429B49EAF20B","0x3AD35DB9190EF4A4E6EDBB856B142335ED0473254EDD8EB7D25CC05BA2DFE2F5"],["0x2D05D17C5E83AB9652398C2B6D604BCFB37D2C3AA135321A3826BE3BCE0B5C68","0x0685C9CE5F39114896570A8976E82189F05E9A14BBFE3EF3EED59F6B2C20C6D8"],["0x0EE9CC45099D8AED2D8304F1392CC6217872300E444B594FA22ECBE5CD65DB95","0x2AF31B220CF541870041C23A0C43D815D826F83E11EC6185BCD3FCC8A92E043C"],["0x2CECE8E0866249165E5BF6D9725BCD3A6015EE6B74510230F33E1A54947FF4BF","0x101151B2BD58BB9D98E6E3BBC25FCA6ED2EBC168CA2898FC570222B343E5004E"],["0x3C5BF0BA3854BD3D7D40DECBDF7489A86B52E5E183A3FAB9520A15FFC4F784D2","0x1BD2DED2ABAD576B82141F4C8EB891C8F0CAF3B1B1AA367E77A11DF09B54C400"],["0x171B515DAA66DE3E9C41AD360D61967D0D026B52A8122B0CD86DC64605F75CAF","0x3915599D2742E13418100DBC0A60466D2BB18AA95CA5C990E48922A65BE17B9A"]],"lookup":null},"openings":{"proof":{"lr":[[["0x08A227172C15D60AB39D3B30FD334EDE074AC615A4709521175F678B8C17BB06","0x2868D82EA71533E7414FFA66804A53A38E9B6FA6EA038F9678EAF883818C8770"],["0x31FBA222142B02DC589C1374C845691F3C6CD3DFAEC6D0BE3E91BFCFD4B4D5A6","0x143506F4D06BE4AA3777A7A1A4378C5D924BDB9CC105075BBFEEF9DA3296D579"]],[["0x0A8406F0301D20DBE199D79FE06AB67B817DD5BCA653F94DB0E066028A17ECB4","0x37F9FE9E9629A7A58772AB5742459B48C9A8B0BB595C0E4822DBF9138EBE828A"],["0x14BB106BBC916212398544B0605569F8ECBFC4CF85D43D08B1FA44DB3AB9A75F","0x1C46D10D88C34C8C4FF3CC35C80DF2C1FE448DFAD832879EBAFBC83B2D3A6C35"]],[["0x0DB7C244FE04E73600B8A40459E5D483BC9FE0954C30209504675CC74818060E","0x31C8B9E15152EB7F4110678398D7EE230853DEF2635AC22DE7F9E0F129EEB19B"],["0x166A672D3579D3595EDCF62113B68883217C3A5CBE5FBC3355148E482A0C74B1","0x1D60B0360C4C3E57E0C6279B94E3B5C5FDF342870A281345BD9695EE36D858C7"]],[["0x06A129FDACBB04E79E8875961A1A1B5C361ABC568A0C073F80D743F968791B7F","0x083AEF7CE905182A92E2585EFC4B2315366D8B074FC71F7397311F4FB167F1AA"],["0x10DFCA4F41D5D1EE5F4E436EC9A7DB1B79E6B73FADA152894A3E3DE742BB5FE7","0x1681FAA9A970107D089501B50ACAE49C26A832A77FFACCF35AEC5251D30AA69A"]],[["0x359C8FA19B9A3AE674AF8D2EA1E913906B1C13FA8B79FE9007EBFCFB830C31CA","0x1EE12AD32257273821DE6B40C9973DD876B44721DD7819D89EAE8913B14D4135"],["0x1F68EB5BCF974068669BE6E0F33CE3363C597D0FC322EAACCAEA1B9A723236B9","0x201B1C74A377B41C6BBCB36A80EBD22367243292C3B24F174623747554D03527"]],[["0x18766599260B638A0BC5430BCC8267B3D9C925902DD0478E71116B1535BADF0D","0x1DF142FDA2787714E98D71D11C745B5D1F6B3A11D957852A7611F68955569184"],["0x039B16C747F441E0B20E347DCD3EC0C9104DF6CD445034622FFA3DB78832EA4F","0x2388B689C43278D25BEF980CF1DD24E725B6FB8BE0361843BDC724D165758D6B"]],[["0x31AF0DA8CB6EDEA03F624092B9A58EFA1423CF59AE419F1CC6BD5EC9C0300FFB","0x214FA956C87B30F83880CEBA07F03D80FB47EBF321E7ED01D88C4F95AA226F0D"],["0x322838DE62EDEC0086DE9B32035D821617A41D9E12161866BAA98829257E0BDE","0x0BCA8B1AF1EAD57D32837DB364CA1FAC3B1547514E60C04D1DC52981A057A60E"]],[["0x00075B738891D010C37420D901A040529B5945D146C4571B75E61E82775D5AD8","0x3399A8CA8AF231466AF1A3B22FA7F90B67868454BB0064F522CEA658643370A8"],["0x3D6D9F6865E04F3435E18CFDEF5C036F2D19ECB0F447FB2A1EC6DA41A406E1F2","0x2D317A15E7DDEF830B4E74D4434689A3B849E6513EA33379DCCC11B60D3B3FE7"]],[["0x23ECCF620EB0B67C1A454E833404095B346C624081680FF7D46965A415126E46","0x1C6B0907005B491461938FF45B623522A2259393CB86A987077F39415E1D720D"],["0x0BF5C3497ADDC1E8CA3056B47FA0DFE1C1A1A26BF7F84ADCC40288CDCEE4E23E","0x2ABCAFCA8BFD45818C3E8D747D4C330B0B3E724CE0D871ACCBEF85C950D06793"]],[["0x350D45E29F4E04DE357C90A79DE87C2DA303CCEB7E6E2D65AA6C271993C914CE","0x210919B78EA08DB381D0B954568FB6B0D1FDB0A6B7D15DB186909D1C35D23889"],["0x227B5BB36119C1789D96239722074AB0EAD1E2B21CF1D5191077DAC1BF94D799","0x08F31BCC4C20F271C6C59AA998BE1033DA4ED5D59E5B1F2B48419B16CA7D3044"]],[["0x1F91098B771E2985437EB0780D18836D456347453D1363AF9909F54E3CAC908E","0x1538490F415C28CE440061DBF001CBA81F3A0D2180E15370D5106E749BF70EDD"],["0x14195CBF0A1E78CD879DA1322F1D2CD1622E6A0EF1290359C646CE44564857F4","0x1DD7F3D2A1F69A28EE26B3D0A98EA27FF54C324FC58F30457A423ACB74E0224A"]],[["0x374ADBBEB20EF66D9E98374A2331AEC83BF5DD0AF5963E42F8B77F4DDD23F4AE","0x1B677E52AAA91216E15FAEEE8A8F99EBB9D1BA4113181BC7D200D98B6125B2B9"],["0x31DF6A57886A6236F1B51B6689391356ED8D81CAAF27FA48AA08603234CB46D5","0x10D462682D37FF95CC3B7AA3619D601E06810DC26A281BDC8DF6E79913F81DC7"]],[["0x1CA80363580D9824F867B5DB0EF1982583DABE542143E62F46BA0F1370F5434D","0x2399A41DE37335DBE27BEC9026BA436F5465D4631972F5F5E46D1B44FED698D3"],["0x0D038243BE0213C05FBA68C389C76A73977C8A80EC571C757B33FBF93B5AFED6","0x064C42679A6B64A4EF7CD34BA049886AEC58CB1F94DCC050EDD748484DECB0BF"]],[["0x21AEB267DF828CCE5E0F5AB02A5B7CCF90D15E3E838032EB508D40A0E3987931","0x01DDB262D94D21A309B1F92B53F3D35E6FAC388CF0728A3CD57ADDD9C354FC84"],["0x306E4DABC1E714B0BD437F62D4D71A9D67158121FAEF162FCC66FC02B47A2DED","0x0122A881BD4C8BE4CB3570D119E351E3C5BDBB6769FAC801E0BCE912FB8234B1"]],[["0x3244143BD0DC66E9E668FA8C177D08A8703E0E4E67440A4D6FD8486E8624E2E9","0x3E604187456B0E899785A472690E47C51055C62BC35967EE7B9280F3B9415CE6"],["0x1AB299623F7DDA51A97560AA8E7E1FD7D465A359F99E0C19D38D1FED42960DE3","0x0184D57417D4DFC3193BA3A28228A6EB9C4B5E3C3A65FEC338E3B09CEA45A88B"]],[["0x1B1DA87C312E90E0060CE6ACDE0F9EA9BC3F090A6D38BD366EACA42964344FB1","0x303E7AF9835DB7292700B162D6D5C96B56A3B6C5DF7B8AD3C089F3CCD7983CBA"],["0x1E5F72EF648ED7B027B23217C3CD3EA1D46EB3060AE0240DB2E46F8209169334","0x3455094A120C17D3AA7E993AC378B38B0E61E5D4F14092A771615B9FCA8DD6E9"]]],"z_1":"0x0F3056CBB24D0FF7180725D5AA6D9EC2C282785BD77FD8F419FA142034CC4CBE","z_2":"0x288573D80E80188DFCFAC12AAED3CD2FACA2F3128FB456C9195DDA1443FA7362","delta":["0x180AE1F6EAFB7EFC8B813C317EA4A098DF1260AA60954BE93EB26385A43271AE","0x35DE9E6AF36E9C8AACCC84A67F3A8277A3C3D3D0D6BD49D5B005F3F9F9BD9DA1"],"challenge_polynomial_commitment":["0x1393D675143C779F71115C819F035C38DA190FF91BC357438E16B9B8504A71A4","0x30648C404784EFB8011FEDEEF5884C4F0C6BE8854471EB67DC53EEB1625F75A7"]},"evals":{"w":[[["0x2717622A968C85B9AB5EF402568518990D93A9D892A47A83920AC2B5E2E40F2D"],["0x2099DB96F0D87F1E8C4FB5D749D6AFF6AE582F381DF5BB65326061CEC4B0BF60"]],[["0x1BD5EA497D5E08A15BA784F707F82A6309450A6AFF61694B36D7A889F2EBEB7D"],["0x2C791D57C724A511071DA00803363F99FBACF6C3AE64BB2B7DBA3D5DE7D00A81"]],[["0x34FEAD075DB6BFDC4837DFB27C59F3F7FE61D840350C609B9D5BD9147C6F0EEC"],["0x12F647C444E80D72212EF8E825C270C9D1B111807642EF45331814B712909592"]],[["0x18CFACE0422C7ECC14075598763317A42441685320D77E95CEBE9F49C6F85AEF"],["0x1B09E6DFDB5D8192E8447275694789E20B09900C331461865B2A05E6924F11CC"]],[["0x1948CE2CB716020459F6CC48E392114230ACFB1610BF83B4E0027517EB0A1C80"],["0x3D54EE5EA20ECBFE9D01549AE0D61772710D02B55057AEA5C90A655ECDCEC888"]],[["0x2B27E31F70A52E4D77D5F27341194B595DB417B4D4492E3AB972F26B19D78BD1"],["0x1C1D4F081DC002649EF4EEA3C75DC708A10527465A0F127240ABAC2CB050471A"]],[["0x030E0F0184A7030D71D517CC8777BE0265CCF90654FD73612226D2E1E4D84517"],["0x121158BA413301345896577CB4D1D43DFAB42EA9171FC1D81042B6CF0CC67C67"]],[["0x2FC83665563528E30DF49F0978F4F2DF6971ACAADB6C824774F4695F01652ED5"],["0x0EFA89E398DEC75F5688BCB44C386626EEA3B1B7AC1E16139889041B4320D570"]],[["0x0A936A76D1B92A9CF0A9D6B2BBF9714DB3853EF5C37A17C14133F454830684CF"],["0x20DB8782D0A5D8730FD5AFF77177F50C600B20835F5571AA51A7CDE09D0205BA"]],[["0x3049F79168054B1A70A45E0B15516D2FEF30476E20514FC27B5CD52AE17C85BF"],["0x1C3813AB4065FC393C3A655BD1E9E50D645A5E0FB58740DE46071781D38185DF"]],[["0x1E57AAC72C4A07174A7780BCDBBA09F97AA1AD8364804BB974EAE298ADCAAAA8"],["0x1C62B8F551FE6B8C9C89016D4A1B9D11F07EF02558E1BFEF9E799271016DA154"]],[["0x1348CB6AC2797BCAA52EE3777C2F025A199E7804AE276F82F97BFFFA514F1F4D"],["0x18AF8930993220E04AAD18047C240C9CCE9061B1610EDACD9F0A56B809292241"]],[["0x26667D74A65B256CB185D8B0CC5864A296F49098A35167EB3B949090FAB7E5EE"],["0x33C6624741040186D320F9D78DD6C2BCFCFD46F29A74A79656E7280E137BFC81"]],[["0x2BFFED3989B6CD0C63298DA65DA90ADE8231FFD3B3A3755643F6106036F0A2E2"],["0x1CA9578B8759FBE39BEE9AADDCAA15CB2B3340D8B404876E2CE690C3F102B435"]],[["0x386C4005CBBEEC8C1F998BC5CA61A8409E0EDB00E7D83329414B127F2507FECA"],["0x03977A9ED889BA8B0F760966E73E8A558F7C0C9B6489A5FD399FEADBC7FE36E8"]]],"coefficients":[[["0x26AD7993EF298C4046A063EC78015BDD803F4105CAFCD972904D100099893ED2"],["0x2A54F85C76C4DBC9B749CCA3C92CE08AA3F98F1F99195C6608470CC4B4A31A98"]],[["0x393FEFAB33314ADF0F143B66C72015B810DACD80BBE1F02898EDADFB69959C6D"],["0x14AB2127F0A38917FBA3BBD63CF1622F68F9A1A0C72BD1F31ED376DC95779B23"]],[["0x0ED1F1382381B19AF25E268785C0796D1B63492D30417D6D5DD1930F406BBB37"],["0x138B5B0B56CE7FAD73443EA7FB7ED373917E9C297B1D6B7492461D0764EBC3EE"]],[["0x0BEA7CC93AF91540FDF634DA26FAEC8C81C3AA082D3BE8106B3B165D6C147E2E"],["0x3D3998FE152088EA0F1494DE51662EAF8272154035D633CCF5BFE0F0B344E834"]],[["0x1D45FC2D9B834A85FFD90C3755EA0DAEE0DD35B1115B45975D0F5AE3D613310E"],["0x1878BF1882BC2258E1FFF2397B60F4607E38C8B2F986611E674E4B4B9C673AD7"]],[["0x00DCAE398EB5D4828CA020C6E3D1490336972F03DE5507A84D488B3897015126"],["0x1820395A88CE251E96E46E55794ACC3AA4786A2CE76A40996E9700B0C9C22C25"]],[["0x3C41B89805BBA30880F1600EA07CCD8D8F2602E71FDE86F157641A2C06D5E772"],["0x1A4D184FBB804E6C76228CB2FF7BE1B8A49F82E91D11A3CA5306BC12AC95A391"]],[["0x1FEEBDBE13A0A862C9869BE1017420BC55C7B4E4DEE7140F9A6F0B75F62D5367"],["0x31FE7FBB12292091F29EC0E6012D65DEF9ACBD078BD1AB466603223CE1828B82"]],[["0x1F8FC0CE27275D134C2C333F5B2CA7EC0D5D8BB1C3363C6A385547A291833309"],["0x0C93CEC79F9EF8C9CB60ABE3E40CEC3DCB6C91383CB4DFDBD58A507E0D9B8265"]],[["0x2553DC200D6A017FF86C60B52E30D1CF1B0C29B8A2BE4DB53112D1D6ADD7D810"],["0x2DF6DD7460B36A1E22BC1B8ADA372206893C18C2E600566046E1525BE3EF8A03"]],[["0x2684A875F8C6C114BB92E9BBD9EC66971DE34F1F1A661DB2CD8B85DD5A1A9EA5"],["0x00086FEC88FAA07213282480685CF3A5D4A3A613D1FDA96DDCE1265C22A1A8EB"]],[["0x15508BE9912ED5FB9500ED595DDC3648EB3DE9E229568D70B85AE2A26CF495F2"],["0x0EE203B4C530E8E10977D1F5DB4CCD594D2AAB0C64A8F4D16EC9975E887B037D"]],[["0x35FF058EFFAD7CAF79DEA862C888992447F87ADAF69AFBC481CB6D43C001E8D2"],["0x0DF8F09E847EF3B9A2FCA90164F05BDE0353B6F78645303926613082D73DE842"]],[["0x146BDD0BDD12A96E0D96C3AE0B5610382DEB5E386923AC4CA6297BBB95D28674"],["0x1C23ECA46D3F3BF2D9257E2C3001BD768E5F7E34537361024427B45BD9494773"]],[["0x19046EA774269A3E85548BB1AF461DCF952F73F7742A37A03F379EA28D538F57"],["0x0D974E4DE87FD5814528491183ED2672F490770A00318EEB1A2A5013B0BC5AC3"]]],"z":[["0x006E3F47224862DDBDB8A2E23CD56DFD5330EED9D7C37105D9996B9388015CD1"],["0x1D719F32E31328A8193407AFED121C66802F7B8CE258066B972C968843B1A27A"]],"s":[[["0x2016EA3E95D20816B311FBAB69ACD4ACFFDFB476B720FD4AEB2E6E59303C02B2"],["0x24DF1389D23BA5B2C06CF1C6B1F8099363D3E3915368AA88595238FD4975962E"]],[["0x3BE655FD0A4F0DF8D350B6BD0FB99CE7EDD1614E2D87A860D403BF173FD7F4A6"],["0x0AC6109F926BC99AA0CF1C60BFCB341708D7BE52B6C9A5A31513090E8BF11B11"]],[["0x23994E6E910231DC66AB1C2D849FED41BC7E84D67B28178A99706757494B8669"],["0x0210D6E82ECEB96A5413FF957AD6ABFFC4A70CB2CA960996FD6EE9C549C36F64"]],[["0x0DA6BBFA41D237F16E1C95321ABCD758FD096425A93C499F83D64062815BC0D7"],["0x2031FC19E3CE784F630C01647FEA0693235A659CE3E9E49BC6F3F2FC624981CE"]],[["0x085CF568B10E09A1FD91EE9AE3524705BE701B941F3F6EAA52A8EB1A71D912C1"],["0x34AA36EA2FE853829414D701A9BC0FA4D5346905C3A4051DF9057CFE02469B34"]],[["0x213D960A52E04CA8C22BDE30759A2B1BA25E77875C4EB9D1597CD9CAD1728CCF"],["0x2D81392F27BB12324576CCBCC1962E759293F734A73A67844ABC0B2C02FFB51D"]]],"generic_selector":[["0x27F5CF100CE6C3D53EBE637B7B15EC07EAF48FEF3572EDD69ADB69BFB985AF00"],["0x2B465E9CFF9FE367849E2197E718F0A19E2E849F98AB87C889B5C25BA2E32B19"]],"poseidon_selector":[["0x02A6064BF2E2883EC08D9A6B66356BE32694F8FEE4FF33A512BD3F30303C8A5B"],["0x0406D142D9BB81CC503D5A98AB4F8DE25D3C0241EC9ADBE7D1C39A660F9AAA32"]],"complete_add_selector":[["0x2D2EB611FFB1D49E2DDB22CA16F02D3F0F69A4511AC2C2D9C3C93B0D0A668E91"],["0x15D488AE59A4BE268BF4AFE269F6AE9D6235C08FC11965E8E8A126B99931A05F"]],"mul_selector":[["0x15D9857C905F92712081C7EA0408AA760BE657C68D1D31D81243A96C31C2D87F"],["0x2088BD8B69DF2E9EBE19285E6AE70D043C4C245075FCAF4366FCD7F56C8CF721"]],"emul_selector":[["0x33B85ACC22A8A9F5DBF88E5761DACA779B6C73976F2D8881F33EC3734D3E85E1"],["0x27674A4B8A9AE697652BB3C5AE65A0B16C5CDDCC95F98F6150CB633231BF740A"]],"endomul_scalar_selector":[["0x1584C9F309069E98A9F51D33EAEC0A99E8FF72D0AB24CB28EFF78053F1325AAC"],["0x07229A27298B1E0002DDBC36EF99C4DA0B2131355E6AE1AC77A59076523DE393"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x3C60C44F77F0A608526D475B9084E03E4E499466DE970356938A64D4F7C961DB"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x13AAA16027CA0333D77F2F7B51CDAD031AB7EDCD5DFB261AA1F59AEAEE059BFF","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x1053F7DBF327BCBE99CDF1CE90FD78579486920E87A6237C978A6CBAA72CF285","0x0C1D5F4428FC4D2568F11722D1B32307E69BEBE49173E9CCE07753CD875BC737"]],[["0x04EC2E70DF7BD22FEA64037FF9834676E79680B8F6C4A4BCC70CEC3A1C0C72C0","0x0B2F480A690C5C35478809B94D86F3D5E420C282BE0760326B2C1D8B02111744"]],[["0x30D31F50A919269CD0DD56E20CB6448F1BC90DDBCBCD114B50480696EFA9E39F","0x34A3D00EE2166EC9F21E0C046D8B325AE172FC710235A6AB87DEAC81BD799CB2"]],[["0x2F4A4B89922B1D46E6FD74CDBB0EAD65839BB2DDD60CD0C080EB8B1745182F1A","0x09C7571CE2A92C82E378370438979C93BC683319F091535D11DB5271C8F7119E"]],[["0x1D9D57CAA87FC9A2C67BEB39104836CB5DDA82194C575643310764DED0D379C7","0x2436E5A77A985AE37F4E658B959196E6DC43D7A10ADE3F6AE5035015D9BA1492"]],[["0x102ED6A959ED50B7F701DD5713D71D24F21EA94570858C9EEE0A64215FA25ACE","0x296AF9EB4E0985D11760279EBCD7CAD6F57C4F62F433D62209D33F80F88B1337"]],[["0x08853C59913E8780B354A63CF64C00505054A8F05831AE5A0E9D5A2D6C8F6090","0x23DEEBAB7E29E9C509C23BAD08DF4A83E5D2280B05FC98C1C4A00B60A504C1D0"]],[["0x34B4DE4F5B25297ADD80A68D0017530611FA4A5DE09DE6B19E3A24B12BAC6C2C","0x165AFC3FAFF0CDCF4ABD6D1F6549DB3265D0CB13F071D692A1C7CCE52165BFF4"]],[["0x3D298EB78964E9E09E0E8F525BF1C43346BFBF2C7BAAA4D1BB7E1F42B1E69F1D","0x34104382AA17DFC82A2A7E1412F8CA4ABF64A6BAA1F38E6DDC2473BEE6C23FF1"]],[["0x1E7F90581A21A3DC8D52CC47EA06F4C8A71554E0965717C89F90715400C0560F","0x0922BA5C2A81B0C6849A428562913FCE357DB2E1363EC19329C952A8F24377AE"]],[["0x274A6D8C5B5BFFBB04CF1B7D070A7C57C20988FB20D64ECB524DFCE54C27B9D5","0x004284E9E7412084655A4C511C70A5A7D0A5B4423425B0DF0CE135B3EDD787D2"]],[["0x1A7A151F20CD4B5C4641D999994D81454356A92098342C991CC3F1858FF471B9","0x247FB4C8C0B83D92C365E50BA08350312A6CD31DE750C409E009F6B91F9DFF61"]],[["0x1F38140E0FDECF19F23BA38FE35CEDE4B727650462E297A7E55D141F68A9005A","0x1FC294EB2C2694690C124D716B1E9643E31899C13413F2F5F9C478D241BBA0B8"]],[["0x199F10E30EDBC7D5A3BABC4C2ECEA853F5F4162E63171C7C780A90379BD263CA","0x2A30BF1C01F9FEEE83221B3FAAA80BE2F1B8386C5847134457E4CAEE43B0AE58"]],[["0x388A9941A951331B12050E50F1AEAA735C7AC510298B1DDC82BDCA9F9C82DA95","0x0624FAAC44696E46A0591BDB950DB762F002857FEE3643F4E72537A729624DB8"]]],"z_comm":[["0x3092E33E3C34527DAF337A9BA8708949B256B87D83A25388490B55A7EC7CC6CD","0x2B428FEE5D0C4BCDB85F7F5CCF2A3AE77BDCB0741CF418509A2A1DA08F80B1DB"]],"t_comm":[["0x1A5FDA1E42B595B1B9C43036BBC29A5C45A26B7F806EB6490C8070A5CA960D38","0x18332A570FF3A86A34F81AC1D6A5A9C7FB4EDC794892216D029648C5A11286D3"],["0x2E604AE799E8AF869889EB923734DC828E4406BF1A8F40B47F550AC3FDEAADDF","0x0D9476EF46EBE0BF91CA4F8CD427A3D7CFBA6D3BB45ECE8FB6612F8F8551BE32"],["0x17C76319F352371BC979E0C403FE60DADE9FDB689C03CD6AFDA8C287A896E048","0x00F89B5CA0F8B2F8B811EBE08D7132CA09336AEB808A9601B52DBCAE65A721A6"],["0x04E827F41FF71EA6BE8496187ADFA735FF417517091470DE9967EB6773465BBE","0x25695FC07E34D99C2C8E2730AFEF99DDF196DAAB040A08DC226BE8BA9951A981"],["0x0DC580CA57ADC833DB811A30B8342F6B87B8A08890B5C2F47A9A1D4A0B678500","0x0C963F264EF4D436C29434E29F826BF8CE99B91D63F16F2850E9D0D9E0631777"],["0x235E585C2C94588CC39B95C255A1E5F0CD3A7EA34AE32C7E8B04CBE6A277BB6E","0x03E6AADF32F89EF1A5AD957EEBA79D9E6F7E34AD0B975AA81FC9AB82A334DABA"],["0x292188A7C99BB8F53786A2ADB45065E453A7C278FA3F53B073CEFDC3907478F6","0x27C4879596E4912ECADEC665347AE0F407DF1CF76A91333612000392D6CB1E54"]],"lookup":null},"openings":{"proof":{"lr":[[["0x2C2C0379EE0A4D037588310DE9CA48E501B642C5FBFEE3B781B3770D9595D775","0x395F67A793CF52F1B99251D790A3367D5FB057172AADEF0CD868D1C4265A2430"],["0x39DD237783A2B37D494BAD26FD398B45AEE2BEEEC984AA98A72B78D042D20E88","0x102ED9457AD62F29A89AF3CE26268181D29084122354AA93751A9F1BB92D72E3"]],[["0x2B9634351F7ED3B5E00C2FBE86396A9E9C2AA882C593F83084AD1793C808C503","0x2E2371DD1F4190921EA16DD8592087478C3BA824B68141267E92936551367482"],["0x0E910A0D4E5F4F7841B5C5ABB26A572E737E878E9162CC359D4A825702278F5A","0x388C348563E62B39E520E58C4A2DF73AB0A69B0F9B75A29B0A15D15700E7581B"]],[["0x1CCCCE04D5F323DE2F7F45819F556ECC2EF5F4621FE2F4ABE1C3E4B57820E72D","0x3070E50DF0962D88CA8072E4F1188CF6D3221907E9A871EA23F628404B5482EA"],["0x26E6C103479496ABEDC017E0EB333030B7244C1215BFE823126B0F9C2F813B5D","0x10C78B277AD02224D7D97AA84B21D4462F92082F5F5B433560AD2AFADF96ED45"]],[["0x160A94C71659A738D7DBE5D517B39C9A8D3DD14ECFF9998FAE4C9362D2C5BDC3","0x03E954F4CD9711C40E6FFA824A59F80536F08052FA73388E7D2AA4E9DBB29C0A"],["0x32D803ACA993E4B91F79C93870905E2C150D118E1B288003E9E23135B52D12C5","0x087A3A88A160D2864A35602CBFFC1ABA1DDB431BAC6908C8B09C2C3A625C651C"]],[["0x245373A38593A77786D0AB21E9C291B8462F80019F8E2F13370FA99BED7CB336","0x2075B1391AE5E1E0EC00A20C1EA5790F6E21D649D572B0F4F09D89E919BE5184"],["0x272675852C9EE2DB231C380DC904AA2B5A46855EAA366129D8B319658F3302B9","0x170BB68DBAEE132346E195EBF16D0D691179128123894BC00C417284688C1EC3"]],[["0x1C3EAA3DECD4DBE356AD17D3AF736F2D921E71D87514E8A42C7074B3040B55EC","0x1937E159B09F6E7916C2BD1175FBF8E6A5CA3678DF00EE233D2DD557C7CCF694"],["0x16F7692678B754344EE27591B1EC57A701692B8D78161DCFB05625ACAD09F1C9","0x17C36FADE5B791B2ECC726A92A1100253F24FF39D54B76F0CAF9367238A08AB6"]],[["0x21DCA477059A1BE281DB3E9068EEC1A349FBC15485F7EE00D9331074DDEF00FD","0x1BC77B99192F6C907982859622AB67A2736F933ABBAB19BBBC81688EAB32A112"],["0x01848CA012420A72E444573AF2A1B809EDE10CD1F0DABF62B1187D0F9C5364ED","0x1C3AAF6A51CB9115B9C649DE923F17D674BD7A476B6901E71C3E254B7BFD533C"]],[["0x0DA4DA9FEF3F822E600A6D6A1A051D6D290312C752639565B457368CB9587673","0x01344AEB4597E62389F0F3E8C3505BD3805BE9337BED868A6A7556776B42ED7F"],["0x00F1556568401105927103B854DEBB10F8D0308DB4D3F062F955705F974D6180","0x38E4700C921D6490ADC645F8857C328B536FAEF6F669E87CDB458C9DCF42B255"]],[["0x266DB6283BDBEF94238E632E7DACBBFF81298447987D83C089FEB80CD29D7F67","0x29CB03447BC633CD507D73BF3F520E0D9FDEAF0BC5729C3CE2648D42202A2EB4"],["0x3158B810813C40013BD2090740317A219C5FB305A5458A130FA35C1BB193C9A4","0x0897512DE88704675199183EEAA1A1E46F4A3EDCC1DD90841CB15EC2F3504D53"]],[["0x110A1D5BDEBE9148AF577805500F0D19CB81BE91755D81D0F13661C5FD6B5E95","0x2F2DB27DBAE7ACCDBFFE596DFF774A034711189380372CBE8304D965C57E0BD6"],["0x193582D9EE2C1A084C398A65D9FD9FF5A7161DE1CADCD20A3748F3CA9D88330B","0x26A645B19E09A1D6AE19185D3AE22279668662F1C236332D3F2FB08A6ED43C02"]],[["0x300F31601F56BDE7366D14BAF450639F6B5F6DA1E855C9A0D24A7A105029D3F3","0x0A12182697803557D9583EE4314C9438BC5C7410772B25740AB9ADFEDE3770C2"],["0x3B22A10915E850C232A59EC8F609955270228F970B570AAF5847885BAF60DE12","0x38F97C7545A0951347EC112CE970FCB8799F423CDB95E61D97B209A02B8EA034"]],[["0x206DE17A6F244AF0957A144EC0911EE7E7CA1960AACAD429DEE258D89F6987F0","0x208941FCEFA5819B3766BEB6D32EC641EDF5BFE84CB71867F134EF1A37F93692"],["0x24BDAC0C96129E9116C4AF4E3F2CEF151258CC52C7A6590F544A2A8BBE99CAA1","0x387B09F6C3D49147BD598E0E5EF3EF0F3D49AD6BF82793625AA24646A465A4B4"]],[["0x2984B9D685E5F6FFCB53E035DEFA1250288BF8BB2941BFC3A120031DB0E5BDD0","0x06729728AEBC90A3C748CFDB6E4202F9E7B0B58B4E6443905FD51EF3107D9126"],["0x21CD6E9BE3F34BBE9A4D1F05B0719CF553B7CC562F48273F9AEF237980EDA2FD","0x3D31B2D4A6545700B4B0ECD17A8E0A221AB6FC56620465B67D5AFF8E5EB80583"]],[["0x339A1C96B3EE80AF2433490A2DA540310BBD0ECF9960975E13C1BD55CA47B8EF","0x0B8F6F3B570FEEA290BAB9A626F484414F0B8396F8FA2270CED3D9F1588CDFDC"],["0x25724E848E8FEE50B924C1374067B5F766A1DC8B79AF85FA30C3915A5D65FA6A","0x28BF1115830F0AAC665C035B11B8CE54CCFFEA5B5C423B58B6FBAE3072EA620E"]],[["0x19240AE9F24E50864EB6C71EA2E5E8B64212211BC3134239EBCF9EA2E4E2BD61","0x1A92F06E70FED38C1A5CF17657394519E66336A664E00E0284F0954B9B5560CE"],["0x1CCFDD353D01E1B5817E3753E23F7AB812781D56890F152D7C262CD392EB2574","0x0206A7C8CF32A47B6CFA2DB8E679F7D96C57FEA1F8B04FBF3C3D84997416086A"]],[["0x10A6C232E8BFAE7D5A2663515BA362BE7A5C176418F0ABACAF465686EEAD29A0","0x0F8F5A2005BC9A4811EC4D16005308091E7B2774BB000F563D829AC29225551F"],["0x1D26C020421232F1616A9A0B423795B03AC8150463705B1E49F64E15CC81FF88","0x32D468750807B9C6BC999F1148A277F6CF5B6D80EB31DBA9E4A32DD078DE14B3"]]],"z_1":"0x1BDF05E08F28FFD65C137392F19B57A9481E1253A1E455CF70F26D5A494D51D6","z_2":"0x36E5076E82CB445745EA91E27ED4ED22D3B72F557CA3407372545FCA79EA0EF5","delta":["0x191470F7DD5E5F1F7EF2611C96FE948BA4E6AF39A815C2886E2543808DCA35AB","0x159C6506EBB9E562DED7422F48EA3CF504E48EAB590F8BF42F9F8BE15CCD1EFF"],"challenge_polynomial_commitment":["0x359FF0437EBCD562AAAA0691BCF9C082778ADF3EA25999055AD9CF7BB339A5CE","0x3F836C11805BF67449CD68AC70A73DB0BC04EB4C71DEF4618FCA5EBD18B61B4E"]},"evals":{"w":[[["0x041811780481BC72A3EA078535993E0C2F3B751F7D41E484EB7EC2F9B44EC57D"],["0x173E81717340F0AE7A03E34A6497E7B72988650E30925E9FB4AB907D86E366D3"]],[["0x013DE7AEB3B3B0CD664F0C8962F787385FF386F9FD15E8DB2A79801C0718DC78"],["0x16648679EF035AFEE2AAD9666063554648A0AC9CE58F66ADFF0440E19D8F3413"]],[["0x106304E997BDEBC14AE887023FBE3F8D7405F6B594BB76B9A0D374A887E0BE58"],["0x05570C70A5A8E16B3EEB960D2865AB77B3C31C75C5460F633EC8E6F7F0461708"]],[["0x21527BAE9A102A6DE17521F65179BE279C152211BCA7FB82BCBC2CE70A65670B"],["0x08D54F26B8681CB00D5452BE93D09AFD0F49773F10DD1DA0DBAF36963C095BCE"]],[["0x3F4F154C4BBE36A1646FCB47041BF5F78E81A13754FC735DB5AB716578B1ABD1"],["0x1C16946B8C8C32A3E5D0EB236DDAFDEA7AD678A3F189D5779F24FB99655412A9"]],[["0x0B138B5044C063403559DA4ABEE9448FBF6AEF8F26B1EDA86F510BBA52334EEA"],["0x02FE995F1B0C7B91A164078ECF7514EEB93D830ED683A04B02426316C04545F5"]],[["0x1A94E77711E2F5B9D9029FE49D67DD0B27C4677D3897E4EA9185B456FE1E475C"],["0x3A0B3D9B0D063ECD6322EF142F04A64455B5BF5D7FB10628F8FCAF70E5418C51"]],[["0x1016E123B4E3C9DC39406D0DFCA234BC9987F3DEC851397B2F8667066FAAA651"],["0x31F6DD89A64190DE3E29BE3331997A8FEF31F8E537190C2F62DAAE5E0F3B4EB0"]],[["0x30854B3AAECF7957F2E10BACD167C98C3EE409ADD7B7EE7AC3F8E7BA4595EDF6"],["0x2C25915A765D271A3DAE65CB2AF6ED9BE0520901D9F10DFAEF1DBCFE36260ACF"]],[["0x3390796801EFD79BFB89A7FFDF5E654ADEF2068CB3032F2535A29C06360CDF0D"],["0x3D3A3C8D97235ADC424CC131655A63D877A16EE6A76F6FB0E9316B3E5C29D117"]],[["0x24F3DA4C0A157823A1425B3B759526AE88579C4721CBC0CA45A219A5B748D172"],["0x38A9382DE747CDF046E1A48D007ED7EEE2F340BB93EA2ED9C22952D85E06D4FE"]],[["0x1356F9A4F0D0A1C718CC0ABC81D8D0F29F44B8E87B03ACD9908B5B532B5313EF"],["0x0E7D582DD1AAD81D13F8C1B5A320D81C99A6D1A4EE9468DF3EBF24BB93D3E73C"]],[["0x0CF678425CC23717CBACA91B62908D72C0210460ABCE1D4FE940953183E75705"],["0x0EB2F248CA0E626CF4815D861A634BDC13DEBC10EF2FE5EC550BE94C5D973728"]],[["0x3F9988E236DB57390758BB0A91D19EBF2F02259A950AB75C82D3EE630B9FA1B7"],["0x0F76D43C7D4197A1A720F380938E40276F5CD3D382F4A7FE559E62442C375042"]],[["0x09E41317225EBCC595694B0B78C883D788A2AE351B8CD3638DF16B6DBE615E5D"],["0x0F7359B78EED2C6B4D0E1AD6F3A2CEA10742D466A68D0C1E15282E8A98730D51"]]],"coefficients":[[["0x273A0A0110CC8ABDBF809622F27FCCE421FBEC15B13703F2878C7B54D24D585D"],["0x2D35064BB59722C3B8C23471899EF824325C11433C4B9AE3045CF6BDB774DE7F"]],[["0x059E5CF11011C27026D36E55EB5297D072EF750EBA26F2447BE7B897E2E5849E"],["0x36FC74D61C089D4AB35D8DE2F5F6FF6B9721D79C99111F3826192F68BC27F2A7"]],[["0x20CED0EB8F1960CE68953516A9CF9E9C11F066DC70AD431A2F8703881623EB6C"],["0x1263FF7FFCDBB0377103929438DE6E345036EE3397905D939A7F7697B4D82E42"]],[["0x001AA3BCE563CC767D60C1CF8F63026D92F32325AA2B9A71B64EC9875646FE32"],["0x2BA7DFDE79A367981EDE8851F57A27CD975488263B5311F367A728836E435B6A"]],[["0x1E8D53E70454CBFE3BC33C7FBF5B016A17FE969965B7C9953E56B130A8A5DF45"],["0x33A9E200AFA38337E316A8CFF75DFB6708E43276242C11D36DC157715D507E23"]],[["0x0C69127E4454F9F5F5A786E4F4CCE8C24D79D6720D97D47A8232C086B0CC0257"],["0x24CBD1941C7FD7D30150167E9DDB612437D23511F4BD98F8DF4D08A023A3C981"]],[["0x21DA0B3BD2B141B25D9B49A9EF26326A25F2EB5F6E9F580F25EDD60A57913EB2"],["0x0F0DAF83CA4F1A5C09F38B9E3475C838BDB1048D5AB06637F51664E760CB212C"]],[["0x10078E798350A798EFC3EA76DA6AC4505EB58FAC6B3BBC4A77F2E8D13EEE77A1"],["0x31B8A1BE2AFD1562ACA0BC33AF723C32C6D186E715762FC352EB38C7B33A5228"]],[["0x14CFDF595F5248E850229332E4BB1D243A44EE4815E8DBB7C1C99E2DF4465937"],["0x3E7BAD561AAC7E3B7D51B0986628CB730440BC1346AA796D80DEB4EF9A11D6CF"]],[["0x0EDDE573A147C67BD80ED76C593B9921CDB1D391A7BE2C48ADD06ECF386B1F1B"],["0x357E1931815A6E2DA79D76319AFB003B2845B19E34C9C772E19570222CDEE71B"]],[["0x31398FA69572E69CE381CAA5F12DEFD1F5D234569527BBB6AA0CB93A83523165"],["0x22A39EC1AE68F5CE0B7E3242FBAAF97E3B133FB62A20ACA4BDB7C78A76DC8CF7"]],[["0x0FDEBB9025D36B1194C8C71C7D30EED99FAAB05FE72346ADCCFD0B9AD311E467"],["0x1D2511FB9EC3EF2FB5F8DE87F399E3CC92CF3FAA0F8F381DE70ED7B557719CDD"]],[["0x04EC6A1783F3D31F9F7F199A3B4DA0CCA29CD187AD7FFCCFC2CF8FB8AF7FF3E0"],["0x143EEBCDA389E5D2D4575FBEC41BB89186F6A3B9ACC065A1612F57D1092CE8A5"]],[["0x30B3540E959663F1733649D48C986B954B7646A7DD3ACB875B2C49ED1AFB7CC7"],["0x0D36B308DCEB1E701BD57EF4E6A02C92F0F89F217B9DE45A30AF0F4D7518FC9A"]],[["0x04A8E29CDF01F994C63205B0B9C842766FCF7DFA42DD9CF527A89BADF822E922"],["0x04601FF3EF082F6EDE0E5E22223701CA3CA24FB81AFAA17724ABFC28CC0767A4"]]],"z":[["0x1E8F4D8A68859FC0FA2F78A87EBF0AE22EA4C77B24E5A783DC09E438DEC26F49"],["0x3DB3B202EF0635157E2CB942306A3618FC9B8B4F43B073CEE5D4BEC474FF93BA"]],"s":[[["0x35693DBAA9C6D940F29F1E85965225ABFD83D22CB935207395FEAD1FC40EEAD5"],["0x3AFB46C12737898CC887DD6EC1244118FE988D38D9C119DE3B8011F7E126A118"]],[["0x03A55C530FCE2F5B650700CC5804B06866B263F400A5C2659B37FEBA736CB2AE"],["0x27568AF37536FF56E0F428051E7B9A71322A3B670E8A794098ECA882409D1CD6"]],[["0x187032824A8DB1D45C4F0D9CB303BFEA734E123453871B685D80BE00636FEE4E"],["0x355890BC80DD5AE8BEE33AF2CDBA4C7B8C7C706B881503307EAC154E8E23A93C"]],[["0x23349014462614ACF58B311ECA454B3A37A7CAA4BEB7E64B21F705BE78D0AA36"],["0x35F1DCE933D854F228EA65512226355733B60A03F94696AD386658F68B7C8C27"]],[["0x3493B0AF220CF88F95CDED977FA891A830E17BF311A41CA0C8F73F2B3FBB3473"],["0x262547C65B92AA3AFFD86FC4C05400D8E07E273AE0F96426A1F64978EA976415"]],[["0x0FA4524A370FC27979CE4F3976D41CBEA0636B68BA744B1C48DB4D5F43A8A143"],["0x17C49B47DAF69725C75B3CFB463FC99C38EAD63E85BB49DC99DA59B51BE3FCEB"]]],"generic_selector":[["0x19DF8FB6F48FAE11FF806B11DD06E64AAC393F37E2A28053655D186278394736"],["0x11F7F48AA5FF2144F88ABAE5C1CF2EAB61DE5D7AB6A6ABC57B659ACB600E7D56"]],"poseidon_selector":[["0x22896BF7B60FFF351ECFEAE5D88D6D1A448B725F9CD6E5C7F7BC3D76D93EB783"],["0x0CC7E96B58A29009DF76436BB401C3DBF098C1A7C412DF7E12FE09B5BD1C1DC6"]],"complete_add_selector":[["0x2E9E1BE72FEF10D0B9C1DC440C760E995B7769141CE81E91390849BD6A0C262A"],["0x1625EAC29747D2F641624466E331406CBBE0EA4ADC9C2DAC5ED1CD91A54C6FC1"]],"mul_selector":[["0x3794E0C10BBB60B5412498B3DA74908CB40BE0E51E54323C0A6027F14DC73984"],["0x17AAC9D73D919369CA269281BDD45784506EAADB900C0606E0730FB1248921D6"]],"emul_selector":[["0x1584162E77726AC42456AFBBF50B5B3F4436F01BF6C7B4056079DA1750318ECD"],["0x3CEF5048D3502B3EC57CDDA612FAA0434B984707B6A3A79E1318614DB3657CE3"]],"endomul_scalar_selector":[["0x37DB77FFE7DFF6CFC502057B94F60599CC1A02ACFFA2F0D20AD60919D22E3D3A"],["0x2A01EC72CFEA3A7BF2393DAA71B8654455966B52D5A178A3F692CF6055A88F7C"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x1E7BC315130A634BC2733730340851BB43DEAF5DE1D6226F53A33061EBCD9DCB"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x0B69DD86C0939B71305E6A2CA267F970C984E0C08CE58D52E376DF189A225B06","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x3995A6F7567D630E9F3CF0DF47DA3A9E881591C1ED577776CEBD94C1564B1113","0x33D08276F1ED907825818D78FA73BE3960B89AFEB66E0CC4F463A4D56B1885C9"]],[["0x1AC92E31B1CC02D96690F928ECD49A8E97207E4B93F8CB5E68F26DAA6751FFCA","0x2F90CDC9D2CC3416F364B0C5CE7562A237E7728D50B29C3AC70DF55DDEB562AF"]],[["0x315AA728461C5F2BFF00C496188558CDBC7AF97DBAAF0E72C381BFC5B3037A76","0x37A90CDA8FDDF1DF1523A087E7037ECFAD48B9A8F48440713BBFEAAF93EAA4E1"]],[["0x0DF0FB4A01BD88E3F9B364F5559C0E08379306EB692581CC14B19EFF5371695A","0x02EF5411F8F2B5D75F919232E7F16317B4DE3B100BD7C65943F7AF0BAB43753C"]],[["0x3301B1D010D6070CBEFD43DDF52BC878D02D697564CE0226AB662DBE3A55F806","0x1D9F5F7D32ACDE47DA632842D777945FDCD07DB149B7BEB4D22F1BDE60E418FE"]],[["0x149C97B2BC3F854C81F0F241EEE6C97DD5341ED02C9749D85DF4BB56805ED14B","0x0FECCACA2373D0F0DD5FC06D5F538F4502B0BF48C06E079174EF9964D53B67BF"]],[["0x082AD23B302E29C268A325292F1F6BDFF27F8EBE22BCB684076435E5005779AE","0x3B48B68879B29C90CE3F18F1A11C8513665FF6811D8E40EF6E8A61097B85CE75"]],[["0x2DC4485E60E21A9DBB5FE05265A2F33855E7549CA21675537394ACB0F804DDA1","0x1F56668D201CDBA803F221975B16E125A69CCD38EE2043DC47EFB91C222EAFAA"]],[["0x261EE081880F0E8C76F9F4EC90AE22B22BDA67E8286D2D8587F90E8F14BD8877","0x20C5C2D7E999327F651F6C1FD15D573FAD5D219AE3D619D4576E836BC80F3BA7"]],[["0x0E3C325EF99B71AC6FEB65117326223734895B01C973A34D9F800A63F3F19EC3","0x3D6491688A0FA29DE5D1C5E0ED25B2B8BE554F02BBBC3DD4C4374AD95C78094C"]],[["0x048BFA3622D2AE4D6AC0FC3A16160E782A7117A812DC08E88FA459E806056895","0x13DB53AD39CD65B37E1DC732B40EFA74B83A5F1A9187F94AFDF4203BA65F1349"]],[["0x23DCA3B0A0A68D72185F1E37E14CF169D723EF0761142B59A4B7F2EFF6F4B505","0x3D2704E07A7D32D3613C5B795ADB794337EDB09450E1BF99DF821CC4835975F7"]],[["0x2EA5458D9D4E988B08D2C0093525A276162F8C9A31638E36507746E95A8ECC4D","0x2E516822DB2BDF09F0AA8566D0A1DFF53341930F60E840D479258378B5844A70"]],[["0x0280BD24DE1BD95C942DEFE5E1D5956A817EE28B3D2DDB594E13994CEADAF059","0x12508856D180B93CC5035B952BB07FDA0661F66049EFBD19A01C90DE1C737097"]],[["0x0DD935A538853661D5E67532CDF10E9B430E4A82B1E5817EEB8BCD0A82FA1D9D","0x2E6D31F3681F3533DD8B162A28918140F7B5867EF2933875A93F7C7F585C3B83"]]],"z_comm":[["0x302E668944C7F20BC610DABD803B5826747308F57D4015602B64FA56BEDD3948","0x25B41FD73348A9D3361DBAD09BF7051EA0C44926D08A2F3B03570CB3676A9749"]],"t_comm":[["0x0CA5DA9DAA9AD8D4C6CAE3CA1774F8B21FD6495E9BCC3BF84C97B3AC7AEBC4C4","0x3AF7F2EC674A1B332937AF6E7F7973F67DF9CA85007414C72EB30D4AC6259CAB"],["0x2655332B273C9ADA41368D1FB42FFC3A460B2ABBB28F5FE3EACBB445880CA69C","0x392396B6E19925B511C0CC89ACE556B94B8F894295B4BE71D3C3AFE8B59F27E6"],["0x266DFD715AB88FEF94BEA3D4D086422FA2CA5114BF1130A001B9FF9AB008BE31","0x303FBE25E0DF7AF97BCC5A755AB69D14CA16B58006FAFD83AAACB2400CF99AE0"],["0x39CE7E3F501EC8EB5408907BB6429696E96F24A2D492EC5A01F29AC0F321F1FA","0x0893CBA2698C0245903E55C9A3493DCBB990D465527F81BC836FDD4B0670C965"],["0x10AF82329A4554327CF2B3E56B04123F89A383EE414DE0C215ECE3E1D54833DE","0x17C603456C07DD4E3097F44A274B023ABCA5916943C9179D66E2783EF9AE3B58"],["0x3F7A4B12DDA09B52D0EE89D5039086E4ACA0413F691ADC7EE1572FC9CB336A53","0x05A08642AF8D6163D0B29C3CEEE827249E5E6F60D4EE973C345EC740661227E3"],["0x108D29D65420697DFCC34D67221C90A16D04C639A24B6F0C6E58E9EE0B3C0AA3","0x07BD91EBA7C5A11BDC296D793C0299BF55B88E42741BEF0F8508ECF055F0F03C"]],"lookup":null},"openings":{"proof":{"lr":[[["0x13209350E2E27A1ADAD27273DE685E725B9DE6A438894B2F6826D15B8FAD03C4","0x183E473523B966447E080663BE632EB54ECABA8C5D7E20BA27A7D3C8BFC6472A"],["0x2D6E6C5DD25C86EB92753F6E53EE5F8B00C3C08E14B84AD0A3219351669C9E60","0x24497C40E6CEFFF6ABC4BE5053A573007DCCC67859C0ADBC522558F723440105"]],[["0x3DA240F1854583A8829CF8E9F8A6579A5C75F2C708A9C2877B0AB8C6DBDB87AE","0x069163F5F17E3C78E0E29DAFBCE54248E071E1861D1E388B5E7ACC24B942479C"],["0x2DEBE8550659C18B5DC462F43355246271F47628A33631158EDF594241CBA027","0x0BCC09E54C151F7FA52DA61BD70CB2A46D2CA5021CEABAD69D1B84BECDFB337F"]],[["0x11581F6B0EA9B10BCAE3E4FB38336ABEB7B064035C1C5B0B079251680D0B16C8","0x3CDB072AB1F958DC62D19E2B3718EEA1AC5920E5D1FC56A539752814091D57A8"],["0x3059499475657FFB8EE45770A8FD5BEE6D9D5557F446368E9FB965DD476F7BDE","0x34D4285E8C4C72CE81A62C73F86F7B83E6AE8F3A1E424BE4C6E57749E1E759FC"]],[["0x15C3EEEA5F6B78FC6DBFA25FDCD196D7F02DF26F8534012C72C82A5AD11F3960","0x121D86AF974A814847193D3CFB6E55EA551F5A7B6B9AE8A2FC2236A0FB6919DB"],["0x290094483CBFAE7E231E32EA57C5818E041AD1BF37E36D1AEE6DF5F36E1DD96D","0x17B230574A12DEE7A08971E2A75DE7C1797E278800D126F29A5DDB5FD47DFB38"]],[["0x0AACCB68D4F115462688B2144EBC5F370483A4B1069F48F02A7D8F6E7E97037C","0x3DA8AFD992408333E0BBE5E055C87632BB1BD094C319FB6FA606E74FA93956E7"],["0x03105ACDFC28E6C43B15437A2A022D4542F8DC7C8568B511F5CE3A6CD8B9F14F","0x0E03F83962E7E4F356CF1064906457EA2ECF972293108CC210B8D2A1FB146550"]],[["0x39518A6F4ABBD2C459C3D54CB91706C9F91D9D40EAEE4C467C90C71BE5247A35","0x31C6AC5FF36251A08EC50E07E7BBD95CD6898C052D8CF86B97E9C34214D69D77"],["0x2FF679F80328E7337C193FED054A4EB29CB316E1EC220DA85024B6F440C22948","0x18BF2F6E4116F40FAD83ECBB7BA9188DD00C3F3657CDF9030F23B590A70138FB"]],[["0x3B19C3BBB9012CC66A641F8850356D959DD8F0F19B295CAEB48B6DC6EEF85157","0x170396843514C9429A418CCD8C64760806D1C634BF8ECB9942F8F47893F8BEF5"],["0x01C6CFBF4D8E7A998E474E5F7FEAEA84C730915A8C4D4895D2021583C77F15BD","0x287066669CD6C92D15101D3269EA999EBAAB8B9677FFE54A3136DDB8C6502A0C"]],[["0x104E9DE293DD0D38BE3D497D59AB381852CA3C5F43E040E9FE0A3080B0075F9C","0x22E098DF55FB4B25644B46E63C1D14A449A7D4E987A3ECB5B7BD300F649CFC7E"],["0x2F71B74C5866F51FD1C145F209CC799C248E5EE7A7CEC8AA8DFE3C170322A07D","0x0D9B513B248AD72EFAF7EC58EE097D677E448DB8144A2F32781B33A287E0C7B8"]],[["0x1ADA056C81A16600CA9F41F835152F4E86A93015ED367747DD6B11604D04934E","0x3B5BCBCF4983B99CE5604CB87FA9F05A37663FE427A02CC8DC38F3380355A797"],["0x38514CDBEF3C6771534EE920E7798A8305018F6F19BE276C851603928C31B911","0x3C57AE7C8C6B4B65D340B64AC7932833CB18D40B9EE87FB38FBAD27564D009AC"]],[["0x3A138E2D30FA53174992E1DF21AE0B51194612CD12C54D36AD0DC3211602BE67","0x3F59B75A6601C96FEF2C7D6EC8D6F10EAC6D6CBC1DE1B78760A72FA736694BFE"],["0x11961D2AB944A616EECCBA37396B4D8C966B79FA936BF0A3439E65400BC2E492","0x0F71D579C1385A586E39FBE48E0D79BE1DBDA8B78A500F08AE8F76676F28AED2"]],[["0x38D0ED41D0AC16DC04CF8454B4A25B25FD3A5AFC826FBCA11163AF8EA8A03C93","0x0798A057470331E22051197AA0C46239AC827ADB3B288FDD0D3EF5FCA43E94C7"],["0x08FFF441D882727B396F5649E6104D66B6797CA4961323F5F3E5B3343FB5CACB","0x193BFC9A3B2554839B1297EE5C8C90FFCA7A238D9FF5D5AFAAC179F4AD354EDF"]],[["0x3BD0F4BFAFBA4E78C52D459EB312F7B5F1F998DC9779F78A7023513487F12FE2","0x2084A356DE4F173DDB7B32FDA3E58EE75CCEE08CDF272ED7527478AD9BC80392"],["0x00B785C811ABDA620F8EB14233AB994A42A58E94EEDD34ACCE3C2A47B113A80D","0x3C5396433B71E0BE3BA5966DE24693A550594E6E227C67C572A6C36AF0B7BA27"]],[["0x13A929A02B6521595E3079A0BF1E9BD778DF50B8A94D75BE1A548DD871F577DE","0x01A2536D1A4481FCCAA128C981F5C416824FC8881B6739173D96F1529FC35963"],["0x3EF5257FCCAAC4D386DA2499C4F3000ED161A6382D2B4BAAE404EF1C2B7F3D30","0x32F4B2812B716AC9E4EF882F398849A117B82738230EBE11DC8D1D1F8E8C3247"]],[["0x3079BAE7E484E2F0805088975AEE79A0FE8C05E534BE6EAE684EFD162B0E41FF","0x13AF6D738B01EDCA969CAAC56B8E0AC36850B4DC5359D500A48C833B01126833"],["0x2278621EC4CE7AEDD039E74155B077007827037403B3C0E46DD8E825C2C7BD9A","0x0E18751D926D119D0AB0AEBBDA77BF56E597C4B1440027B909EF50F77B49D4F6"]],[["0x1E7F83D600A0DD00C54F832F6E610E5DD86F9A49BE8BB661A68BE427A588B3F5","0x2BFFA4649E123EF0D980CAAECB7A4F7B55B595176AB646AFE9C9DFB8FD562371"],["0x19C67AB76893F10D97A4B42D02FB0B13A037BB8164DB8747D3EEB58493834377","0x2DFED3FA0737E9342995E1989DE0A5C72DC00A4B3012BBD177FC6A58E39D371D"]],[["0x1888A8BAD69C0B4371E86C131F6FC77455AE8E998D412E8C0EAEE242FD61152B","0x271CB90DDA8821A603F54B9BC9268786B1DF73BBEFFB2838FAF0209BCE11408C"],["0x1A19369A37D9FBD5B186CB22DBF73965438BCB091A0A9FA77A77CAB5D8B3FD8C","0x39461EC4451E58F4BAEF549736713FA39F11D4BD60586BD27E5AF09D9578FE41"]]],"z_1":"0x1C5957B0DB5A129477784DD870880D3A684FFEC2C457227D1D97184D42823B37","z_2":"0x0888FD4FAADCBF2F98034CDBCA9001D05BDAF6BD2EE599AE9B0BFFB940217779","delta":["0x35DBCB23CE29860126420DD894657F8FAC291F23CF502F90D240436F5315D4D4","0x3508222DCA768EB013DA46C045EAD6006CC5D0CCD10BFFBDFFB25EACAA79AAF6"],"challenge_polynomial_commitment":["0x21487ACB04C5CDE55F436183E1B10B558EC1AE2F28A451CE4829FACC1D3104C5","0x32FEAC527E1996640B9128128BDC8EF1C31611AD3660A30CBD9ABBC5D93696AE"]},"evals":{"w":[[["0x2377DB62DE757B38B5C63D851A0271683BD5B7774BF0304DF4A7932A308DF274"],["0x2F2D4831B82055F5872FBC62FA4077DCB6F4484DF83C5EFB98A646AF40608ABC"]],[["0x1A971A297BC4EFDB9004A0220978F6D4033E0F3264613631A830A63880FC53AC"],["0x27569A07AF99A04B3051F7E547746C63648FFA945AA8D13F3591E821540969C4"]],[["0x2889A0705E772DC3D33E5EF9979800CA3225CC970CDB27A50D0E7F472A8D470F"],["0x382616E2355AB89F24360F733A6543A4165AB8A9DFEDFD2746BB4D2B301E38A1"]],[["0x0EDBA44989A8608F231BA63CABDA6F1D5410A5C03803BE32E5093EFEE175620E"],["0x31753028EFEC978D1F868D89284C182648655AA3C2A6CFACC8F8E125BBDC7D85"]],[["0x3816A9A650B0F61CE36B886295DB5E67A8FA51A20C5284EEB1913EF38122CF85"],["0x2E2B5A7F750EDB3F8259C7D492788012DD2F8B3E4F9DA17F7CEE47EB8F1C36D0"]],[["0x05EFAD2A05E85FA96C3570A937F3C0D0527C0C64756410A64CEC83E51D222DFB"],["0x38FE3724766445D843F004E9928495D2F5FDBE8D2642D9E4F083D6D7A44946A5"]],[["0x16065868D23C656B20F08E99FC6A93521DF357616BA3C3AF8B0FD2A05ABB4262"],["0x1174B01B5DD063E56933065715B3FE3184AB2B1F249CA97038318D058EECEBB5"]],[["0x305EC9B590C504C2B6DB7455C31CA9295C4343C7EBAFA96700E8F24B50011506"],["0x264CE4EF51E4CC00B7AB417C8481C7AD6A546F24D3D0FA2960FA25BFE7798465"]],[["0x23A454F46A117CEC44FDFEFD22E50CBA883E26D2929C1C9209F7DF4916E1E89B"],["0x094C4CCC55A157C5061FFFD74286CFC3532F9073AA9085836A0A7CFD9C3DADC5"]],[["0x223678367DE26C1874DD52EC0D46149184D8178505BA2E14D01C2F8786154890"],["0x0863A8EB1734B2663C4FE63E59CA46AAF1BF281C0AD512B4318503F5DB840337"]],[["0x25198F670EF2152A4BF869FFDE4DC6F2A6EE361AEF5BB707753087AF4DF7AD6E"],["0x1E538CD83C1CA9A20704C41189FB73B4E24BB8CDE13BDEB718A42BA867C5FC4E"]],[["0x08D512BD43E227123413B3CDB34164DF46FFC08EDC9245E96A5DA7636321C64E"],["0x2B647AD1BDDAD317EAFDE09F86D81FDF8C4B83B692DA9FAE58B4561156AC43DF"]],[["0x3EA9F8BBEAFFDDCFFCB463A5630A9F722B31892B8EE07DFEAD2FE1FFB72D0C33"],["0x3BCD9D4A945765AC68C7A0EC1104F4E32A375927DAB187210FF4E26BF8A6089C"]],[["0x1DEA1FDAA399D4F5FE49C71066C7B31C96892E183A4BF9F94E6A378D0194FBE7"],["0x36EF4E35CADC40480B2DC4CF86DF9559498CDCEABAE7D4BBDE6B3F71C0358354"]],[["0x06C346207AF93B93A0AB8D40276B6C37258F35F51699C355DCEC4C5FA3ABB6B5"],["0x1FE78796FE7608FE0161DF635EA6920E75716355E934C0795468654D834C48B9"]]],"coefficients":[[["0x1609A48D9B24A2F3D9FC523C4D97987290F3BDF2636C558C6D4AC883F5CDDB4E"],["0x398B8CE622F003430F7EE6584CFFE190DDA47AA5595E4CD7ECA8E66637A31791"]],[["0x305FD2C68C387128A6AC4A1D98494EBBAC13F763AA16DDDA711DB01AF06411E6"],["0x032737A13958E8F1C0602D0F39841A1C0CCADE96CB7A5EA5F7291F2A6C258742"]],[["0x3575B0C8B2E047058365666C0BE1C8278272D1385414B9FB47BC9F00F258CE9C"],["0x20F2409C92948B0666B28B8D04BEF898A9ADA29F1329FFD05098E022AA490638"]],[["0x36FB0485B114CB814665897B2386499D539C0FA7E203C7401EBA738E411B5C3E"],["0x3FAA54BF11377EB413FC59E13A4D531796C47CC75DC204E49AC41A1AD7D59F1C"]],[["0x3450571CC6865BB7984EB32A5DE1689184F5FE8B300BC32A2BF622BC32046FBB"],["0x04D33DEFE67E398C06E69ACB3D821EFBB388DE93DA865F83FB807666BEE39195"]],[["0x367A20ED2D5FC0D3A8016CBBC5B96CEA6A88E2928590AC6E2F5E1597ACB33234"],["0x1967215E60D852E912FBA16DD3D316D2A16E8E19D23A7EAA5883805263E84B11"]],[["0x30906F6EC202956EDE27E0505F43786B661CAEEF2ABD58A9B2E9355AFB540056"],["0x0F17007E2891E108BF85B22D5664055A50523A825DFE6367B4A97B296649C008"]],[["0x37342D95F3A5017BA8E796056003AE484119336C15DC23EBE77D82C3EF53CCA4"],["0x36EA67F8B630D6010907FD4AC85443953415E0D49023170E0A6996BDB570810D"]],[["0x0FE9CE9EB7D41D9B12A410C69E193FD2287B327BA7A78EE7B5B7FA560ADC33BC"],["0x04C67E24A4193543230FDF97841E5E558643DA810C396E70E1531669D91E978A"]],[["0x3100E165436552A18FB27A321E43AAD60435CA624DC4AF29100472FC6226A88E"],["0x0A5116E322C37EEC6964512C445A3BC83463699F8D6E51247B8C2D745652EEF1"]],[["0x2FAE7988E2A70BF411D20CF73FE607500AC81E49310359943B9901F0CB91A479"],["0x213442188254A30B61C29CA144E7587D4ADB6D786CEC930D67B8484044E8A5B0"]],[["0x0C2CA39C840985C4EC5B4CF169421B1FCB8C6B174CE1B4075F1FCC48E2B99F8C"],["0x2A5EDCBC03C9F2041D154BC70373F2E69B2137F5A306BCC619E7720DADE9E588"]],[["0x329A0256416B0D2A992FB877DA96E30D8E596D43618EA6FCACAA979862DC3ABC"],["0x1F278635D343EBE489A042C39EB49652D488B2724D99A028222A69189E0B2B85"]],[["0x14D07362929FAC795CA5F0E3EE9B372C20354E1CAAF7EA8972FCF40BF3ED68EF"],["0x02E46618700B300F1E7F76F7D4A348FAC435DA67C8D6A6F8BE5E713140A83AE6"]],[["0x2EEEE3ECE17A1300AEAC87EC44A9D77C925201F9FAEF06743A306023579331BF"],["0x2B15EFD0E86BD8C48D220EDB8CA68761FD292AFE81B7228B6ACD6DEAFE127FA5"]]],"z":[["0x18C01FEC107A09BC8121875E04F8871D8FCB50C862ED1C74FB6736884E4DC1E4"],["0x22BD4A291CD5CBE5C23BCC94860863B00918501EAB4CED92ECC566A39540C3AD"]],"s":[[["0x04F67A16ED243C8DBC693428DF2CF64982A5443522C84D2296B74DF1A424F569"],["0x0D3A96B5B99D7304DBFB6E46CE883F2D879FB3DA97260B095B72D9A2FE9BCF1C"]],[["0x21F0F834D88AA560B43844FA67949FD71944FBAAFB0BB2BD11D04E448E6C79C6"],["0x1E018511283A8DAC9C56E9DA43A89A7964C9D3C2FEB3EDFD81AA22A7EFE929D9"]],[["0x2892A25342D63C75382D86313BA7EAB71B08F81BA19543D1F21F0EC405B7C4BC"],["0x1988F100A548C9B9E3748052CCAA03AB30891D355ACB9203255CED75265D61D4"]],[["0x3746A6D6B93E7B66AC3DBB039D905C643353B4C4B06EBEDA918A838C65D0F420"],["0x242792EC020B466328B4A12EA1B1958C6A63F545F22D8C72DEF324DA7AB4E489"]],[["0x2C3DE57FF7E5E590B1482EB29D4C97E57DFA880A29EF114DCFC7E1A459647222"],["0x39C28AD113AA6B4D3409D8C73D7D034399B3A05A6F3DF1681F4A8EE38FB22C4C"]],[["0x0BBD9CA283C5582E5EE25F1B1A1F6571F2E303D437BDC1287B59C6C27C1867E7"],["0x295B9A095ADCD2CC2240AF3BEBFABC85C02A74C9A72A48CC11FCF0152D3CADA6"]]],"generic_selector":[["0x20FBD005AC31AC70B556CF0412A60AFFF3A8E7F2B3A06DE83390BE043B35E5A0"],["0x2DFAD5755240E3CEF03A05858D8FAE0F06FE3797A66A98A2173A2F77966CA532"]],"poseidon_selector":[["0x35FD17084F58E34E507753E1E59519515501E9D5E20F48615D69418DC3C4CA23"],["0x184EC3E77C35AE76638A71F59E018B63A3862D725E79CFD77E0003A5FB53E0AA"]],"complete_add_selector":[["0x22D521F5F0CC73FB4B1B1E6492E7AA13344466EDEA411F66C32DD7B440D09F30"],["0x342CE7D4AF53D3BF2543E5A21D1AA2D1569A593B17A944B30140492677D5FA19"]],"mul_selector":[["0x0D34AEE9CC0659B02F0815D45559BD711C980DD5078C99DC99434B17AF2B7EFA"],["0x1DB8C76DB4A5536BB8DCE7528209B8F39B6A7EB7AA1B68B10352EEF4CFE88BBC"]],"emul_selector":[["0x3C26A60200230F4D87ECBD931BCA32744A50FF2B81898222A177224815C18DEC"],["0x0006891BAFF32AC25BEE22CC2E2B2A6BFD4A7823291DC8E1BD3AF36044DC3C00"]],"endomul_scalar_selector":[["0x0641A813F834716258D0C79836DFD11E6CB126DEB6BC4947EDE6B8DEE7F5B89B"],["0x231395A66CE5E3D85CBD9B13B7E9E6353C8ECE8CC8D50AA7FBBF1D6C9252AF9A"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x2F1F8E0F16DD4A8B732D272010E04E3FE569AC8E24BB270C5C0550F6D1BFF0E4"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x07364906D30720D5ADCC390AEA191D313B0099BB74A870FE4123E84A829CA89C","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x2E73BC292DB782BA0EADB9CB182EC29A05969809B0CE35C64A963C6794C55975","0x0610F6202D72B6C208D3E8560178E68768929668E80B1101CD8E7E29E7750220"]],[["0x1CFE52A955EF78AA9B0FE976A683DE09997EB68527FC756A60A76ED1CDF5D67E","0x18397CF5C9AFB4914C8D6C5DBDDC1C03FB645936F0273538B6B19E502C21E77A"]],[["0x34D149AED8F96CCA8119309D699A82E4702A210933E3A21AF7733D11C08B23DB","0x2AD8AE6A41A4D7E980D7BCBC2289EF6943972CBD76E4E8573394C0B80A7EDEB0"]],[["0x2F67D672975D87976C892938C956CF32561FCF0DF4074B6EB9897E7C9514616F","0x3CE647E1F1F16D6A05BE6397F52A82084DDF1660D88724203080D277A837C0BD"]],[["0x3A89A3AAD0938F2B3374BD7B9C6D211C88A80B3E07A04395EC4881CFD8B7442E","0x17742086D14936D6B3018D16234FFB1017181C6251CC644BDA2F287C6AB1AE29"]],[["0x0A00D29A002AB845727EEB0861FB79340ADD075A64F7888CC18E5E770D113D6F","0x18BADDA32654A26734A0E9C0BC2959FDD8FDB0E81B6C84B727FE539E9644C3A9"]],[["0x0D0BDCDD15BAAFC0B97AD627677C72126A0DB5F1D4790A9C6FD888F1323BABDF","0x16F6D6BB271CC4FF9F91874B8E6036FF59FDCFCD3A88F8DEA1F7F7BADA639870"]],[["0x07F074A14519BDDFB3B399A18AF127643FECF78F68DA1FE2552C46EFBC6CBD95","0x32339CBAE2CD7A3617B658B9AD99712891C8D79CE81A161F815519B7C506DC24"]],[["0x23214F9E150D6934C5FAD0CBA64B9855B8E502190F6FA0A5F236D9E91CE224C0","0x161CD628317A9AF1ECDDBB28C909175BD29B6FBD6849579A8DE58BC430424EB7"]],[["0x3ABBA862F4DF7588B4C5547AE8C6B91A05CCD0391714C93C7C4679087B36DB52","0x1C3665CA8B50D6C2D09F407968D37424C4E6FACA2D6CE961AC336278AF8856B9"]],[["0x267844A670349B992493A5AB5E717115F969772D1DC6D889C3593E890E590F9D","0x11E9B1575FDB72A2EC03A038B8E018238ED585DF8B72DEF858B248FC4C9EDA14"]],[["0x2272C130499C6B125967E3B68E8AF15409EEE2B743FED9D7201094BE72AE6E83","0x258EF92A063A11319D9A190843AE7E2C64272E9FD374DB6B8F4F601F5F8DF03B"]],[["0x3A709797A2525BFDC2C5EB1B7F6B37167E04FFBDF867E6CD5D45C6353B08738D","0x1DBCEDFD23E212CB60728C03421618E61AD10683DAB63737C1E25AD11B99B916"]],[["0x105096D93A7635EDE3C86533C3D0125B28D3386483E204E940604752775DDFA3","0x34D6F17290448A572A28DEA6F3CBE9AAD3D8C48A15BECFBEC3D1943BE83C35DC"]],[["0x3245CEB4029AAC8AFFA14377F5E6DA73551B7394ACD8348907105754949BEDD5","0x0C10C5BFADE42415D7750CA4C969ACB358B10513E00D39A29F692A9AD89FBB95"]]],"z_comm":[["0x0D866F93B82C0081B0EEDEA2840DFDB85969AD2964904466AF36A19514D92705","0x03D98BAEC5F7392A63A05B728B939073CA363061B53D02B515B9C9FDAF80A3F4"]],"t_comm":[["0x38975611DAD6EDD7D3C7878BBD7A018BC81D7A4B5DB9380CAA3233473B15EBA2","0x0AE53BDDB96F706A464163614A36055E5E3FAD0C71F4E9B0DF9B9ED4E1D9A6FE"],["0x0A8DD05F184A47885FE38F0680C1F52A0FE4A5FF63B9429C39830E77AF9A5A88","0x31EA5C2DECA3D36B6CEDBFD27D23019234D8350FCA707E3ABA6BF14016A2795B"],["0x12569DBBC62BA5D59D6921779D8E41B2FA50400E046D11E75592B5092A7415D4","0x0C10DB2D13586AE9911BEE5B7B97D8069219BA0F588F7BE5522FAEF4A718CFAD"],["0x32430BB3CE49B2D4D2725835ABEDA281A484514124A2E7B1DE3B0D749F71B7C2","0x0E595228F0DF5F0D7DC1D51F069650C1C5AF9E2EE44361058241E3264D70A632"],["0x3496CB85A79CA1D02B47E095B635D19EA8DAE57792419E22A27C6C6EC7605A1D","0x0647D69DC17371E9C7075AFFF1DB5B28B2338ED3BE6AF6A65F36A46AA1023C3E"],["0x3BE2FA3B8FD682EB6321B7A85A2380BDE6FBF5DAE71EE00098D074490EB0C823","0x28977730889607DF5AD689F8C06F85BEEB0E041AC9C6EB6E88F41BFDC10D1033"],["0x37AA1F1572398B33E2F1F6F9F7579415CB84508D0D7C9312D52C117058CD3CD0","0x3913B46BA79C212F4D17D4B7A85357F3E5383E9589514115C84B58237F398454"]],"lookup":null},"openings":{"proof":{"lr":[[["0x00A86AAC125FC6435C3FD09471B6EDEFCDE50E848BB0050BC4884608C46B93DF","0x0158236470D4E5B44D5B4E748DD59542177C986491272AED0EAC1EA70A87629F"],["0x080DFDE54DD3FCECD66C5097924E5601C261188469C0E14D609736E7BB8BFD18","0x3112A4B2F752BD0EB25F32091F85C4FB52527F220C0E72486C3A61F295C33EA2"]],[["0x24D1B41DAC122D8EA138FD4C8DE18A600D7115120E95259AE5709DAC41E217A9","0x0E4BA431546448A716F3268791D38EE836A25B96696BDF20F23B974D370B3539"],["0x20BEBC1F116F57DA48DC487A3D2387EBD93EAEBAFCEBF5E9340F14F48F8AA8AA","0x247574C975635C292BE98EA3E84CBC86B81073045A59999BE470E2061385B8F8"]],[["0x119042194C08376CC1EEE0B1DE49F42E5AC3E58C2DA4133E41DDDF603C61A032","0x081B1DF7190B5D5FFBEBB02D48B04D078AA44B7B9F1B4DF43FB5F3D2FDAC3BB9"],["0x1BC37F837CEF9850A086AA0D5B950922D0C58D60A37D627AFA28F787B3380FC9","0x12722B907216BA9441D1759B1045E749594C8B28E211E70B62C02B59B0961FAB"]],[["0x3A89DF17F7EE0AB507D194727C188620AC9E3FEED1A0193B940D0127C7A88448","0x196EDC5F96CEDBFE2A971CA5A1EC87E740DCECB8529FD2DEE03E1F43E4FF98A8"],["0x26865F45161C43770049D7AF53F0AA7A812DB1CCDC573ACA4B38A4D8241A7FCE","0x0A8CFF3FC7B3EBDBDF2C078CAFA31AC37F36BD054EA52630A2584F58B15F25EB"]],[["0x3191E02F502E472649AFF32AA9EFD42F084708D65A51F907A395DB771FFE1893","0x13A3CC9FF44D47ACD3B0BD3DBD904EC5689017261FEE9EA24657D076A3142E3A"],["0x08C958CC1F8C866408DC7C7A38F4DED56D273ED60AB35B57514E22E2D51FE4AD","0x2F0174496BD49B20FA6C9F2294292122A9CD45E54EDE559846ABFA73FB08BC34"]],[["0x2A6A79B097C0E96A5C7655B4589D2EC836AD0266A4373EB3BAA0C6CD5BEBAAB2","0x21E89AE8BB953C7F3ADA609BF652611DD5305A7794E49C5959D6FA8F57CEB80C"],["0x392AA959AC36963040862F2BDD4263F608DD79BF1A8C6C3D25EA83BF1E5BD62E","0x3544FB1BDE63C66FC8A141993E6D7CF559136CB06B9DD410D6E3666858DD17F2"]],[["0x089B55E2CACA171BE553F65C3087FBE53DDCC300480A5DB22F8077D2DB26DCA5","0x084DE67082CCFCFDA4F46E06CE4041552045B787A9AA310CE2F833E872BC1387"],["0x2F9BECDB4598F1140A7EA14108C6BE68C61C5D1FC85616E7F51E27F5F762ADD2","0x17716A248A0F284DE7AFB556DBBC5A782C5B16362C190FB07045282BD31E73A6"]],[["0x0A0A7334028B1D805C9AEB5D24FD0015D07ED1450D9AEEAA83F4970A851F9032","0x2609A20E17AAD03BBEFC89D9C0AD9DC974C5E32ED389BF948F2CDA19613078C2"],["0x3A115D496E1C8A02D7205F628D4B359E959B508A4C7E7C0182B40D7A27BCBF90","0x07F1605D975EC39CB77443B3412FDE8F03E65968D1D873E0B58AD23587422D29"]],[["0x1B4547D601A83BAF9F7B9421E4F93FDB794ECEE8E49ACC6ACE4F3E4395E49699","0x111AB3FA7E92E4530CFF8CFCF9E8989BF15A12719ED31A6AD84AE79438A4A577"],["0x11C584F1EB8C6F82D6B0EC6E11A07F81C807B9601740263B367E6498FEF32D8E","0x389B0B0008E4FED7F7DB0B09DA63F545789988E889B280F636A6251E933683AD"]],[["0x2D7DEEAA25EE1484F7B146407FE7C215D311BB40DED7C85C98AFBAF5C30F70E8","0x36A42262D29A0E935407480FFC27D9095A3E66BC200E93E44BEB20B41E37D133"],["0x3B22830F22DB13E074559C508506173CD8FA25789ABABF6318536700F8F0801C","0x080942302743362C2E11BE0984262032F150DDFB488A8C712E358809454E10A2"]],[["0x258EB6AB8D027F12043A2E385E0A52794392F814656DB791AE44238525753F38","0x0643E6D353A352D4B5F1A19AB4B2CFDD665A42B8A233645754E3C813708DDBC4"],["0x1BDDB4A6A010E611DD9F7E777BC9C9D62257AC962375C3C9E7033FDF92F44D8D","0x046139026E18D095DC6AF3912F9D3F36E57A2BB2D8009A4707EB0FD92BAE27A0"]],[["0x1DAFC4F43DDA0EAC4DAEA85D007442D297348816464CD21E9D2516200C240814","0x34AB40885EA63E14CE56E97FC1A19F49FE1F76F7C13CBEBE9286B89D79601CFD"],["0x16AFCBDC92EC85C4121BCE613947267B67D9A98C0CE7A1CF1037184084D41DE3","0x1F7257131098E2D29092D3AA986F5DA38D6F195F305951229DB3A8EBFBF69E1F"]],[["0x04F3BE68FF41B78B713CD42B9393D0C0499E72AEBAA20D591C21AC518665F668","0x04A12987251EC662EA860C59A2F8FCD09561A61B10AAEA9ED4B83183F3346335"],["0x202C3F94C00CFB472E1D84C82A87B5CE4EC386DDB75CA6F27447D3D434D430A4","0x02062781D25CC67F7BD7B1870DF20BFFA0EA403C4B27E5FB5D521CF8C572EFD8"]],[["0x1F98E6AA8C8C7F6AB5768F46C9986FF621B6B1ECFD39F8638EF0F8E700E16D11","0x0C088E540ACA5CF5B5B68E72D264A7F98E03BC7634A098ADAA4A089FFB1D2CD5"],["0x1032FEB297E813B8AB1F51F2C354F60C3E3AC2340050CF40A2BCFF416189C918","0x270C7692CE4E4014D8D40C207B5BFDCC55947C300EE4FA1615E12C25B0E11786"]],[["0x3DCB2354517CD33432F5D11C325CAD0D4B93AA8D64408D72B6F14D8A8E763999","0x11909EF7E86DD52F1DD01D312C242FF4CF983036B70672F5B4CA63BFBDCCDBE5"],["0x156E8F641A0416C525CA2270CDA2FC3B109153638D57DCA9C5FFB6A282AA21A5","0x0908E21E4EACFC378530E61E66582800582FDE94DAC0D8EFAE13D2AD60EE0CC1"]],[["0x2E9B3EECA86C168DEB323E0EDA25DDD3A524EEFE081CAD5BFFACF8923375324A","0x3B9561773DE8BB47A3A94870A363B8D99FDEB685AD9193A3ACEA1446553120B8"],["0x153EA46C218148394C0A3B80ABE46046586C12544BD3E6434FD147836F5A7144","0x23C0A881E0F94981031B1971B0E1C3D762194B9F7EA32C5DEE24A03CAE98B317"]]],"z_1":"0x24E4692FB4C625BEB8EA4C46812724E76AD36941D8E311430C24DBE407FB7F58","z_2":"0x29B8D9FC6EB44F75AA3FADE3A73D3CB70434BBBB5F7CDAC34990CFE38265DDBF","delta":["0x1172436DFB10987D1A7E5E92A2606421F512655E81CD8E07B7A063B08C42282A","0x245A354C3901B2E7FC3AE2F7195BE4BA0BA1DD8FD16D63E18CA633CAA2BBD869"],"challenge_polynomial_commitment":["0x2C33406971AF74E53FDEFA8DE32C1C6FB357480CC9A5D335F7B1CC0006089D12","0x37D30F1616B1FCA80609A031F0969449AA8E80DA0619567B65C91A22AF029EA1"]},"evals":{"w":[[["0x1F977858E5700A8BF5C24E3D6F5C9896DADAE2B0C998B018F2710BB00AD3F346"],["0x148111ED4583521257F21F05ABFAB32EE1C9B5947B1F043176EBF7645062F738"]],[["0x1875789A7A4522C3ED4F59CEB89F2A525EC79964944398F23C94785522DFF315"],["0x1125BCBD7AA642F8AE73B504B64B98C5352D64B0E8296472896E26710573930E"]],[["0x3D09651D472C5B5D8C09E577A785C9887FB0CB63725AB1929C95FA5489B790F8"],["0x07525547C23C0F19C57920BF24C66E72EA8E9C176DCE431C31AA0988FBC78DDC"]],[["0x26E4ACD1EDA3A8E16EC0407EDAA2AC48A7DBF1C42E5246D6D3B7ECEDEF37274F"],["0x000C9AC9299BD25BE8672627822E867C137BDE22D1B29724C13194BC963C9472"]],[["0x3B74D2C0EAFB294B71531580F408650FFFC48E55BA7768CFB3BF2D62E942F268"],["0x114C8A86FF65E1329B992EA095590827E6A959618BFAF44F8FF32A6D926F1BCE"]],[["0x275DC9FFD3A408D706E2EF77CFDAB3B4917D8EF39BB4161F99E25BDAFDCC3BC5"],["0x164A8EFF151A745AA376F7CAC12D8415F8147431A32E6F09BCB7C7F071A6CA1C"]],[["0x02D2584D7FE2495E01F4024D393C972DC5F94BB37DF0D9E3208E699C40354FF4"],["0x2C1E7D26EFA13D653B10EE31ED874695A76238BC3E2DAA221430B48D3A7E3DC5"]],[["0x0BC72D6DE6351A435725893CCB887CF799CDFE51F3DA0BE39D5989A06E3AAF1D"],["0x3AEFA79E6F2BDB8E4CBC5B2B0B10CC5E3722C946C4FD81635ADAA316172C261E"]],[["0x2D0FE803A506807E7C014DCEE0CCAFA42F3DE531CED1D4E7E5AB6BCAA59A6680"],["0x3A5F646F3580EE0E02C0FA1104B8B70DB4C388C47D0620F5AF634B00D4FB72C2"]],[["0x2910D385DA30926F70F4A61CF6AC91D5DFE46CD800C61C8D51B0DEE0F8147649"],["0x31B4BE288226E8E8B1B08DBF701FE155B1CC3645EF5326DB4F23E9ED03734BC2"]],[["0x3DD75620168DE5FD0D0025126FB1725011BAD2A599D33A564422CBEEE20651ED"],["0x3605818647348CEE7FA7442DD21183EE0A864E440799DAF9EE71C2AC45EBF39F"]],[["0x2FB287B312FECC837F027DB3919CF1564BD4010941A7422861BBEE655ACE318A"],["0x3D452C45004D9E52DE0B2B1160003A6606B9F2D1389264E0FB794C52A76BB4D5"]],[["0x3FD5BE58BD58B2F8377488AF5B3E2D7356C0855B70C2E97D7E5785855FFB37C1"],["0x3F23227A2B65E17B5977791FFD4A7B07BC57F7797D2880EC500A38F28F249C34"]],[["0x13EB6860003E437CD6AA8CDE58A9A49515E4103C9016A9B13A4F5BEAF646E686"],["0x1F914795B6617952FE908E919E41654411701CAAA2132F839198BCF1CDF5DA42"]],[["0x0C6BC8604C35C68E409F1445FE6DCDE6ACE4E09ADA82D6378A62A9D812F1B02B"],["0x1A013BA043FA2CA1D34CB93A1DB11DEDB02E712CD90A1AE0F7DEF3EFAFC914E4"]]],"coefficients":[[["0x2E8FF957F52F92AFD45A79B57204895932017521027CE48D2CC4CDAD06529A6E"],["0x16C9C14537922A656ACA4990C8D8354A3349FF2E9ABA27F03240A6E32A9B1B64"]],[["0x38B572EF06EBD16F3E1B172D63B5CABD882F8E7151923BCA60D91E6C9AEE58E5"],["0x1F46A157F21D847F89A1C835C07D219B9F767BA137BD03DBCDA69843DECA6067"]],[["0x231A947301AD931DF149C34A4FDDE2F9DB529E6CF1B113758DA21FC00259CD33"],["0x392B1A9309FDCC32735E6BFDA785F7D39869F6205C078F14B3B69E1299381CFD"]],[["0x01E576D387FA1893091FD39E4E58E69E0820C6CEE714BE35E16CA68710DC5D35"],["0x014DB6852C7ACBDF19F89D6533BB62EBDA95D7147C7C45CA58577680BF4515F2"]],[["0x14BA2BDFA36E338D3FB7C941F23B248370A9CA5BAF490E62CF25788692D87D7F"],["0x022BD71E614170F57D75BE591C47CA3339221501DEF5D67C56E7F43CCACC7E05"]],[["0x07FE9455148A009F163BEF51E75C8B877317921C55705103769F7371C372E48E"],["0x083F9161FC100F91D0C6BD454433488DCD8D079FDC36056D05725C40290688DD"]],[["0x2AA86978728E980EE29017439379A82B02D6BEF3129384F6D3B7A49ACDFA6FB6"],["0x3DBA1A56EDF89A4373E332707C3CF5DEE56F029F789AF87D77D513B45F9F610E"]],[["0x021DB16C6C28E1723A7F8187354C4E8CE09BEB1EBE7747A1335119AF84400A46"],["0x309A814F10DB0AB68A6071C76CA1D06D4B1DF95FEA12D4372E6713D5D82452DC"]],[["0x0267DBFCD884BC0FF8B3418848569729FA126D3D002EE9E8FC7A33F572BA1D68"],["0x234FD6F1E1862653E6DF180C5EDEC82029AEA1706B19F06C7FB1607504304DB8"]],[["0x16233A71273EAF7E3606FA91FD9F2FBF5929CE5F7F058E83530C116E4220D95C"],["0x27F0409DA3E243E86DDF28240E46B89DEAC8722A41050A46C0D25D0DE8578029"]],[["0x3F89A11E8CF1B2097E953BA4B979A7A9E0D9B7D448FC08FDE9877F9E732F31E0"],["0x3076B366EF51AA8A61ACB54C89C67AD78F7269438A644BCD4F8B5ACCE4524FD4"]],[["0x287E05CEF7A41FAD10D19847B8BF6139FD2BFE3A6F572DCF9A6A16DCB2AB425E"],["0x371F5AE6C73ED24BD55B7D60BEF4EA0EEA0263650920995D257C0D38A21BC932"]],[["0x2CD87222A31C7D914B8456B2751D439B22B45CC8AEE791ED26C96D5D998B9223"],["0x2B4E256B01E845D55D2104C5149011A5B56B6408DD9B2AAFBC0FA114472A2BBB"]],[["0x1862B8091CAE00697F6A9B03AEDB3F975D2E1ECAA5B01C14FCCAD407F22B2884"],["0x2A8B7046C88E42799BB566C7C22CFF0BF56BA93D1925F62F4F76D0B675CDD1F8"]],[["0x1CB8F3461D5D056B971ED5280802AB425EF81B5F8A8F60254C89B64B872CA3F8"],["0x05771EE9C75535874E960B0119DA07E9D4FAB533EBAAB257F0B193753E8475F3"]]],"z":[["0x057EDB72BF4D5AEE8AFEF3792E51EBFA2E37494BBF4963F20AEA5F6DDCCBF59E"],["0x0DC439D9398716F80E6CA7D7CD79F0122AACDC89178BB27C0907372F217479C8"]],"s":[[["0x06B4DA38B027A9AF87777F038A3A5659303B2A184F85B5BC8D099AEBBD26C32D"],["0x3A4065D4EFE2EDBDA449E793D4201586BED927A78602BD5EC0F50A2FF04EAFD0"]],[["0x18154DD91A069612D49B201222F8EC8EB654B0F39B5F009DB641E66D6B43F715"],["0x3975F5F3C44CCB79AB07D8DDE948997773DBBF777906160416934370CB05D43E"]],[["0x023A51366E6892269A0694AEAEF06B24AA235B4CE36A662235C43D3830C06AD7"],["0x0B37FA3FF6A376615BEB289F32D2EA3D4674F5FBE6E36BAFD938E5F8819AFCBF"]],[["0x03DBB32F0F0F8353A0856EE753E079EB0614F0B5F39845B78CB0091BB4BF50FB"],["0x228C32FEAEAA5728C56E1C24FF36BB3E033275BDAD9479AE6A6B66D4A0DA192E"]],[["0x1AD4D3559F82D0FF6013622643B2F1B8325F8427332840B254E0D5E8068EEB88"],["0x320D6D2FAC6E7D92EBBB833E604BC0171081EDA6697D2324A274D591C89E6576"]],[["0x2DF8910A62D42FF53DD95DD0269186F5056DCB1CA9537FB223587F72ABE9B4DE"],["0x225EC5A5BB1CCF4FC514223283B156283333FF974CAD30B1BD6805462A39D0E2"]]],"generic_selector":[["0x11647E88FE9189BC6390C83BA19F933A74BA6630436C3A67E6CA2B266C046481"],["0x04480817D801965C0855F0681BFA486A30423899F03798C687282269222E98A2"]],"poseidon_selector":[["0x2191DD1E151760619D6134D5EAD6F8C9E509815DAD9DEF0320B0624187884595"],["0x217F0CB32FD70707377296A96B35D2803F04C3252051A469A48E8F4A4C96658A"]],"complete_add_selector":[["0x1261D2B6380BEDAC32F8553FCEDB295D7F54D2BD4389CD96BC187A160CD27C91"],["0x2BA69C2C94F2D2A9B19D627D7BE1AF123F5533618433848232B1EEAA64F33260"]],"mul_selector":[["0x2022F8F1B6AFBC0E1928E79B7760452E2B73DE0B176F0BC6DFA218551B95898F"],["0x0D0B9F9BAF6D38A1E9537E09AE5DB847292EB8BF23BCAE3A7136F977014FC9F8"]],"emul_selector":[["0x02192CD2B9614D90131D08A572645E430689FD6C68573DF21648C2B056B866F6"],["0x280EA65B483F34C60E9CD95E1247FC047EC7CAF229B571DDABEC97F6C503EC9B"]],"endomul_scalar_selector":[["0x25508E77A7791E47D4A72569A20326C2B35512844AFCE5FA88090BB8D673B5F4"],["0x17E10C65307B028F6F9DBB6E900F9D97EFFABCF53904F918B3B70E4D31F69E4B"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x07040450EB0D33A7BACF414EB6CDC589A28E3449DD2B0AD7DA835A2DD8B94BB0"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x063091A8DDB1B95B7D1FE7A2091B2407C8E1BE5F0481380434EFEADC522AB117","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x0B909A260D78AA0EDDE9E14F5DF28A1DD10392BE7799D0D5AB36A1CA7E0D9309","0x0FF47A559CB76473158316F998629DC5C4865C6458DF1593AB19D7724B31EC59"]],[["0x3F496DD94CCA1F32C9AFA9A03B9FF363A3DED370F21505F77D4A17F97AFB87C0","0x3858A40CD4C67B48EB46A1E2188E72B801C8F0714CA106378D61015A6D8D2D10"]],[["0x1A8056E58CE5648E3F8926AE3BC5181D49BE9A6BEC205736676C77012CCA495F","0x0F64B0926580A86ED2FD684D36C6FF2F5D718F20A1A5E7108F0A0B6086E0F430"]],[["0x377B35037C2F45C4CA84E44C64D76FD434D0506ED90EABD8D1A7987F772E04FB","0x0947869204607B0A37F5959C3E63C081F006ABF27C2A8BC1FEA4DCC4C028F888"]],[["0x23179A1B55FC6574CFA350B956EF2B24CEF87746E9938A41C13905CF50611ACA","0x04062A1CDAE54BF65A0C8CF413BB174CCED5558D94747506748BD80F9A541908"]],[["0x03E36B4D3DB7C2DDDC76BC6BBDA9E746D9377F6463BCB21E2C8B1148B48951DD","0x3742F6832D4C50B5D98D173C470C05DE55670D08474350E68778966A05F6A6C6"]],[["0x24C71C310288762EFAB37C0E6033E4D9E87C8B18DA9C8E696FDC219703FB2087","0x105814CE514774E347011B0B6EF6DE01515121BFE074AADBADEB8CF29E2E05C0"]],[["0x3DD3FC7869C7E8B0ABD8B02A6D3EA4EC82A6E23E58EF1A41A5DFDEA3A90A3AD0","0x2359979BC0CE0D93732D723A11D6798F80912A752A2664A68220F5C20E200AF8"]],[["0x261E7676F778E3D7FA019BC6083AF7B173AD029F5030D29738817D6D642625B3","0x3E740158F617FBB51D37E45462FD2C137A98831C5082E90CCDBEB5A6B4F37631"]],[["0x25C06A9B88C57E118197C6823E373518498BF41B9F84355D5F8677482D933AB9","0x331FCBC9C3C46642C7ED8A49D9236903EB931AA158CE81CB60421C21C449CCCB"]],[["0x2042EF51F04504685E42FF64E6C05D311FEDCC71E211C218353CE54D629675CE","0x13777086CD81A5362AEE6A1EE2D41D0FD4A2F1B5CC7FF02AFD818A13FC35C900"]],[["0x0E77359D73C0809BC6EE716FDBCB79D1F9029896C4996A82068DC3B26F9F8B6C","0x32403A05B21BB8F84DB73AFEE47D05727E5A061FDDAD52D495CBE62F65A9C6DD"]],[["0x290B10C6BE21C82A4AF25F9B71C78859BB792FC6B89264ADC348B89E02FA2B7C","0x39FD20C645E0D27CB66F7A6CB398D9ABC392FEDE8FFEF49E32687F7FB4122E3B"]],[["0x35278EA0DD7346F52BF6F5DF29A3CE8C2D0D94858CF6BF997606C6E362961F88","0x0100A1A0D3BDA0F4C25B0DA03974B5C6A812659E8C19754BD7C5117E1458A5B0"]],[["0x0B36AC5990FA262FB4E3F9A634E0BDAFD1CD5EFE4E4F369404A2E6D2104452DB","0x1719B264B005ABA97D3341B60F43A75B049875F8092BA9A5115BD8E382FECDAE"]]],"z_comm":[["0x0914ABE342F6541721C5AE7918059A146E77E647630CB528CAC0245B4CA38029","0x18215B1BB122ECD70B482A379C20B2264DB5BE99355FCFA58665A385090216DD"]],"t_comm":[["0x2F88AB30BF465496AAC56432D3ECBC4B69D8B23B67F33D6B2B628B9DCA577528","0x2751FC16DCC33A0F73D687A51DF9CE277C05DE5D01923277A1F9F9EF9D4275EB"],["0x04AB34AE201C33913653D3BCAEE86BE80B7750DBA7BA6DC3152902D3A040A290","0x3144A0955423F19070803F654DBAEAE2E11CFFCA37D6F2608558A30AD34BDA73"],["0x0CCA1C5B1491E667D21D1EE620F85D451AEB00C9E6C6EEE98C87AB1C51864A37","0x31D5D4FC2847C1D32FED3B71868162F403219A8C6E5CA1792AA7E735BB29FB27"],["0x25000C6E7CDB4CC2F48EA7A6F88CA4B43CE6823BB98B225CCAC3B0C2ECFC2541","0x24BF89B9C61D9D039D5930C91F15796F766CBC25531A067CDF263542ED921449"],["0x2A77DF66B7EE08AF2852DB6D20DEBABA0D7429F5C41A38081A1AD7C6AF5215B9","0x2EF86097C813BF92983107DD85A0B46962EE96B97456D1CC654D88A5A2444189"],["0x1299A987516FB2BA7362DAB559CA2B859C91E18DD0DC738CDF29F7BF74A5D896","0x37A7E72EA97AB981A8C970A78E891F5EFA15AFBF4D072FA5366683F9B0F11AB4"],["0x38FE58D437542CE6C6AE1FFC5B1A7C1CAA9F6D4A3ED8C12D0DC0AC3A12F5E95C","0x2B2ADC6FAAEE80E2367E8CE531B773D02872DD4B99B0D26A3C069EF7D7390915"]],"lookup":null},"openings":{"proof":{"lr":[[["0x2AA060C8FE210448E92670D570921C5B488E6D0B657E2F753B1CDDA31DA9DF84","0x192F39B7AE8FC1ED7DFAD8130D670607597C41A6605B16FA89898728AA87BB9D"],["0x23747DD22380E71303E0D247B9A0FEAADAD7A2162AFD5969079B2B3A5E4B2466","0x263042E77031B337A4AF2879B367541C9E30E13F3BE31FB23BCE74F5264C9DDC"]],[["0x30231CB7EB5F9778CAEBFAFE535964A36EEB86B8AA4A67C5C70530908DD06B98","0x332B8BE7B6D5D7B6E0ABAF3ADFA3F83DBDA9F0A4EC44D4060E1C4BA0EE90849E"],["0x37A58F0A5CC1CA375B2F083D202C50805B2516A670211E9B0098EBA49EA359DF","0x347FD862B97E59C3286AB0142F8DADDB56F0973559EAB2C87F6562B9EC8217D4"]],[["0x3779DC753ECE82CA3EBEA91D7CBD331C6ACC7881AF57DE4C21AA86AA22A6149A","0x2D795D62C366EC70033CEAADBAC179C407AD22BD8B8F48155841B78DB7A53D67"],["0x18D8561567101B5E90A4262742980353BC0B39129E37E32F26210AD6E9611CDA","0x2F25ED6D2AE3280A73F61C4005AE0936E8FE21419310F5F12E6309004FC6FCDD"]],[["0x29EAA5F4C9A6F86BF33AE3D7BB9114BDDB050CA4288D079C1533DA6DCF5B653B","0x1E8CC77EC60252A684640E1423BB5833E1DC39CCF855AEE20295B3B2577A4829"],["0x05BE40DE36F75775F489369B0BC0BF01240B190BA539884738E1D17840B2F2A3","0x2FB5049AD997522D05AECE1F09D841F5AC2375819017783E61FD63B75CA9C790"]],[["0x099A6FDF9387DD9B2E5719C66D9D1883F79D07129C33D52CA160164008407A1D","0x21A030E7FC68D39B27B78D31C72484FF697B0EEED303F44AED32D85BDADB738B"],["0x3DDB8ED2AFC9C6F49F7F535931D5DB350CE88761089361A9D5BB0CEC2A29564C","0x359A73041D519A45650DC31A2374D8B5B3366B5220E0A6BFBD9D704F116B6382"]],[["0x06D68558960A11816B3F882CCFFF2FF1CD5B96A68E734FEB9E18F6A5C348366C","0x1E17900D27AE2D1890870EFD01AB10A74BF055476EC4D5CBFE4AC0CA72B3FF2A"],["0x34741EAB6CB717CE0F52ADFFD82D078A7D941C803F5245DB72E345B44678061C","0x1AC63F99668C6B9C2EFAD79AE2279338DCDC457ED7E624279FBBFF0A66669E52"]],[["0x09496CA29FECAC16699D89DD05FE9FB236950FFECC398586CDD2DFA8263BAE3F","0x0A3B30EC85564D19A67901508B2DD177A144EFC45740C0D3B90A755D57040EDD"],["0x0EBEB08317869AE98AD380B7EDCF8751700D14527053F7600A00060A1394838F","0x23E6AD39834F9FBFC55BBEAD73D6DAFB819BFCD3AB90A16C479D72731E89C9B7"]],[["0x3AABACE7D7EFC5103FEB67E899FAA14FA07289CADB4DFA4BB61252EBCE95726E","0x39C27D6D084537A5625F2A7896131655F4E63594F416519FFA4D89BF7EEF3152"],["0x0E9AF7D6B4CFEF1D0A51FA74F4D8C07877DA7D57593CC6BD0F1828850E9AF33A","0x14B470A86F1EE30EF335EEF13DADE17BAE71DD06384D6B2F04C96974AC103EC1"]],[["0x32AB9A72F157606FCCB8BBB94717D1A7751A04ACAAC9547A9F131D9143F69AED","0x1BE73FAE0B8EB026A408475C91EDA6FCFE4B0ABEE422C93F325CD08F063F6FCA"],["0x12485A3F1E3C831AB35E3A43B5E462475007C777E43720F56265A35320E7CFB3","0x1C453615D6975F3CDA7BC1283066ED1F2D3AD4FFFFB0658C264889DEE6FE5800"]],[["0x1765558D3853F5AB4E3855BAEE48848BBABE3B10E18F9DB0E316EA92E553878E","0x3893578C82290191FC021D9EC10032E7AF4567E8FC73EA068F44023F1F000FF7"],["0x265BBD4F703ECA1E2F402A1D1C870EEB9FCE5BB8381941FA0011624EF8E9FE90","0x18EF35159F56B8727D2F062B65AEEDA89AC8C1FCED04B4B2E4BD16C0A616B029"]],[["0x214174168BDE735FA78EF23C623611C2588DA4E269D4D31C0825F0290A5D4FA2","0x1D3AD576E5B451822092B9289047652C488F119872C5BE49DE0C975FDF4594A6"],["0x29EDFB66E7BED52A3502A8CAB6E97727612F26EA0C3BDCBBA1FF91327EAC911C","0x2CF9165E22F95063BE4606072B7C51F037CF4589F70F7F8EEADE1B440FBA5A51"]],[["0x28465B6154C620F4BEE870176B4A7733D2EC6C93EFF7B7278F2C4CB5E5F9C58A","0x222A172456E96D4E1478BB6FB7FB45E38DD5BB1A9BB95947F9D9B64B58685417"],["0x22B445C21E4EEB22F570E9435FD78C6C051B769A0C8E1F49DE8DA828AA205180","0x084BFCF5CF66576D9DC5D01479D8D69AEBBE34826CE58106EB52C6F9A46D550D"]],[["0x2D0EBC2E20CDA6F53BF80A1D8E5C9E7892AC72BA83802FB3FD9D75DB450B2639","0x2560D5CD181A981EC74F4F4BD4925BF6AF9D3F3367743664DBA1596308CD5214"],["0x0F3D60014265DFCE35278963F13EFFF0496BDFBC3C186D5FB742C4B3F765D879","0x1DFD150352ADC3ABBA32DBE590555C0E85DE47C6C72DD89E35B7B0EBE9A9D02D"]],[["0x3E117BF219236E73C6C75319A56326D72C349CC7F9C1BFDF61908379BACB15FD","0x2071512B19F317769DBBE244F2DC887C3AD1FF4692B77165B55FBDFD75CBEFD1"],["0x040C5BAC5C029D714B7AC7259F3AF0F8A634ACD3DC224F2BD845A35AD0832BA7","0x22EBB5C51EA83F09821F2C2AC0B96A4A801CBFF9A51CC4CB4D5D9D6A9571B509"]],[["0x35CBF28AD4D5E42938D4897F9137784E30EDB5114CC137046254D85B32F2C369","0x0CD8C15ABE356715AE5AA1B3BDD4AC04D7CBCA5B14517A9A38DC3C2DEA5A62A7"],["0x259F417039C106B78073E2FF4499BCDF86FB5D8C17D33329D04CAB55FB7411E3","0x1EB9D164028D315AFC6AD4CFF31F0284E42A74B95EEDCF3B22AA80B3C2FA30CC"]],[["0x35EC4B7520F9EA38DACF416C412F4406AEAFA58A2D20777AA299EFD536231D69","0x2CFBA33ECCDE659FB5679F30E99671FF602E6545DEEE1A798600A117DC252473"],["0x3953A7310B50FA7B5EEC00495B2387CCF752EE5A086D9F2A880503CB247D33B0","0x33C7A7A963E3622950E7DA56CA570CDB3F06FBD8230693FF638E261B9F9C2391"]]],"z_1":"0x028FAB91E0C251586367C6A728893CC7BFD7D0876802A82C4CCF9DFFC0B1AC09","z_2":"0x1E8433BFCE6A1114CCB69E7B155956D9C0D348770C7311890CE2492D2B7EF44A","delta":["0x19E746E491E28D09CDE65DC1BE88D9C62829D1472949D8368A386ADE79822697","0x0EEA18142704A920937F54DD09E6FFF7BE67BA535BC6FEB29584C2D9C4F295CE"],"challenge_polynomial_commitment":["0x066F385F587190B75A2D53D3B80F13B49AFBE4430FA2ECBC31D06C1553FCA897","0x3153DC5AC6D39CFC03B25A03E24D740D14F7831D3BF0BAEA4D979BF0FDB9CC28"]},"evals":{"w":[[["0x19A8CA2C5BCDD6E0C301CD6FEED4478D404B032907A03460BF086EB8CB2F734D"],["0x1E16B055F89A5A5983AF66B51DB655DFCCEEABB4606D7474C337876AC7771175"]],[["0x2EFFD7FFCB6BB51160F7BBAACBEEAA58ADDA55457AE5143B088DACB8892C40DD"],["0x185EC6DAC9DC70BE400308813E73AB87BD82FED986DDC8E69116314FF53AEDA8"]],[["0x3373CFB6A7FD9B9F4AAD3F2EBF5C2801D27500257DC8527F8873D4E3E4C57159"],["0x37236E38A4BD8F49F3F198C6505980DC3E92873F470D1B2E07ED55FCC4B04A7F"]],[["0x1302C6EEA1F9B8B230D87500EAC6E07F82250F7BEC30E2D0F32D41D70630AC6F"],["0x0B3D5C6202E237171C5C5C229B822CC4832C6802401F3606BC25BC70B83F8C41"]],[["0x2B7D5D122E561F6176C260B5D1D4B1F48FF10360C5BCA6E3FFADD8154A0786E2"],["0x22522D8F3BD9BB6746F88D7BA89470B7331CE8D02E5790A5E0FA70F29B7C8631"]],[["0x2A47D31E46E129D5DEAB916AFEF875ACF2C910FE9BD16498B35E5C65F10B4466"],["0x3F7669141183E76A553D7A185061A73313913624C4F2C101189827AEAF51450D"]],[["0x18B65FE76479C30D1D5C88F9C66C65A9F58BEC9F9A48D58D1D11630E8522DB12"],["0x2CBE82BA56C9FB429A741C6ED35C785F8A3A705D9BD5CD6966E4205D36C92C3A"]],[["0x3F99CE8AFB31840C79D4706474E732689A8F4CBAC316F6D12DBA96706C0B2B54"],["0x3D2E1E7901434BAEE74D355B196469B01BD00A60AA1715DB7132D2B729BBCF42"]],[["0x0691AE288ACA1C4FD4AD6587076511D7C60E32605A372445D7606F1E4AD95D80"],["0x3C8B3A9B05140B382186CC326525930D990E52DB0E3859923E31B10F8E4BE000"]],[["0x3F93E91FBC2FC2A07074ACE6FD1D25A53FC1293F8753DE60CBF5E84FA340543B"],["0x2677537A4314682A0F07EF5FFAADA6E81AEABF6D46BBEF95F0F0FE7A878BF5D5"]],[["0x22258104E910BEDA6BB3E2001670BE68D04356F21D7BD21000C6BFAAD19863CC"],["0x28B2113A0166E85C767888293E6CA7FDCA6FB581E8BD37B075AB12C42291855E"]],[["0x21E9A10A685E886FAE81CF057C8877D660A6ACEA5C6A4A576E3CFA22B8EA545C"],["0x369F7BA5FA7721AFB087BCB4AF3444742AB7CEC9D9E162F1E447CD8932DFB445"]],[["0x16B5DF23E9740460CBF71777C324D1577619A5F7B8AFE4DC991A1278E4ACBF07"],["0x2E7BFBA9F943365486A2EAFB01D96BEB022CD483B11F5A658B7DECD6F83B544B"]],[["0x1A68481B7DAD08925895AFE0264C8341CD7AC3B9844B64FF15B9C479412003DB"],["0x0038BC1B06A7F39E0C3F5BC5A511570B11A6A24E0DEC0E147DC1147D0B13636F"]],[["0x0644539B542ECB167E760FF24485A66681299BC391DBD1B2C1584307320D1347"],["0x3C15538994255A58F4F9D8D7257C254DEC12A4B3B055F60325BDA40AD3E8DC30"]]],"coefficients":[[["0x03BB95DC3311010319C861263F12676354EF401B00A69231AA68E3AED5A4CDFD"],["0x2D4216FD84252F3ADA8597E34CB70E7041D3BB657A3DB696110608E8737A28AB"]],[["0x0C6909D71C23EDB9645AA8DDF98BACE27A2122C22059899199B8D1D9EFA9B172"],["0x0D63C7BF3B06250F85DC6E1995A61FB9D3FA0FD88393EE204EA6FDCDAA64E68B"]],[["0x21A835A0DE6D4775DADF411D4CD8442AA1A31157B027386A87BC691AC8E8BD28"],["0x2A0D4B6FAA928217F00A0688DACDF2FB3A986B6683D1E130C087F19936ECD8A4"]],[["0x07D844E631473F0D54CBD11798C1D765025B04FD141884CF687948A080FCAE39"],["0x0FA9DF5EDDE86153A62374D189E5B56261F65904E6E14334D24A937D6ADC8F84"]],[["0x0E3252701B11B76D128F943AE48E02B81485914C72DA622A72394538BE5B0CB7"],["0x02CD8EBD382215D338E7A33DA8FEE96F2162A2D9F542907962F72BF76F2596B5"]],[["0x249C6BD897E968DFEBEB21E85CE4C9B38CB6DAA250A1CC2110AF20D54F969D44"],["0x280A4086C950680EB751146F8388B39C5ED4CAEF463812C9DBE309704FC9E08C"]],[["0x3A0A35353278A980BBAC79FA2B332739FB08E9EA0AFFA42C7C3187EB700BBF14"],["0x3B4610D63685C45044EC976C89966C44F5D3EEB55CDC4C4EE5196B9EAB658E42"]],[["0x200484785BE27DFABD529FA60F1F4BA4F5E7B68106952E5BAA436449E1BF9556"],["0x3781E8841B067A1F22EA00C8424F2568BD184A3A6165C7ACDE8C82E4DEE04706"]],[["0x175AB8BE3006AD93D32E17A92A1C075984F837F59E8C13E958FECB1488C08D4D"],["0x1E9E1F6D65371057ED4A8CF8579FF41BEAC8D6AA87F059E12582E61A4B08B2AB"]],[["0x319D650EADDB3E6CD379C7B16ACFC21078D385B7CCF5229B9B095FCA066505B2"],["0x0807B9B13E0D16BA2CBB6C19CDDF6E722A1AEB465BCCA5E102A4DAC00AFEF99D"]],[["0x1D53A11E276F9B030C458EFCF91BA8ACEF8CB0DA699897184AE204598DEF8BCC"],["0x1A1E4DFF9636DA13D7F097EE09DC8D0C9289056974273F4626835BD39AA9E2EA"]],[["0x09784C742B5388962BEC338008F8D8B8A7138EC0144F8B5B0F1B3DDBDFDAEE12"],["0x3EB1E33243884380F0F6469A31A6100AF8877CCF981A86653F2AB93CB44262FA"]],[["0x2A7A6612A16596A204D762F9392A7574FC23CEC6913ABC6DB05B21F0D03B3009"],["0x25BB76C8DF9427A726EECCCB3C1E8FB56513AB9FC58686622D24D2819E6489C1"]],[["0x06A7CD7D5B3107AAABB4EF6B1AFE53C45277C7C6ABA8E257D8F86EFB83AF1520"],["0x3E845B53378D89FA9938D7ED4F9AFD16ECB95286AFE8EB1E80688AE5F7FA307D"]],[["0x1256650E8EE71A704D9C422180E4A8F9AF0D48FDEE552DCCEE0A42C56E5C41F1"],["0x3816FE2E55B80D861DFAB0479879D70F12AE609A36B3B91E7F967DE72431F5E8"]]],"z":[["0x28587124142100023C9AEA0FB820966BA1D86D9A0633407834CF8EF68E99FEA4"],["0x03367D224D825E0265656C112C45A138EDB7BF91846888837AD9EC7752F50AD0"]],"s":[[["0x0AF21FB90ABE828DA3B54E6DEF3ADE1180C95292AF4F69DEEA94756718AB8C50"],["0x1A44FB195AF804403DAAF94309DC03E4084D30EE720D68F730D4225437FCFE6D"]],[["0x2D5F4373677ACB4619A26F6046E25FAB807C6434EB81F6E0F4DAB03A1F83B62D"],["0x18FECD01F61FE6BF76A3E56C9EEF9E5FC0E0CB3E2355B31BA78B7D7373E83FB6"]],[["0x307E5E12C38E95DA2DC31C53ABFB982F0E1E8D75F1B2EBA394573401CE962287"],["0x29FA061CA5A2FCE93CF7F9F7A71FB9585141EACCF81A6629FCD028F721636DBA"]],[["0x1956C6E040022D706B0CC41008E783CB073CBBDEC7800E138015B745C4B250F1"],["0x1EAC72A3B8FDE9EC0F00C55AB2ED71AEC4BB3F3CDB451E7D011E608024DE57F5"]],[["0x232F2250CC0635FD02083144DB5D7B5744C10817BB27EDF80D76DFAEE03FA5A6"],["0x194DEF11AF229F277D022F37F542D9776F06A4C4F6F76249AACEBAAB1D065BF2"]],[["0x1B2F4B162FAAAAE2097AF210B83DDB7CC45B7320A26F3B12A0FC8E23BB998F22"],["0x20A071D7B3D2609778492B37036579C1AEC81406F00EE139E2E6CAD70A4AA8D9"]]],"generic_selector":[["0x37B40422DCBB9385FCA6E1BE9F009A5664B18BB26DDDB38325FD6212AFC4C61F"],["0x03B8ABA245A87908E8D07D0465FFBCCFED3CEB0B089C57F04C5C0EAC5742C975"]],"poseidon_selector":[["0x3BBA179940996ED3991B941B3F5F90F327BA348B3CA8569B93B76B7045D6DCBC"],["0x27316432F9DE37D0A1A767B49D92818C0E3DEC35EE64EE273746BB2947307D30"]],"complete_add_selector":[["0x1DB071409108314F64FFBC231BA5CE60BECC958872DDB36593E436288B9E6E26"],["0x1B67ABD8D0B5D8FEE432DB171EF777C762F614EA3D17A436C92BEA5C9418E5B4"]],"mul_selector":[["0x230A19A99BBED5DB70F8524775AA6D9013348702B5FDA283F51503A99CCBDC20"],["0x3161E535E660446AE00981F47EB04EA71165FB6A6A312C0F233FAF6F80369A70"]],"emul_selector":[["0x3E355AD04F260B88D207C56D0F887258CFE2D953A547D05F7582ED3AC0AF06A7"],["0x289701B655D8F94412E64BA877F830BFDC1FE234CF161F0B3145D66763851004"]],"endomul_scalar_selector":[["0x38B58CF86A05E352D60F88D8BEB9215DAEA7637AAAB37AD5D4E27D6CA49B1105"],["0x08B0B5369F76FA491D90886F557081D68BAFF98CF5A79439D0AA3E7EF81B90D8"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x3A604F9286DA060D3F15584C45821AF80B72DDE31CBEF0264F8BFCCBD4F76031"}}}]},{"verification_key":{"domain":{"log_size_of_group":14,"group_gen":"0x1E5587687024253BB079B38D9C5371594958E496C605D3BD898B34D068AFBEE7"},"max_poly_size":32768,"public":40,"prev_challenges":2,"srs":null,"evals":{"sigma_comm":[{"unshifted":[["Finite",["0x2E1BA392A00DE111B47C704EBBD87382427FFBEBA2AC2CE2BA264CC51E3BC790","0x26B3DE969086079CB6A4B786DA27CC37E0A88D56D76DCC3B4CE5F49AB0D3AA29"]]],"shifted":null},{"unshifted":[["Finite",["0x0D149B771E2875BC64E26367286DA442FFF55680D6C195139CBFEC8C4475B5BC","0x13611F6910AE992655D8476804AE8662E0B1CDC7B516E93A7B5D0C05949A03B8"]]],"shifted":null},{"unshifted":[["Finite",["0x2866D41D0F4568697CAE2E29E0143418D47BEA50F1AE12425B89331098D8A3ED","0x004BFF1043678595301AF8FE0C298B7316AE437B71E1E859F76FAD73DCAF9C75"]]],"shifted":null},{"unshifted":[["Finite",["0x0C0A0F9037E1A0BB97A38BF8094693528DDEAF854EC70E4353CC5CE5C2A30CB2","0x09248EDD46C25527015B6C072D1B76541AA1297EF03F94180A7204C88DCF26C5"]]],"shifted":null},{"unshifted":[["Finite",["0x342AFEF0A1B4F12C3197FE74C6062CF723144009FD86E4E78CED54433AC498EB","0x13A25D9CCDB85F839EAF00C8CC6B98E829E0C43409AC31226E3E7492B6C081AC"]]],"shifted":null},{"unshifted":[["Finite",["0x14E9A3C599040F5A7257370AB0CF6D633A23A2647D30A0C201614E2A3419DB99","0x0EE1E0F0E5F7BAA5EF3EF72243D730F10CD46F8112CF8BE313428C528ABF352A"]]],"shifted":null},{"unshifted":[["Finite",["0x143B07B690BB601E6036F3F4992149A9B73AAB158F6536F239FFE4E7BB00059A","0x256C74B6A9540CA03362974176010574297558A064DBF2EC0E08FAB6171EF16A"]]],"shifted":null}],"coefficients_comm":[{"unshifted":[["Finite",["0x3B80AF498D5B2A24916701D23FE166A15D07118FCD3C4EE13BB93794359C0EE7","0x204A3EFB41ED3409E73F2692AF9228CD6CEA288662A2C63843310B0890C3567F"]]],"shifted":null},{"unshifted":[["Finite",["0x2E9E5220459C1604306466B5BBDDC9EDA3D070C5D4C03EFE56E2C0AF42F8CFB6","0x079CA3ACB258FF770A583BFA8E3C9FAD50849068E14B64BDA80CBEE73A9A691B"]]],"shifted":null},{"unshifted":[["Finite",["0x3C71294AE4FC806E09F7373F3BFD1162697B22DB30D872D53D7930CBC0E5F627","0x2EBEECEA5FD198F21FF92A17467F52F71BAA3531BE894B0A93878912B7AC9454"]]],"shifted":null},{"unshifted":[["Finite",["0x0365EC6FA6CECBD31B161BDDF3F05EF238DFD9BC8A0F557D28D584BCF6F37017","0x2AD15EC1538A9A4E0BED6E91E2B05AE8EC7A1C2397FF69F7106534EE460D4AEC"]]],"shifted":null},{"unshifted":[["Finite",["0x2C8C051DE7C26B58EA7980BA15DEA3376185195C88994A7514588E9BF894338D","0x1E74BCC50501AFCB9416BC7E5318085BFF381C9CD630D3A9DC091F5045BD99DC"]]],"shifted":null},{"unshifted":[["Finite",["0x091DA1DB50002CA51536B07F22C73B509A6EF0B2F5091DC423620DCD01317BA6","0x1F4C23D9F633A7FD579533BDA65B8D4FF2CDFE61A6EA4622EEB175A9E28978F8"]]],"shifted":null},{"unshifted":[["Finite",["0x3D0934AB41D41E63D5997E9057D4D78AF3AB629C0AF2100286FBA85F134D286C","0x0B55D1A90615E96F36E9E472545710275CFCE343FF5E8D6855C15D9AB0CA852C"]]],"shifted":null},{"unshifted":[["Finite",["0x314581EDE333D5DF81145C7135AAC1256A0ED8DE0F373E2DE5D6611BE451DD03","0x3F0413D92E6B11ADEB947399BFB444FED650994815D450EE22CC7F269B582821"]]],"shifted":null},{"unshifted":[["Finite",["0x31892AB0EF9007A18B6848D7CB34A81EFBCBD2B3036A340C679092547365A2A3","0x264CC495FA075632DA8422EDBCD433FEC19A4F8A51DB148FDC70115071733E0F"]]],"shifted":null},{"unshifted":[["Finite",["0x13C82FD025FAB969F472C5C12F5E4F57900C22DB012B76ADA26A6E2E7F7FC821","0x0FB4B331DBBA3496C166023B9144F1B63C3510F5E6B0F5EB2BA0DA9ADCC54218"]]],"shifted":null},{"unshifted":[["Finite",["0x37D11D9267DE38801E8F6F122157FC3C8FE0BD4FD513EFF2DD16CB060B0A3F5F","0x3B604CD996282DFF6B62A1B703872A1E9F097A01270C7AAE366C3113D06A65F2"]]],"shifted":null},{"unshifted":[["Finite",["0x3381AA1D603B2FBFDC07D3595980818B9951778D8B8C749C82DC8C8E220D9AFB","0x064762117042E4190071DB64DA1942D354A52F27A16DFC8C076BD78358AAB02D"]]],"shifted":null},{"unshifted":[["Finite",["0x33261352484985743D417BA2CEDCB1EA3350B7C866A7EF0EC16FD56775EC1910","0x0DBBA68C8DD57441290EC0CBAACB2FCFE8C1B66BCD82C081652BD48E4B2BB90E"]]],"shifted":null},{"unshifted":[["Finite",["0x3F396D7EA673FF7780810CBA86E987220CE8FEDC200C0C7FD82130BBC8901164","0x2E2BC6D59064975C81438A0752D5FAB68D9A982B2AB9783D818FF0B9A50EBE18"]]],"shifted":null},{"unshifted":[["Finite",["0x2CD7881A5E1A8AC5A93560747674C900355FC9C1FAC557551AC4245F0448B26D","0x1DD59EB809F1AAF32C6AFE0066208F98B88D3A39B4EE1FE3294290B2DEB127AB"]]],"shifted":null}],"generic_comm":{"unshifted":[["Finite",["0x11B6A2820578A4614717340BFAA4E5191DF1CE850BEEBCE5AB8B54CEAADFC3A1","0x076AF659D4EA65535FEDF29B860C24B4B5C4C169EE071EFE90B0D2895DC0E8CA"]]],"shifted":null},"psm_comm":{"unshifted":[["Finite",["0x3823B56EBC39DA397F591B5FBCFFF8AEA862F5615B1CDA8A6A59AB71DC8309E4","0x24A95165F4BA7182B6F2A17102773046AE2C9DA10FFE19E7938A6DAE51692740"]]],"shifted":null},"complete_add_comm":{"unshifted":[["Finite",["0x1A3D03420742C22690C09300D3A089A147AF67CD6CA1119B0DFF258E8F15B95E","0x0E59CBCCDA1DE60D5E34C73E3F5C33CBBCCC14B2D883B21CB684E8F362B7F10E"]]],"shifted":null},"mul_comm":{"unshifted":[["Finite",["0x2F9E472859CA4102EB9C3572AA5738B73CDA521600852AFA855109801BA64A85","0x1423FB421325ECB991EA017D09283D5D2C5D38AF4449C0864733B9CA6B7FEA28"]]],"shifted":null},"emul_comm":{"unshifted":[["Finite",["0x018B53E3C45C11738FB48A03BEDB61472324E4E80995AC4D19A7AED7E96F916C","0x304AE6D227798FB1A465DD40E581CDE95C88CF9A36BFB6F718898843E2D0E44D"]]],"shifted":null},"endomul_scalar_comm":{"unshifted":[["Finite",["0x1BE58E4FD71CDD885AC5AD7A158C92DD0C3FBDC9EC5D00ADC525CCDB1B2D5F84","0x122D91EB1FB77AAEB91018B297C0B8F73DCFE1ED6546C6DC64496624BFB23602"]]],"shifted":null}},"shifts":["0x0000000000000000000000000000000000000000000000000000000000000001","0x00B9CDC8FD0BD4B27E2A74AF7AEBD5734D52D75BDF85EBF1CAD03413E914A2E3","0x007CF68160D84012626E0046A932AD12E68B3394D6E2A001A537FFB40D3527C6","0x0077D45AECB939AE97A3952B48189964AA209609F19BE4A4B89F339A33440F6D","0x0077C7E54505D4771F6AF1FED2195500481EF1F3C0397B0AC819E678BD2309B4","0x00B3AF68ECC6AE7A4727F0708EDF4736BE1C99281FA380846E42264C62407484","0x00381CA4536FC0ED935D50A74A87136F1A0675B618898DBCE67E564AB20174A1"],"lookup_index":null},"proofs":[{"public_input":["0x3F4B6FA97CE0E1580A6897A5C55C57A33CDFDE4E453424891A7F0459E0968197","0x37EFC51DDB18544E95F0AA08012DFE9CF601BA5B9080D9D37227A9C6D960AE11","0x06D1DCF98AB0E02A1F19D740B86549C7D6C8D20CD6D40F93151CF0DA3A8F95D7","0x1F0DFDE9A82336EE82A18EDF4FAD9D6301129140826AD8FF3A6B4F4D21D3ED97","0x3908D149CB45E7F51B4CB248805098143B51CE1E985496B08325A465BD4BB453","0x00000000000000000000000000000000CA19F24C8B92BB92DE7C19EFC42196FA","0x00000000000000000000000000000000E984D04BBF29E0383DC97A301C29E0E5","0x00000000000000000000000000000000B6D16D3F4D5C68A81E26F73A7CFA1645","0x0000000000000000000000000000000099B6B30C1CF28F74E1301A699A8EAF70","0x00000000000000000000000000000000C9A3C4A525BB2CAD34560226C9AA499E","0x12A0E38139EDBADA80EC3C9282734B7AA268D41721188B014C83FD089A98C26A","0x190AB8565ECAC7106F52662B5DFC94E219EEE407675AF98B7670BAE2600496A2","0x063091A8DDB1B95B7D1FE7A2091B2407C8E1BE5F0481380434EFEADC522AB117","0x00000000000000000000000000000000F526570A52194CC664F590E02C92A4F7","0x000000000000000000000000000000008D70CB3D764F87E2FDBAF32D977B8052","0x00000000000000000000000000000000A6FE3165FFB88016D6CBA1017A5B5842","0x000000000000000000000000000000009918C4B1F768372AB65271AE30A77533","0x000000000000000000000000000000009E92A173208248302959F77E9B0B26FA","0x00000000000000000000000000000000103B584F4860BB90D667005FC0023CC7","0x000000000000000000000000000000000CE79C3D0379AD8EF13ED54EDBB44966","0x00000000000000000000000000000000C5603CD73DD0E19673885D964ACA9442","0x00000000000000000000000000000000474C702D98E76F965AB9E4C279E8BEEF","0x00000000000000000000000000000000D16759A0E1588B9B13A6F2CD4D89A40E","0x00000000000000000000000000000000455E5212BDA0DE443D10308B0A95F20D","0x0000000000000000000000000000000085ED920F4A0F2B6B74050F19587CE0BC","0x00000000000000000000000000000000198CDBE114C2F8D37774EE385A90248B","0x0000000000000000000000000000000063123A06FA25F055CED62C826A52951E","0x0000000000000000000000000000000040C903CAA06CD89DA37A4A2550036732","0x0000000000000000000000000000000021BBF0469DB3615A676D7562D6C66AE5","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x07DE7F8B95444B6A48A1E61684B64520C31AE99AF4C7529FB1FABFA89B1C1C20","0x3B5A9A8A0A92B6643A95A15EDA9964B6A88A516DE0BDB6F8C1C380A3FFDFBB07"]],[["0x0F4778954D3806E46CFD693FC1E65F591551375E7B6F3854263F7A5C26A1D66E","0x341DA32AB45126E03ADA5F8BD7D3944EE150571C1D1AA7A3051DE12995188DD6"]],[["0x0C62D330E77708F6C297656706D6C064E4E15F6BBD22FA6965765BC4B31EA319","0x151784EF876EED84A00DA256D2294B181C167DEEF7DBA6396AD658A44784FE40"]],[["0x0354258399FC8D54BE339B9F2DEFDB456CD6276AA1E9E9D603AA50933F5B95C6","0x0940B90226819ADC32C32055CC547EA2C623DB122A5DBB3A94D605FE54E77C05"]],[["0x2D96A09A064107CA8C8931A20CE041416CC2F58D761AAB79030AB2911AEF5030","0x3C19ADBE85F4A11DA71C7B5A42AB14F6A64F68E3D8C6D9BBC21E379AF6B967C0"]],[["0x3D89FA3C29DC41CA0266E2F7E7FFEC4E2A4FFBDCC94177FC326B5A86BD2C02F1","0x1D3D319896DA1B1B114971D3584936F8F2C1B7F09082C1570EE2E818B4B22A00"]],[["0x1A1E0E1F3F49C087FEC08458C5BB0DABDD4BAC62B41D397B9748F1511AADD323","0x33D379EA0061A2D4C04171931B6554862E04EEF363D5A1B2774C4A5FFAAEF3D2"]],[["0x3674150DE0DC0BE190C903E3A3AEE1330ED6A2A754F6F63C621E383F34ABCA56","0x34B58B280183423C49CFE7D273ED7CD757C9EC30F1395BB7949CD6D6A5DF6D28"]],[["0x3C446EFDA2BAF856081284EA3B6DB65A77B31EA8343DA76CA9187FEFE6A85CF2","0x0B4352031338CC5D2893EE15D6FC7FE0D751E69489E9DC17B1006C194DFFB2BD"]],[["0x10726A8A359712854C01CFAE5D7710521813D4213C1D7136C30C92F4C14DF969","0x135EAB5D988DC692AFFD27FF0A67CF582A83D4867058F9A5D86EF6DFFD75F24A"]],[["0x030999E9CB61CA0F1B1DA368532F2C9D8E88832E0D3176E359B8D1E48648C0BE","0x20101FD7F851852E24C345C4A0710D1CAD9B2DCEB1568D099B576C9CD5188794"]],[["0x16D42026F6A72C9ACED546EDD24E381A1A7B8030BA1F6B59E6C17AA35ACCAF7C","0x0C5D16068584C1C5D3F5C687C25B32D3B037D5A0D32955A7624620AF93311C38"]],[["0x1FCEE8D8FF06F3B1C1B2F3D6E5BC803C58EE73ED3B958645FD58ED1EB0845267","0x0120CC27646FF174B59CF22145ACD38D4655636C2552895A2E0794683EF3BD08"]],[["0x38C4B7191460EE90805F535D92CE2736BD5CC0B7010662D8C5844F074EDBFB62","0x31A6906BFD8E2CD93467229158E6082D4E95BCCDFCB85BBD90B5FACBA12B0B6D"]],[["0x34CE3F3A7E854DAAC8702AA335D26DAC010C772A8F40FAD1449BC44C129DBBC3","0x2BD43C095CCEBBB47E8553858465BCF7AB22B22ED48F11A5EEE951D583E3664C"]]],"z_comm":[["0x05E3A313F3CB969AF4C751DA9ED6D4DC15BBF22CE000653E20A0AFED7C93DF7B","0x17B3F6B37FA99C31B3DF8249453C0972BB2761FDDE9D482D985F5610E94D2D40"]],"t_comm":[["0x36DA94A7A25E9C64D5396D1B156DB28D48C9124CF21E83E44766CFAC79A4980F","0x3A30EE3E9C853D7958E7ECC54B03859AF08211A13967F4058E05CD11292C70DB"],["0x1348CAAC55207ADC48D9A62661B29042BFF02B6082DB6440D7AEF235AD4D84B2","0x1BB2DB7018865C65F0A58D7D9842F49CA9C17F30B2F71CBADB3FB6A98A5825D0"],["0x0F50F6D2C9D36CE0D5F71D06E465B2B20808C99D83F5B59ECC5207F74559BE5C","0x1CA608D96C2801FEFC815B801F19AC851FB87CA06C1CBBC591BEF9C012C267C5"],["0x23525ACFFB8E27BAB661585C036D840DAAF0C95EBE0EB67B13ECA8B8BE3430B2","0x3A5E76D7CBEC59E436A6C51F77E5BD75F3A8C681EBF00044CE5F26F85B515FB3"],["0x3D0C7A9C5044C17E2FBD632025B5A933CA6F5DF29600E2B0BD32D22647A3EA63","0x37AA17B825FDC96A59178970FD525D5E787B7558F0A922A6C616693F7D432BBA"],["0x24211BD040774C480C70E37DB04DC390A46ECC8587FC943A65ADD5DF2A73F72D","0x2174DAA272E45F619E38D1B3E28FBC1D56697FAC344707DDC4FE8C2EB76B1D71"],["0x0B2B0134AFE814F49E6635C1BFF74F6C11A3F4C712E8A34E96761FFFE91177C9","0x149B7426B94649576A69DD2B1FAFFCFD3820ADF22F78CC73106BC076900AA001"]],"lookup":null},"openings":{"proof":{"lr":[[["0x0D190B57D3C9BA4C540002DAE1CAD2D78B5B242AA1019B3B7B69F5855C077BF6","0x33934BCFB8A43D85892B792C23D28FC0E986DB327E0996A906A2B50DF7C3E751"],["0x353002E67DE24D87503E025229C9B2721E99519E888C5FF3DDB2C2364900BE7B","0x32BAF340869D73FA1F1A053D6089F0C8A1DAD0FDED7ED5E72AB508601F705F03"]],[["0x1CDAF5A590C6DD11E886F7033A0BB6606C8D32BBA29FF1E08EED781B8F9DC134","0x09B73DC184CAAC57335186AE850DDBFD3CAD176679FFEADBC2C63944A5328B2B"],["0x39AE00583F55014000E5C4136FE796E2EE65FFFC9B675E14DB9C0BD6C1873B5F","0x1D812538417EDB8F29A21916C2C4E505CE273FE5F81653F7BFBEF454F72806C6"]],[["0x0376D8802F6405846094F752BA89670635803484DEB5E3B90C4B88C267832863","0x0975E6406A89E71577583610B6EDFFE15CC6DB45BEB4D68DE2F28D958BA01CF8"],["0x02F9C83EF83B18CB8209B1B4CEAF2A66BAD8B83DF7447ED646F2946A0A60C200","0x0DA412063A0D5D8F342544EFF9E3B1643CFCA9CD7338EED5853643C63E1A7E05"]],[["0x1858C54BFCF6FE241449279190C6B04ABC5D46DBCF1F2895BFD136E93B9565FB","0x11995613328F73BFFFC48007F775536ECF77DFAEFA234C1AAEDB9A2A6B6826C3"],["0x115F90ADC1F14E6029ABB8FA402340DE325180343B54171934E1B3B4E6A533C4","0x3106BCCD8B5F4BD59AFD50CB0AD078CE91F837E6259EFF2939ED7E30F48A219D"]],[["0x1E9E17BF2EF01E8DCC0A9326F8746041C58A973873F7D54D98746D9145FBD1D1","0x1BD7AC867CEF57E6C5426ECB0BC8FBB81702F7B3F29AAB93A7F8B1D78ED1F296"],["0x0ED0A057CAC139738A860B436F12BF034DC621EFCA511086C786D3CA883EF13C","0x29D33A5A8B6E58FA85CB8ABA3E23EADCD70A2E4B9381BEA81A68F6C9CADAB478"]],[["0x3FE498062273D60123E734373C5286946CB4152879350EF8D064C82903092ACB","0x008174D6843CE8F72EACC56C7DAF8AAEFBDA5A68E190FEC7636C91F3CDBED904"],["0x3EFBCAC92CA88CA026EA14ED90F14F3B3B5D142FC3D86BC11FDF6A57A2FD66F3","0x1B6154FD045C120289F84F9A4020A88B93C124160624CA6E0C4230F6B7E9A3C4"]],[["0x32CAECA324D106D1D8E0CA9AF094BBD07EF1335C9148148BD8CBF49FB0EC779A","0x0B06627F364FAA5071909632D71C2385DD3CE59318B7D11076155EAE6754BBD6"],["0x2E717BDDF05174BBF290F507ECD38D957730CC655E9EC87A5A704A71BEDC8FED","0x361E0FD710AD55F561AE65F7D5318AD3A66BA02308DBCDC3AF81B8A4DD41BE8E"]],[["0x2104ECAFBF4A74987216A86B7A8FEFB239C8081B885064C15DD0CB910AF40DD1","0x0127D437C1522A34DF8A8B485709437E2E78AF5AD1387188478600FE0CFE453F"],["0x3DBCBC84DD685AC005B0641BBA49C2AC07B61B665CA42A5061A053DD88F92B43","0x239A6AA2F7F4DC4CCAEF6BDE5415FFAAC50E30DA41DFE0AAF2414D3212F9618D"]],[["0x3FB8BBFA5855220E963671B0D6C0423E7AE30416FC0424479CFFD69EABA4F3A3","0x275DF4194B372B115EE33CEB3706D1E7BB962CD0934F4836530430984084ABF4"],["0x3F980ECBDD57BFA7F7796A4C1AC81B8070256F2029E6C01DA25C84010F6ADD14","0x3A8EB8E09AF271A090223BBAABCF24995E5B26E95B89F3B566C69781E8ED9CE8"]],[["0x30E387CFBA9B739CB6C451925F5828EC0919200322C4EB52F37A4E8205664755","0x3954630E63D5E744E7E77AA69EB509DD80D24D1214DC45192B64C9A641395074"],["0x3851F33A3987C63D08F1B8F0805013A8FCEB5DD0274D1DF85657E3748758C218","0x3E77356058B62ADF42C01F2A4085A28D7CC5676B7AD519C6A17697AAAE576F6B"]],[["0x0848A595823729DE7CAE5D4D7A7A03E658EB37943E983B541A3EA0DE4D27DEB2","0x07A0159C1BCC8A24A2280421B6D7D8BBF0AB8796AC5C9FB2F1462E71FC10E666"],["0x22BD55B148355474D937B523F93413296A9366DFC9AD8ABFECAD4FCDFCD04FFD","0x23C97BEEF2AB829F4E223E10DD77830F7FF09FF0DF904C6768333B47CBC14994"]],[["0x262B00939541F6B29171DEA492A45D7A858DA308F71BBA01DC5A0D2667CDDA6D","0x11D31A678BA302189BE50814C4B13E061F45AD9D56DF4F6C79A9F10DC8DAB4E6"],["0x1CF20E634CDE611E445118E1E10A140369E2277DBF021DA6BC60B0D86DFBD0E9","0x11034DA14255FC9DDA8674C9A34F51628FBA1994CDDCEE29F40EC53C84CC1DEB"]],[["0x056442CDBB6100B5F63D5DBB6B40F8727E60F129D8E0B672E1D21D88A8E081D6","0x17FF8AC7BDEEF5D06C38655ABB88D63FB33467CF6FDB1FBF0DD345441D526CA9"],["0x196C18A2945419F882227DDC3FF8FFA51CC635961F3EB09BCD6E1CF9B64DB8B4","0x1B00C0B3D360BADD2E3D83683EB4D9FBA7DC82592A9531FAB69FCBD4D3DF4494"]],[["0x139AA320F8AEF88AD52FD26267F51B17E9035FE8C8C9225BF10B6491C7F57024","0x195201F836D9AB6CBA81484C6E981E7525DC29B016552F285F553C9CB3D1E959"],["0x0ACA5125C06A43078BD59F9C63D284CEC5F99C5D5A32FA22B3532EF8B5AEF706","0x3B164D5271F4D9D51C0BD272A6232FE580BA06F3E8BFE85ED17D1778146A097F"]],[["0x1695DA52790A4374243A572E22F1864326F787120F64CF7670B5238CC2AA6BA9","0x12A4CCBE58AA260E29C7A9D90B07C82756811D877205110A13B30CA2DA70D16D"],["0x254C2CD03A25A5D2D850DAFEE2A9EE94253F824289B5C17027B438593CBB3EBC","0x39E86B21E4034785632CA857020A676E1080C2038CBC5D9DCCF83200C5C08706"]]],"z_1":"0x21891CBAC08D64A501FF99956CB4350612140075350F8CEC5866BAAC3EAAE84F","z_2":"0x0D180463C3D67E2C34DB809111E6C5BD5CCCE62540EE5B80F995D69DDEDC43AD","delta":["0x02B4D91DEB40D0BEB356E36A5132333819AE66424F40B4FB502630B6BBEC94D4","0x2239811376295CC400F337F5A06671E069DFF52208517910E759255F6F7CA3E6"],"challenge_polynomial_commitment":["0x1F648A0A8B2BEBC8AE037DBD9D34F0231D108E9861899B989FCFF2244B77969E","0x27F8B0F38304A222FD4A6118A881985F1D9AD1E4717A9E4F738055CBD3C2E63B"]},"evals":{"w":[[["0x2DF8B72DC6A926101D8B121CB8A2DE4F30A01D8ECD917D65D844ED8B699A3D72"],["0x2C6E48023EC1CA6F23F48A7DFAC9EF0351F6366D09BA99A0DC468DC1ED673DF3"]],[["0x171B4D5AEB865B4208F1FFD9DC56E5947CFCC2655F5EAE2F3051292D4CB80CBF"],["0x32279B3E290837B56DF0FC5FD61EA363D9393E3B1BD687CD74B5A4E7714A0DC0"]],[["0x125BEC149650A64E5DECEF9C4F7F766C5EDC3F7A6A17B1E0D8F3383AB599A774"],["0x0EA02552684D702B11A7BE8FA475DFA24176FDBAC7E0596BBB97BEF3DBC5083C"]],[["0x3087A489D49F60A631C7DEA73B3A3A2F756CBA87111D0A1F4329BEFB4729511A"],["0x1300126F90B868A1852DE312FABCF17D0190EF52EFB0CFF68729E29F403A8023"]],[["0x25C46FAE8F91F626136ACDCC50392DB757CB65F995002896F684FAA7BA036C54"],["0x2C658A1AAAD610B2DEF20EAB45E7FB60C03106E298B5F868352EAC4F5F4F75F5"]],[["0x0A2768C4DA53A0712C3A8BCD9103D38E07B56BED4D394F08B8C7DC7A2634E23F"],["0x036190DC4F63C0E73F3CE46111AEC97C6C2DBAB93C6080858B790E021A048C1A"]],[["0x00D61338CCE090F845F4C92EF5B90536D1752C9D1A9B2D2B8665CFE42B461BCB"],["0x156BE1BD75E9C5782E551D63F400947E519A550900ED83A44275C9E854EBCAC4"]],[["0x37B90E965AED96E4FAF35BC163D7448A03A5D4BAF1993C88184073920E322347"],["0x28B66497957B7D01F39D9B61660F14CDD4609FDCD6913F45F573AE7B08DD675D"]],[["0x3B5536FD41B92C272F038720DA9CFE39BF87A5A3B65BE60DC8359DB6AE156E1C"],["0x3F105B9CCE935336902110E5CD01BC9655299629D47AF3BFDEBF15E8E86FF5B0"]],[["0x2ADA3DF04F840AB4298E5AE37B8B10D2799266BAA5A64DF15F610B45B59D14A2"],["0x2AEE5BB8CC91C20713190E538CC88B86E22B14586834C1F4EFBD7AF0D3C04447"]],[["0x3E62002CC89FFBAB37AC019DA07E63BC99B07EA5875D0C77F5E919DF10ED146B"],["0x2A728ACC8F223E93711A9D4908E5911DF28C8BD3790C9850E699150B83FF76BA"]],[["0x017B0EDBE31F9481B945B95BE501389E29BF4E0A347366E8794B7EED6CCE729D"],["0x1D675D9BAEA9B85E37AADBE985D94223CBDCA5EAD47FE6248F38652253C33C43"]],[["0x25306D86CABFD84F78B59AE7A66460505D87E79278AC953BD70045341F034BED"],["0x0FE495351288C378689BA8B00EF9D0850B30434F1CEEB43DEC15FD9FE16137B9"]],[["0x15F17FEFBF84E815665A0A3823DB8008DA13EA3E57DE4B5FE36C4DDF82D8C489"],["0x0F51E61F3911B3D05031821659D0FEA0F5A3AB9BA9DF8D179FB586B1A64FAACD"]],[["0x0D7A4BF72F9660BA970A8E6450CFDFC2EA7ECED86F2E995D5DA9E11A5D9D35DB"],["0x01E26E29DEBCAF8D11BEEE214F70D025AED64B2795A749D8655CB4557E561BB9"]]],"coefficients":[[["0x214A0F6BEB3429E49240463C1C45CDBF7FECC29E25E8BABA6A6321F0F781C475"],["0x0C1C4ED8412C31A6FA6B1DBCA47B731F37F7FBB85A6DDD3F486168CD9111BC35"]],[["0x1E6DC14C8D6B8304F84713E129AE3EFE9E5C531679D9A5A506F909877A0A71FD"],["0x21CA73D4347CC0BC43C45BCE3D50C01D5341BA156446104A4A2BE1F8844EE866"]],[["0x21DEB13A9CDC43CDB2BFA80E2AA98719336E2F8861A0CC92570749949618F43B"],["0x112FBBD7270076F71C63EB166008C0CEB831CCF0C6F4FC9017BEC27D50622DD1"]],[["0x2E299C62CB563615C7916EA6EFD8D661EC0F69409E41034C5BDED6708FF62F22"],["0x1070170133E088DEC377649AAD459AF5D1D5F6A373A58AD20D70941532E8A5FB"]],[["0x347EBDAD01ADDC2C886D2031759BFAA0081CCBA3117EB3035A30EB28979ECD12"],["0x0CFFA30FC626F68FB6CB17594519692253BBBEAFFD3222439A1B857A30A631D3"]],[["0x05CAF398B4B5272BF15A6E2891936921F3ADD14CF7059E85B917E89160723387"],["0x30219AD9BF5EEFD4A1EFCBD49996837900263E82D61F7716636EC39F23213AF5"]],[["0x17D083B8C11D0117C038C915BDB15665F42AC5D48EEB05ACB82C8ED23BC71705"],["0x1236CD53ACB836DB3ED48C3123E0B9C3EB953047030BD8E88654AECEF4E007E0"]],[["0x2711A9505072DA2DA3037159E6ECB1C3D07122F1BFCAA897827064F911418A6B"],["0x17847ED7A5ACBF121DE6A09BA9989AF2E00D3DE12901FD8F79D2E38414F6B65D"]],[["0x0B9B12AA34998EAF9DF65246C11041E25F30130BF24A2CA06107322A4C5A4C6D"],["0x235BA6512A4B82C29731B81D7523264D37D333926E74B056F34DE12746207D58"]],[["0x3BF141F8F1B5E7F67D7D695577451698FC99E7B2F0A7DE154BA277EA38F924BC"],["0x3527CBD63D0B5EBE640143F8AB6520D46964A985FE3FC975609A23C6F09B8C88"]],[["0x101740C55D03FA89F7EAE273383D6F6B73A75793DB6498F1AE5B92BACA6FBF69"],["0x0AC02D7324E3885987304FE7E70F0C3C1922E280B37B6FBC7ED585166093A449"]],[["0x0D33F3D99DD27D13722E591E48A86B690346D6797C5200CA6591C6B7718450CE"],["0x0A7EAD671AE8AD93429031DBC9A28CC15A3C0DD6CEF75DE2F4053D6C1F36A6BB"]],[["0x0A6C7646F9920575A54EB675348A88ABEA88E225DCBDF21A5970D92784FFA313"],["0x025EF13A205221CD40FBA194C397A212DED2D6D2C18BC9618A7E642DCA715563"]],[["0x2456B747F26F47C217C4EB13B5092739DDED695FF0B28385AE5C82DC84A67C39"],["0x2A50A7B55897E6768E4881CAECA104F95A22B40F087FE42CC6C4411D80DDD675"]],[["0x2DC151B1D92FF41A4D069240E5D394F49D88BA4490E54B8D59B85AB9DA67A827"],["0x3EA40A4E7BB62180391EBFDFBD7A0D2EAE607C31EA1F91A85427511226114725"]]],"z":[["0x0DCBB4B167577EABF61E34DDCA1FCA85D0FC12B91B24FFD21EDAF12D98FFEA89"],["0x1788AFCEE06FC4BF2458699AEC3B8E89FFFA11ACE6FAB1DD6ACDF6FEFBAD2787"]],"s":[[["0x2A383DDCD6E0AB200E622EEBD481619199360DBF98C01EA67A0C9D30C58E70E3"],["0x22C0BA85C227ECA442F9406158AE2C54169D39844EED6A863757A5DB1C1157FB"]],[["0x2290303CC01DE8690D502DCE89B4C28A117035DB0B26D712B28CA805FB824E36"],["0x19CA7C310D8CEEF8A85813A8D2CD446BA6383884EE99EEFFA6F74EE017FA31EA"]],[["0x38B48006EF47F422D4FD3DCED1BE1A47AC4619F74A71BCA7DBD149E28D0E96A5"],["0x061BBC126133C2AE6C4066716C9748F374A8FBB10AB1C1EC6517FB89E2C54178"]],[["0x2F56F8D08AA0FB400D4B532A829E1BE49F07B0F5B8CDAB82E6CFF5117876FE52"],["0x1991F116494F3A5087C89F2A33213BC2741EC9BA7D0FBCAEDBA6E9CF16003B90"]],[["0x3AF24CEF6A4EFE72F0546981E0338580FF0EA0898D3967B25B0F48AD08CDAF39"],["0x379178CE17C0480410F6F217E4BC380F81FF9226599CE76D027CDDED3B034CF1"]],[["0x255E255540FE1124D1E12D941F9C1E3EB64050BF79BD916B786365AB08B85228"],["0x062589CDFA5947C7E2D350CE82DC14583D3AE4455DD315C037277ECC1909C604"]]],"generic_selector":[["0x007383F8347323B41627D77E4E27BFB4DFD527251BCD1868100DC94EF1D081E8"],["0x0BDC67B73A20087D80A231B5E7319F3CFCA3E831D0714675B4324B4674B6BB7F"]],"poseidon_selector":[["0x39B099EF171870D28B3F55C5B364DD558447B7EB22424A2829FF45FE214CF6F7"],["0x1E3C74C859B0FCD923228C3A7D94A6DAD0CB1D3EE5F9DD8234FD84B921C2630B"]],"complete_add_selector":[["0x173230B627FCEE27410954DEF124DE21DF8EE0A3D1B3E6D1B9A4C737EDE4357B"],["0x17050FC224B201AC843ED302DD7FFF5DD5396BE32F1CC143D3A7929321FB2886"]],"mul_selector":[["0x03BC80B718D26158975CA5DB571F5C596EE7097546AA88A43562939556E9CA8E"],["0x0305463DCBAD97542030F775B28CF9E288F9AE2163B648074A940BA9C9F741BB"]],"emul_selector":[["0x1DDE1E9CC4EAC223DDBEF14E6203F6DD75A4FA4C41A902E3F93AF81DB19A6131"],["0x1AF522389311797A671AAEF9894B06526C883E30B6CE420F31BE4582BBA46C55"]],"endomul_scalar_selector":[["0x2BE6BED5C728501E1CF7E22BECC3CC23144DBFB0FBFA58732F4FF63952C4C155"],["0x305AB33313EB1709F38EDEFA70FC99668F8991E4E3F0F46D7C49C35C1071A09D"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x3F01835EDEE3B49AC0D1DA38D94EAD8E953A2A405B24B386C995E6F0B485BDB4"}}},{"public_input":["0x3E5FA05919053CA9111A847DBC33BD28815901049CCD4288B932F9945987A33C","0x134807C910A5E31235CC4CA57F3496649AE2FDA1DFA30573D6A534E858453FA7","0x12AC6BDE55519149017F86A16282523A9FDB4D95CC84CC000774FCC594D769FD","0x0127474FBBC08657D992778FE0CEA125504D4EAEA799B7228F9B10BA41452D6D","0x005890D6103155B66AF333A6B6D260E73852E34DBB9C20026C429E349B2FC862","0x000000000000000000000000000000003BCD112CF62D564F29C23313CA2E4392","0x000000000000000000000000000000003DDF10EAE0E5AA7554DE5A311914C64D","0x00000000000000000000000000000000F2FC652A0C1C64F0AA07CBC8A0CE0A81","0x000000000000000000000000000000001C12E5F4F0E5726B532F834A8231351C","0x000000000000000000000000000000008EF6840DA70EEC14177A9FF3DC73F844","0x29D9BF164719CA671BD4D40A1F470784E484F5C066CD8AA644A6D7C2132C5FFF","0x1A14F9E8811BD9E44626716247E0273FA05ED60532333AEAA3CC0E646C20ECF8","0x2CC283A0B7BFA2E4EA87EC95F972E50853AA92EFD2BA9ED144F6F78A2FC3EE3E","0x00000000000000000000000000000000F5E372C0C5F57CD326C6B45A3D0E7EC0","0x000000000000000000000000000000007C337FD755C777DF0AC5FE6B3D0AD36B","0x00000000000000000000000000000000FE9A76DFC1BD905B87B83645A350B277","0x0000000000000000000000000000000045F78564586B8095BAABBA33ECFE6F96","0x0000000000000000000000000000000012704815D2C2DF6CA409BDB1D541CA7F","0x0000000000000000000000000000000017B3DA418568E8FD18237B9BE0E7258C","0x000000000000000000000000000000007BA872EAFCD867BB1D9BAD4428ADE40A","0x0000000000000000000000000000000021BC6829C9E2B3E02E7AC5E155554FD6","0x0000000000000000000000000000000072F2E9B0C78AF375A8860A8C4DE38068","0x000000000000000000000000000000004D04721CF4740280DDF6A59151F7F0EB","0x00000000000000000000000000000000D515CBA3F1B785C759149ADB4E6D8E24","0x0000000000000000000000000000000019A291F485E1D361894FF051D268572E","0x00000000000000000000000000000000AD4765D998397735916794DC720ECB05","0x000000000000000000000000000000008EC316F08AB159A72020B8B715CC96DA","0x00000000000000000000000000000000F1EA9B0FFA69727C9607CD7C7BC734E0","0x0000000000000000000000000000000020D6F6551388A7CA4910ED602B2787ED","0x000000000000000000000000000000000000000000000000000000000000003F","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x3ECF1143F44BDA57D4BA6B3365739F6FA14B7EC63160F4B7B037AF6C7D9D09B8","0x30A6A07921C7132260638E7175AD18459534F4E491E6BC70532D5A661B905D3A"]],[["0x278048753CD8D8771FE9F204D4DD463B61BEBEA5ABA5E8F1614AB775506C5CEB","0x02A5A5FF91985081E19060296FC325216DA286F443BD33570B7B022221CE9F75"]],[["0x172F05EB3411AC29754FEC577AC17F069BC0D11CE3888DB2699F745349325669","0x265FACD4147AD9E7F2BB9E8D124B98F817CE46A3DBFBEF95D9C0FD4C0D6C3D69"]],[["0x1D5FBCD6655DAE4A4DAFA7790E1CAE9F242ED815DBE62B6924EC9DB86914E093","0x3A4A12216B19EC17F8429F14D23EAE261748643E0904E27E346FB721577D081C"]],[["0x0D169F1840B2CAF41071D34E6FBB0F4A1B2A94A9624DAD88D9D005AA065571E5","0x3F3E6374B5FB97F137CEC828EA69F00DF614C082BC57CD16AE1FCA3A00C42633"]],[["0x14316212CD96AB05843063D3C320E4AEA96D05AA089F332064F57646D72F62E7","0x04BA1617FFA1C272375DF8E57C9952E5C6A4FC6EAE98E3C07110176A622EE7B6"]],[["0x20EE81250C760D4C34436D41F81202238805F85F61F4BBBE58E7A19FC2FEC3C8","0x12894DD061E4E16E2672666494A4D7F7002DC27C5E92D03ACB175190F04D0F2F"]],[["0x008CFCFF6BDB1F546B3C1E2922238A872E1B383FCC6BC3529D24C934C674421A","0x08033814830E71229251B544B7F58F53D5BA392D01FCA8CBAFFDF2EB1FAEA51E"]],[["0x1A8ABBE1F4A6A1FA7749290DB95EC2ABB67842E12A00ED87A48887257420B1A6","0x23E3701E66CADD3A59DB23605731FE59D2C63619A6B443F8BD4FCA7AE7F568ED"]],[["0x3C5B2C24AAF48D3B27E75015AC8B484280B78EA91990BF032348B0F0A6B4F4F9","0x243F91DBFC3C6F80B44599F4193C832195137C406BBD5911676560797F931ABD"]],[["0x1A84EDCCCDFB400F346900B15DF8F9CDABAD6C418071F59D56D8DC50F4BFEE75","0x2D66F19972655F29E0A46D6EF6E494A8CEE86A610A445345C78A75639CE0D1FA"]],[["0x26B4BA66E353319B33F1253CA2D67E4AED1C7152014418E29AA16FFD610B900E","0x339FFFF0E84661251B2972194B2278739181BF3913F092FC1C4A4163F38EE955"]],[["0x0B3CF510BD1F0F292CAC26380A4C51D827F960DD4BC89BDFB237342A10856783","0x01C88AB4813F270E0C5DC2C61058C0C7E15A6596DC6B90579D6F52D2BB05EE74"]],[["0x30420BF8F071ACBF50D6128F460120EF431EDA297DB9F3BFC11C903D3FA4A5C2","0x290D7C8C7C33E75E0262959ECF2D1D2687DE895C46BB8DE3E0483944D63E192D"]],[["0x16FA39B2051D2F980EC011B7CF325BE17CCD1D314BB18D90EDAF24DAA6AF3AAE","0x2FC63BA3C06E5E6C0B743DE03ED631DEA14F81844BDAC1D73CD1FD0D2AF2205B"]]],"z_comm":[["0x066E33715B6BA17E98D7932B1BBD78021746B38B985830CFB795666D649C2DA5","0x3DB75D091A68F0A8AD7D969F584FED4DE59E919083419AD502217856597A2870"]],"t_comm":[["0x0F3D1A82C93AD28C7B36FBD74C0A2B3072DF87A8D5281479F86A6EA891AEC8BA","0x0B9B586C2D3EBF955CC43DAE716BDFC1A50496B8355E8B83D1C101036B7F746A"],["0x19BA047526568586A0698DF944BAFF75099FDF71218994B883429A1FC7F7E80D","0x35B14074002CBC028F836371C111BDD450963C93BF0F672F413983EF86D2126B"],["0x0B43F1DB764F7D49A68803043E5CAB3B20C65929FBFF1BB5EC78F0FB7C4FC472","0x12CF82614AB08A4A857E97B19C8A246FAE4E190B66B730AA9DFE3B4DD8D0360C"],["0x1C1590C29E755F0D5F11ACB9FD4BABD076705C94EEE09AC37FA03A3F3ABE453B","0x0B82BF3D1244F91C45D450939E5D30609DF417D1017771FC9F78F13420078577"],["0x0223F65E769F486082967A9F01C29DCC870EAD8479D1A02E4A759BDF1D49B360","0x227691046F88D0BBBE8F63EF0B280524EF289A5FB42CEA6D3FEB854B040304BF"],["0x38923F9842D83E2D556915C4704BA405DF176DF3A667D9A3DD369336E87E0E15","0x0C0A61009639F27391448ABFED95505FD096FC7FA06AF8B296CECC6971BB7554"],["0x11332B70FA40AD6106A2C50A5D121EAA60623E59E51A8693EE3ED5C822CD5262","0x23F1095C0119563A429C5B1DC52DC3BD519CF35B4725D9EF65324E0DEAFEE888"]],"lookup":null},"openings":{"proof":{"lr":[[["0x101B9B55DC6A82477FB9DE85D3777F99D10C0C4032B9CBF0CD35B7B90971BECC","0x05FC24C72F9CCC70B91800E13A418A9716A665EFA63D6E40373D39B2E9A8AD6D"],["0x0F008FD8B275E411BBD677599C65149E579F720C1D46A461C603F6121A6C6BF3","0x3EE636620CB1658805D7774FB56725571A1113E0D4804EC89C5FF2BE388B050E"]],[["0x1C11B67C591621D2635BA9CE580EC9DFF18C5A61261E6AC78B9F64F294F403F2","0x2F676E91741714AF7C4E38BF219D1C4B4F9E3B7D2C68BA0EA23173EE3033BAF5"],["0x3229FE62A112BE2D3AF87C349AE1188521A8C08EBF40551F1DDEC33C543FB7D0","0x0588AB7FE287D1A63F1B3554C0E7D069CB9095D4CE1DE145920226B5E7E8DBE0"]],[["0x0FFB43CB07C61B10E9A549B2D1839E1DC359C67441413FD3605C6DFAFB7D08E4","0x311454968D4A62B25CB5573CBA80A68BB4DFBCEED5DA1B6A7A454546929D8271"],["0x36B46199DE27C708039792D6293ACD45BA9D6AD51EAED8CADA3D1613FE6588C9","0x32937581A2AEA9BE19E255579AB337A28747C21D5F6B174C8F7A31C82545C1CE"]],[["0x2CCB32210668AEB63C478D914AF88A20D3BB4783D2EFF9AD2C1718FF469648F4","0x2E0BC7397C41B5F84D8294B45A631041AEA19C7BE862FFEE3B35A249B78F1AAD"],["0x20110688C80AFC0135D9F14D7758FA4AEF97B72070A779DC0C72276548E6AD8E","0x1CE7D795751167A139643F8DA5AFABBFB176349A10E78293425F1B2E183B6D2F"]],[["0x2496B68975E35FC462DC51AB668A71FC0D804EC06D2E89E420D9B3A788AAA8CB","0x101EBB646FC12CD196E09AD8D60A3D75DEB654C525219773EB2BE93A6EC165C8"],["0x14AAA4F7E18D746535FA46C1647101A50B9F71AC9032E1B517AB9A1715EBEA63","0x26F8C4FB1B7AFE9E5442147C2EA97A532F7B90979252F89AA7DC3211FEA1219B"]],[["0x03A608A6B4A52BFF349948837D9496EE94ACD7BB7DBCC90EC2CA342B90459FBB","0x0743381659EC4F6C795BA77719B5714ACDAA2F84D33B9BA746D029FEA8EE040A"],["0x0B9138670C0F2768C6D8F2423AC07797FD9207E2D61AC11C2A2864A75FFF9782","0x14E10C3A887772EAFFB29174816ADA479287FB15B0513FDA108FC4FB2EE89F49"]],[["0x0BA1E2D197C7D30D7C362ED1D2DD6D6891E40BC522A0C46F76FBFC26E3369CEA","0x1C0CAB101443B0D9A9D8ADB02C06C0371800078300907AA8394DD1C4CC4274C7"],["0x21ACF09C7054C9FAC07E19D9F0F549ED94226188C9E1578B7EF747D66438B692","0x00A63A79B2D0C9CACFD9F2BAD43D9135B088EC254365C265A81DC03623267777"]],[["0x0649326B6809EDB14791629EB0AA785C50168472F93C6002DDD2FD2A3276E761","0x36B11718BA0EE9B0990C9F293D5A9A777C14F290273493EB89EE9517544D04C5"],["0x02633C363C1513F82A93627D6C2D2F2BCC781C8433BCC81528113E0443DC06BF","0x0A2A6933025C8912735839C38B7C2C4D90AE833955991915817A69AAA81FDD07"]],[["0x3BE051744DAC7378F4AB792D1B365F47568EAEEC4CB370BE881447414AC34C8F","0x3AF0D37C85B397B5B486D80B3575D0703BC982C4D1B59664EA93431F3A545DB7"],["0x0FCE5E5F1E437923E5AA025152D109810A586A38E55D5ED63AEEC39BA8C72C73","0x088A62AF3187375EAFE1384100D71A4D9CBE73F5D101718B4237B15F0ECF98B4"]],[["0x36315F86626A74B315E11A7B0F3DA314483469B1244BEC270298441E393842F1","0x3BD0D138C18FA979D5B8B382CD712B07CD8EE5CA5E993401AECE231AFECFD69F"],["0x1FB85238DFB0A872DFC99D451F431D7563C2FE8D8F4EE9AA17728D8EF2980680","0x098167A10634F6DB05F734DB0CE154B10FD089CF9EF0683167B41985B1789DCD"]],[["0x3411809D3D018F10B6CC1A2CAB4274221C730D65A201B0A24DE43038FC8AA8C0","0x39983F1FEB342D1D5CB3ABE626864922E58E011F58CD9824B98EFEA56CDBFDFB"],["0x1168FB7FA465E092D25A08B83016F3ED7E73541A2111FAA58E1B642888CFEE45","0x061F2C08F2D6622F3DFE0C55F6E27C1BE33C7B30DDD6BA17320124D3CE4A6D61"]],[["0x18FE5BACDA68F387FAFB56DA056E6E742A0A3E2938FE00C805F1D102B33C1D93","0x0D97E1C528039D0E519AF38316987CCE0F797D5EC934E9C0F51DB36FCC0E0C1D"],["0x0DDF22536C872B1AD980D7C75004F39415459F23CD39675464BFD210B14A4074","0x1E51DB43FCEDAA03802D39FCECD4DF9CDD08BAF21D89AE8DEB9DEFD3186B07A4"]],[["0x345197886B9A7DCC6736BC1621A0A2D8249F163947EDD0A1C3943B32CD5BA8CA","0x3FB6E2E8732AA3EA9C7089B695A19D9D533E444FF5DF48EB5ECA1D810BA8A20C"],["0x248A26EEA47EE9323FF5A27CD97BFC6410801CD4A47FC109F1471D779C11C3AE","0x3C3DEC47E825EAE271155FC63242B2683DB63B8293078236E2E7D8EA05B79DDB"]],[["0x2ABD93F88692CCDFCCBDFF3D70F482EF05373604989B9682B2AA47F10F61480C","0x217F300B48CD5CD4B489B10780688AC3DCE06626C140C19B4EBE5642746E7B5D"],["0x0CC9D91B43B60BBAD37CCDE0C08C3707EB499A6D078F34A9BD5683860D7938A9","0x036442BCDA7CA99E597ED520279975612FEE78F9E8BC46FB492ECB82E01D6DCD"]],[["0x1852A020CAB3D3E585181F6BF3B56D7C0991A04D7805DA16ABAA292A49C0AC24","0x2BCF31348E82F3ABB8D38DB52CDDA66F4EA155005AF580F69FA3584D327560F3"],["0x04F75F6F0864E0798729A605ACCA5FAA8752B7A92743B6111D9CD930BFE6639C","0x2016265C82B8A3CABBFE36FA8ABAFA318133C3AA6F06538DBA8D9957F95B82E3"]]],"z_1":"0x0B132D61523BC2715855BB7325C4648FC98045672A5071B0BC73D96E869E9F63","z_2":"0x358101F03483DB1C0D735BF3316B6D7A596F7F4606A1877B80C45C8632B109C3","delta":["0x18A7EF75273CC986714BD6F20A68AFB84C74DA46795E34EBD8C2789DFC57C4F0","0x0517BE50F60FE55B5DCB905E8ED02C5EC7AF128EE083101560C26B134EB94CBC"],"challenge_polynomial_commitment":["0x0B1F630523EAEF87043CB451AB7F4B76A020972870DA5658CC811A943283CCE1","0x1DB427F7E53BA5F23EDBA8B120212D4675916644FD968883F0CD4939DC06B98C"]},"evals":{"w":[[["0x3F4E6482B033DD47F7D1D9005AE9B470301A038AA65177824E48B885892570BB"],["0x006C6AF34A4D20377E103FE78E8949CC930C412FF969343AE0F5DB5CF2A6E72B"]],[["0x1E3E742397D944F467BD3CAAA056CDA615E13F5D1287DBE9E05D02422A7AB6FA"],["0x21AE041CE2744155F1D6D38CB54E8EBBDA32B3EA5D81F744B7203427B2912617"]],[["0x2AE30E618BD41099B2B083D6A142091B3D8D927E995F3DF30B53FC7250A12802"],["0x3E4B0647D2DEA6D36FF0E7F2523BF61025B30262BBCDE6AD1E29DFEAAA556BF7"]],[["0x3BA52D8B06E26CE2E67E8D5BB9840B8C5F87EC938BB004CA2FB2E4ADA412C67C"],["0x0A73584E1624F161B3CAD490DA9B591071CB138AF0A0725A5BCC37E2CDDF5247"]],[["0x3AEE00854287EECDBA94E8AFE64E6AE3154F7A62255DE7C126BD0A4FEB480FA3"],["0x2832295C419C90C3A85C6514F2A0663826EFD828490CEBD0EEC15BA2793EE430"]],[["0x0BEDB966B8FC9565FAF566D87E89C677A524F41BC9073C473FC7A137BF72EF98"],["0x390FA79C68D7D4E33FC1B33B686DBE4F851DEB6F63D9B96F95AFAE87904292CD"]],[["0x1C48A372CD8D2EE8A012F5AC2F46241F99DF2CEAF8266D26E05D48D56EA2A3E3"],["0x25D1CCA8FCCDC2A9767607799410AC7D8A3368E0857BE1C3F059A67DF25A5CE5"]],[["0x2E78F1B91BE7376E3CCA702D1E78B04E932509195BC8CF48C23C684E6A5118D6"],["0x3E348AE8609B0B98A962BFB4263EABBC7372B8D8AFB9B8D751E4C9978E011BA5"]],[["0x1D83F42EE6C9867BFE8F221E209AB48A9BB24A7DF4CB96730F86B56E819156F4"],["0x0DDB506C0ED8F72F0676F3DA9CCF3BC4E91C40A48FC771FB1AD48DBF6848E0B8"]],[["0x16137C21845C7D730871F85C8653F1D4419CE73525E30387048C6C9F4C92289F"],["0x06153678D62A87517ADC32B5FA67BA705923B28E353196B407542A8978817A2D"]],[["0x329146A488237D291A6585D044C298702F119E1AFCBAA954A35BE54211DEF419"],["0x0F5C4DEB0A5F87575CF317D457760B5A1A695F877DAD8D566EE41DF9D5769985"]],[["0x274AE30CE7E90C891393744A43EC18C973E2FCDBB3D1184CE245B99159BD966D"],["0x16982B97146A9CEB1DC5B0D3990C6149B33C74FD32C22F3E202A4126F9C91C50"]],[["0x0CE7979E8322B6B8A33021A19374BDEE05DBEF0518FEB64230A5F97EB6C3ACEE"],["0x1DA993BDAE504270BC5933EC2C19FA9CE64C54AB42BB2D64F2A89341C5FA1E2D"]],[["0x015E994F8DFAE895E3DFBE04F4299A2576B0A16FF3634D0C97BB7AC7780A9F5F"],["0x38F61B7EE08184337A1E92CAB9420740431B06D3313B6CBB9441878388DE62F0"]],[["0x0ED34699112732D85A396F0F9197F7D57F07FF454F9D7F6B78E5CCE2CCCC0C0C"],["0x088F99778A312684BC7A4F99A3A260CDA34C3C97E7A0421724CA6E70D55E4751"]]],"coefficients":[[["0x1BF3650466C84B09CBB72B4C22AD221C33096B5CBCB5684B3AE66EBE34CF8F1C"],["0x13CE06BF59630A3B0F98FD0FB64253F42C8952C08CF86956B07327B89A45D7BC"]],[["0x15FA9B2699B7F0C2FF1EB10E9595EE3B50A0CADDA198C0EDB0EE212D74B4563A"],["0x215E52D1A88FD7B42D595A6D9B4533BCE24670F1453C8C0C1835C5BCEB3F2CF8"]],[["0x1E0CB5EF2B93F3881377F283F43DEB693802F9D7BC5D483CF57381B717ABEC1E"],["0x24FFF73EC12E7D738403DF3B01B060934428CD5507ACB2D0AAA4AF740FF41BFF"]],[["0x1D369224FB328472AB7B1B6C2406751189876C8013A7A7411CAEF79CE5A8E217"],["0x0DA627672AE7E9F713C189ED6C6515FE86641849BC8374FBEAE119FDD7AC5DBB"]],[["0x0A5F9CEF452DCD752B3001491B8AE36E83A29C315F7DB2006A74390AF8A71060"],["0x06BE6BDC217788E92BA937FEEFB0FA157EB52F1200D8D959BD5E9AA5CBEDE42D"]],[["0x069CEA26E129AAEECE4BD25CC12065A54948C28B83A660D93475F94D0C951648"],["0x3A8ECA49B5BA85DA7E5B7A20CE176FFD6A9E87CAB9CB4DD3D2D3C343CBB4E248"]],[["0x3C127073397109C8A3A0A79D1FEAF6D7B4CBCCCA3B5E374BBFA079F601DE14CA"],["0x1033A38C59D1996AEBB4B3996A15D00DBFC4FB5487BB551ADB5BD49AD60C20AD"]],[["0x23C585591DE4C0BBD4D4FCEE3748024EE3235C87135C0EA3D1BB89CBD7F6C30E"],["0x25936AC18A493B0D6953775B8E0D88D5FA140D4484CF40B18E169CD23D88D9DE"]],[["0x20A2D476607A3D5EBE09E91C7F6A128871535F4C698FE6C95C38AD33312F726F"],["0x071EF348F6F5FCD264A004C0894110D480CB4D5E8C1BB15372402A637DE73AAB"]],[["0x143D0067F0B9C9F5E4027A797335E59914FE3EA52F979C8BE697F635D21FA1AC"],["0x26AD4488FFF9442A688D4BD3F5B10A3790CC3A8ACEDAC253344A4387C4467B23"]],[["0x18C779FDC2DC5799163A96A76FD0226F8AC39512AB7480425C46F5F989BB2D8D"],["0x34A76C16507317E7D5ECE9D47F329CBDFB6980F1B415090FD6EA6D46F7B235FC"]],[["0x1E982BD6D0311A93A92391BC1A9BDE64D18F22210213B43862F0A336A9DEC194"],["0x2BCC6B8FE70518434956BDA01DD4B443F580A0DF8E981328D7565E7F1C6B9D17"]],[["0x1BDCB2B1394950778EBDAC6006B98DEAB67223F3CF26F011AA76DAC4765C3660"],["0x032450EA77B1937EB3DF272CD0EE25FD3AC633E86985304954E37C9C18BFF999"]],[["0x267A7E425D52E700BEC15219E58A61224629E16AA7D68884EF501308C391C56E"],["0x03722D8C6FFF120916675339CFA357C5BF4E0989B23E4EF4EFD2B3DCC49ECEDB"]],[["0x31F8684BB387302854CB08FAEA89CF0D32D2645AB589006454A86C3B00EE5C49"],["0x00F09A81DA4A6DB05FA22FF26E3982C44C40E61B884569A40980906A8CF03D7D"]]],"z":[["0x1EEBFC76281D34BEF13A8C07B62BB5EFB931C2DBC204E9FCDD2442B3E0AA040F"],["0x1AD30A5ACB3003F4D37BE8B0F17AE4676BCDB5E0A947D5D26A5012441B1FF988"]],"s":[[["0x2628293CAEB77F363F55B15267DF6A66BE216C140C9242451DE159F233C56AF4"],["0x3E52DAACE2E76067B0EA74F2D57F15FBF4992C4BB0F2606F6607E4C984C922B9"]],[["0x245C89D1367FE3A20C0EF45E8F747158644F778715AA31787BFD10B3AD12B550"],["0x078D89C91D4E4213ADEC26D6FFAAC2942043816E5AED24683A1FB037755743B7"]],[["0x0E5975AFB397A7216B9B59BD873FE88548292E9027A0C05DE45D36C29680AE64"],["0x3E8BB232641FE9E114C36789EE743326F6D2A318B111CBF59FF4E79210D37C5E"]],[["0x258E7135F0CB2371595E9AB11A29817A359E2113B663FC5F379770FE208D5FE3"],["0x3ECD75797C2214DA164C73C0A88BF0289160BCA4353CEA4DCB5757C8DFC3F6C7"]],[["0x3EB6CDE55095F39149E28A1FF4223BBDD0A31E2E90EC7C2F2894EAAB63809C18"],["0x04376F5033E7A6F6675520C3005AD0F1042A3240DA45077A249EA35F48C4FA6D"]],[["0x3871B6F3644F05E871E4354DF64DB58E039ABD14A1BDD4977251093108CE67AD"],["0x2C60B191F0B362B0C089E95C7D04A9873BB05E297A22F0ECC630CAF5AECA0472"]]],"generic_selector":[["0x1DF5E4E9B7061EDEB7475CD85EE142721981CBDDA423892D929181702A03ED08"],["0x16612F8088851CC458D48D0A881B041B1A5DDD9FA1343C5082004EA656A05C7D"]],"poseidon_selector":[["0x0107D76DFA3B1E8F9E7367C545F5F73E32100E9A15EC3CA3253BE4992808805A"],["0x02B3F880A0378743AFD4090B0CD750E4FE9BD9C8C9621326C1DBBBAEBE649E28"]],"complete_add_selector":[["0x1F4A918F4FA65C1C235443078B7A64BA4F50F442CFC7FFDE14C88BA9D48B8FE9"],["0x1B46BBC5B5532C31BED8687B53C7E9DD2F15C825CC25BA4E85FE0746C74D1469"]],"mul_selector":[["0x0F43521D6E84FA9B20A231FCBB60ABFE7A449F4EF58EB91D89E30C68883C4A35"],["0x0C644A31B278A612E4A85D48F8F0AFD25C032008C613EB5D5797F2EDFE5CC619"]],"emul_selector":[["0x0BAB19C2BD29CC44F20554957BC1D834C12C9EDD9A35E5DA9312656FD431A34C"],["0x3FFD84F93F3409484EAC9825C886B6C1D15F95131B6C042644F925DF11EDC3E1"]],"endomul_scalar_selector":[["0x3AF972091633B50EEBCC1AA433BDC5877723CA8169A97DF1C1A1037853ED1431"],["0x2462459AE6F418F2F6C908A9F5390D3F278F00505FAFBF896E33F8FCAF03C450"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x231EA289864EA29C4F8773D8F21E9810AAF9D8160BDA31D0A0CC255DF4E0394E"}}},{"public_input":["0x37BCA1EE5406CC2023E8C256A0028B93A97735330C5A7462FA1766CF5BA87DB4","0x16A52983C4D29C631646D13A767C099E6C629CE1E1067D76DC843D9FC92A5D0A","0x29A6A1604B80A2DEE610764FA9F4FBB10109441875DF30ECAD898FC6A53BC57F","0x0A70271CA08E0913606410C54DB9EEFDDF19B0B4A0132B8D01C44604F37C4311","0x284E65AF7FB61F7C30360ADC8AE15CF3EF2E81A23F41FBBF0F1E82A19FB272EF","0x00000000000000000000000000000000A132F91F3B86EEC22F619B82E63067C5","0x0000000000000000000000000000000078C7824788189DE158F062491DC38ADC","0x000000000000000000000000000000003B0DD2BBC9DEC62321B87C49008B4382","0x00000000000000000000000000000000A97E709695D391B302BD160C2490D555","0x000000000000000000000000000000001DCD0C6B3279116D4C43E0C9D9C4F1C8","0x2C241A585AAF1114C8A3C6B54BC10532589D0BF9016DD02F0DE1E08CBAF4D233","0x0D60EE6CB64FAA6513B6BF3E9A003DAC14360FB8CFCE9904B33D5BD0200876B5","0x3A047927503C7B4646E86DF88146B03D3B435E4840EA2D101068637F1C12E69A","0x00000000000000000000000000000000B75C6D9386BF3104BFC7331C183E6D6D","0x00000000000000000000000000000000A60ABECA74C8620B6C24CE38A401A28E","0x00000000000000000000000000000000B1E07B5DD7FEF976E65802F4A0F3530E","0x000000000000000000000000000000006653D249A88A5D8700882EC2E6A56C67","0x000000000000000000000000000000008002F53743E1843C52626CE41FC6467B","0x000000000000000000000000000000002FC35921804BA7A972E13B29537719C2","0x00000000000000000000000000000000C2851F22EDFE09A4935C8F8116586120","0x00000000000000000000000000000000454E1B2E640B1A9F199961341044FC8B","0x00000000000000000000000000000000B1F306EE6B15CB99B3CB214290DF771D","0x00000000000000000000000000000000B9AF643BB94BFBC61771483E0D807E53","0x00000000000000000000000000000000A2C90FA1299EB0151B439DBE7B6CC809","0x00000000000000000000000000000000B70A058A755B976FF50624E62F2FB329","0x0000000000000000000000000000000027710E3924F108791366BDEB5EC12934","0x00000000000000000000000000000000696583F31C870EE7E8B7962AFAD47AA6","0x000000000000000000000000000000005BC630FB7C024280849752B936B2D6F8","0x0000000000000000000000000000000064DEDB76FCA40B2691B0A6DD21BA442B","0x000000000000000000000000000000000000000000000000000000000000003F","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x1DD4658143EFFA416753910A844A5C85C02E509FD3D6B4A4A8241D5FE0AFD2B9","0x05B3C66F36709838E9937B7B9F238949FFAF10E78F7B5FD5EED6AB7F8F17E5FA"]],[["0x2B18DA728430D12251135FAF4C98EA5E8C951E885565DD266011BC27529B1B38","0x3F764B6BB821F6E07915451C0DA0382692665BAE6ED6FFA3D5220E56490992A1"]],[["0x2D020ADE501D70B8805868CE2C537CE507B5C10C8FA8D1D1DB30F0DB5BEF11CE","0x224155C3F624E0DC8B71A948FAD01E44E1EB54604723C6D8B53647C928BD232C"]],[["0x2D6360729ACFE91275B1111B94AAA89CD679D89C08E902B963B2E316E2D0F5EB","0x3ADA64129DE34A367FBCC7C2AB44DE60EF1BF1CC1F05FB762E461AB9A627C9C4"]],[["0x0570860004DC4EBB2386F16EC95FF4339DF34DF39D80FDD4F5268F591F6CE3EA","0x1852FC8CD6F5D95829776C518FD0F5C89A48840A13D55CE430A586D8294AFD3D"]],[["0x00A39B14311E3A05DEDF24A949B189A1B299753B8951877ED8C842139C1D0DCF","0x3604E7E11D19B6D769AF7319F4E27D153D21A3CC9F0EADFB3FE66FE36895C12C"]],[["0x36B6102D9C5252F1F636272814FDEF508E6F391440EDA69A976DBFE0C108E997","0x0B4B5D4A6B5C743F5E4FDD3ECF740762D8E2F26DE5C226C3F5B7CD1E028D4684"]],[["0x07C9DAD44BB2EF734136B83F8DC0D64EC47BA2F7E292C6EA849D58A0A8C694C8","0x24CEBC4A966EB161C074425C4960D253A106A1B0B8D039681844E8010306AADD"]],[["0x3984B671FE5AE847E530A2AE238CF323568914284F6A39B1FF23D5DF84661BA9","0x29573DFF26C47C3041F28B4A46FBE4AFDACE7DF76EDA9FFD20339E0163D6E533"]],[["0x37339F07AAC8C3A42F493CDC749896ECAE601B8741DF9A453A2234B1BEE15B5D","0x1CDD25200E97E27A0A80DB2BAAF4379075BE2FD79E7B4B7B4842F07888C6D7CB"]],[["0x03CC2DE0C8D4AFF90D0CF71035CB17FE8E8F14F4639FD3E943ECD56132A09B38","0x31EF2DBADA7253B5A87B85E52D7B0852FF93D0C68438227C8A3D55690CA29D89"]],[["0x36617EC5943BCF820805C8595A14B41AD73A59ACA5B9B11E81176BA28DEC2379","0x351D60314C82B01E781F23D999DE5C98BE883226D7A2445218FADAEB5E9D5306"]],[["0x2A0911AFD8D1E324FC94F7B0822FACA43371E2A68321F56CC5D171D2E66CF044","0x32626C191D18C4E65B435B476571659EEB79FB92ACF1045B77D20E836BF98DE8"]],[["0x341D7B442A6A4C574CC631695DC9D39A106962D31172D34F232F99F11A57E8C5","0x32B18488A25082322C0766B32F1BB7960CBDD7892CD9D2FA6BF6ACBF7C8A21D2"]],[["0x352BA91A38A4DF902A153EB522672248419F4953D868340B4C7CF26623D935B3","0x394910DEF9A1735F9926F22179209FC7FB215BB1E20B8FDB29FC5BEFC69E6270"]]],"z_comm":[["0x0A6F0A6699086BBBF3969B20B9E3907A4A6F8CD581FE42B105A3CFA62B55ADF3","0x3DF732A3E684DBBC7266DB9CD8684B1664EEFEB01E4569FE12DE08FAD821E140"]],"t_comm":[["0x038D91A09DFCDF278A6C67384E8F3C96CE14EF9F40E6224D23860B38AC45EC92","0x15AF9425BFE0AB695B115241398494BABA6BC99961E35768B12965D1DDCD521A"],["0x3BC1662E19EE4AD9CC76EABD8051D3525B27AA1343D07451EC00DA84F18022F4","0x1248F38A23B8B51F27A1C4DC91E363B95B5B24107D08BD567E106A2C4B8E80EC"],["0x281F514E01C1350809B9C3C4A17B928BE876CDCCAD54CB4C4065470B10C0E6B3","0x311628CB09104EB514786237301D717E6BB4CEFA446021CFF3EF4B4C4E6F896A"],["0x38D47814EAAF00C2ED7037A6581F79E556B28B8B11FDE1CE739E55BAC4E0C5FB","0x216694F4F59325A349C94B87981B72CF0E341E4CFF166D3DCA7ACAE6AEAB8AA3"],["0x1B07DB4E6CD0A1CF58D24568EBD37D6E2CC83C7E30EC08A2319C2633458BCC7D","0x0CC7AF8CFE81CA343A5E9E9CEC80A82AB49E65983B57A38180D5F34801A37D24"],["0x2336F04831F5D5AA2120018CDF3CC7EAAF3B6C6ECD9DD43F0C1B9E968CFDD213","0x0CD08B0A9C004BE3AE51BAFEBAA81EB35A8C671001C84D0E0698E8E5891C9B29"],["0x0FBD0F6D564B186DB670185C0360B8032E859FFCB96DC74B52D09F2060984BA7","0x3375C3A41BFBBB683E0E48329E55E2ABEB11E2FC889DFA3F10A910280BB30229"]],"lookup":null},"openings":{"proof":{"lr":[[["0x3B4E82DD31B696DB829CDE9DD191491A94279E09C09FF124BD001B5096668DEA","0x02DB4F9F3553F436DEFBCE176196D43AD5BF93029DD945297A203CC35344DECF"],["0x0EF315B17EA8718D55FAD5887BCCFABCC372A9BB14460B520B35EB78C1BEBA31","0x226314FE2A9003AFCCA475F1096E149D0A192E682B4D9224C7A3600B6AB9CA13"]],[["0x18D913230652A777E796A80D1FC9382A5E9F9E4FC979503499BC701FF6C957CB","0x2E4C2B00C0CB2A6E7987512F45C9DC9BA970016676F411DFB9954EE1DB07CE24"],["0x120B23EE299E99179A10AADCF55E3B8EE46451D543BE2797EA14480C118AC748","0x099CA03F4A2BE54DE9A984641B44E299E74177AE251EE585AA409587EF5B4CAE"]],[["0x2C8DDEB0E23CB920DA84EA6CA28CB2D84B415E7305C2BC9C805BAF99B97CBD1A","0x2E71A0E09889C7EB110146C5BEA7BD96E308879D2D9237449201C78F4EEBE196"],["0x17A8020EBC780E38AE89CB54A82560C532DC92E0BD9144ED9869398142F9ECBA","0x32A956753FB417C4F4AEA1797DF46FA221EB710788652A7F3A31613E0311DE14"]],[["0x3A0AB67CB9F25C59F34F55C50997DEF01C7E129CF40C062355DDB558B9910FBD","0x084C2609F61DBE43EDDB6037C53B2A18585D6BC8C4FABFC0550639791A03E61B"],["0x1C3035BCA43C4BE5BECC21B38CC71B23F9443C79ADD39647EF97324178CC7570","0x28D01941ACC9CDF08450B955211525715292A0302842C0EB688C0EFBB31B44CA"]],[["0x3F39E1889EE8F5BF7EF1AB968C3FFFC5EC59ECD868C3EFBDF4474481219E6FE1","0x0A83C691B205D36374784BD6DF5A14B1158146290E0BFF258706DDBC55C53152"],["0x15E847F1D10C0C7D34177980773E08FA01706D13DA5A175D99C840BF01227128","0x1666C4DA7EBBF5E6D4B85EF32E64034BB3FC2133DC912E13DBF7123B12A0D1A3"]],[["0x2E505095670CAB6E28FE2C7DBE8980B01FBF79031E24EECF248A226BD5637463","0x13FECC6842ABCD9CCEB2267241FE5A23F9325C72ADC06FF10119FB6211C0AE30"],["0x0BDBAD15F016FCBF1DF9EDD1C636B9922400D90F149785EDBBD3F98E348BDFC6","0x045E42736F52E52AD860A61858FBB9CA5E5EBC90FE2E61F1BADF0C5C8185434A"]],[["0x24FD6EFDA1FD27FE9A5E58E48ED597690A0F61D9BEFE415F8FC57173B3616A34","0x1C8D3344020B25F2255F63ADDF97BAD08B959C5D3EE184BF12EBE3131300C43E"],["0x25BB4E3C4C004D8925392DA65061FBC7BF6A15FA47BFC201134760F2C1AC75CE","0x1E9B4E1AD692DC6F15A50B8464D9AB868EECD8535D89BD209624396F1BBC0254"]],[["0x225E670885709F9A17A2F4B97BE765F4AAC9F8F53A326BF2EC55BC20A62AABF5","0x1CB6D097F9FB9614DB86938E866F1CD19EC7E290F10CF59FCAB61E7331F21E8E"],["0x39BA78A5E4BC54BC0F5D158C027F95E37266532741BCEA51BD44FC10DE28FD0E","0x007BC22E7AE222E412D2E5B2A7165642DFC1CAC2E81C7AE1B8380EBFA9DC082C"]],[["0x02BCF0A1901FD1279BF246C222504EBB6086129E38E7A91B728AC2DEDCE6C37D","0x12747591F83FE269820DAD2AE7A19825594F4210422F6EB11154E0AC3BDFC9C1"],["0x38BE9DA96238272544CF387E6976BC5245F30707933D55FBB8E6AE9762D76B41","0x2540F08C0B009727792DD2ABD98DD07693E87820035773DCF3F5EF7A4A23624F"]],[["0x0044944C0583478CDB22137E347BFCA80E7E1F8FF82D3DD3B20CA381CA2F452C","0x265CE7FC23BC2AD97639645DB1B9F10FEA578DC55A856EFD2745A2268FDB1125"],["0x26AC86AE62C55D91DAA4D3CA728D2E05DECA2C0BEBF6863434853FB055B7F883","0x2F5BF551B0FD63D45F0A1A3580744213B47F0338D4CA54DC392EF387F65F888E"]],[["0x012FD31BE05D8B071F543B7547338A3FED723BABE5BD856C9D94E743A3C11A64","0x1FBB8CCB2A6B8386079AEB11532789639CFC9CF8CCD01795FB8B1DF62FEE9256"],["0x3906EC1C223C4ACF783FA6FEB82FBEA17CF02E93F8E7C237AB0D8FBFA9BF7EB5","0x36890D899AF48A6F7FF052D0EB2F6AFCA5B87EEC3B7C7B09772A812744613E46"]],[["0x1041D8AD99013D8D0F1BA068A876478E75C7D45AD3B393F2ADE587FC4381D5E6","0x355D4B1AEB15A47F0F0C353C8347E54A690A89F1AD0978691B53CF813CC54D51"],["0x28744129EFBFE2E85B3D8D49ACA71D5BAF50B8B9143C198E859053D5C1D02B51","0x2CD52517F8202D1B41BC53384FEC3C55A1EA722F8BE9DCE64B0722D5A2D12B66"]],[["0x156665377075EE00C4846673A26319D1DCE23CECE776A58C4E6E133F65DCB80F","0x3B5B8FB2E131D3E9623C8E24B9D6E80131CDC8472B29807F95B09F77972CEB1C"],["0x3BD326A4F2301922562F485B61D5D996F788F09F04E35F33A805134F754D52A8","0x1A14DE37089DA715D9CE60DD30972082D1730D21C90638625F2AA0AC145D3E3E"]],[["0x0A29400E34251AEFE1755DB62CEBC4C97EA7BC2E59E4CC993FB340C141A6A46D","0x051FFBA80E4331E86B3BE369F1C4EE2CAB0C66C4CE95CF0CCB7DABDBE554CD83"],["0x2FA4AC23A4E96CF53FCD0AB2D0C2BE6DCD38321E1A32543E755D5F8D37167CD4","0x26FFF33E8A30996CEE694E08851329D78B51BEE6687705F5D1639AAA2489BCF4"]],[["0x080C88746FC071157D85A15DA1ECF691545F06948527C1E3FCC4662E77B48D9F","0x0442653C3D3739CA6203469B7E3D9F5C6DFD4A8E52A452682D997DF46D299BA5"],["0x1110DB9510803467C44D72982A4AC982B7D75FE6230833A049937136C7D53F82","0x0F6DAAF1495CBDC947AB3462B2194E2684D76BF77569B8D56EBF5C0FAD6D9F4F"]]],"z_1":"0x044828F0DA3FF3F88F83CBA50AB146E858CFDD649B7EAD166E4FB61938192701","z_2":"0x1B46C4F9DE787736B7D8B46D131B4F706FB2F693ED40575FB102A767DB08AD31","delta":["0x0D809FC0B5E4169D6954D8E77B86A95058D395B36A742CE2174B0BE2FE6F34B2","0x323AD58D9DB14EF78FF89BDED0605CD0D7E36FBACC6CEBF74EC18C263F1E2BC6"],"challenge_polynomial_commitment":["0x028870E8F36FEB6579091F6F9BFB4E12DA0D1282BD0FA3A3C6ABD6F1EC7FE659","0x015105B4E6DBFE848DBD4E14C4C52938DF3ACD2294BFB539D88A703B9666D4F3"]},"evals":{"w":[[["0x01985FAAEF81627B2DD03C495594661163FBE5D9AC561217A7E77015AAF8A101"],["0x1D3E67DEA2340CF461E7A2458788C1D2850E17C6E12326197130F93B17994063"]],[["0x347366C3766A79C7BD6EA9FCEA3DBD2517D4282EEB9A0DD1E0BF9E4BBFF40B8B"],["0x1998C9927D0E43297ABEF5E827F003A685E3B3B2A9CC8A5F029617159F8FAAE3"]],[["0x03ACFD7465DB4DDAAF9098BED5F2D89AB0E00C217C085F9305FD1EC9CE82073B"],["0x269B87BAE6D4EE716C3ECD4B867CC40AD039B46E229250B382BEFDF05F06DE48"]],[["0x184E920FB71809E19B6BAF49D9903219FF657FD568A1192FDCC0B9E4CCA53678"],["0x391699E293396B80D66F55A0ADC092DB1599FE884ED6B7546C76D2FE955207B6"]],[["0x207EB0C3A8363D7CAAC610C97311134BCEB550A7D8D8C575BC28852DDC0E8959"],["0x080C4C3FBB2007570A706377363C632F4ED3A44BAB36F719946FA078607C9650"]],[["0x28746A59B5BE5B78017569AC07E94D73CF59B081CACE944A2A11743BBD90F52F"],["0x32AD42632B7B6329EAE137B2AA773CC739B16123B5CD32793192BBC57FF5FC5C"]],[["0x0394A25BAFF46A8CF7CB9399F9EB44E9E7DEE126B189302C591F069E60B3EA72"],["0x3FADB4F5BA1668912123EE0E81212ECAFEA188E135B225058BD2B003DBC307E3"]],[["0x2245133123AFD205BFB591D334E0C7D269CCFBE583D41CA9BD10856B06B3B567"],["0x1809A4127309B8B17C1D2842C4CBB4AFAC06C1680BF51B0FF4A02ABF2EF5D070"]],[["0x258C4D135C4B96AD9D4AE0F45E01854EB7E6ABDCC04D1D78719CF6CB4D63FB33"],["0x05A96217DFABEE402766904F0E30ABCBD231B2128AA11AEF0A0461C7BF796F1B"]],[["0x00A059340C859A626A4144718B998255030411D64D64C7005B1CF69117CF6DA5"],["0x1361C37EAA968F9A83F5C73A037F560DADCA30A00A9DDBDC09FACAF17B3BA24B"]],[["0x35EA98A7CFB1938CFB6E83E6CC580A677977188BE5085C487DA0B4BD9FF69CC1"],["0x217143E189DF354F952FAC5B47F2CE414AB6F56A9BDE5638A55F9ABE0F9C0B75"]],[["0x301ACE7B65C1A0DF21008BF7901A22B496E4696E9D6C3477FACD7846E710CC19"],["0x372A8681F2D516005AB1C62935E985478A3102CD31AD730B82D6F4F1A09336E5"]],[["0x29C481E3A12D46698FC22D9204AE4569D76453E24BA324390124A992596C8999"],["0x29E7F68A9CB50CAD0E06C4FBFA94A6E1A0C844FB60A04B0E34B06026A7FB0E1B"]],[["0x2DCFFE14E43F51F880C458BB640DBA286495C8DE043DAAC69581EAE16983FAB0"],["0x37020DFA4D5478C3F50F6D1E1462E6F5A8884A533B4124D2DAA1FFD0CD8B512F"]],[["0x050B0E1C52FAA2A754262D2C732C96A5792F77E119570806FCDD050041AE6234"],["0x31967C89F284E33188CFA8C31CE1EE9E33C0549C25ED485144DCEA6B8AEB01C7"]]],"coefficients":[[["0x1BE534209BD53E712C2C876A92ABC46E3F3E2F95DC97CC6BC84D33B0B9E0771F"],["0x2876C34F37087A47EC6232ACE1A14AABA884E803091E74AE400BFAB4573566D1"]],[["0x059BEDAECC38D58EE4680E1C56BB8F981AB9E62A9A892BC9D4084EEB041ABD9A"],["0x11019D694BDF99ADC58A1B029B54AE8DE5848F0CA3261801D5A023345CED90E2"]],[["0x08D045EEA4ED8497A71929EBB29D89794652A14D898E7EC8A3F00ED4CA719A3A"],["0x38DBB2FA132B3B5739F234BBC941898A6B078449C84D9A4538A27219095D98BF"]],[["0x2A3A1514220BE7826EE6A101303D7768285085EA0F319B9C47446A342066C00F"],["0x0838F0F93BCD93EBDDE1799CF09C9F3A8731BA925A3EDD9650B070FF1D328503"]],[["0x397C58271A17B50A6B647B97054C49CE40A4C52C9742F883D4D07CA2B67AB5C1"],["0x3FFF48AF7E4C0A3576DE197132827C01FAB9BF7A8A4B2E89FA854410FE9616B5"]],[["0x0175A157348336790DA5AFF268727C89DB547F332C6CE1375E35FBB63BF58FF7"],["0x3E986FB0E8833D674235EF458268D5970E66BE51228FE292617072E78CEF14D5"]],[["0x0B4C7E0786DBC3D9298D618577F3DAC992DC980B255828647347DC17F0E5F498"],["0x3E84F1511D49685FCA43E0F19E74CF1C3EA0A62F97E466B1F513BF4848452558"]],[["0x35E412F15920C5316F36A22B4B4C1076B84F3FC67C8D3855FD767FE5428BEF5B"],["0x3B49F4AF53ED8CA5C034F7D8A57C2C59EA5607BC138906C50E99663F36268F93"]],[["0x3DC35BCA21F946C625C13F8F3174D1373E219545351915EE8A6BB84C7F5F0D12"],["0x0F9A7F53095B3BEDBDC5B94A51F4E6AAA95A92F40C8CE2B073EC30D7BAF024D9"]],[["0x347E07AD9B985D1D63A3C34216AE73C2C40B9EFAC0C9AD7604CA54C0155724BE"],["0x36743081828792D3FB0726DF4EDE488EC1E594833338554B0E4BC630A9945AA8"]],[["0x37592193CFC23E7A4DB2648A846F3F96AD5E3AA2FC6E5C7F3DC4642DB74D9C9D"],["0x198FA83148A18984E91D9628CE1284CE0EDCF422112FCA99695B252A0425CC39"]],[["0x38833D8ABF79A21645B6FECF49BF143FFB316849A0F077EB6B729FCA0E6A31B9"],["0x2B5AC350CEEFE02B3EEA1D9F6A47071DD6B216A16708618BE08D9BE03904FFA9"]],[["0x176F2EADA78F183C7A33ECEA41C3236AB3817E815654BCFDAEDCAB5829FE986C"],["0x0A5164C3DD52C2882D0EB16504A8C3764D2C39E22FA6FDCD5A177F0339CCB8FD"]],[["0x3B58884C90396DA77846C609DFDABEF668E98A961DD00A5FCA2D687A94A05FCA"],["0x1F10BBCDD96A8174186D4F68F1276563F133E90B3F68C41315B3203223DD8BFC"]],[["0x11EFC8CEF7D337FB4546E2A63BCC03FEF5447EB04AB6A97C41D98AA64E80AEE1"],["0x0A569661826526FBFD3AB3D898556CDF63FD8D643EDDF0A9ACB8691614C52547"]]],"z":[["0x3CDF140E26B1D965E1030C4E15C17DDD396995B265B60F733EE4708778D3801F"],["0x06AA7603579F53F6A1B37587D4DCD10801FEF1461BF0A444ED9BD4EE4C83CA20"]],"s":[[["0x215AD6AC06C069288CDCC6F87F62D41C7599111A3D02B9D81A54D8BAFE6A8309"],["0x2AC5C0ED25BB5C81838DF75251FA0B9F97B793463C352BE1235940DD4520B79C"]],[["0x3C7F39F57FA1BD684B71F7C8B72239F18960748FDCFEDE833B7081A0681B8689"],["0x1DEB4614F60AB251EAF4DD347651FF06A025D0B7A5A3FE5A8D6617186A87F8AC"]],[["0x3F6FE125365CA8A2EC761BCDC8FD4C065818A9DE7EC516FADED6C724A5D61635"],["0x37A561FA6DDA4B9E0F199EC9F949EB46C35EB0C5ED019593C2D7B85E7A6B304C"]],[["0x2DE6340462699CB181544183D2E1722115753873419B53AFBE6CDB63CF7C7EFE"],["0x2A5D190E57C2D16733CA040C05C75BDC88EAB557A6D2725E0E7673E71F0DF57C"]],[["0x0A342F12ECE330072A0A82DC4CA315B7DF67B3FC2E26639525B46BD8B7545182"],["0x3811E9566D24FC758080698E80619633B50FC35732D334499CC977A5EEB5B859"]],[["0x1C9BCBC4515140564D5E4F8E0951BB5C61692340EE627E858BE52CB3CED564EC"],["0x3F436A62F4C71449F92B627FE9D9B049C5D8CB61AB34992E61EBBC687CCFDE9C"]]],"generic_selector":[["0x3E874959225CAA6ED919193B799F814DEB4378F606DC3BF987DE19D5A8D62D74"],["0x2417C0F5229E34569E53E78E7C2321D2F74196276CDBD0871BD70898AFD3C82D"]],"poseidon_selector":[["0x2404B13A235D828F059BBBE4731C31D077167C89DC6523A8B6D0B0D712AFA9FD"],["0x0255F6CC5F7CFB1A0107CCB6AC9FA63A3D5F87C646E83A0BA8D90B97E8929F22"]],"complete_add_selector":[["0x135C4E2D4764CF8B784ABCD5B958BB88B9309A928EBF5D400B26CA19C4835AD9"],["0x15B6A7F1E6FEB2D4634F601C477C41F478AE870DCAB4275DCF25FCA43429C999"]],"mul_selector":[["0x1B066687B59537061CA85E35DFED5033BFAD0BF89ED7664B3AFA532A53488E50"],["0x2CF0A044FF3C4A760AA7CFFB57341CCAD83FE2329A6B4A955E1E00DF3A1CFBE5"]],"emul_selector":[["0x2AFBC17ECEDE5BFC12CDEA128CB1C9A7667B44FEE88703DF588DB70B16EF71FC"],["0x04349C6E4DD952008A2503F05884939FA404FA304BA8601B6F52B3C59B0FE1B7"]],"endomul_scalar_selector":[["0x112B59D62EEF38F04FFE40EF9087176D2BA02C5661C2313953FD2F79C472A3DE"],["0x2CEF8DACC68004A011C69C61386A3A142DEBC469649E4E9ED8AD47DF468CDA73"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x15C5A6311EAD3EF292C6123DB2F8C1F880D4D0005EBE013CDA172397E3E3B0DF"}}},{"public_input":["0x36E22AA46F2BDB9C24C952676C84AF8E79D840B64364E303D0E5696FF3A94679","0x0D6EEA266C1457537706114FB0AC65B2B5AA53B69064C47989D4E1CFFD8555EB","0x3555813FF960C2F69C214514DE0D1D6C9F1184BEFECA0BA6C2D9FFFC0854B7BF","0x2D4F030300C61B1E4AA9D7441F43B2FAF8F47BC1DCDCB53E39CE737ED91652AE","0x15FE77A24234BB86BC84D0E5704CC046D9EC624F04962BA68FF62A829DCEDFCD","0x00000000000000000000000000000000FFD01CB3D05F78DEBEBA1305B74262BB","0x00000000000000000000000000000000D5864BD90E7E1F814A333699F1ECB0C9","0x0000000000000000000000000000000088C36933D9F230A9B09AAA6F6820DD19","0x000000000000000000000000000000006702BFB2AB8F7C8F36D0EEA8B9538511","0x00000000000000000000000000000000586A20DF1A81A7E3BD623F1F4212251C","0x05F6DBCA27EF098654B6BAB8DC116DD8C774CA0A6064408CAA0D4E28B2276A46","0x3174BF991AE2EE4C38919C0BB3FC3930E18134D669CDCE2820D941D2D732E00A","0x07364906D30720D5ADCC390AEA191D313B0099BB74A870FE4123E84A829CA89C","0x00000000000000000000000000000000FB8393F76D87EF299EF6E318A77FA213","0x000000000000000000000000000000009899C1A83A42B067A4F76B3CE901AB72","0x00000000000000000000000000000000DEAD31575E7BED796F1A10B9A3C28936","0x0000000000000000000000000000000057ED3D06F404CCA75286C5936834B6CE","0x00000000000000000000000000000000193BF22391CE6D11F07A87DE43FBEF17","0x00000000000000000000000000000000D091A5AACF0B76000175474B33DDF7C5","0x000000000000000000000000000000009C8B46EDA6ACAF4E07648347B21BBFB8","0x0000000000000000000000000000000069E015A655BFB57E128E3191DFB047EF","0x000000000000000000000000000000007E2C50711F4E75F64D989578B31FD2EE","0x0000000000000000000000000000000091AD819AC5AECC920BBFDA1CD5670FF5","0x000000000000000000000000000000008BEBCFCDAC829B258FCAFDA38E9BC4EE","0x00000000000000000000000000000000241295045970BD08F7B25396B0E6AFF2","0x000000000000000000000000000000009958AA2CBC306A321D2714DE955407B7","0x000000000000000000000000000000003412CCBD0239A9CE911DB1A3CA0B6D18","0x000000000000000000000000000000003A13862DF118FAEC9863A50E84A63C43","0x0000000000000000000000000000000059EF5A54F0E99FFC09AA152D1CB3774B","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x2EEEFF3D8D59F035B1E5041B2A3343576AB7B595854D4EA4D804FC2D58C19325","0x1586B6FC39639B62F09F87C43698CF646E8007065594E1A92525389E1EA3D483"]],[["0x392877E8A160CC04B070CD923E228191930419F5C46276B183B69743C2FF9573","0x2CA39256482CCE898E29C5D9358BE190F04784E94A813C23370A069CD1DC5FF1"]],[["0x3C7CB3E2661AE3110225B3F1819F45B3732D74240B2E71196A19B13C1840FA26","0x2970A73011C2E42FAFBC520A9E784E5D18DAF75DB8D33F3287F0AD089F3BF21D"]],[["0x0CDE9696CDB78077192659796999C7D32B01956BDEAF2EE7F0FD8DC877072413","0x39BE3ED1297C98F6C2F8AF1504A6674B7EFCBA1024CFC4719AD02E525A884F78"]],[["0x0E05E80EBE1EC66BDF28F2C578D2601FAC39C991A9B1AF95681EB1BD2E8C5BD0","0x0EB668B90AD33A67F2CC1334102369FDEF9011A70DDECDFC9E1FF56F746E8442"]],[["0x23F056342752879EB20D7CB5FBD107948B978D2F2804362F65A4301CCC4885C5","0x02B6D52A22D2BE0E123F6960423685003A760EE34D3870609C5F1300F18AE6DF"]],[["0x2661CA5702920A8A7FB154A329384B24EABB8B496648ECC22681BB7527A96143","0x29621121F126DC021A559F45137F2F69ABA11AB56B83AE30D8B177A3BDCE0506"]],[["0x13F4E1BABE83148D078BC967C3B90B312EC7C572CD165938048D2F7840EA7FB9","0x246789DF49F4C195BE40C97B557B4A40E34A25DE35B0954921A3B5AF9B6F8539"]],[["0x3209D415910CEC229F8E280BF23B49B0080A8B9D1CAFC604AD9A9A19894B233D","0x32A66F83B7DBF479F0B42D084A8FE4B2921F741681EA12D740F26863D16F5295"]],[["0x2A23964C0DEDCA235D48B68C6F9F43E3530C01B84D87CEC98ACA0A54415703B4","0x026983D3882CB563912E62D6CB770F2B1E1A0D372100A2D0E155171DEB4EF855"]],[["0x0FFBEDB103531C8A2498FBB29E32268E220A2C594AE2757007956FD0A15C07E7","0x0402F7742E186CAC4748961B3645E3A30CC14D5904AB316619EFF2BE5440297E"]],[["0x2164B463C8E161FF7773915C8FCAB5CCB8E419D5ABBB305DFBD0669D407CE00C","0x3EEF0C60805DB0CD7EE6088551F9D499BB685BB7234661B938740C60F8690013"]],[["0x18E591B6844E32E75A6D201FD37DB2164CBD5DA0C3297964604B82BBDC9447CC","0x2B3D225DA514ED05E46CD28324FC166D1BED8683A4452C5335862655BC127A2A"]],[["0x15360CD4D8C6AAE5F2CB416837CBB8F3E3243F32494D233699DCCFB165A96CB0","0x20F51C15CEC37FAF6F8F7A13B7EA2B87AB7A49712C2B8BAB7B4B2D0DF309B8A5"]],[["0x32441C86C98ABD5CBC6D26AD2EAA163073ADF0101C66A4AF78AEA0FA8EF974D2","0x009BEAEFDCA34D1C983604E54D654651E18B71D43292899D2081D2E8D3862E5B"]]],"z_comm":[["0x0E258E5D5495643C6BE8102F624803D862D28C58011E033137EF27E6EBEE2454","0x0DDC5F406544E3814E52B858AD0D6B513429F6FA19B8387AB9153AB1A769DCE6"]],"t_comm":[["0x2F9FF939F81E2C5E9F9B628EE5C0D21B09602E9795FB4BAEFC58C4EADA6A0672","0x11DCE33C21707498263286761581A79EB723DC430FAFD1CFA45DEF54AD81D1C1"],["0x0A2ACC8B5C96C69BEDD4BECB14C1266F8E6D969DDFEC10346F31DFD262B720F1","0x31B8BBCFEB5002C704AA6E4C5F1E0759F193F545B91BA03949E3A28BE7709AF7"],["0x1BCC0B430AC699D9135BF4E3C3332977E2AFF9B059D56940CAADB9FAC6F370C7","0x280E472FE1073FD2678FCE3E27E6E02CAD3C96162C5C9EC91486E86151E78924"],["0x0F4542AD6B3528678FA61906F21D408990BA5D86EFF9191E176CA3EBEF14C3EF","0x309DAE66BF6304CA5E56C938C2C0F172EA438F8E58FB2BFB9358A47DF6F23ECB"],["0x19552CBCF585E10946EB8EAA409A0332F6F34FC28E949DFD64F4B816E267A9C0","0x3EF13DC39456D3A92F63B9A5417E544AC4FD1B41A1CFA5AB3EF2717E45CAFBB7"],["0x016267CCEDCA6A9BF1C1490E887A9E6BE1415AB7AB268BB197DEFBAE299EB027","0x1C6A2AD40EDE6DC1B5257C26876AB4B791F8794FDD09424488A8882360F4D3A0"],["0x0AC2814BF6E03438E776C98A168241BDFDDFE308664F53E9A4A56F22E865A851","0x31756E9636E2C513D921357EC3BFC5A3B5DBB0EB4D0DF72BAB4B5BEA086E4BF7"]],"lookup":null},"openings":{"proof":{"lr":[[["0x0FEA68600D7C0E398D26C3B14CED50AFD3713B6F11154BE9D399B2FBDF6575DC","0x2203FAF2514DC755EEC7B2617591E19A9382F5B73F533E1FAE8FCA324029AC8A"],["0x0210FFED483F0B044A9A1007B62687022E0A4EF57F10538C613B14FC00D64760","0x3AEA0E1ED86E2D2FE9E961E15573DB47B5F2934A735A715EC5C560F22FB7C3E4"]],[["0x0CA3A73555C8FFC9E5A40F706118F9AC916B0EA56792C47436B12B5D82A29B17","0x173E6587464A8F0B4C2022F71DA85B18386BFEA8B97EEB205F46BEB78D2377A5"],["0x3FF987960695DC9948371A3759745182C7D6194064678FA2ABF3FCD882BE117B","0x23F36E907F0F29218C590FD6425F83829B53E52D3AA3A92883D8E778AEDD299F"]],[["0x27A5566B14A43A43563A42346DCC656A9C6862BDD3D8F5491823F938FC84F6D0","0x21E22D216E19CFD77D2A0FCFDF7E2D5249387048C80126BF067C155498DAEB8A"],["0x0E9D059E15346FA2064F56D75F9BB998BE5501C5DE3135D9DEC85B378888B832","0x110D50503B2CB9E14A650016C45EF5A51C9A561EC10A2DD8496F3E52803E5678"]],[["0x02089D54B59E7858D74FC1C1482F5977EE90A71CE13D4E4F74C5CEC4D103C533","0x2FA526189D1490CF5C55DD99DB76D6116E83E448FE658218A681F2A8B601E605"],["0x2A69F4232946A2EC409AEF8064ADD8DCC572B70B7B10330691EDDA7D541B4E72","0x063D5D1ADCE46DEDB210807BACF82FC4C0B4F66D68DB334A4431782C08E585F6"]],[["0x26F6EBAC53E5E5CC284FB81D2DE9C2BAEF98DD1E09C32216FE1F74771B581E5A","0x26859B613D59DD8130D21E74056ACEF3D1F9056357AD4CCCA1BBB7B031B95393"],["0x3BD5CA6CCCC89CA1E08176B0F1126C47531A657EEA1518C5E0F7DD40BAED4E35","0x2A7669DC3CD25225A64705973B54BA4201B761965E575C2C577395374160DAE6"]],[["0x2ED3217BF25F00CB7B15ECB30C39AD5F3B157EF53F523B83B0F93B87EFAC390E","0x1E5492BC6A8BFA99F7890DAD8AFB8850305A49D1DC24C7DF7C2ABF56826F9717"],["0x381BD3C45AC6B01B88389519BEA7D9AE6222033CF275DFFFA2ACD3E5AE0F6A2A","0x01BF152CA1BB7B14293592C9A71F7778C39DFCC540B9A97406A216F5A67E3AC0"]],[["0x15FCB381D5F946F902666FD61840FC5F4C81662BE291A99E875A9718B931D7F6","0x31E5C61C5BD361C96D42E1CF96408737F7E78258E5AA9A1BBEEE6563563EB6B2"],["0x35738FCBEC8CC3E8FFC141C12B3AE2A02092C41BCE850D610E21EC76E9D6FEBA","0x3A9D73B228239A8D9B1385D1C9E6A7E3E05DAB76BBBC06CF04C0D6091E67A7A7"]],[["0x143AB436FA85753CD8F97DD70CB50F592FA0A1A8986F4AA9BC53980D22A8367A","0x3C19E6CC8F06730D1E5AAA028FEB3D8D6F657B0B8503AA6DD7EE883D9FCA600D"],["0x0CFC0E6C35D9DD4667334C480145B35C20F2F71D330B3ABC9E37BC66B80F5A71","0x198AD8AB64B266093478FCAD57EC2E48DB28D38C396C0A90BBA96B56EF355F0D"]],[["0x1F65A396073D67FC229EFBBC7C373B5FE0A4B75EE8A2DF0571476C4A1FC6548C","0x324000E5E664B0E8C899E872C4BF921E8D85DBEF6EE42D1086DEF91DD79E4F36"],["0x10BDCE489D7DD97850EE23923EFAB16FB5583D594E3974BCC47607052ED27ED5","0x2ACC1E271AEA8E7BD6310B451BE2CF0F4A3F1E0B1910AC7AFC648F775C64D207"]],[["0x3A0C4DB71434D779BED7860EC5212684D3D476B43E4EAB7EC388D518B2F30E5D","0x2B195DB8C40830960ECC6446D46B571D55A330366475FCB65F040A6741EA29EB"],["0x062E5A9BED4A8BCA693B4A7D210E73C668722CF7604D2A9459F8FBBC15E99EC5","0x3DA47B469F2F08359ADFCAEF044200CDFE86ABA13E59A0FE634E1718F73EE9F5"]],[["0x0C06BE487047801578AB6002C35F403F9517B3E533EB6FDDE081BB7A5E4B7124","0x2A98C4306B49E4E4AD74FDE0DA340FD4972B25CC6D3952D257801FA7F2D785CF"],["0x10D8C582F35EA6E57D60A110BEE85F4C42B6743279564746CC8363245F437940","0x0BDA915D2237363D3A111173DD77EF4F80A00F4DBF8A5811CB46176BA25E0515"]],[["0x39AA93901152FBBFBBDFA494B62F85427E2961662AC04183081277418F551D52","0x0E60D20F115D1163443A94769EAE383D9B1B8FC79E146DACDB2EB7D65D5DF3AD"],["0x2A56F84A3A6FE672353713918F643CE9AFB5CE1924B8FEA5202B0C0B3A773B5E","0x06A3F96424587B97C9DE8086106097089BDBF2D55F52530CD00BC12E5F3CDA45"]],[["0x25DB9E85D7E0891F858139189C5CE6CCFB7E50C7A8612F2303AD8231456217F3","0x2812D47D969BAF9E65F4891597135E4ED280C9029A9DC5643545946F3C037192"],["0x090625760A96E9D7C47B50B78AB7CFD582BE57397DC77532A6C38E8BC440B752","0x1EFFAD376F34D631D1615BE77E4241ACF8121AAB85BC09BBECC665B956478314"]],[["0x14CA52EBE77DB6751EAC27DD98B4DF30C9EB0AB5C9C177832DF2927E278F02FD","0x24A66B5891E421883F25BC69EA867926445CA20F0D59C6297E9FB5E970F9D71C"],["0x0B9DF9DC1900F38C5A82F324ECBF99221556921D02A773F14E41800F40878F54","0x2B9ADA95E204ED8C88714C3C2376705322216C373DFB2D20850F641AA616A7B4"]],[["0x028F944674D66206B23368D042E626603EC8095F1F753B1103215B7B6BE7B4E6","0x13D78376415FF8B4433A0EA12682539F94A17965FD4BBDF867CED9436641E0EE"],["0x22AC618A6C7E61936C103A4800E0E156A71CDC3748D8B3102A2F701F931787FB","0x34C769511804D8DD450635CF295834610F4D6A624B8595B5D1E581D6D9EBA863"]]],"z_1":"0x0FA9A497142FDCD8368BF660BE8EE38D2257CFABDC4DE66C0072685C3257CE78","z_2":"0x1A6572EAE20E5B2A6B377A7E7081BE06AB2C69EA3062E327BA7465B23DA1D7DB","delta":["0x175CAFBBA81D3908856E36DCED7F7E2B98AF2493CA14FABFAF243D72E17A5EFA","0x3971C66EEC9BBF1DDA7A1DEE1E65D33614D759C5486AB53BC0F28D9EFC69753D"],"challenge_polynomial_commitment":["0x3F0574A43BA1103472F1A1AED71749A22657512C9E04DFE27ABF3FFB9C35A18B","0x0D3ABF6FEEACD7556BC62D0099D4774A408AD22DFE0AD17F3D5652C40AE10DFB"]},"evals":{"w":[[["0x037A4995DF017ECC0F7B90BF6C99D965C68FFFB19E6B0EFBDA57C754E8C68679"],["0x22C8686FB23527FCD981989A22E03C17E20BB4738D5486449D54A37A4F2FB2CB"]],[["0x0D4F47E0ED1711A00E5E93237E4F1618F781D4979E3CF811C4158F0DCECE0120"],["0x12CF1EF6D5915E6A45F5B4BF816201434F9F294AB51EA30D9044469EAC40801A"]],[["0x21B88622BCD118F1DDD2063C7502C33C95563F8BB4E7034CEA8016387D8E5224"],["0x3F15715C55484C7E63DF3275E279FE379DF6BA6E78B1D9ADC35763B3CE9F1A2B"]],[["0x3D67E154C0E96CAC487F09F6D9CB5A4034CBB3A92B9E2D4CE3DD3EDFA09FE543"],["0x3EB7D0CE0D39A489CBF203F1B107393C8A3C6189F73868105B7B341A15BBDA1A"]],[["0x00058E37A0477F14E928292A67013FD9B3102648406AA176653DCF9CC6F2D292"],["0x2112FAF8801722DDEE8E113766EC88A7048F9374F6D87C07320F56EBA7703AC2"]],[["0x21964C992AD438BFB31E68EE5AF9189C51B2B5B050EF840AC046D04C3B67C46C"],["0x18CADB2298AFF9AD91B7E6823DEF2C86A36F298FFA715FA32057CB7CCC399992"]],[["0x23B49216F03E795C2FB13B91A13AA9D8D74B251A30847F59BD5411347E40B2DC"],["0x034FBD60212D22C165BF647EED4B88EC7052CCBD23105B30B38C5E29F7E3C998"]],[["0x1A9DE43EFFB5779E84C6C6806CE0F15C9EDFD78DA10E857C296E95C5340F06A2"],["0x0D0D8AC583810CA6B12AD3379115D91FD4D02C73E251B49E5FB44C0D201951F6"]],[["0x26A0DB190B91E1A0E95F414D8EA97EB8235387BD91B1A3D68DE3757464FEBD15"],["0x0A59375C1F29761B02C8996917184AF470361381257C89A8EAD746CD08D71820"]],[["0x0BF64A60827AC95C795A7AA91F96FB10130DEA9DBC85E8C4C3E2B5FDBEE25E47"],["0x0241B58533926A0653F40C6D6C930E614A7E7F7F9B96C5F97206FC58F96E37F3"]],[["0x38BB2DD872A3797A7BD86828AD98794743047F0295E71A3CA2D3D064B2C8FFA5"],["0x3210583B02DC2906CD163FD7759992F3DDCCAA75BB20C7E2A0DF0D9BF1372A77"]],[["0x11320243BF41FE73B67E8A37A9445235297202F29A36CBD98A197049182EBB4C"],["0x3E26039F83F619EF0D7D19A5BEABAA315BA4DEF2A1BCEC4BB6B45F3127BCC2D7"]],[["0x1DA703918795B6A9790B992F3EF105B52D85B4ADCA8EF4CC588CF8C2A7AD0B95"],["0x3BBEE07789DDE69BF3B9BA06CA5F3438E55B06F12E072506DC9396BEED99BE49"]],[["0x2A9BD48F3F411E2ED38B77E993C5541DA2F05B3297F528EA3F0FF496F524C797"],["0x12F5FA047D2ED10B281C6CC745F807CCC2BAE49728BAFCFE4F829BACAF4A3253"]],[["0x160D70E4B43F546971E5207C659A01B545F1CAB16DD8AF02C49E2BA3AA69812E"],["0x325B3EE586904FDCBA5B7B7C9634CF5A6FB18CCFC2B8264C0F01E33C3C76E337"]]],"coefficients":[[["0x298613C6F18A33374430917B9115A9F26C70610F116848B0BEE3E259D187B4F7"],["0x38F421C503092F60ABD19887817B5B1A26E6D83B27751D88E1D6458CBFC0323B"]],[["0x173E72CC93572E370B4C1519F86AAF02C28BB887732780F7983622D93C3B83D7"],["0x0B34E294BFBE046F7C02B186B10037FDA88EE970520D2AD091E24AADCA1B5E6C"]],[["0x2381653D4F6D8AE7FAD488B007AF96CDC3A70C44D975FA521F342BEF20037489"],["0x1CAC0A4023EAF609690A82D0CB6AEB7EF4066201A953572889A61F3E8CC83704"]],[["0x260745948FD607FFB0049AE9DF6EF25B557031B7BCD70AABB84E6F5B944BE2C7"],["0x14CE866831626825A3DEDA5AAF4B028D4BE9DA97C6E4396C4630EA8A71F41CD0"]],[["0x3769DB8945E798B83A7478B8468557E1E8929EB736DC0CF30E640AC4E459B7F3"],["0x2DBA92DDA807140194DAD8EC0802181BE12FE476B71DE866126DA4ED3738EA2D"]],[["0x20AB536D3C73B275052E37626FDFDBC9FE0904BA4D8E9A87789A05F402464988"],["0x3D203DA7D34A07AC77E4C26A5DFCF5FDCD0E008DB1592C07E4E27C7B80DD5F3A"]],[["0x32D7B8832EFE16EF6C3AD5295C1CF4BEA483D73B84A47AEDA7F7B1C95936DB72"],["0x2746CCECB66C6A068AF423311B1C27C3B47908613F2FF0FC69DEF3D46CBF8893"]],[["0x1A3CD31457F812AAE1EA2C530D3B3C2DD8E69587C254B896C6157E3437202486"],["0x07CED6A422CEEA576495C839293ADD1F323153B0776CEBF029C1DD84637CBA58"]],[["0x2009FD6871D06DCC0D4059D356C17228D54C91E5BDBB42853E002CDDA2C585A0"],["0x3991158C21127C9D9EF450F2000D21E86681CE6DE2BF5457C632625A14605622"]],[["0x3609D4E16341630BABA19900187B4A506B2303850059546F1418E9E73BD018D5"],["0x0B49C5C614DA842179590EBA5E76688DC22E2422B65A98A92C2731316CFAE5FE"]],[["0x2C016344FD338D18437EAA75168E25FF12409394B7DED162BE827B3E8A364E8B"],["0x23D7BF6EC39F7E6F6169B1B760E6EDBAE5F216A254EC0679C29B609B6C710A9B"]],[["0x2671439BCDBE581D1F5E02CD85DBB746E28D14E77CC18D422F97C202C2D0F021"],["0x083342DD56700540C2DEA95113FA17890183E5ED0921BA8764427EAFF244776D"]],[["0x1657EFEF1D2C854896D6106265DED1DCE7BA77ACC5DB369DFDD0F3FE305473B1"],["0x166CB72529D02EB55019B9109C509827002669CEC533399F126AE49002F5C223"]],[["0x3F00F5D0A6C2D73856D98E5D884BE9563D87D21AC5FA91D763DAFC709943385D"],["0x24ADC5AAA2E4536C2041D082D3FD3E9B6E7A605E5B84CADA16145AB757F84B6F"]],[["0x02F2320C63AFEB29AAAEA106A3DBE1F6C8CAFF08DF88AF9DB652CCD31A248805"],["0x39C1C151022683BB343BF47D1CCEA58E0F592C9CABAFBDABE048DEB6D5C52345"]]],"z":[["0x31CC08019825CFF7FEEEC64EF07D8BF87E03A3357206949D84622DE29B9AE04B"],["0x1C1459F05EEA8AE7ED7B36EDFF96528F04C83BFA274C0CC4881B42E755E69978"]],"s":[[["0x0D6997F6605F642CA7E24C57EE6812B4BF5DD069817ED51C918AB67E05002553"],["0x06CBD69C54C6F2142959FA16489AD9655F1344600EC1FC3C03027481347B666F"]],[["0x0477D70BF77B18146C6889C1DDC1EAF8139A0C068D3E8AAC72D41E65ACEA490F"],["0x0AA1A5A6CC70610E1E6DF7178EC4EEA95830C92B85DC1D0E4BFAB586494E8F53"]],[["0x3645FA19DBA604432C918EE72B4AA9B518DD768FF4EF0AB9A4A2B0BC617B59CD"],["0x2E5142E18803F0E0B7443336D6FFF296C20E179308787AC4BC74BB88654CDD28"]],[["0x3555A61F99BEB805D1FD13B98A6B009690BE8784D293C01C66AF571C33D8ED89"],["0x23228CBA8C7C2E93886EE49682B50C8CA694C84BB0BBD53A410FEB7408CC4CE2"]],[["0x3647A12CB2303F9A56DC21F5DB328DCAAA1A22EAA8C4EBDEDD766C337DB9D398"],["0x2B4EAFA3ACDB7FDF4FB20B58962EB2903441882B4EC88F0309E8610F723616F5"]],[["0x2CD9F572730BE23F7D729F729C65F3C658CBD726BD2D8943F396CA66F4CEE6FF"],["0x0A88C0E23DE99BF4315A708175589C16E6784DC4869B690CB482DC6AF4B266C3"]]],"generic_selector":[["0x0483408CA84EAF199A2F674FC40A5002A739CA54A02C6A9D751B961077CF89BD"],["0x34F3B54899AD387EFC6D0E11C5C78598568F15D660BED981C584166B57882773"]],"poseidon_selector":[["0x338E54DABF99EF54AB4452A8329865E77C8408B4ED408512F0DF32BBE50892B7"],["0x20D56F7B4D20741E3BF77FDE697053B337C05CD8ACD915A95B65D35CE0647430"]],"complete_add_selector":[["0x3FBE8B51F366123368CF973B4F159B65361CD799EF377A877F66F884C9EDBE5E"],["0x11DE042CBAE87C38F8DDDD22D6D52383D2D1E9D8883A89F9FD8176F55376EC3E"]],"mul_selector":[["0x20DC4F1FFCD248A9F560763BC9AE348B8084FCAA4DA007AEE080D6A5061D7337"],["0x156D0C526CD48582EA7D60334D26E4DA9C6375137BA08B7B1A360ED177FB1389"]],"emul_selector":[["0x03BA85C70E4B59EA7FB706A738D12FADCBE8200FA2B3BFDD6131554B7D091C84"],["0x388998F832A8ED3014D21EF05EDDEAF3FA1B1627A451B91009FF6599A9D4EA86"]],"endomul_scalar_selector":[["0x3EAF6736F02F21DDBC20B5792BF3F3C7E5ECEEF016F96D6331240AF39E1B89A5"],["0x0EC995A2A5C55E09D27E19BE3372EC0D90C23FF1742D0EA85B44ACA07A1ED2E8"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x26B4ABFE879D63FC327AE9E118E9880A80C76776F298357FC290472DF632F87B"}}},{"public_input":["0x3569D1152C34CC6B9921AF7E9873FBF01450F862A3AC18843BC34624A21DBBB3","0x0E5D7263C3B44CE1E85F6C00CBDF2B431E060AD59C2E886104103C964191CF58","0x2401159FBFAF2F927FE70980FD55FF4B1737883DA026699500FA154600486FA5","0x33E89276051CA52317292AF73529D3909CB7BFC1EEB47A2FE5F88221E72898ED","0x18F96381F6B9ADC897F63811A8663DD0C939801992A90CD3C927B40C5685C7FF","0x000000000000000000000000000000004CABA4DBDCE853EE53677E15ADC7C447","0x0000000000000000000000000000000081AB0C5C1F047311259B47385A7BFA6D","0x00000000000000000000000000000000A3AA7D6070B1CCC802A4E6DD6E8D7122","0x0000000000000000000000000000000018D1E777D6845F398343735A63C18B3A","0x0000000000000000000000000000000007EB0C87A5F0369C4F809C18BB962BDB","0x09044CC64E95D25FF7D4B3C9EFCCF0F69A1979AA03390E7BBB2CB3A59460D8CD","0x2031BF3A601F915B32DD5E92876D70C4475F74A92F9E63810D5AFB89361848D8","0x206954BD7487721E62A9762ED94FFBD11D240409C6D58DB5D725CCA667A8A83A","0x00000000000000000000000000000000590B4C25C3E69247C32955FD9C6F4C8C","0x000000000000000000000000000000001DA780D4643B5090761EF0509B412E49","0x00000000000000000000000000000000D3C4ED2C3834408621C91458414001D3","0x0000000000000000000000000000000005B21D38E7139C5149A7412309B2E4C3","0x000000000000000000000000000000002DE6E2B8CCCEFCF7750FAB4456FE74F6","0x0000000000000000000000000000000013E48DE43699F490169BF7F33E4E5BCC","0x000000000000000000000000000000003FEEA5A7F6D26B4B889296758B4F9EE5","0x000000000000000000000000000000008BB37F5F938D071FB29025B5B95CE3E9","0x00000000000000000000000000000000ACCBA50352DC94489A287F3C5916D217","0x00000000000000000000000000000000026B1CE84243752D05E0F54844AB1D85","0x000000000000000000000000000000001074FC248444AA3A02ADD553BAA123B8","0x00000000000000000000000000000000A59F275F608AB0131B7DDF1D6652A604","0x000000000000000000000000000000005A9C3DB65A7192708C803400FF821889","0x0000000000000000000000000000000087FCFC8621E54E9A763CE76B4EA0A8A8","0x00000000000000000000000000000000A7463C8DFFB51AA42AC23A09A776C38A","0x00000000000000000000000000000000594E04748DB793BB5E8E96A81DCC690B","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x2982B01C126AF0524BA1C8092B80DB07B386F0886159388BA8C08E0F102A69D6","0x3CEC7BF1AC20BDE773F185B335C6BF8A82A1236092B31BE082B66D8EBBBC0EFA"]],[["0x182AE77A5D69910600212E3B1F8E3FE3F075887ECE225D0193C7537A837A7029","0x3785F456FB784AC4C79202EA919DE884FD1E30C6CCB653CB23E4520AF515D39E"]],[["0x28BFCEF937759B432928CC39270CF5DDF84D30872663D1D472FD1578007BA07C","0x0DDBFBD15312CFF5F8F70C1B94121EA79555758B800BE1A256487D9E945B9A63"]],[["0x031432C3246C638A570D32EF39636AF2F2D610E3BD9250DB2C0C267C6DDB2283","0x36F15308358393E311381ACEA80A0AB4257C48BE002A19AA3310C7BCA7B7DE86"]],[["0x285622A73B4C132D66B43ACF894BDBDC59B22837EDFF0BA70C7DC50425024326","0x295275345B8AB05E3D348F3DC61436CF2B6FB33D416040E89B6D0C6FACF77EC8"]],[["0x27476AF9828D6509997558E20647E2449F4BFC46C2C081F07921C294F5F19E77","0x03A92EC8C9A9C76E859DEB7FC5FEDB8BBAB41951C2F4261E9B4E641E19FBD693"]],[["0x3309BD69DEEC56BDEFFEAA1A977C52AAA1D5E11C34EBF10A71D3D690550242A5","0x02C3FC64240DAF0A50DFBC0107F11E654D719CFB58451C8F1287C9CD1C202755"]],[["0x0EE9DF61E8FFEE24E3D968F54E098D667CA8F7B57A1ACFA42EDEA2217BEC38BB","0x14994DD8DF0D567B0D6AA74067098ACF64EBA4A78A9C891368604F5844A986FE"]],[["0x05B8081B876D5F7461FE00F59162895FCE893FBA5D036541C24EDA495DC615B2","0x2866455EA543561ED2A17CE247A6D1B924477CDF4F5D5B349DD71812039EDE61"]],[["0x1A3857C0C705F7D1AF341909732BBB082D80615EBA4887C81F0FDE66005B238A","0x317D6CD22739AC1135BA0755F12382FE6B849098DCADFF247A5E35892E82D0EF"]],[["0x10F598E90911C4B053A5D7D4859FA9D412C40EF12B10ADD6ED47C9D521B04B22","0x3AFB1F8B66E530E4F6D9161A4006BB5A96318A8C2B23A2AF7F57A02969CC385B"]],[["0x16DBB4D6FE9BC26E54BE60986E9D736CEAAEC7B6B3473C20264BB52BF4E3A3CD","0x3758A13DC939195B3B32DC809A16D7F2471E110C751B93FC613A81DAC7E7880C"]],[["0x14FDF642B8E2DF0D959CD44144C516DD0887FC85BFC7BFDBBE3BC903ACC7FB23","0x3AF55C688B20FCEA4C8A5351C0C071BEEB794D5565BD82498A19DD6DF37E1A0F"]],[["0x2EF98F9CDB813A200A4E81E9025782F459703B8A0F4542C3E00DC5FC28BD2AE3","0x14E0C492283D82076F45C9B4E110C8EE8B3131287E698323DE19A6014FA1E589"]],[["0x0726B20422061C5C5676CF4BFAC22DF6C5603722CFC6BC92E3A044F2381C0AF2","0x1663661F6ABD092E39D76A070E677484B3162ACE01639691FBD729BEA3D11561"]]],"z_comm":[["0x10BFA770D5A60204D4FFDD6E5CEF8756BF9146001ED85A022E232DFED6D72E23","0x103100DADDE24954A01DA49C6090481316427EDC15424459D8A7E451454DE200"]],"t_comm":[["0x3A323C5099C44C09B21E28E434623EF631AC74BE5113F48D6B43A08638EA3C33","0x2E3952B6F3ED89367991EEAAF8B08704EAD06E29DB6CB6B00C01234AA0AF6BA2"],["0x22D1775D0157D2CF77F0A814460B8FC6A00F5474B92D85542CEC31B45E208B92","0x2E24C739E8A592B162EE9C6B4B9F488FC8DA4ED47D3EA473F9A0FC5302FDA1BC"],["0x32215B92EA7134A3BDA774B9724264F75E756979BAEA515225E728FF19265F62","0x3FBCB034EC071AF92DCA3A3224DD01D9FF432F059D486ECCF003E329AC834ACC"],["0x30948717683B1DD06B178A324260A2EA825013970BD239B29EEEE995F4159390","0x213E237015CC1CC92ADEAC3B4D6A97BBBE3AB8F4A5FF6625C7EDD7175080B1D5"],["0x15AD0736E3CF6067BB67E25B6F6DEE933A7392CBB2263194B7A7E55808E482D2","0x07D5278161E779D13ABE1E065D16C9527342A65A3810836F81A02F3A2C14D5C1"],["0x0240D02C3ABD2893E6549C6BAAED225469470547BF779D8FB1E615EB1F014201","0x3026E31EAC71D121265DB4820D1E895D0DBF53A78DB60DFB1BC178F12BF6C10D"],["0x27B55A0FCA83C7B0D56850E5D20082C0EE69D2FF97927574F6FB72AAE6EEC0C2","0x3482F896E4BE38FADC54F9E1C2FE523DD96C4F4AB85E84D93AEDC76CD35215CA"]],"lookup":null},"openings":{"proof":{"lr":[[["0x3A93209FBFACD9EA852A975955EFCD645D6C5F5F9D0AA6FF09AD2A93DC8FA030","0x2293F25F5FF3DAF524CCC093AD78744FD5F0E970AC9B5B474045B3C89CFE01F8"],["0x0D29AE51E14E644F603F44497E8E79A372FECF8D6E7A281F67F345B5B569C437","0x25B928B40ECC5D6A4355EEE415A64B93B63D4E1690289931AE5692A6F6E6FD39"]],[["0x09371373461C40341019A28C990617B7CB4231AAE9228207EE686FB65BB882DB","0x3DBE1D3B931E9E7C9C9D7F0CF042C8C5E64F867DDCC7A3AEAF468BC1FF6FF82F"],["0x35F16CBFC3A1DF7A0FE67C26F35A8B55318186645DFB62246A74D9E4A02A413D","0x3D53E78E23EF0DB720548A15652F51693C8EA1236C9A8BD9CF6B07BEEE53FD51"]],[["0x3EBD895555D981F6D772B2B3ECB1269A55829890B2BB4F3695587007DA20ED16","0x2F936D60EB38C69581A9C76ECAED0873895EDB96CBC0538FB3ECE7FD09F2BD0C"],["0x12F7434C3E94611D9B09F61FE5A906C2D7FA67D0CC1349B38AAF9ABE64FA7157","0x3E0D3C09BE60259BDA9C0DE67CEA48FB44B64590092016B33B2A36F41E57CA5B"]],[["0x243D8D7B22C5405F2B01CBB1CCC1B2FD256CB5640D4319318234A1BE6465F963","0x2C105F3838ABB4006BDA0E8036F5B399B0A2E0E426DBB7DF4F4593D6C695AEB7"],["0x08670854E5EE81E1DDFDBC88851A17ED4DA289DE56C81ABE20492EF9A7347CFD","0x1650D47D159AD3A8927BDA67D49ECF9371B840384AF705F2E25F641F4C0FCA79"]],[["0x25302C1F6EA13A25D144823E8F810EF98B0939D81F5FB9AACA7BAFA2748149F1","0x3906B5EB1719D3838089E866D70DF410989C89BC0E90517712E190F91EB5FAF0"],["0x0EEDDB606701803D0D21140C23E8895A1A0F54859371E5B98A8BCDD60EF56B6C","0x185B5555D36FA2E6D59141790037698DF83D7E540BA164DA1579D64155DAB5A1"]],[["0x16D86354EBD1B2A8646CE722D039889B1A8747F2CA4B505CBF3BE8CBDDE277BC","0x0E311DE95F45D8EBD74DE2B6A11151D5A1A23BFF490BA3F8DE780E2CC2BC34DD"],["0x3E58340777D9D23B93117F03955D3C422D3554FD582F477FC845D464ABC07C8D","0x03B912A8677942428A335A7FC3655DE5A78EA27F57111682A83FAD42E71C524D"]],[["0x31CF62744B97011870457739289378076B9494520C62D677B3F26711CCF345F3","0x2B1771224A4989C095FCB0B4655A72DBBD2D26FDFC77656788E5B9D14382D38F"],["0x2FBCAD683E61A27A128E5A6BCDFD136ADB170F8F631C0E34FD8F509A3F1C6B32","0x177C7F1CD3F055B19F35F1132FD6B6E96239381645A60A820F5D0E2C9CFF161C"]],[["0x109E414CC1F4A76E43F52AC858B9758D49F22D14989CF50E0467C5601BE7CE94","0x11ACEC859B727A820B2C637B264C72C85FD7EFA3D1FF084017FFFEE8C3A59EF3"],["0x06C9696722774DCA844FEA3AB2CCF33B186D20E590B7E7D1F5750D3567C403DD","0x34155917874FED810C70405A0520FAEB04546B6CDBC8BC4A85BF9FA140016D7A"]],[["0x2425840BCA7C43AD87016D1065AAFD982E4439C0895D11D96A1243B2B3C6A292","0x32CDB353C494E206627057D513DB413FCF3BF193778673EDDD8F10B33B7AF3A4"],["0x29F8E9B1A31B5C0E7066E72514304D233AB4904D234C28B7A9919AC563CE206F","0x3356141576DAA8890C704826879C65E50413957797B25B121B4863120699CDA3"]],[["0x27AF583B10476800A6B4D94521A7E0E25E1C3D1EC2E31197F159B34EAED9BFCF","0x16B55A84685F624E0C1298CE8BF69A2E0D1FFF3FCE0B7C4CCFA55316FE02F48C"],["0x1E49463C2D4C368A76BF154344C7843E5D0F0751C81F5C1AC317B88443C585D9","0x3B596DF50A33222757599481AE22F0689D5E911C67BF328F68DF4C356CB69DE9"]],[["0x2A602E940C6A26570DCAE9E6300511A20853184B99C00148C59FA8FF75C4AFDA","0x2BE60BFCDB453B917ACA350FB94334601CD9F70264477E28D58DB06588BF8B33"],["0x0192B131F956CED57D0A6D45A6E5695E0B5DF1FD3624260196209EABDA798478","0x094561EC3F3CED0F9C00ADD8168AB4A803896F9BE7E6FA68EFA0ED1E02FDD0BA"]],[["0x0D98D69B8F3B1D273081AD81EB028B3DDAE429281BCEFC7227694CCC11CECE61","0x3BE506636BA2D859005608362BB11EE01C66037A917E3EE9E7C8A816E340EFD6"],["0x318CD803EB6922D299E62200EE2917DE2B6C55D5D658A1D9FB7DDAD39343CB1A","0x1828F39C60BD812456F240FD882850CE4ABA2929C6ABC29803E763013AB2867A"]],[["0x3B4A5209AFA37A64BD6D7448FD00281518AF7ECD77AB7F05F171F5C80F7F6BE7","0x279BC66FB99AD1787BCD0A5ADBD6427B4A2C2D2377AA8CEE8EF18C32A93B87DE"],["0x38B08D2FC0F3FC0CE1D5CE97EBF92CA75EF28AFE8E8D528BCC81E045DDB8A91F","0x331B6F6D27CDA1F76520E25440E167DE594686D3E6C71C5AEFF6732C76678152"]],[["0x37C4E6858FA8FE929F971D363848378677495ECA4574940EC6CD37B64A47A0F3","0x1E4A75BF11AA49250612B865D1636154AD4F2EDDEF21E24671CA7EC1FEE91EDC"],["0x04365E3055A85CA49ECA8BAC0F77E9B7670C10B4ADB14B74DC7E0F24730B7FFC","0x3808283CE038910D29EB0E4ACD2B4E897F6D154B9F40CBEF25F51CF5C2BA5AC6"]],[["0x05D641C10B20C51642074D56114AB96E65D96F93AB08080382476041A5ABDA7E","0x157D4131FE09C7BFF7F0FBDE586005391EF816C9FA36270E4AD5231124B2DCED"],["0x1795B3360AFA6E95B0A268A4342D9CC726E741581CAC876BC26F9F8327214A93","0x3DAF4A0C0ABC85F883878EFA5BAB2BD764C30A7EAB336DFA29945F368802E375"]]],"z_1":"0x1B3944FEAD81B5492F09D65FD24A6F47ED45EACAD2B426369872606D2CE75F52","z_2":"0x17C652F169946CA9415C878588295022474FD820583C0BCB3F4C9C9647436421","delta":["0x20B929238E5CFE859603DFF3BDBD2CF8CB5DF2CB66218CD8BE0FDD07B2E73A37","0x16D307ECECC0B45D75ED0C3C15CB6D8971F2A3C7F6A89C1A2A7D01E5F5F33D27"],"challenge_polynomial_commitment":["0x30C91D021BBE64E273CC1CDA7F9F54C6804EA3A5D92E3E9B84880B49DA00630E","0x25022B9D6D83AFC71B5AB15F88DFF8522E2C11B65C02F6143DB798A845CAB76B"]},"evals":{"w":[[["0x0B4761A5F934B60900E5288F2D856E0C666800E72947C1589B04FC2C9B3D9492"],["0x3F422440B2F35F58765FC1621D2D7CE6E2C87080FCB8365452A42909092AB3D5"]],[["0x32933129AC1B2E6DBFB1EC9A004BDC5C953800D48A0A2CF8042AD732A53331DA"],["0x3FCAAE26D177F0A7FADCB30E9CA7E39E3CB5C3999045FF1627424A3D5952FA1F"]],[["0x330DF7EDA0A00A5D73F7A584AC758D63B105ED128530987C5A3615B2F90EEE25"],["0x275E255F7528CCED7F174AB0026406BAE817912DA2F069ED43D16A046D7EB31C"]],[["0x225AFFE8D6016925683F7D9502FFE2EF2737B809333515702FF4C15DFCE2CCDA"],["0x19F5A5E76D5EC109742CFDF7EB9C5FDA61EF79CCA7612D024E47C1F51628CD54"]],[["0x0BA1FC868A7D316956F5FAE501BD4245250481095F03F1E2F62CB04224F479BB"],["0x31F4EB53EE98F732D3BB28224AD0D4C0AB093D8EE30692D1B1236BE152090576"]],[["0x3AFDE082348EABBA5F6397F9EEB095F5F85B0C2579CCA85A605B954F38CB7278"],["0x178A4C781B46632C2970F1096B2C436B49D57216396BA4407F6A598627D3372F"]],[["0x31636B9B77B55FBE1C10D4425CB59B23B7D35EEE1A021C990D87DFD435F261C0"],["0x38153BAF55101B1A384BF50280CF9D3DD4CDD12454DE5956484A96577C4E11EA"]],[["0x29A42892903E7B271D4C310C082541A23DCE25EC1A7423A344D90BB2079D5105"],["0x3838AA6ED31CABDBF4E20074063AB961E5C759ADCECFA5AA5AE0F74E68B918F6"]],[["0x1CCCFAE3956FFA44BE2900C44418E5381E463222B12C360C0166E2D6DE1B79CF"],["0x2328342B5BF9A3703DE07889137B736FFD2AD7CA19F2657872FCD6FD6806B973"]],[["0x299009E30167B7C7B236F1D489F572DDD11B7E3D03F6060809AC29942B3195F1"],["0x30BBD49A5D3427C6DAC9EE37525AC760C2D7EF20613A1C84C4C7CDE3472A41EE"]],[["0x23983A71A6CFD1E1C2C5073CC77D39D5CCC8DE23C1AFE0F09DD8A0330D2F375F"],["0x192008C6ED4085EF972EADFC1034A54B194168492E9CE9061120F0AF23A871DF"]],[["0x0A9C069D77297C8591A702695FD64E302F641EF0DC488648A62756B0CD987C07"],["0x048ECD620EEDFFE1A9BF0CD392B8E010131D393FC6B8F06C0730864F4BC2263B"]],[["0x0B64F22E068FDDAF137ED3D519025673B1A08D696485057F0A325BCB32288A1B"],["0x0DA1E08B24184EEC9DF8D6455555AF87D5B220327E5CBDC00B000A73A99287FD"]],[["0x2490CA5FF55B7B0CDECEC0BE5E46FCB5D8082AA8E778845A20FB2EB6AD4E9877"],["0x3891A9703E0AA4E5E33B17CC0CF06C6B6773B1C08C11E53E3051E38DDEDB1688"]],[["0x3309927650FF1390362470C5A8A9DB8979DA5FA82BD2B108056B0523A57D35C1"],["0x02843190E60750AE3DD76FF8305EB47B3C63231AA4CFF0760D922B5322F3FABB"]]],"coefficients":[[["0x36EBA831D8DDF6A325C8AADEDCB85D2D86FE9CB892E8EC6408DF5B3CBFCAE5BD"],["0x0F66F37D5390563039D91911246FD92D6A3F6823BC7345A0A6BE2B4CEF1CCBAD"]],[["0x161818C9B7E1F8D4492FAD76B407B1DE363F0C86EAE29542F87A0775F047DEEF"],["0x278CE76DFC15A3C70CAB622A18444267855074DC4EF71D1CADBD3D1EF6C09286"]],[["0x170182A462D867142B32580CCB1D9B89C5C98D725433384AD66EB5107585AA0D"],["0x0FC8011280B52628AB9485E14F9133BB89B92664846C4036EC7C2DDE239E6E05"]],[["0x1EA432095753C121267D8402CB046644ED05302CD6510220C98512661A7A9AA4"],["0x2429F70D09F1CA0555320BE3307161744664695ADCA360923442C5252659D2B6"]],[["0x25A6E97749E9F04813C340810FA88678AAC9908E5CF83204B9F3A85F08CB9C67"],["0x0A2C62A731FF46587ADDF940277C4CDA8F2C8F5E2B62CDDF79604001347E9B8F"]],[["0x1AD964E7F2F8E84FC634A34F7CA01AA4466BE5CD7448CF4DA1AAB87BE920F74F"],["0x356B01072A6C06010AE57DA59BB850D54DA20C5D7A4177F2E5CF5EA58774231D"]],[["0x2AB5B51047EB4295383429E08A5FD1EB0C4751AF67D80AEB00326680153A91D3"],["0x1136C7DBB5CE0B35E0134C93AA4CFA430B160149F78360821A19FF5303B46844"]],[["0x29A5431784B59E26C75DF11301954E3788850D52283E4BAA84D534451EBB2A4A"],["0x34FE2FF50B08F8FBCDDDCE99865E698B2238618A8A8C2CE12EE7CD8E271CD074"]],[["0x3C496505AC8382DB2AD0C9B1E2DF0276FF9B07B69CB564669C315A405D31B05A"],["0x2335C34F2192F0FF51AA895B5F6E400B95B5E2A86612C17A72ED3E9A99DD9C71"]],[["0x00D5EDE0F1C041F8855074BCD470CEE4910CBCDD0D8B560D0EBE446F1E8BE4BE"],["0x19FA81D688A12AFBBCE06437C54AA2B515257773D6ECD1F09A5EF998B6C5F3B6"]],[["0x14B2C6B5EE5A0B1890A2BC18433680B7CBED222DE5A81E9682D45F99664D7F13"],["0x3CD1045AFE7931B5C2779552E18E3B77EA4BDB38A07D9D095CE4804C5C01A454"]],[["0x2F88229C571455F77A5AA5F82E981F30486500CD400AA5A9A573B40B693AE1D3"],["0x0C0587EE2A805438B16660534918209B28EA5F7CED2DEFDCF7323E602A65E33B"]],[["0x28EB5D2B034BC8B6F3BB7F60AE43CA171E2263F29209B1C958ECCFC7D81A5962"],["0x1BFEE7A140F3D0AD20DB880165105F7143BB4F7FC3A96F19F816848BDFA2DC3B"]],[["0x326ED55A2EEA9B5CDCC7BD19E8E62DC3FD90B6D9E4D27414F32FD53E11251E3B"],["0x1000514E94D12C72C9618014B210F1FAA5EEB8478C2AAE0F65FDCA986650ACC7"]],[["0x28700D2FCDB17E38E8500FD0F5A70E61CD8D5A713D3F34E0A43E7A0DD95EED7A"],["0x171512B779CEBA9A4EF89FB3069712ABF122DDD5DD4616009E87E3178806F440"]]],"z":[["0x289877FB7FC198D44A66FA296B254E98B9FAF331BEDBE0DBF6F1DAD00310B8CC"],["0x0659591BAF8C636EAD75871461449E9F443262AE73CAA90932C1FD0D0B3F2FAC"]],"s":[[["0x33AE2F30A2AAEE493CB742669C00B7E7C447D773B4F7E49366AF8B66D930769B"],["0x3206675B5528BF7E96532C3CEDD3FCDE5882D2B21E59E27BAE42091987B1E45E"]],[["0x2883BE7D99CC0D141947AE5F336540E73A8EA7E784903E59CCCB73CEC5BCFD10"],["0x0EF28985702466BF7561ACEE115E6033912F45E77C2BCD1D36B45D72E250C1F7"]],[["0x2AC1CA3BF39751A3372033180A9D3FEB8EF67D59E23A1895775992073819C509"],["0x13327B5EB9AFFFD8E373BD63B06B5382318503ACFCF53121586CDB7EEFF02DCA"]],[["0x33718910D247BB48D1366A3217A9C46EB69C948860583D487C5D1E2011F4B600"],["0x078B27D2B8C29402BC587D86C5C62758891E1B608C604D916FB5C1029910126F"]],[["0x33AA492B764C04D0EA88916135B62D83586E88D1CCB5975D9BC10BCC8292BCED"],["0x0B273A1162F15D2060E588CDD29891768598E6F2EE711E3317048A3AFDEACC19"]],[["0x22397ABA002D8F5089B687F8892E9B5203DB7B04F6E6660DB9A4225C8A3F8DED"],["0x19A8DC26AC1813C56E6C85C6E5B5118C81766F8F9960824B2084E164DD3AA6AA"]]],"generic_selector":[["0x366D036BAFFBEAF4B5A8B10ABFB380386E49C9B8FF55DDC80486D28F8BD4419A"],["0x001EF18A913C55E903378DB8FB0F908A8709AE648BCB1D3D3B6F0118F0CADA69"]],"poseidon_selector":[["0x0DED185525C53065A988B95002A1E6890B7BBA6B7C0C0250FCD9C7F828EDCF9A"],["0x36813F4C51B25F31487CD44E5ABB26C1C28390AD4618ACB998AAAAAA6ACEE1DE"]],"complete_add_selector":[["0x2DEF274208CC0E56A15BE6208B5268DF9D972F9585FC2672ACA874B2334F744C"],["0x2D37CD0816DCC7FEF04291B58BFE4D48A58571D794792CBD04ACB7F9517062F5"]],"mul_selector":[["0x1B1E3D97BE589B05EC2231F1ABCA61EA2C9346CB41D9EBAD29EC1E3F735D2B1B"],["0x0E2B96601417DB10B821BEE322599A1FD7EF25E74C92DF8C5EB293E0287B5F9E"]],"emul_selector":[["0x00D7AD3EDD0A66D053C0994574ACD89D315CC06EBCE545DFD7365B2081AC3346"],["0x1933DB5B4C828B7BD180ECE31F775E69BEEE7DFAE53958D77CC0FE24B24DEEB9"]],"endomul_scalar_selector":[["0x356FE609319CF11022F74C4A35F18715544BE9E13BD8753F6EFBA88C9DAE4105"],["0x16CE11ED36D5679F6B2574355472B82685C630F2D2B875CCA28E2C675B74CCD4"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x32C204A44F5CAC85DE9926DC1743AE480FF09A9AA3DFB1D318058AE20CF0DDA6"}}},{"public_input":["0x2C1AA014ABE1560315C083595CE5F068883B935ABB80DB324DD8FB23A2AE0B1A","0x16F5E0101E7FD8E553B39EBB428207EB1FEEF488D123E05941CA1F68364022B3","0x271551892E12C0A844A2E0BB4474B01D05758424F6D01809884774BA534A15F4","0x236CEFC286868B4D0B991FE26D045358B9F558C92CF9FC57B2B6E83F094B6676","0x24A7FF72CA8ED839D649FAA766E884F9447A3F56B8CC58E384C13136B80E60EC","0x000000000000000000000000000000005208EDAD771F43C2B5E6CE04459D5FCA","0x000000000000000000000000000000005EDC293AB20B9E987879D10E48BADB3C","0x0000000000000000000000000000000053A242F5580726E9A0136D71694D0A0F","0x000000000000000000000000000000003F4A09002E10D2F10948F5518BE9F08B","0x00000000000000000000000000000000CC73D3DC6B5222EC2A13E5EBAE1E75E2","0x2F0D7580B120670C0919F5739E75519799277FDFDE4DA976AF346AD3B2C4D062","0x22779549FAE4D9F1E858AF234C417BF04FDE7DC8E0122AD229F34C0EEAA48D18","0x34ACF5538A60E4DCBCB2F59C94ACC4BCADB8A39C3AE2D69D31BE3FFB138CAA14","0x00000000000000000000000000000000F57334222D6D5C6C14074638EEF08848","0x00000000000000000000000000000000BAB4638D6EB99B0C42B40CC865B81D15","0x00000000000000000000000000000000A1F83DC3EF302CC37329B4E7804F182D","0x00000000000000000000000000000000FA3C702A14D341C4FD51A17BEFD5CCD9","0x000000000000000000000000000000008079D458D3258B35FB9F83B18B69036E","0x000000000000000000000000000000004098E83B852B46BD68BAFC58076099C0","0x00000000000000000000000000000000D9C4A48F2A97AFCDEB27DB5B15673DDE","0x0000000000000000000000000000000022D59AEE619793A75F88083F5CB968D6","0x0000000000000000000000000000000094E0E4B2DCDF4DB000BA1B1A820FC027","0x000000000000000000000000000000003D66606A32E2129F5FC28CC00EAD2939","0x0000000000000000000000000000000075D24CD6E756CA29795A4EE354DAC630","0x0000000000000000000000000000000064FA9FC84660B3C9BE2637091BD61BF9","0x000000000000000000000000000000006CF3C0CC86717027E5D3C19EB1FCF9DA","0x000000000000000000000000000000004D1C31374993CDE720D936404005ADCF","0x00000000000000000000000000000000D0BEF664F027791C279332264FBD26B3","0x00000000000000000000000000000000355B20DEDED9B2949D75466D3A8FA64D","0x000000000000000000000000000000000000000000000000000000000000003F","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x36A0355A9EAB45C78FD9643BD1539BD60B263C1A997F18426792946191FAD236","0x1D71717EDAA829C9D2B566C41788F35BF23D5112434378C7368169E7901CDACA"]],[["0x0E553EC9BB4CC4C916A49236A22202D2C499C30717765B76962AF61E1F19B475","0x2F38B3E6AF61B210A04C43A6A7925189C6B215D212A7146E2D9B8292099EC6CC"]],[["0x09AE61AEB5167A83F8B51642664C6ADEBA64038DFF932137A6EA9A3CF63C9907","0x2C31426E0147A8EC26983AF8D14229DD64403CF5F3A05CEAE6371681D4C3A72E"]],[["0x1098D7E095D8DFD66A642D7F201E47EDECA22097AC384D44A3E8E1E445804D2A","0x27C39AF9D4AAE06EBFBEDBA9EA4803C826360F938572039BF6EF6955E56EB990"]],[["0x33E3C085C7E07B7350B805CDE5ADBA08CBE41481853E22FCF68E2948F066B3BC","0x2EF751451897D63DF4FDD2CE743C74DB4E5C2380637F6D419082645FC34D217C"]],[["0x1480C4A5694F01239BFCA601CC0AAC705E33DFE3C20BB1A4AF20D2EEB75277DF","0x12934C96B82163E8DDA88FD5DBAEC0D0345863F9487AE3879256A0544A957F57"]],[["0x24D1C82F167C1D2E78FD3D5BBFD4F8909B870612C9D2DD625C6F844C04C32020","0x24C7B5F22EE853A6CABF28B28381A926577B7DE33DC4C7D4E17FD8DBE013F0CA"]],[["0x1F64C9356612E9725C74A305C6C66D9E636237A1DB23AF157F1CD073301DA088","0x290BB360E636C545BF1F603D30C5781EE58E20430F62354EFC3822BA2B045B0E"]],[["0x29AABA61B13C94DDD63C59CED2C06EA6B1C619CC85DBABB9C2CCA527F750C56F","0x2226176AC771DF73669ADA1FCABA17C407B6CAF3C7C81D3BF3D96442D7FF3521"]],[["0x3B327E8846D4DF40B4C921D7A5D0A2C206EC9C477EE4CD1EB65A2593CE89B150","0x301FECF37B896CBC95E430CF68C67436117F05FF222E7BF64D55E60C1FEFBCF2"]],[["0x0BC9C571EF59CF54EFC2C625BB219F0733B36635AE3F019A8940AE7EF86C7D81","0x05BD77F797201C20BDDC585BEBD6E8F93F74A9111B8F475ABB89B8AEA81DBF99"]],[["0x27ED73702A3B32C92BBE481FFCAC479948D1B7B2698C98FDE4F9789DD8B93604","0x1E2628B06E4CE9F7A645D8AF3E1C902ADD28EB76E02ACD453679450701FC11A5"]],[["0x135485A984A4C699FE72E740F68504C71BC750E1621584DC32FE95C7349C3929","0x13352523BA6DCF33DC07B6F19BAFF170A3DE3A4C76828ADB63C2349A94C509FD"]],[["0x27C48443604F07D92B98149A928F0F867AEF2D495F6CFE64374B70115740BAFC","0x17F04C08DD9A914FA553044A9B0FC4B8E87C08E2192D848F9170ED5AC05A3D98"]],[["0x1673FCC0ABDEFF76069FA99D09D8BD2A60126C4AE45A23A2DCA46E090BCE04C1","0x1EDD2F48C9C7EB873044BC846FEAC67CAA5E1D74E3CFB822F19EFF7692A21B36"]]],"z_comm":[["0x0E7561BE24FC8EB2796591CB0EB38F666E8921796578C424446DDCC3C38449FB","0x18C43BBB70C41DF1F9D81DE1B6E636FA0BFFAD6943A374AF9C84D499EC9AB379"]],"t_comm":[["0x3B7FF4DDE002C12A33456F8F5A26642B7994135389842C1CC71E53F3EF9CF037","0x0FD10CFC44971A922905A212F41ED9E977CB139B75E74707CCD57753B77DFA9E"],["0x0BD8890629C3A5452EFFB97533A53CC41E43E4B9731F842BAF78E33679A0660F","0x31C372B240DA1BBFC9851B4C7B2BF958DA6C52D5ECDCD4788DCA7ABDE6E56634"],["0x252D31DD7093FA6DBFB7C6B55FD16881E0DC7E477955C102A7F42340F9A4AC15","0x03EED9E208923F804CC534FCE75DB8ECE8981BC9FD5A10617367F49E5BC39B78"],["0x06228867D812C5FD1CF20A09CF63EB8DE98F87B68576483F99ED7928220B668D","0x0161D794A58957A124294DA51B8FAC118A17DA73448E722B1744C184EBBEE587"],["0x05AC2700D0F5E4798499368F405EF16A441CC0EF215C818FC8039EF7E99AECC5","0x229B25315067252C67410EC17B44B1C6A35FF804ED8835872813A95C7C220DD7"],["0x1962888858325F9AD98F189ACA81DAA22CF1FCA4DBDAF7E30E45CDDD396630C6","0x3DC7F579B90A3F7C2F3A3DB5898F71687B48AE05AE3398ABC453989DDA5422A3"],["0x2B1B86B37FD0DAE4B9022C91D91167CE3F51C8F9638910C345FCFA7C9F8BEF7A","0x0A5565564161679945174DB9006D7672348A2795930D03359512949354706C8F"]],"lookup":null},"openings":{"proof":{"lr":[[["0x0C562CFEEC389DA55C833C52AF239C9F3379BA9D758AB55E6A8F4298C876147F","0x372ABF5E0512717049ECD071F02DBA1E6932BB58C49E21A73B7D7C8804B9C0E5"],["0x1E24343AE28F249A0779B492671F3C200188E01C4C3E1CB38CF19925F4BD770E","0x18B491EE03EA52ECAA52B607F19E195D12A62713690BF390B0673BB833B345CF"]],[["0x2CD2306290501284BF361813673CA260F3526E7EAF285CC4D6A5CE37E0690E19","0x08AA66B0454D0DDE4551C6E00631003BA6A4CCB293AFFF07FE791A925A7C92B3"],["0x11CC0A8F21C4CB1DE9D5EF35D59BA16395E59A8E602FB576F3AAACA85D56B267","0x18021F2105017A2BE1BB738DA254C0A8D90748E68375FC78AFC31E4231548EFE"]],[["0x2C6E4F6854A211F0C9B12B9BE256680ACBF4B60C98347F3F75081B149DBEC365","0x0F70091D61E64E2540B80E826A4598971F2A003AD73514C60268323C720F2A40"],["0x0247B9C3D7C690FF9C31543BF848721A1F1A14ADCF0C0681C44E4D2021CE6233","0x24C4416D8403357F1532BD3B672CA3707DAEB2F109DC8F75462916D7F6F86D54"]],[["0x39B6B4A4E9FEC19DBC1448CCF38544D7EF0F7EB7A39B9AEA87EBA7E45B9F7068","0x18996CD005485CCCEE5672744AE0D24088220D27B9D1AC5FDC177063F9B5AEE5"],["0x03A7B0EB3E0FA51CCEE6F2A1B914E63F6D847C25C5A82BECE9086A9DD5396C12","0x3E662AC71995EE724E23ACBC48C019B8181B60C22F45FFF0C833224AE44E2D25"]],[["0x39C4659C04487050A70C762ADE3DEF95298B729119C5BB2CC7F8E2F98970174A","0x10B1C411EF689721DEC5C50CEA049B888D60183F41C67340841AE324765B69CC"],["0x236F99E6E027989601204D1DAE21191F9E6B588C82A378419229A32A9D759432","0x2B29DB127CA21CBEFD7F3E07EA3F0C9BF5E45AA81A4F547297A93A014DE95CEC"]],[["0x20A34C2E61D67F3F1CBC421DC3C62EF9ACC043F1583C9A0A9FDA724DCB48BDF7","0x3BC4DABB1F0D3CE10A28CDFCDEA615348E994E9FCDA316865DF57595EC704302"],["0x3990E17EA7445F37080293B26C9F877D07DB6F1638C6455AFC8EA99D270B595A","0x3D4FD059A2A7DDD4A29783C96430F768385EA84A12DDAA53040C60134598F512"]],[["0x2021C6BACCB98A317AF2FC3A388EDCE3469FB34A3CC1B470694EF36FB6885B7F","0x3E521A7ED7C5BD075F6CA31186B85501547F1694E525D0BAF4EEE08BDDB2982C"],["0x3CA2003733A15E951178448322CE968434CE252863271BEA2370B95FEF95A1D4","0x39561BD099A6FDACA01C1C3779B2C75E8BF88EBB98C9313E5B277C225C2110CE"]],[["0x3AC4BB558DB3ED4DD484879FFA61ADA5F35F13E3BF05AB742A1C894F50DC0B26","0x3270859BDED17F1A4CEF345B3BFAB4A56EBB3ABF8E0B7621C52CF4CA659CD663"],["0x248F05A2429EC41E1B671FCE695A58076076FD7DFADFB26B6E8481A11217DA0C","0x37BDD2CD0EDF649A5253868ABA1B538C80B567AE0FF44F1D767093D839D729C3"]],[["0x20917DE45550D485FE05C311B6E5716504447E37083F2E8F24BBBA14874CE59B","0x0433C66C92A5693464BBE763F15260797FADDDCCB2AC23A037C5C866FFC711F8"],["0x05348087EE65A816861F33CB5982B06011DBBC2F92D9DFC1062D74CD33919682","0x1CC6394D08A4BBE13594D60E5D985C9509A2E73E83321309220B45A833BF80FC"]],[["0x13B98BF4271D2AF310E2EC9431BD26696F855E3DFAF4914ABD023DC63C587B22","0x1DE39E2F2068E73104D0B7FC6BE9DAC8DC5F3FC9B94E2A337CF252B05580280C"],["0x30E87F703C60F584DA3B09CFB0ABFDF80DA4C379A3409AB45ACA02D700C27668","0x253BB278C97571098966AD58A560CC1CE2C81214816C84434BCC36BA854CF020"]],[["0x1C35640FAE9F554A09963A65FE4098E2A578FB6A65AE7DBD23DD1E99EEA57ABF","0x1C27C39900EE837D5216AD4A47A2C7158F590CF1FADFDAB2A2B71533B73CD8F6"],["0x3E6B6C0DEF5FA3D08433C698B9DC5570D702CA7B3AF560094F64AFBA3F20DDFD","0x291078EB4C4471263899BE5C240708898190ECD5034AA2A3DD0A7E229CE1D74F"]],[["0x3239FFF8563B9136D2DF6283B9B65D745E224CD330C5EE40539937473A701AB9","0x220939B54907E5DE58F0EB83CDD95919DCA768978ED5B69CBD3C686C9EE53516"],["0x0FE46025F32FE6BAEF6AF2FDEE56EF3381A3F70AD1661D9847C1E7C073B15360","0x36DB17A9C15AD4E65409D654555DEF2555154916EC79B0EB108C3614CF51620A"]],[["0x0A921B7E11ECB154C589425A990F7C9A7B03957D82E4AB33422F8DA2729C07DB","0x0FEF165B26C839421CB41217AF48725ABB41C8901460C84993941BA54580CC64"],["0x3143D05FDC98CF1CC4B428BF2E291D9919A9D83CFF35ABDCDB6B8E2533F63AEB","0x0B5CC34292E3A350A2AC186650C0DA5476A538AA4BA54210765559A91E2206FF"]],[["0x0622A842192FCACDC2AEA9DFF20C000EFC50BD1BB76A7BF85E6CD23868B0F9B3","0x2BA2D5BE7917BCEBB37F22346A9D9610A9489D06243C181F09488BA007C8377A"],["0x02F63F79455797C075CF6744CF695FDD79D42DF13FE1B3B4F48DA748E8DA1719","0x2F65C9F16A32E8BE498AC9528F5ECB4209CD01F90924B2E37A5B640421A90CD6"]],[["0x01607D2CDEB10DD2D58A037333A34449E05F47F69A13F6CA14706C731C7AE5EC","0x06C6EA095DDA2412142F3D0CFB59E60E1504072F1D6EF2C6D28C1B585E68AEF6"],["0x2C481647EC3521A101703C3E3654E5706E98FD789673FCBAC8E3FBF594111B5F","0x2F228D895496D9EFEA69064E1080F0888E15F354C87DA4BABBCC6BF8BF5EBB47"]]],"z_1":"0x064917A1DB4FB4CDC60FDFFFF931E434A16BDAFEF56ED18D93344C728CC19413","z_2":"0x1BCBF6E35CB35C1E5DA618A03F0489882A4EECB8BF73FBAF38EE0436B7F71509","delta":["0x10B9DAAE89000D1474F849E7FCA3594CA9BC9FD67408BAFF6571E186BF752F99","0x02AA7E87455E2E9A6275EC2B2D0BAB0F87802538B8FE7D31C6BE45DF8C8383C1"],"challenge_polynomial_commitment":["0x1A0AF459BD25A5E9209A71751E32253ABB26739C974593BFA9DE04A00E99E399","0x17FA71DCF5157C9709C3C0CDBFCADBF85D940019AD7237577BEB6C3FB0549588"]},"evals":{"w":[[["0x0248C3FD1BD9E64BB4E764753033AE1F40546A7F1BA3D92274F72E61ACE8F6CD"],["0x21169AF3AD06B6BC642F1169406793A585A7BD0E137B0F2B96369D9D023F7E19"]],[["0x22AE0D44AFF1A83E9B6641E3F809376F5C7B038CD55E1320515717CC580DFD6D"],["0x214446F8FD26F053813CE63F9DD6CCE0FEE14C02EF12528E8C0A2A38B0BFD04F"]],[["0x218EC4772E6887FCDA2F929482C8B70576EDE47C62A110321B8D98448834A9B9"],["0x20F49F9DADEF306EA8D149A758D50BA9245DE6D2DAAE0417A20B3954DF0665E6"]],[["0x312BD8FD6D3750FCD979702E8A9856BE71C29F2DA68E2EEE339F7C53273CE515"],["0x147B5CA2AC603CA32E04F8BC75A7433B66A44D37AF861ABEF851F2336C4C1A6B"]],[["0x24446F5882403D18A1E110DD690C3607B0539D2481408B5CAA705D5314508A6C"],["0x35410941A568A7130BE226421E353BC71694AC42600D32F2D8B5E567E860F10C"]],[["0x324EB9FC4596E5F950201FBD858385FF2FBC4887DFFB221B42D1CF76A6D29A64"],["0x072EA7DA7D7E21E17014A761F3DA9939C9B30F38FEBE1A5CB8935935493A843B"]],[["0x209F76FEAFCF388BA2C3132723062B98C59D66CB7798B5D4C71822FAC7015346"],["0x0946D488C06C07324CA6053445CEC5BAEAFA79D0BD67012224650ED4C4AB2910"]],[["0x03B530C4E06D4C631073DD8A03C48E9D48131446F7C5F9F8F6C5AE355641F51F"],["0x14FF2AEE0F5B9169B7163BBB4CDAA07B588E8A49C69A8CC21F6DF7414FA6F41E"]],[["0x27D94DCF90846265F51321BC4E9209019E93B195B60EF4F5D2A537D7BC23A7DA"],["0x0E20F159CC55F82D028032430812607E7C7D6F9393A6D49FD1B3A592F42ABBD3"]],[["0x3FD6ECDE4D68F54151585DC0FD12B12875159357D1D46C866F7D08951741C02B"],["0x1859A2FBB34A8CA3D5E5BF7D90D6BDDF974765E7A181DD04F8B41327F57D3732"]],[["0x033760EF8D6C93454548935B4DEB44FEC9DEE9653ED5D18FB29DEB9F223A994B"],["0x2BF55F1108C71FB8157E605D8283326EDF9D0DDDB3FCD0124086082CFD27D6BF"]],[["0x31135291B52B7F7DC766617DF831904AEEDCEF79F1711FE25FAF09A609655D0E"],["0x2C726E5CE78DC1B5924DBFB65C7D282885E5545DD659CC5EAC7BB586ABEC7678"]],[["0x0764F0F28435337A1ABF3B22205C2121DAB28684D651AE9F0852EB8F280E6BF6"],["0x2E194954A8D1D4035D8969619AEEA2ED72E78F826538A5961AC586863EA33B7B"]],[["0x32E6A7FB0435902791E3E6CFDF2720574F3864E89F52DCC5312FE4D83AF5DF5C"],["0x23505FCCD967219C2E7441B109A0EBE8450821291D7E5DD3A47B8B81711B5042"]],[["0x0BC304751495CD27DAF1DDC9D65FB124F4F9CDF4C468A6A0B78D44B8C14BA9CC"],["0x171985913DAB8031541131D36E18FF9D84B9BA40109A596F0642607133B6ADAB"]]],"coefficients":[[["0x06F357D2738712E8061F7EAE7A9B88EEF9F943F4AFCE52B42F0461102908FDD9"],["0x00B1BC4F4B59A9A2210185849F3984160AF1E2B2B1578F45159706F88B29D7F3"]],[["0x3629CB56DCC5AE69EFBF027B87F843258F7477720990B76DD579130DA21ED39B"],["0x19BB2E61B130A55968FE27E4C4A504592E5D5720E5A5F38225460EC1F3533677"]],[["0x368DBC1AB7FF8303857C1366D160E00184FEF539B70D431CF6C782F08C92872C"],["0x0772072679C76FF8BE6EDB82413D53D748857309B71F5A4FD4B306C9FFD93EDB"]],[["0x1124BB7E7C02FD21010080E2A5E6957F1422277F457A9D60E98DFE798B4B289B"],["0x0EF385411FE85CBDD5416BBBD1059CD0B262E16E81341FA9779D2A72C5DE45D4"]],[["0x2CB1DDBF057D56B71D5F1B77CD32B6BECEC752954B41C73387EE373C3E065DB2"],["0x329FE3BDF133400D236C05107F372C8789B1FE6956E27207E0A5FC0F18033B2B"]],[["0x3E5EC51BE837D248E7F30265D65ABCB8C9127BFCB1F12582E1AA62582BAF239D"],["0x09A24D230F909B19BB588112FEC21DA54A1EBC8DE110C7CA67C0CE5D769C54E0"]],[["0x0BFFF365568C9D6668D218CA82BE45E55262BFF3715A0C74FA34DA1E87A9DA92"],["0x3C4AA20C3CD46AD289FA1EE29C6B6275632FD298FA39EB7F14FDE5BBA6013799"]],[["0x3A1879303D01AF374492946A452C2011397F08D44477BE3840EABE467C8A2134"],["0x34832ED60EBE0A9821375C4FEBEC6CC74E542842420BF89477E1950B50D9185E"]],[["0x32B9F904EF9168BCF0851BEA4F7788AD2B7321A2570265F81A4539B088B25BEC"],["0x1ECF0D2EA8D3FD6D59FA20FC85071AD60D6341E48985FF0AE5BC22C3A60FCDC9"]],[["0x0209FE29991658F04179AAEEB4F81D8C796034FF15A575F8917173EE523E3FFB"],["0x2987B6E33D7BD36E8A41047506251E65E06612C91E398411BAB08C81AA14E5C9"]],[["0x2D682E301A675AF373BE7080885E82179A9CD81F8CE997B4B2E8BA0E0CC3A788"],["0x2138E7CC56B94B328EB1EB2253F9FCB41AD144D82C0E09CD1710FBF250350A31"]],[["0x11CB14365BF1CB064649D57D0E2A07512E29A658640493EA249E4A332F9060AA"],["0x3A0F9F3380591F243DC6C00E2571F8492631A0A43303FCC59EE87327CC50931E"]],[["0x2B9246BFBE8D62DD744370E70CC8416A53EEF231E199B6101A6EB40435E7DD59"],["0x2D383441345924EAFCCC2EFD7F744CD3B8C8E244A2C7D2634955E5FE53D137E7"]],[["0x346E80AAC3A417D493167A8993AEC3B1CCADA61C444B7FDB4147058EF6A5D223"],["0x1DE58A3ED5803160A51D0CC840B34256DF4936EC27C4DFC02B1F9AE8520EB47D"]],[["0x2735A85C1759C930E974C02C3BEAD226F56B2A6C52FF5F8B28EBF06A722C283E"],["0x2F645CACF351454474E5BC586255C8C410B59AAAA090A99F79896E7A73E24200"]]],"z":[["0x22B64800D549C0F25D840DAAF3774710090DEA2EA80672029BC06D6C6616040E"],["0x3F0923766A218BAB262B091043A9C783763B1E49930C4C0FD4505DAF711AD652"]],"s":[[["0x001295CAA63C5755C362B0D80B505FC33B191D8F3BF998EE32AF114A616DE233"],["0x3D64FCFC76A1189B4B84BBBA33CC16A455D35E09C00BFF60C06F3EAF1542E6B8"]],[["0x00DAF7A661D8727890F3C8E2C908F1C2DF991F5822D1E42E468B93427CD9CD23"],["0x3E093C2E9895E096F110BB7BA957477796D48810FE438A938892D17E01797080"]],[["0x08B25C487014AA5D7BF51FD217289255CA8E14F017A0AF9D0B2B9888180B6FC0"],["0x00941D823B6365D73A5BD98A0896ACE2D24F7E4332DAA7D3FC8B3BB6EF5177D0"]],[["0x26C03BCAF876C94D12C0850B509EE1BE0517D0048068101ECB5A50C1769E9023"],["0x179F5878462194A7290D08A68E9751B0C4391233F278E7AE165FF084B85C9A2C"]],[["0x30A4D805866023B37686B339EF705F20D54624728636254A19241F60D580B1E9"],["0x34D283A4F121D0A70635C09B82648107C29FDE6ACA5D73CB139A9CA14DC1C8BC"]],[["0x07852E3D1977F6EEA126ABCF7FCCD4F36822E061F88D603F76C2D8884CBF2821"],["0x326753B31C93B07379DBF7FFC0634CC45049DC7F20D5C61F62E6326AB6579BCD"]]],"generic_selector":[["0x34A8BC5C101A51F85E6AF14516AB162E18905C6F7B96291FDF7F02F1693E9B8E"],["0x120D5BC3C115E581E3D7549A3A239BBBC83B4A4C36FED7620F2F2C205B48B4E9"]],"poseidon_selector":[["0x155ABEE2466134A8B9BD33E024802FE03D7866FAFF606F80BAE5E7027FA4735F"],["0x2717F6AE9F4231CD2F0FC1B57ADA6D19E5EFF5254299C43446EAAFBE9E96D1D0"]],"complete_add_selector":[["0x2F3F1FC2DED07C4AF96E388BBD371964A9E600AC802A0BD485E27A017B744B0C"],["0x21F2393EDD3124D616EBD0D49506ADFC5B37733B7C0789E02BD895516015CA8F"]],"mul_selector":[["0x0D5D7089A78996242A3D273B43B2C4EECBD2737BB1C2E2119ECF880EC8773432"],["0x244505448CD5A85BF0D99729232F90FAFF4CF59FDFCAFEFC0591BD6C68EE66CA"]],"emul_selector":[["0x1CD38187634E766BF9E4AC2368FA5A25FCBC129A9793B3AF584E48EBCCB58840"],["0x205DB367A142276798A70858320CF25B05BEF4EB30703F4FFFB483E9C8FE6D6D"]],"endomul_scalar_selector":[["0x23B1D9E79427E3F84A4C605FC4B72269EDFE02B59225E850A9C4A662C2111842"],["0x01EC9CDE2D83D826BED4EEE939F1F3F8D1107A36E12B78CD0C8AB0052BF7F63F"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x3A030076ECBE8B7A5BED77874DC9AD6FE8DE3D288D70EC3E3C5E1EEF9CF46B01"}}},{"public_input":["0x1F1028925CE5E7FB91E6C07F29FD208F0D312C9A7015E1BC45927B83C5381D55","0x19A5029AF5493E6A87E314698985A75A4887B0B56C2FA56BA7B225E9D786C1EC","0x2EEE885F61FB333323F6F6671C1339CE324774CB96781AC85988D1C39BB66151","0x13B46360A3695547B06DDBEF088CBADC5A81A1942C04A22DEA87D5814214D884","0x04FAB6B652D372B3096499A96A1DA662C807B757EB44EE055B1C81841878FF15","0x0000000000000000000000000000000082C8FE68DD354A058C2E035A26C66C31","0x0000000000000000000000000000000059C7D41AD7C924E0A4C05B05C107DEDF","0x00000000000000000000000000000000B7408F606EF2CAB2001B50F38A87E0A9","0x00000000000000000000000000000000EBABA8E72A09572C9C01ECCEFC7CD6B0","0x00000000000000000000000000000000E5106A869D71F26C26D85FDD62575422","0x1E2E1288162EDDEBC6A267F1DB9A6F9A174CA4BFB85641460A1A69AC4D54855F","0x08284D9BB01EADA8CCA3E8FB6D6CC69E9B2E79F348D3F3FC4FD8BD1E3062C968","0x0B69DD86C0939B71305E6A2CA267F970C984E0C08CE58D52E376DF189A225B06","0x00000000000000000000000000000000AB65C7F75C62C6496CFBF6120C4F03D8","0x00000000000000000000000000000000196A6A5AC4F7C2CFF275EEB6A3DB0B5F","0x00000000000000000000000000000000B798F5DB05A352DCD3C82030A38209DC","0x000000000000000000000000000000008962FDEC7DD4EB6B12725501FFFC4DD0","0x000000000000000000000000000000007D40630D320E67D96B40CD1D3EFBC581","0x00000000000000000000000000000000733E4B890A3311AA45812FFFA1BE018E","0x000000000000000000000000000000001B0AB13DF7D5FDE3777D71379D2FCAD5","0x0000000000000000000000000000000050FCC950B60EF737FB0338C5D3937A48","0x00000000000000000000000000000000F6E76B5A13C89EE3C91B1644EE649E42","0x000000000000000000000000000000009A9641345446EEF0439E49589DB05534","0x000000000000000000000000000000007BF8195842B2E42B5FBB7296524F9CE3","0x00000000000000000000000000000000CC72E5A74EE9564F64F483A1512123D2","0x000000000000000000000000000000005104FF7D97CC54355F32366351829F3C","0x000000000000000000000000000000006D4DBC24E5E392B56B2A66C11D9F9B76","0x00000000000000000000000000000000669A2EA8D43AC01802763E04E3F04805","0x0000000000000000000000000000000024018DC5C4DDE237486A6932510D2621","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x184DC1750795618CD929613101BC89F7A545EC3BAB8537415AC5566ADA056D85","0x1D2782224E65A1CB927523D740CB3A7242E0544E85FBD9A6E6DCAE580BF354B8"]],[["0x03792376AB5BEBFA89AAA3AB502EB246E354C98F642381BE2E5C068874119AC9","0x036DE6C52B7B530AD0AB81045016EC039995E5D190A7A9A42389BE5819CCD384"]],[["0x2426A8B0B11B6258898D5555BC85A750C50BDAB6983FBB0F5ADE85B06A5FA1B8","0x355162BC2433FE64B2B2974FE6B65CA574E2AC22C284D43530A84106529AD1CF"]],[["0x254C849E848770335D7F19FE8A6DA00E165F114CF85B46B9D7695C5959604A9C","0x2B783A4F159B5D9579FA953F9831C4F30A72D6F4448C0AC46ACADB869D41B2A3"]],[["0x10C36F1E20F1B051C33F4A3CBAAF14D13771A37BCA31A864AEFD7B878032ACBF","0x16DE077FFE59F9ACF270F0671F77DE0E1E64A59A01F737F15849E787887B0892"]],[["0x2D5BB9A951EF8F312D8846CD2C2447819BA8E3CE708C9231387802D9357FD284","0x173D58853A16750F6B97E03135D05ADE2D90E4D964158C09D20A5095AE75E204"]],[["0x0F6EC3DEE9838B770E24BAA1DCB53323CA7680257978A0DFE257F57395D6AAE6","0x02297DDDDAEDD716FBB3F84F9B57216A8201656697E967D7BF527D82F2898F2C"]],[["0x137A782BACBABB292B72B6FC0D729FFB8334397AF4BFAE35DBFB5A8A7D7739EA","0x3D7E9A595AFA6AA0DB8CA972792E0C14012BE51FAD37758885DDB2569DDD5EEA"]],[["0x25DA580A41BCDEEC31C4D20E685DF1B103D5F03E46EBC654714931CAB5E43F5C","0x241B3F3518C55ED65CB7ABC7CF7892810A8777043C9F8A129812C30EC1FC62D3"]],[["0x271B2E9C46C62076D1EBF75462BCB51348440B837E372343E4AC46BE35F19FA3","0x314E72A847959CCA47C8A974E820B8AA279A5D15023BB62B822A01FDE460356D"]],[["0x22C30161304D64D3003A3A36760441F109E14FD2CCAF4C457C651518D5EF263A","0x3F1D2E5857A5C842F597BE2570365A6B2FD8DFBC1340889A4D5240A86D6BEC37"]],[["0x08EA9C2D1F250E2ED2F37BC95C00F776304C1DF28C63F3F67B9F35E5367DD15F","0x11FAECD40BDB754775F7A2C85CDF839FBB053AAA13D6B5D1827AB2ADE78EB3FE"]],[["0x2E57F539822EB628D35CA563F51DB8C9D539640A5FACE0650B5C75A1CBAB052B","0x32A8ACBC5DBA0AE54EDF58AC02BADEC3E2F0892E4591A2DB8B280CA5A417A832"]],[["0x2B643F36FCAE0E6AC0D7B06DF35E9644763E8820B3D804F733F56FD80BF2B484","0x1C557333D80D5E2550CD309AFC6EFCBB9579EDC59290F95FDFD85466AEF0CD4B"]],[["0x38E09E1C8849EE49689FA715F3D87441826BB59924C3D534A38E41360C7A3A1F","0x3815C87BFE54C5B28AF595C3D0F7F23E87EAB3A1A55CEC27953938F36B07CDE7"]]],"z_comm":[["0x227EFDE287F3CDDD6F85DA8422A0894BAED3D3F8F85EEEEAB0CB99CD0E168B75","0x1708298CAA601952C395BD4C8773225B3603488A780971C51A2682FA9CA42E45"]],"t_comm":[["0x0A66F873185E5574AE9A0C2C205574209CD6D87E4AB1907A40812CA3CC23446C","0x298FC1B25FF9DC5F02974BF7B9C7CCFDE5FBFC0DB2B69B5B6F304F6C1BF46E41"],["0x09D8D159F594DE03EB71B15CC3DD0EEABDA4969F5A2A4ACEC6E8BB83A28F9404","0x28F6668CD46FAF541ACD22EE603B94FE32DD1B02490DE78FF726319C0811B0E0"],["0x287AD36F029866A6B0EDC71573333AB7997AA042AA9475665A70F95C28D96630","0x217D96D4B94139B6EFE7ECB9278000D1B098F4AE16CFA981576158E83B7C2DED"],["0x36A4F5678BC45BFD5BD8E94342E342FC54FB7D423841F215774CE421C7C17B97","0x2120B492F7D271BDEDEF6A0BC2AEB45DB2A741CD1E0849B64C0F4651BD463A9E"],["0x3F63D4727BD1A14F33D26563B3C63957E17D9BEC41C64E7A132D1B59A63855D7","0x3C45B5C82FA67AD5A1AC066989985AC4F06964D5C3417E09DCC4DBB0AB046D42"],["0x3EB27E8395FCC318B50AE64F34CDB126BE940F3E0BAC041D0229DCA204F8BDA3","0x0221D4D207D1E8F7296FD71D450A2FE5C2BBE56FF9E3FEBB2A431C1A11F658AA"],["0x2DDC132802429044EFE05CBA14CC7DC1FD5426E4AEA1CBD17C2D588C075A4EB0","0x37BC8FB0722DE96F3539B6B2A7F654D295646EA1B6CA1F20CAC709F403D572F2"]],"lookup":null},"openings":{"proof":{"lr":[[["0x2671B08A3E48D0F33FD17D76DA12BB0C6A9627FFB35766051D832CE68EC5C2F1","0x15A80F0B9236D47544EBF7356725154B363038BB6FD2929D2C89AD9D5E76B82C"],["0x29754099833E529D16CCB21AA616C5489107E9671D5092340E87ED61CF808CEB","0x02B40199AA4572523580633C89EF72AA0BA2084062590630C7D571DBAEF18F42"]],[["0x382EEF5F2BADB1AE3C5A7A8492899A4F8B462335CA70BA41F1F71B1B4384BFF2","0x2FAB3AC67B136C8765C267AC6342C2A6FA45E84A456138CA164339F1DA29F1F0"],["0x035A44A851A374A5BE34D7BCDBEE284F79068DFF662417C48192D18FBBC61CC6","0x3B32FA818313A77E6E3590E5194FBE932BD0CACD9F8F21046D8BB1BAFCF64BAA"]],[["0x1F5B24786C36E9F6D1F262BAF3F9242C895CF774C82C88FBFCAF82920FA3CC59","0x27C6A378D8043AD4485C2A23747CB06CAD62ABC847E3DEFA7487531BBAC22A80"],["0x1A2D5DC54401C045D57451976BBC409631943DD3B529D6F13B7C348DA67E955A","0x2F5FCCBB007BEEE3775F2D60CFDC4C1F074C70BB30C9A4D9FD5DB065AFFDEDB0"]],[["0x1F1974BD474EF9AA57F3BD2DB4A590CC09AEFB966466A03E938ED2FF5A73169B","0x01AF762998F10B9632C1AAAE8C062E6D2F3734CD0E52F3F9F0259EE5EFC3EA35"],["0x09B1D38DCE04960924D690C915A3E193A98DEBCD452BD6D810E9D478AB9FFAA1","0x1A4D9B5F2FD800D7211C27406DD997D0C65DED9BE58AC4055246B50E356DBE7F"]],[["0x0F3FD4CA2768797F980B6D1D97457578726BCD03CC190A092FFA711AE2A7EB0E","0x25C813FAF786CC3680A57B3A9C551E3946A122BA7D2D8BF8B73260C719840E7C"],["0x3E6DC90E2E66F78BFE314BC574046F3047E226989E1C54E6279684BF971D48CB","0x0BA8D10A5EB7317AA1925AD73DD37CD2FA4F3D6EA6FFDFD246400C818EEF2DBF"]],[["0x3B0D4FAB32D91943AE0FB63A263C41137018FFC17827964225FD3608E4960754","0x0913CC7787F8D9FDA597E8132CEFA93801B74A71ECDD753417B46BE00256F6FD"],["0x0BD14AD7EF5A8996731A46EA944929681776FCFD98C051F35846528C58C24642","0x3512FAAD6FFB01C0265D16454426F76D710D98CFAE6E299C1C1C7E166C6AC432"]],[["0x0618A159BAE1D3C134EFDF41EF9602A078795CD3E2BB77E00A209F2A86D906AB","0x1CF35F1B93D00B0C7FB6337162BAA0A626F9F4A840CECAA5D9902ED3E6DC55E7"],["0x377F6BB98F6B7253237ECE3AE623767EBA8778A845E4588E4D8016C8E5B08D3E","0x28D6140B7271D1B051265F1B3D6BDD4CBF50D541200159C4A38E354B630DB135"]],[["0x268B8421A3E582080D4179A3D8F43AB85718C149DABB71815FF8EBC0D5ABE3C5","0x036704FC39E740621B0473B4D0086BD8C65C5B7E73A0742C7817BBE48E93692D"],["0x3DA2CBCBBDC8E90267CBD15871735CC7EF5262FA02A85BADAC37E875FB0275C4","0x136466ADF429882312D660B70651AE5CFD62D0A728075DC035766967B14D8FFB"]],[["0x28067A08EB77E47FEFAEA6FF2F8297DFF275251D2755E60486CA788A997831D4","0x24AFE8FFDD9EAA644E20D97473A0D2CDD051A65E6375AB3E5F4DD10CB0066053"],["0x2369A80BDD2CDCDDA0A3A9F09BCC5F0A899A0B1AAA6034E521E45F51C4C0D183","0x0501FB9F591D93BFD010598CE30E0E8758A0E9F6AAA30BF1704B13334DA2ED44"]],[["0x1664AE9009522B4D965DBDC5140DF88663959AED88B479038ED66897F94B7493","0x2DB153A1749E3502AAAC7D348EC3DA711279E2F70DE58894A88E1074C35DCBE0"],["0x16736DC619F7B9E10D54603B0D7E2D104B1D0D24723B3367789791D842CD4497","0x038F47D6DCFB7462A46E3AC907EAE80D3AF9761C92DA20B1300A317B2FBA680B"]],[["0x08DB27253406AF4E3F63D1A50AA9BDCCB56676077B75F3154115FDF4935999B3","0x34A0E9F175D2CF87BBE6B2F6E2C17DDD619467195370E334FDCE7732F973B4BB"],["0x21C5F75FB554CE700BEE7E68DECFD22A96CBAA05004DF5BEB4A018BFECBEBBC0","0x2CEE4F978705885B4D27EB6C3C208A67A47849A362AB4664E56C7616271A4399"]],[["0x0AB1BC708DE1FD6D137146CF79B8A9FADA1B301B514CC96EDDA01F1F2ACF06E4","0x25E869A57843D918A2BA83615F5900C578F6EB7888BB2B43DA066E4D4B40567D"],["0x178DD03E8D765E7D4DBBFF938D93A606B61E33EFF7D7465784FFB426E3BDB10C","0x2CD5019EC91FA4E17525637F8138A83EFB040C48EC1D0D555A45BCDC47849A45"]],[["0x20E1AA9DE043EE52E4D5A69974AA322497B5669151F22315C07E98F1BB845FE0","0x30B80FF13C29FC74E266FD10F00338599DFABE0B6A1EF8E248D7011A8AF2447D"],["0x1AD67ADC18AD5A8AB0B71397D09320673474939D2F29C5C270A7F9693EC68BD8","0x257D38952C000CD786BD7D0A52C3225D15EED5F579E8C3D168042CC3524C559E"]],[["0x246A7D0F1F56D2D74C58AAF0351FE317B76EBCE67779FB6657007059AB8B423A","0x02B5680E1CAA806C4346132E3C878A3175F1B70F7D769BFE122621955C6B773D"],["0x2D6D62EC3184F61EE30908458CE24A8E73843C9B368FF2A2969CAE9868E8D3A6","0x3B9CF05BDC6A5D5C01C05DB15B53DB5F6C4FA8A605967AEAF5DAFF4F2418957C"]],[["0x11CF7C4526ADF84786B5D5F4B7F7711423C8D9FD39649E58F0F8E7FD17325B28","0x3A4CC5EA51B3D2003E4AAE2AF2E66E6277B11C57BB35668A4F3BE42334BF0278"],["0x1B336FEE7C37A252F4463209967427FB3E414B990771ACA8687B24E481C90C62","0x159DAE2CDBDD58337838E63ECE9C451F81A2DE669C093C9810A8B93AE2B74998"]]],"z_1":"0x007F1EF1F50F4F4FAC810A111D32802285DBDAB8F075B6DC8B04E0637833299D","z_2":"0x0731CDB71E96123CC9E8F5CE488011E67717D96C8850BE6AAA4CCA6361A4CC55","delta":["0x0BE6706201243705B417C8B0D5F08F95A869352D91B9A7E4B0B40DF48AF2AD57","0x14CD02EE17E203248373FE16172A0CC276863DC11EFA067222EE56E977909986"],"challenge_polynomial_commitment":["0x050795A7B8AC63B3F70B2921A3E7F92134C1E3D3380BDF67126B5F9BAB1235BE","0x05088A8ECDA7E1FF0B01E2CD3A3BB15593F1E65EDE23296872BF6557EC2F6866"]},"evals":{"w":[[["0x1334417BC1D6A88B1542A410EDD5B07FA543153E9A650FB5C487B7929D7306F7"],["0x3C4428D5FAF503C00F7DDC8F6E00362CCE9EB079F20700D9520B3A959B71917A"]],[["0x0188C77943DD26B39A931B53F2BD63FB82C3740557ABB2315C2316EA5C69FBAA"],["0x13E4AD069A9B1D0452E799E9F07D5FBB1AA3CA9A6D10B6BA55009791CE9D060C"]],[["0x300633428A41019CF81BB73302260BE2C717E155B13044E1FB39A7CD17681EE7"],["0x0A2488F0A46C218685BE60108543D5A94E1A9D4E8C93582E71A984D10C954AD1"]],[["0x376C93A715BEB2E4D173BAB92A2FED4803914B1782D04547BC97DD0CA5A11D43"],["0x123DF4FD37D7E88082CDD5CED5CCBAE2DB23B04BFF545B8142ACC2F8A91C97FD"]],[["0x3409B5094CB2F81FFC8BBC322E552A2BE41F450870BE467E8F713EF1DE2BE7BE"],["0x1930EBF4C8FD96731F33EC2DF58200890D670F5679F2C305DC3B320D7A7A8B05"]],[["0x2DB79335C0FF7677E4997ED96DFF53D3E8DB3AB9A691372EBC9C935EF19A17F7"],["0x371DA8877F69C1C86ABFFD03471A820DE065592264D24739EFFE4D9A736504AF"]],[["0x04B85F28FDB7B4642E9E05C296ED37DEE949773376620D3B403B28614C6D50EF"],["0x3440E66EBF5A5B04E75B7AC2ED0DD7DBA0822F8FA8EDCC1D9DF3E1FF33E64DAC"]],[["0x15ED1D0317B493572CA062C71F6821E35AD60EF2046FD684404CFEC57BAB43DD"],["0x0D8E1DC1A1FDC92463ACBDAD0F73A2DA82A18BD4C6D8A1E82781154C82645D38"]],[["0x142AB2BF1A74168EC9B28D9C63EFB8C2375DD8FCA070687F87266044CFB1FC30"],["0x2463F40A558FA1A2AD77450DE32F7DC904729B1BBD179EEB921E2CA4C58553EA"]],[["0x068F4FEC6C29105542DB93A3BF0520FFF31514627DEA3415FBB29F0B0B196D9D"],["0x0EEE7E6667C9D9BD17D445A9CDD83C554DCC53D4902174B5B1C03BCDC30ADF94"]],[["0x13C1FF1E1A96A2F87FC8D1BE9A495F5B32F819A92ADDCCEE77141E42EE8C1C81"],["0x333CF022F4A2FCEE26410BE211627689C02C76BD1F662A4F2A0F71B2F1287ADD"]],[["0x329CF3F82E2B80AE9C12DE4C58C6A505F8A9123A99F7ECA79E514317EE9A0BB4"],["0x340230833442C9C2410E8B6DDBF469A075C36B1403D02F715508B5E2E7E1B06B"]],[["0x3B3F49D65B7A98CF7C3326A08E4636984C1A6F731328CEC7DA51B230146071AD"],["0x1A68603F189B7CC632442E50ECBACBEABB01D9889E4E79AAE96A5E0BF5C94881"]],[["0x07CC87132003A725195F35959E1F10A46AC19FD277660CD74B4720F16EF3FAF6"],["0x36BC4DD6E46C14DD0B4F68770376894DEA001A0C25C7056F5CB7AF8FC562288E"]],[["0x1B73F12481B58C8DC0219A8A061DE9631ABD6635B731FAC3D2FC6A7A663718DE"],["0x2C5282C9837CE21EF4DA2DB23D487A4B31B48813D0087DC24653943317858AEA"]]],"coefficients":[[["0x20E4D9A221972F9933522AF39ED8B909C748E65BAC46DE42CBEF3B34E050B720"],["0x39DFECB04B6F6208089ADE30C7EA8E7C67AB626A714E97EB7D04FE7339723ED5"]],[["0x1214B7096ED6AC8E416A1B18C70A9EA7CE852B14A42A4846A63D94DAD33EA102"],["0x2E747803D8E34C5A07C6CD13FA9807193705E53A38D1F19FE19CED626CCCEAA5"]],[["0x3302DAD7DC9BFF9965288914CB8E15A5C7A4A811122A080C13D9228A0EBE6205"],["0x2FF983DFE9991049A5E9F1E9F4C48036838007BA4D00EBF59B9D019BBBF3D962"]],[["0x30D876DACA47453F453E0B77702251C24DBCA1F97FE07BD3C6370D0279CAAD8F"],["0x1FD20F51B6DB391E2470DE375C34A653869748AE8D7BA27EED247F9BC5B3EF04"]],[["0x2ABC44D1A96205C14EAAAB0C65991F7F5E402F610B42AFE6C6192201D41A3748"],["0x0038B07CD3FE7705B7192195135FEE068BEE6F08D33D2FA9A7DEB3384D388331"]],[["0x1B2391B31CF0D7EF9B8D9B39167E3C2F6A4D4FD141CF7595FBF9FCED82655070"],["0x3443955D9600432AA3F109CD92FB4926991E989CB4E27C21983519B05AE51989"]],[["0x2970B0F88179C0FC3678B55F83DA834E38373E22C2DABEE7A0597AC626EE7D97"],["0x1D4E685EB89775643DB27072E29A02DDB5F9FAF2388854D6EF1D4918C8E4883E"]],[["0x1BB367C221D471083EE97C532579F01D6B5AE9A429A1E105FC8F4375D8B29D44"],["0x0B3F189C6AF124A64204716D17F26326B83912AE2A1D5E0A72777D5B792961D3"]],[["0x1A2318752D199C5BA4CC51C9996C1757C21DD3A9B9E644AED0F3D3397EC4B5EF"],["0x08220B6D2541DF8A243AC506300C0BBCC45DF58037076D9512E277D7976EAE6D"]],[["0x2C2B306BF4F97F9A7367C31EDCD2134F814A615381DC676647D9F4F21CC5BC17"],["0x10BEB2AEFC294FEC20720C4641F1825DD078B6446E3FA9FB7309D3365F307419"]],[["0x10D6193487F21EECD24DA095332FFF238BCDDF3E480796DF85DFC1E74A496C0E"],["0x14F748FA1B803A1BA13A8C95C9DC18C1B0FEBBC9D90419255A2EF94727AB938B"]],[["0x3329017FE4E09BC29AAD8198C0F72050B3975928434157CE08971AFA0873DF61"],["0x1D52007D415FB11D82C41FFD492C050D23A9F7D03FCB5943D08449565A187714"]],[["0x3E3DEC57CAF411CD3581221F097325AF51C44F0A20CCEAEBFDA1FD3CB4C2CED6"],["0x091946E599F55903F5724E66925D9177494E7CB66773B3E6D8E8E27B92F93587"]],[["0x1DB7E6DD76B70E266D9DD80DDC7D03D5F5C3F1B26292A6731012917AFC979726"],["0x06EB7E27FFE94CCA6E14A4D77EF0B467864422AC696CF39860BE0116006D9474"]],[["0x2A7A7CC70702FA3EA0E612614D52F32EB96FB4408769974573C156B46A9768EB"],["0x25CE4497D4C46D77166C82C27119F81ACA1FED9782D3CE4CACDE9CCA61BB1E7E"]]],"z":[["0x2FDC40CC66C4F560DC5BB7F55E85E1F67FDC907E98CE4765EED4D369DD1ECB83"],["0x2F09B70C15ED9E0033C0B1719D27BDF40B1D76E4D528BF5A74B959A3E7AA7414"]],"s":[[["0x0B2EBE817A02BC674A38BF196D918F7814AC84EEB1C5A7DB140E4D918D69FA32"],["0x32238C3AB5A5B5DEDCC54B4B4A873D25C502265FDD7A8D63297EFFD2149F3B62"]],[["0x0729C1FE74228D1F52CBC378E9EAB40B1FABAE4EB5EC5A2BA20A3838F9AACA2B"],["0x24630C77485D7C37118107D91AB4925D9C32FB1C0360B15F404E0ACA4C9C0BA1"]],[["0x39ECA8C3D0D95F8A4C4D5CA00E6C33A1D069F799B0EBD20FF311B07C89135284"],["0x0CA04582E764B3F3C113DC253A2E33FA1FE8C1421955E3C925F285C58315E409"]],[["0x1A93AEFE5CA29123C392EC9400445A3A2707E8E79754AD95C20564CA7AD53547"],["0x3C3A4E92FAA84F590EDE7B3191BAA0B9A07F9E39B2DF55E1BEBC0CAFCEF44255"]],[["0x08C0E86E795472B8EADCA53721BBEF1DD1B768F83F8E63EBE89186FBE8210767"],["0x258B7B85636963D3EDB9B2B7A38D0B19D53484C22A81ED03660027FE9E122FF6"]],[["0x1923386111FF17F2DCE5FEC67BA9C85457EA1A3DE33B2228106990C6D5336EA3"],["0x0C080A077A9E24627019DF4D04750E9F0BD74F2A549FA673D6077F5327C0CC6E"]]],"generic_selector":[["0x350B834A0E9D7AA02DDDDCE8357E1351B73308DB8CDD47BB29A6E64BAC19E37A"],["0x1E8EAA82DF4635F34C638535E065832FE24BB428773C6BEEEC75B95F1D46E52A"]],"poseidon_selector":[["0x35777F6314E5CF29C328C557D617C4600C57BCECC304EE551E239D4A6BBDBC3E"],["0x27EDDF67FA0B14E5E241E029775772C57678D99435A674C989967AE3B254A0EC"]],"complete_add_selector":[["0x1B27B497B7B714910B20D9ED1A7D7AA805115CEE6BA128C4A2E8D44B93F6B858"],["0x205E7F1971A45C19921F06F5B2D8F852C23D9A84D8E777D747A1DCE0EB6C6EB7"]],"mul_selector":[["0x29DB86DEFA157AED149EA36F77824E469CF20AD522803D0BD76CF5FF18E4512C"],["0x39B93AA0F6816AF9BB3B4AF2A6532C345079EF8CAD60EC9CACB2E8B6A2803F65"]],"emul_selector":[["0x39D051CF90E3FDC57D36C75B69AA59EF183CC14C39793D6EE67DE7D228B45E41"],["0x0824F6661686C95C58A2B475D5F8FF457BC16CE302B3C3C52195C9A2D33E48BE"]],"endomul_scalar_selector":[["0x2371783F077FAA05CF811F1FBB255655C6D863DDD8D01407F484E78D0627CC55"],["0x0A35414C9B4D37358263E37F27E3C8390DCF82232B02503B5E21E0D38A5C7E8A"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x11CF58FA25CCAD89F8B10F7DBF7A8A5CC3C11D1BE58F549EEFCE87B63F086C8C"}}},{"public_input":["0x1CF9C5CE7E30AA0AA2E7CF62D285E0FDD9D51AB0C6BAB9E6EE60AAA230625183","0x2CFE3145DA66847D53419A2159A589B9A1FA9CD9F2D44D0AC8A6ECE070866FEE","0x314CF4F5EA8ED24E0B6A0A88C1BF25D78A384DFF49EE54DFCEBB66695542DF4A","0x0DFBD4DD4CC64BF8584365A301598E77DF821466A66B1DE6EEEA5C37036A15F2","0x1992BCF56205353F5B0BA2573CC93F05968AC767B0DC6A2F5BBF332BD9CD6788","0x000000000000000000000000000000008362C24E7B4E04725F1C68F1AD652C9F","0x00000000000000000000000000000000E4E15B849F2946878CCF57FED0E1C874","0x00000000000000000000000000000000D35833FCA28883B441961E6D6A97843D","0x00000000000000000000000000000000CC7D0D8C54FBA5F3CAD148B98070F135","0x00000000000000000000000000000000BAF1FEAF6C7CE5B279FE9F5FF1A6F2E2","0x223E7CA16074AE69F5A10E2B3C4B07085D05645E366738E481958DAD947DFD74","0x328898F51AADDC80AABB797E17385492CC1301FE8932D3B0AB40F9612D8EBBE7","0x13AAA16027CA0333D77F2F7B51CDAD031AB7EDCD5DFB261AA1F59AEAEE059BFF","0x0000000000000000000000000000000092C312E3B792DF742BD46EEA5207A031","0x0000000000000000000000000000000019B5B10E41BA2842BD07566ADF5A6142","0x00000000000000000000000000000000D7298ADD66AC8968CD236C6139E1CFA6","0x00000000000000000000000000000000D2147EE0D8FBE7716AD023A5F4087B4E","0x00000000000000000000000000000000F63A613158DD48EEE5EF3A8D262782DB","0x000000000000000000000000000000006DF896D70B58195ABFEE16A540CB753D","0x000000000000000000000000000000009CA870285B668E979BEE1EB8A3840419","0x00000000000000000000000000000000CC4B665C65FBBF3F100B22EB0A2B912F","0x00000000000000000000000000000000BA1245AF322BAFB95762346A323BB37E","0x00000000000000000000000000000000C1D1DFFD0FD207DB84FEED38F5005A51","0x00000000000000000000000000000000BC7E1FDE081743B78781EAEB4283B1A7","0x00000000000000000000000000000000342D192C23ED6239674B7A8E732E5D7C","0x00000000000000000000000000000000B93630C6E074FE2FF217B80FE9DEA5BD","0x0000000000000000000000000000000066B9606B19A5296EB8B2814CB0F2D885","0x0000000000000000000000000000000017A3C900BB56A97D7973819D63856835","0x00000000000000000000000000000000A953EF2969ABA9CB236DC06C029DA34E","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x05535D18C3A0B3C1E431B3EF11E2DD5556216B6A9D3FF7B72F3FC116FC1F9DC0","0x22A186461C2A3C11B8EDB97B7CFE2F2E940978F8A6F8AC34C87A7182310C13BA"]],[["0x12F238903553BFB7C37593F3C2F1483D9D4081FCAA83219EA7C914F63C59A216","0x02F847DB143EFB8F8CC962DCE34FDCE4E74979611FB1901CBED964D4D6285A5E"]],[["0x3BD5097A3D8472D050639B54F5BB252D8F3E4019D3CD34B80885FC8D9BFE57D5","0x0F8D8AEB49037ABE8DB909018A7008B7360DFB1D9A39CDB0BC7264F365926B3A"]],[["0x39F0EC133090492414AD4418FE89CF00A3096997626DD2FBEB04DE3A63009723","0x3376CDBFC132A37F843B69B25627147CE3DF98B2CC2921B7A609ADEB59216AF2"]],[["0x300E5FCE611042B32704FFA7F1A4F0183C4AB700140BC5328391C96AC16D3ED7","0x351EE47AB9ED0E934B45EC256CD4F177975CDC0BC87471000A1752FA3FC56516"]],[["0x3B7FC57E5FB0E82BEE5A62F50AAD42CA51FAD40569FD78F8553FB1441DB23C56","0x2EE09EBC5E499043BDCD697DF65CDF30A647CECDED1BCD10ADC418C780F29123"]],[["0x3C2E158F4A5E331ED608D0CAF9869983E324921930D928B904862FCBCC81C67E","0x176AE0FDFDF2B640980DF3D96047E0C98FBD13FC2164FD58DD9E9FB2A6F9BAFA"]],[["0x0072C8FF6B76F49446B3D6503EA71E024E3E4CB9E2639BD932A9D81828AF58F2","0x32806ED64049CBFCDD9356BBCBE9CAF2E5115D1FE4791CA3BDB151369F8288A5"]],[["0x338EB026E6D1810FEC54C8E8FD3DA4D898252703ECD7373C6F3C03CC588990D3","0x27FCE60A09378D2134189D11C82E21C7FBF2B00AD2670D1B867ED7FDCB0447B0"]],[["0x2567E35C32C931C9555397043CE3C6F9DEF7F87BD4A02282C5E3C33234F25BB8","0x061FADAC3F72029E9C4DCD961DBB1E1298BE48C2821DE28D9D6E6EB629EF16A6"]],[["0x15943125D84F44F24E50AD4FF20DF30482FD015A7BA70BE4689139760C22B88E","0x2CC56E3D0ADADBF57F7383D552A08251A4B547453F75D5A2579F4F8623C71571"]],[["0x3A43EAFB20D382F74D4836924E8C1D79386C8CB0B64DB3A1525A440C2616B660","0x06508F2F56369D5030F51F5977A5AD98645DC8FBAAD294169E328CE689D02CC8"]],[["0x195407D2B8A6771703920539A54CA28FF232D2AC5A48E1C0962F3989B931516B","0x279E7272DF071BBF4EF39ED343FB04C4AE07653120F9034E0B27BFD2B2C3029E"]],[["0x2348669CBCE3B314DFBDD0EDC361D0C80B1708CF80A09A05A6D2B6585373C689","0x18AF3A7C4312FD97348BD60E35CE1A9C2784CCA576ABBE513D89B3799D7BE950"]],[["0x3D445B7DBE7B3F96B85151938792A048972AFCD35995C91E24230F06A4E88C0D","0x31718A8916455DC8AFF0FD48EAA4C9C3ECFA8E1761F21C2A2CF8C5809F4FF1FD"]]],"z_comm":[["0x31F22A560958B2868F8BDDB2582C8EE1CE62EEBE6ACAEA7A64E6D9717CCAE93B","0x2350451A814D881DEE1FF5BC63934E829AC1FA436E820FD0D0290F6989DF70B6"]],"t_comm":[["0x3CB47BB3D17E8B7B9245905868C52722D607CBB53213556E6BCBEF729E3FC7C0","0x21D3A83589883511F5F7757516A48A73554EE0D5D439F9D3969399084C1A7754"],["0x0947E435625256A4748619EB8CD0CD1B75D4EA62886860D47F1E0222AE9C206E","0x28A6222C22C80AF48A05017561C915349B64F6D753681C1B4A6E0AAD903EAF58"],["0x0F0005908ADB90AC23E061231B4EE487CB8881970CAD75CA0554E106625113E8","0x22F049B7FA73E49D903456F1BD071DCF3AD8D73902DB341277DD3C51791242D3"],["0x0F89CF8526A9658B56F6BF4537F91D277DE11B1BAFD741594FAAB01ED81C4EAB","0x363E091DE7FD929F914AB4E3886C912B19BEECC4FFC3B25AAD1F81A1950ADB17"],["0x16148E79E2DDFF7E8EBD68B87E60143A9E5B6B46A3276D68685D58A9DEF01D99","0x33EEA41F8B3FCE04190011797AC9BDED6A21380F5EE5E2A2723FAAD42990DE7D"],["0x0CCEB093FBB17B487EE71EA754E71A9C8A507283A433D6D457BCF6C8F05920DD","0x0E054F3BC08B1DA39E78A1AA09B64D90BFC4595815B308AAD6F3693FC441B093"],["0x170D25D5E41884A3EA76300A366C3B9DB11AE1DD8C0B33951724EF7F0192ED71","0x1FF5973C3373A1878CC6E244435D6D8E062AF98362589A2FC3CC09A139DB4159"]],"lookup":null},"openings":{"proof":{"lr":[[["0x0BC7896949CDC9E09562DDD0362A5B4BCE816BE376D479464744EAB2C55AD6E4","0x183FB3EB7164417985574AE9E93DB2FA46315D109BC12D7DCD92B420A3FB351E"],["0x0DF1CE84FD2D953B0854AAC540E466D6950F67D8F9A4B168D645BAF7AE9FC4E1","0x0A87764D1211AB76BB216BF85BA735D21A6E3220B7CAE4EF64D2B5F5CD4D1D1B"]],[["0x0485DAC72B3D46A96E13BA52332E6264BF3071D0F6E67AC982BF6906BDBE32DA","0x3CA111D346C4E6049D7A1C2E7A08773F56850619ECF1E07B5C0DCF42EA2EC6CE"],["0x31AB92AE889AD82CBD1E0E91A23047682A4233A6038D6A77D1B782757C9E565A","0x1B3F777642C3073BCD660680DC07484A17658768D464CB5A7DEBEEFB27B2BF76"]],[["0x292E4B1AED1AC8E1840065E6AFD62312EF10E6C43C3919ED9CBB47F4B44F0906","0x03CF22330174F4FA5BE258466FB2D1EA6D2A1E80262A81EB4C9DF5D86B733010"],["0x2951F538A39466ADA30BF0D05F1D2DAFAC4834ACC057EE672CFD0511709642E3","0x19A3A9D7713C9F5149BD308612D62ECA599655C20D7560D3C0B6FF0CBFB96494"]],[["0x180828AD6D9F9CEEE054FD5AD14A596908023B51FC7B29BEF091DBBE26D9809F","0x138FBF18D71A28C09634B87B566BB6E19E726082D47CEE453D1F8F1E5E84AC75"],["0x2A0B4D411F921D84B82DFE913B2FDD3B20251DECAAE99436838CF54ABE424C1A","0x22710721007482404F5E23FE0F179E3AD15BE32335F297779F2C7C718055A531"]],[["0x037C1CECF2C1DE3BCC45399737BDC1F20F14DE52DDA41FC8BBC45349E3779FA0","0x33DAF4BD18FF878A3D38FE2A52B374B7F327C357081A99095F29DB22AC517868"],["0x1159405EAECA5681F72FC80443E4B0121AC007E61FB59143544AD48555138E80","0x00B5E57ACC34309104475DEC9D72BF63B1EE8B22C56AA929F03C2EC8958B3762"]],[["0x268E333FAE13E0A0523EC6AAD115A913574B2CF1E4FF2991ACB7E64178A84741","0x239D503B81C7E1D90B2D1C96DF721DAE8E255DB2EFB5D7C9FB94A2F91312362C"],["0x3F79BDBF31462A84D17E9C6D94A1F3D1ADBAB22079849EF0D67AB7E2470E8F84","0x03C1554787E2C25D087B1F57996DCF3D8A5A3F1A027A63C40F3046C9150A0C16"]],[["0x0816954A93DB7579442DB5FBEE9BEAF44596C5289AE847D87C19812D9C1928D9","0x1C4D8F6DFF5832999BD6813A63C3719D1FA4B9A81C6E077BB68DDB93FAA6C186"],["0x1290B80D17A42BEEF7BAF0CBB8DABF6207E605EB83E1C7DB4A265B5A936D73D0","0x27949EC93A663191A460C4ABC14751D121129A9C3C02134825B545099B793D36"]],[["0x2BC32D40A79D61D1C86661EDD5B8D9551B9857EC012A392E90FC46E949AC5251","0x28E959DF49FE102942129A682F5F16FD5884683A43D5EFB7EB9412943BD488D7"],["0x1EE8957D74F847BF4C5B84BDEC5D3C61BD654FA86DE47E9C69466546577CCC6D","0x1A07D49E20F3B4884CEEBBC69E3670E37DC3776189BF5751BA01DBF9BD92D9BD"]],[["0x3A7A5F89A9053B35EAA4769A6F9DB854059B48787F0FFFCA0F4967F19BB5DBFD","0x17A4B30F3BBEEA904FBDD5F1343ECE5D7FEE8EA81F8E292C45FF374112DDDC9D"],["0x24C7E27249DE95CA98D093D4F8CB8B76DA78FCA905B2CA8AC5ADFE91F63B8724","0x22D75A85A30E50F69AB93325B3C52CEBE0BFD9BB1319CCF976B20C61C84FE149"]],[["0x139F7F5942A31DF612A22F6DDA5B3045FFE8A729851F37E2C5F33E8A8F7DB29B","0x09523E2161B46EB96FA8A72D0D1D6C84546E795327AA4F4E7B55B26CEAF54C80"],["0x2B6210F9570BC445F288B5527E18193E7FBFF39DE272C8952DD5AAD79D22D973","0x3CCC254C64A0226148A06FB0AF5902C9474AC6DE2C3AE71E08C7979A7A257955"]],[["0x2EB021CD0C50335F0C5105A305E575D2FB94D63A151814DDC39FD40758B183F1","0x306262653EE7663C0CCA603F880C516841F836967189D2853813E4E980866449"],["0x023DBE6A88440DC59CAD5A4F9EDE68A78282D705CB17FE909BFDB5ABD079B2EA","0x14C09C500ACF4BC8EABB6E868E679E6A0CC3A522E9B60AB874FA426DB1E6F0A5"]],[["0x3D3778E7AB2C98812955B56476CCCD4F81AA7669CA8CE0AA10F0E5006ABA2954","0x2F8CEDE54C111A8C35340D271ADB0709E1268D646F3C6F3961935B3EE5F5414B"],["0x290586B7F52CE0AB14459B7E1BF8CFF47B5CA5C746B06E22097137DD63B1953C","0x1C0AA7CA731DABD767838E3F37B877E590813C030089FFFC3C429DC479F2FED9"]],[["0x2D552EFEFE6E0B77F0AE631AC3DF9712494904BF18C0BDBF1058416FCC0703F8","0x0E7704D6609B58DA4ECE77DE93319DEF5E8994439D47340BD2BD003A63CDF246"],["0x171EB3A45856B02A34C68F67493D6E4E4649F65D82EBE4BE423EA405CED68B48","0x11997AE4E72E2755DA254854EA55D9414C2B1DA0BEEA7F0EDF463FD51B6DFD75"]],[["0x234F5AAD10372EC0B91AC01207946B264FDC08914AFFF01B252780BE433416FE","0x155F30DCF0B5069ED4A02BE27BB1C06F7BDAA0004D033AA1C055EBAD28924346"],["0x1C5C8AF4C92CAD2126F6CCAD3123DCA91AF92A51F73613BF8A555A10723DD0E3","0x24923251D5ADADB66F3221B62A9B6233BC5B14AA82B6A2310D97BBE2E9103762"]],[["0x136083BF2E5B8C8D67BEDDCE1D18B1BD1D1AA74B2829B66B0A42D6A047221223","0x32883BAFDFD9526059DD5AED7BFE747A295F75AAF711E3D07FB81D9F65080075"],["0x2F61F1C57320940F7D8B5CB590FFEA1E9DB89DA4C0BE3B42BD26BC8E083958BE","0x0C01706F7BF554C5D939A9584646A8AF32BC1095F9E0B5419D8F1829F90CD312"]]],"z_1":"0x18620B597B1D2705CAF6F4D053E9F70859A7F65DF530D99B08147918A56C7E26","z_2":"0x24E96A400B7881321C3A1DF02936014A1A981E8D8EE3DD7F33818D68B2EAA504","delta":["0x04F198786B8A2EAF1F4D28E13DC7AE7785E4C484AE85FE449B4EF637B96917E3","0x3C22CCCC88CEE4ECA8D6E7B9BE335B0A89B0F9291E55BBF50561B6B5128DA669"],"challenge_polynomial_commitment":["0x2E0CC079F640F4466E1B1E876780E490A68E2D5785FA4F31E0BFEF543B775160","0x0AB132F122462F28D6522DF9F85A63917C21698AFCB105E2CC12C91D6C535DCD"]},"evals":{"w":[[["0x10215F40B303E245A90491AE2E279BFA59C7A4A32C00A1CEECF29D436B5E4CFE"],["0x27468BF99A89F5A7A66B56F95D4EC19B956EC8C284E9D6AA0740FE64F58A4980"]],[["0x3CC109044D181FB125F58AAAC330AD112A818AA5A976DAF10F16A4502FAC5522"],["0x0F76646618E5739ACC0B33C1302CCB4744FFAFCDEF3BDC677EE45727F79B9BBD"]],[["0x1F9C187A724D746137B674A87949494C9AFD7FB9C99327BA4F87C05315B11A00"],["0x0FC2FEC5BD6BA009E3FC2B6A9487E9AAB6FA933BFC428B4E8E4F6E453548A2D6"]],[["0x0C65D436CB9D4DE77EBA0A4C3012CB41CD1025F6710DC1423BED72883FBC1ED6"],["0x122661763FCF31C119C5C9B976170DDF4ED7CF3FD9CD37D88131E84169E27191"]],[["0x1741D99B8BEFAC3A18A18F6E2F658D0D01C4473F70FAA7DEEBB61DDC682FA936"],["0x0B0684E43F2C6E1354CA0A5974E51C14D54EDB53168A436F88E6529C1EC6CAD5"]],[["0x30293F3806A5EE84CE490B2474779DFFC1EFEFFAB913DC7E398D2BBBE4BD2071"],["0x0A9011FAAB6D9EA8A6E67E2A26E48CF0BE2F3D547ADA5F7D8701B750D5AF301D"]],[["0x1B62F09F8EA3DF5D941B15E3675D1A7FBDBDD8DD9C7905517CE37358F1933AC1"],["0x2233F0332BA74A94E7E2980BFB672351D7D18D632C4BB2DF137EBE6515659C8A"]],[["0x068E14EAB474B2C5FD3B61DE98146FDC13E48B50B2A7B67577A7590EF20F4BA6"],["0x3C880AC97BBAC478B51CF98381969DD107443508E5F88402FFA32348C22FB9F5"]],[["0x227BF47FA64296B8A92707A51BD2CCB1D1F9E7CBC0BD981A10C22CAA901BADBA"],["0x3667C904118A568E6301EF5580C28B6B56F3271C6108EA661929F358D720B679"]],[["0x112D76D71B6214FCAED45C36D5DA6AEFECD5E7BEBCDFB36AFF785B9280D8FC10"],["0x2FAFCB1F08DB0FBF7B2F6EDA0CD86CA3970DFA21BA6066D8B45EFC40CE718BC1"]],[["0x0ABE4E253CDD477A4A938E0A169731329F5AA0CB0657E4CFB9A40A46996A6F97"],["0x26BBE031F1960A2A14F801BC09A46B40FE2DB5623D42F9ADE5E5C39FA9FDBE22"]],[["0x246267827969C5AD7B885BBBFF7423F35252C20B1494C210CC8C482BA4005EA7"],["0x0EAE47EB7E0A1D05A8DAF100F72A46F52952E15A912E555483B743C23D2C460D"]],[["0x192E49CA5D3E2726862007B9B947A80F66AD8BF621935C29DBEA787C2A08BDB6"],["0x0309AF54AA5F7878FA65ABEDCF6D2EA464CD869B51DB54B260E60997AADCFE54"]],[["0x35B60A4DDCB797F42391421BC5A993A4CB935527404EEE9B4EEB507689F045F0"],["0x3589366D1880E9AD183C73DAD84422CBB71ACCDF039D145636ACC788D0FABE38"]],[["0x03153EF146940E2D0C79C9A7839595CAB91E6D580BBEB4DC17AC58947054C320"],["0x2CB19BF5AA2C2F72DF5CEA2F02A0BA23000DE58386F07D0FD18EE3D83DFD4DAA"]]],"coefficients":[[["0x38E5D6155C7F2841D1808D8073E5E0CF9432E9C91D432C567E3EC6328633C027"],["0x1DE1BA7A2AC02F3532A597870FD0C4F8BDE823B1209E401B377827783DDE80B0"]],[["0x2E9C35DFFB89AB2C75D770EB2FCE01FB3546C769BC67F00B304A0132C41F380F"],["0x39297EF97B7DF8752E17E5A66674CFB1C85CF5429836B404399FA2608CB3A9F7"]],[["0x324F84D9DEC75419FECD31FA9420E2E1EFD2C0FEF22806C404243E411696DF1E"],["0x05FE84BDB78790D7F5957744FBC9A3CFF7C7C771B3B6DED3409A7C3E51F40F0E"]],[["0x1AE2A1D36A23063E8974ABD350B2223C0953C0C025EFFA934AFE0E38D98E682C"],["0x23EB0924686BFBEFAA339DEFABB55938DB9DF447E8B26B93242C1872113B24B2"]],[["0x10417B6A6D3E109FC4B2BFB2B64DE49BA6E7824BDD3AC38F2FB0141A66196508"],["0x0BAA70FAD1FEC4632CAC582419346D16F0FEBC8213E8C41E991E40F36648A071"]],[["0x103438310130F4660DDCA7269DF8FC1726C13EE6BCCD8CE6BE47232219EF3058"],["0x0B7BD7A2F006501BDC86D56DFCD1A6C2B7DFB267146715B6FF191870EDBF07B0"]],[["0x0840831E50A0A03F4E8EAFDF8BBE56435C1933664BA75C15A95FEB451107EE01"],["0x3D152BC4F7860BEB6AE27C78BD4A3FC0D70BD48CF12A3F18658B8F6DF0E39794"]],[["0x269FBF9E83DC0576AEF0629A6006C480298E837C0F4DE6E0619B2B196CAB4539"],["0x3CE04B5AE150C8BC5CD12854EF86F1C228AE97D6184FCE914EC62EECEFE051D5"]],[["0x27CBA10DEA0C68DC225039F7BD2A365F0A406F7804DFF1F00180550A21B7D24C"],["0x0DC80E50206F604FDA3C1312784CE4B5F5C71C731B3DDE11AA2FA4B869DE3F15"]],[["0x09D31D2119D04EE4AD103E53E2BB817F6EE29326A0ED875E133A8E500823AF87"],["0x21FB3F49DBA36D671DEC1ADC56CEBA3AA6A65F03F7EE21C2F07AAF24FF0A4009"]],[["0x2C45907280823652C8F979651C46682995117B85697562F6E66970F69AB745E8"],["0x167B5BB4FEA987D18EF740BDC3C3E55D7BB50340AEBA3E3C46F493684F28A31B"]],[["0x10BB6085EA5728C2734D2412C350ABAA0A55512C9618D09B6EA80610AFBD9645"],["0x1B47D4676C30461F7C565C16CC8F02C3D82C1D00FE92B3B8141C6E3FB781B1B1"]],[["0x1350848E79D25E6593683012F9CE90EBA86475E9B37712F42F6169C0DFE08678"],["0x2889E8650D81F50D86906DF7D65A0B918800F8817929895CB9774363F5B62A6A"]],[["0x076A47273C4E7A73F7BAC7813C80F3F3F79C3B3771A0643E050212AB116240EC"],["0x211690D2DC002C1049FC154197D42C8CB944568A62BFA1C8784B9F3806EBB89B"]],[["0x1489AD0B495CBDFA82C76A23D679C363BFBDBCAE5CA60DEE8BB1457305A7D355"],["0x07E23420617B58324115A74E48250F554BFDD641C23F25C6405B58455F1D870F"]]],"z":[["0x383472D1FA6A64447545D8EE24CFC8CB0E33CD3CDE2F83D6D5D53AC12FA9673D"],["0x13CA707959B0A3EF3E090FEC58D2ED02031AFD4C943A3AA167C8D7B85036BDC3"]],"s":[[["0x004C3D95F586F1BEA5530C0B983C4B427C59B0EA9A8F0E0B3B2D21709918013A"],["0x24C9C7F8DAD586CE0515308A41763EBE30FE4BC25F8DDB50A38FE70844AE818F"]],[["0x33D872A9BA222D8DC7D3E160FFF102E6B524CEFABEA84C05EBAF3C5F246BFBE4"],["0x0DEA68097C0FB98C0FD1DB3B5C87A9BD6377DEA207DD4FDFE937A7F56AF23FB8"]],[["0x1EAB4DC5689909E3AF42B607A250C0BD3B6E588D4CAC27FBE0BE60AC1E1E1E29"],["0x32362F198B03ADE0D6ACAD99147E968C9266FA3137DE87F45843F85312FB63A5"]],[["0x2232FCA1404176ADD1C9433EF74903D395049C6169B97A6CC89046357770FAC1"],["0x121C72CFB95B1305FB7B536BE21AABF75B97CE9E9C33F2DC56AB25F737A47490"]],[["0x13D22832D24571A15BD394F672CDCBE8A14D6C7794D0859B5688F929268A0CF2"],["0x3E2A7E5CDB0055749B0AD6F2E91D1DE4779AA99E7873CA5E08188AABA8F26CB9"]],[["0x257A4A07B38E9E7A8AD5636AF7F768605D8ACC5243CB03A87D4E3E4F42155021"],["0x0E6E5EAD50C444E663BD2B088445E725E7D1504687B7E2C0779A2D3393FAFFA9"]]],"generic_selector":[["0x30BF399B1681EAF533A9EF63288848CEFC3B01C1C27289BE2CC3D33ECB33D686"],["0x057D12246E2487248981832705916B163D343A4EF24C6075F40D84C958A39E5B"]],"poseidon_selector":[["0x17FD5862C44D3FE280524A285C373935F984D5EFC6A37C7C23FCE4606C9E0F86"],["0x2EA35E9287EDFF094E942C47714979BFE2E6EB1337C627F6E3D2B716BBBAAFB2"]],"complete_add_selector":[["0x1FB358B36BC7357062B27257A11CE2FEE5E08EC86087B829DFBCC129F2359BDF"],["0x13986985F8E75F76FD0E1B75AB0208173A9E02CBB272F6D619C120C64852DE96"]],"mul_selector":[["0x34198DAC9D86C3D5F7F9F1C5EB8035711DF7F0ABB0BF0999ACE77D135AC2295A"],["0x37D6E4ADBB2A4A546589A724F76C48CC0C17403C901F467F1701DC026D0BD28F"]],"emul_selector":[["0x3660662A64B4562ED9BE85B7EC1A01D1B82245B59ED9856F95A24EAB93E2D1B9"],["0x3AB2AA3BB8B4D33E82D8266A1EE0B40B202E32D1A5EE3DBA1BB1FC4F3BEFCA6D"]],"endomul_scalar_selector":[["0x3CEC02F549AC9666218EB31B6ED37C035CBACD7DDF29CDD70BC6FB059792693A"],["0x3FE021199C99E8D4E6B30259D86AA62A7BCD0C7C019859380BFA20D24F64826E"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x044E29D793FB12F722683A8C62BAC78BA1A24EF53AE67680F3FC7FF80F1A5EB0"}}},{"public_input":["0x1BF4F324C315D070EE1CE49FEE16E5751649D61D51285A63D1EF1A3006F773FB","0x2748CDB90E7A881F7914B936C95602822B4A639F7AEFE8CD17D43322C924614C","0x10C5CC362B62213D4C52827D23CDABACF24B79B24EFFAC934120479FD997059D","0x332334677D24C6100D357CECDE77494F55AB86C5EFBA15BAA3E5414F7156CCA4","0x28C695F37FAB4EDCA1354A117CCD9C251F083950827E9BAC5A6971A8B598F1BC","0x00000000000000000000000000000000CFD90EA11CBE3ED956ED19603B92E5FE","0x00000000000000000000000000000000099889A91B236CA5C69D6071BB062C25","0x000000000000000000000000000000000F849D42569AAE58B7DDEA84E806A9EF","0x00000000000000000000000000000000930F6BD34AE640033289E380460B9D52","0x00000000000000000000000000000000D67D2BC296FB277884D5803B6C8B1D09","0x3AA37E47C4FB5F457C5C2EDFFC2024DF51D657C48FB6BDFF4B5FA78921CB062A","0x3818DA70D283C57158FD52F53B8D164A2B83149D72886937BA588C943F42BF12","0x22549C93A736F8AC7542831566E00900C0BC66514C84C3BC5A80976291BCD033","0x00000000000000000000000000000000B520D103619E8135DF6EDCEF4EC1501A","0x00000000000000000000000000000000C5F2E1D7C94446C2B305C36E5F5A0970","0x00000000000000000000000000000000CF8A78922FD152B7F416E85B225C00C6","0x0000000000000000000000000000000021DE4680026143C6F2D19CADC24752CE","0x00000000000000000000000000000000846585C1A10C1905D0EB5C59EA652AC6","0x0000000000000000000000000000000052790329F4017DA1034E00B7E9443DA3","0x00000000000000000000000000000000B8BB76C511092633B546E67C7EE80663","0x000000000000000000000000000000004EF758B3EFCACB79319ED3368F5A2165","0x0000000000000000000000000000000030301F35BD0A4D394A0A96EC00373A67","0x0000000000000000000000000000000011BE05794EA5820DA2986D745195B35B","0x00000000000000000000000000000000B9F8F0A297373AEB6748396221E89D72","0x00000000000000000000000000000000B1D3736A07929FF8DCC18C81C2E308CC","0x00000000000000000000000000000000B8430D2552219A2EA6A38985F12ED5F3","0x0000000000000000000000000000000041989DE1070BCE62DE871BC3C687385E","0x000000000000000000000000000000003B5012F41DFF96B3EB2056DBDC639C1E","0x000000000000000000000000000000007D1D4786EFDCA014C0248C7FFA398458","0x000000000000000000000000000000000000000000000000000000000000003F","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x0473F8C3768EE337E91C595746F2FE9FAC5CC5C78DF692E0EE87EA48CAF1A6CB","0x386D64EE1D253660E0AD91DBDC4450A48791E367DD3ED6F60F7A588B731E7644"]],[["0x1A27BF995740AB0863783D52CC577C7E3163312E54A4D1565C58780908EC7D7E","0x1851BF4B13D2CB6F8A71358D46B016B40ECE789A66405BDFCBDA20AA08A45A44"]],[["0x3E3FFACA522B28F7C35EBA6333E73F913B2F7EFC3776BA9E6A7AC891F64A6991","0x29C0DC5502A29CF61A4038EE70ADEFFC7B6126C72D99BCD9FA421426487EF7E4"]],[["0x202DAB0A878399B7083046BA0FE4A7BBF0B51B2C4AC5340BB05CC4AAA99C9EFC","0x10C82C9308F8C17D4EE040526D191F222B71BCE2AC887F5BBD676ABF4B5CA0E8"]],[["0x0B37CA24D6A20514FF778DBF74C44C603E6EF3E1BB4C16616FDB318210453246","0x156189D2A96576A222E903B511166CA14E1FF2C55F96A42B8A8127121F2C4170"]],[["0x28EF539A1B7629B55CCA8307436397D17DBA9311591B1471602FD622E4142999","0x120D63815D9D7923861872441B2E81994545A4444A6172951BD58CAC9B33E922"]],[["0x1AE0E56A00BEB4AFAFAA0ACB6821592126DD1C5BE4F7E8E3BD3905AEFE53DF19","0x3568F4DD9CEB5E9B46F899CA3C24CD9AE991658325B847FB46B85BF2744BD6B3"]],[["0x0BF36A82B20E0EEEB1CF384A5F82A44E48F3D493F814461FB6A1F551D6F3B341","0x21C6F428962F7451023ACB8E2E6135AA275C99AD633B7E50B65CDCC6D02ED145"]],[["0x216724306CB48BCFBA31B54E66B612F5F4A79DFFAD4D5D543B92EB90CB2BCAF4","0x10EBCD3BA8C8F202C22B43E5AF25E8F34A729BF4FF9AD83FD2CCCB717744CA84"]],[["0x3ECF2AA6E129C39EAEADBEBEE46728080382DC031BF78F2EE7AC983236CA0101","0x3B46F69FEFC919251FB793DA92EC8DA0A2F5BBFF82F20CA8B709C381CC3DA1A5"]],[["0x014B8D6007365A819B070F5C7EB99AC0D12BD493BAC446907E751F2C243CFC0A","0x36E64D1077DD52FD82BC76F94DF34339F3C2A580633CC2D6EE4148DC319380D4"]],[["0x3652DB0CAB71D50C095242A8D4083B91B0CB52B9B59845FB183EBD2924139197","0x1746EF770B0B576248F7A60C8CDAEE48A038EDD98CE88594E65FAC85C1C04397"]],[["0x242DBCCCBCD3A4198145B5CCF1BD52817E01F426EBA01DE1D07354377D63C4BA","0x1593125696639BB8673AF5A7E0B465DA96EC8849A309997EB2D8216E6F3C93F6"]],[["0x03B83C264F472ADA508100CC60B31D2AA8B019255ABA9FC456BAAAEAA62F877F","0x17BF0C953B4A8548AA322254A4E01D8B79B02F7A51E84B0D0E78CD99C4B075ED"]],[["0x054E928A64B5BE20AC93F2A585A3BCB8492A74881CE37FECB97918B77F191EE3","0x1E26A6D6C430F27C0144555C6416842EB9E1E587B25B1463172C63CF6F91376E"]]],"z_comm":[["0x2BE8C733238ADABE5A76918726CFB676177F560E5F664D9D32478A23937A5CF3","0x14541919127750E5B9D5AAF9D587345B70B3CD1CEB26000FBB25B29F4826A99D"]],"t_comm":[["0x2863A674A212B370C0AE7509D72489D800B6A24395E903C41A93019E6EF67F7E","0x174B5BF626DE0857D9B015E5528C3445CCF9F4A235D97699019788C4C7535B6C"],["0x292CA7E1E74CFC41D09D0F64216753C3A6F982E4D25509A51A2171FD4DE0A7F2","0x0717D88BE5C73836A2AAF9D9B02F501C275E668116093A99ED3312AE6622A9E0"],["0x372AC44B77E2E2B05A3E4169DA510D1A9B48BFBB977F2F68DDB651A2E67A3CBE","0x2D104B02D70C00341F59CB5F66790485CBFE2C213D69F6B15304195CE6162B7D"],["0x1004B893B929611B0335899F4A2D4D0E70A2745EFDEBF02A30B9A79D6860F0DC","0x256459A295A21D1A707C593FF96E5EC67A3FBC4633808910B61F7158CC16E5F0"],["0x33E34389552BF2EBBB59E9877CFC3E0FD7AEC3D687ABE28E227030ADDDF44E10","0x1FB9DA43AA1FA51CD3B46E7B2AC637081607B334BEDF95742D8E48B9BC88E5C9"],["0x09BA4813CCA71BC2D6A6F99B392EC89689CCB3F557A504F37783F02DAD1783FC","0x0AFCC78B8CC5DB5D170A03BD65689395FC43B4F6BD17F0FD3ADF6C191113769E"],["0x29FA6D7008F8B926008A6505A3423132AF49F1A18AB8152FEE511CACD46BDFC8","0x1DEE3D5A51DDC3EC36A2EA533C49E14C27E568E731CD655F63872877CB9AB5B2"]],"lookup":null},"openings":{"proof":{"lr":[[["0x071BCC13A694CFE2FB41D29C2A4D46DC7A43E28B8A8ECAE1C035AB708179C109","0x3842412604B1163BE9BFCAE12028F3A6C770FA00FB0F23F5E71CDF1119205D94"],["0x21C5BACEBA1892C76F8AFEBD338C0BFB8C2B3E4F7E7F20B115E4230D768C91C6","0x2F1EF0EEE8371E30B33396E27DCEF288C54A55BAF2B272BB07093AEFF87D4630"]],[["0x288455259F50C5B219538A0EE80D8A45D95CF82D7D9B37014124EF30F2DE92AB","0x290379F27CFAA60435DB92A5AB48E69B53AFAD0368D60750406BAA7B5CC7E1FC"],["0x008002A01343991637D19CA3E5C764D2F452755FAD48C924246949D983D06D2E","0x07842E66FA93A2B2577A99395AB1BEDB5631ED6C46066403A32B8185112BB687"]],[["0x1DADE0349F6C0C275B8003E43E12CDED50A81808E6F14BE05BC19571F3088DB5","0x3C21ACDDD1BA43CB6CFF6D56C1B0FF0C94DD251CEC738D4B85BE31BC333E87B1"],["0x198D0461CC4E6E6550C5FFB41E3FB454C448E8363208152B8D28C435F6804D35","0x36029E48BA6502EF8DD00B44483DA455E5B2CD0B97D059A2BE1C2FADDE56A596"]],[["0x1B91DD40DFD5458E8A55884FF2F7AEC2D0CCAF06B9144A407AE5B0E16768BF3B","0x12C8F1EA71749F097C44C69F40539EDF6BD64E77A09C9705F79B5DEEC2BF60A7"],["0x1D9CF5BD281191C46C9B6E38488307A2309A2D093755B490FC159004C21CBED0","0x0F4E7F9241F16371FDAA02B7E75B21B40E815F7EF6AAC5396B388D0985329180"]],[["0x00D084601E0B9D2CDC12EBF5358D7E44200D1CB41FBE513B9EB6261F211D8672","0x1646764D68BC9F8E9359C590B66D58723A8BE701D6A865F24F1ECC9721F69CFF"],["0x0767F6B118146741B1BE2FAED1FF58840DF3BCDFE9B37CE5B55C068C9B1E01F6","0x21A3B73EBADA5E609A1F390ABC30898F95E06B99846F1B95E3EA3D09A1AC755F"]],[["0x3558A58196CCC9821D7ACE1A98855694F6BA017BC9B84DE54667F69DDB37A384","0x18BC8DA8B8A6BB2B8CC9A821B335A1761297B244BAEE4ACD8641F4C413DF2332"],["0x28338E82582BDCD195C3F9E4F057CB51585B5EE973E601F01835CB21E0BEFBDB","0x09C54CF4ABE46ECF72453EFF017F0039A8BFA4562205223AD879F42BA7137917"]],[["0x346179E1C3FAA2E4399A841FEC5485038210BB25E2FF47252BC18CA5C2F74610","0x3B61614691A2A1B3D5588C6AE9745DC092CA74B0445110432ECD7422F54DF0BC"],["0x02F8CBF0A180A2FFBBE86E0439A5BAF5223877B5C3951E0F55994624EF223196","0x0030D61F19F4EDB5BBD161CE0B2F7EA4FE0D7AD1A89135F9866E44CFD2ADB6A1"]],[["0x1313557FB2F5A3DA787665B382EF7DDE58D6AEB7B8E742C16E1D43A86EE7ADAA","0x00A63C5161CF5E0E80BDE7027862B68F3B4ACFB917A5E2672AE209EA3C2F95E7"],["0x03E2354725EAA710C2565FB7B74ABBFD25D59BAB4B270DF70AD1121497938F28","0x119491AC9D57FE8F178CD962C6CAD4DA28C6622572D49520D23EE36C2DD9F6C8"]],[["0x066E81EA53A45ABCD670BA4F2C60C107F7D1F7BBAABB30A3D6B05B7F1D431426","0x0CCCD394CDDDF1E6D417B802F440FA0079DA1E9A9618568C47E8C73597AE0843"],["0x302617B2F42E854753D3D7B73109FFEA3A588047AEE251CA278C4B430B03147E","0x3ED8824AD381F19E84B75A6EF5EB4EE7E1A268C33F555D3059F97B3B53815839"]],[["0x1F668EE8107F6B4B1C2C513FD4EF788829997E56A452D2176C3ED3CC6E3BBB89","0x18B045A1C7C45447EA003E478B9B87EFB7859D2C16F38001AE423600E4D19B96"],["0x102814CAD01C88F7C49812AE78B367CCFEBA958ED45400E69B01DDB3FDC7F5DC","0x2B95789B4C71EE3E0375BBD43E6BF81646EF07F174E00058E15D75B7E5CDB725"]],[["0x0C87C18AC38DE29193754C37E9C3DB417F045A5C1DBF54BE1FAB4E382AF30585","0x3189C5A9B36CF0D019FD1762F9E0D591FEC4B6EF2CAF4F15BCCC07E27CA52431"],["0x1BA1876114359557804D35D88B2D07A968CD216895C471D79E3F4FC9471FEDBA","0x290E83C76D0697A9F83793CA35B7A33C4220320F2C7BC955E08EBDB30331F1E5"]],[["0x238DDB8F637D6C0862C80F2858EC4F13C37257EA967056BFE8D3127DFFE11984","0x0801E03C5004BFEB64D5B56E122FB4EFF9AB67B80D8FDEE8141D0D82141885C7"],["0x3EFB0913A04AB9E6AFAE10F6AEA4EEDD32B1C630569F4B794BC63A5B8635C7FF","0x2ED2A74830347E1AA5499CEDEC7375F294A97A9F1729791014355D7EAFEEA248"]],[["0x039E726A1E93FB8DD0AB4FCACD39F73D141209DA9CA1A9B2941FE24C7E351552","0x106DB12A5E4221FF5D07906723173B2879539E5677E848C95BDA73142365418D"],["0x29954F9F468B6663323A5B67F95060FF121E32B004CFD4096DABF06B73834F1D","0x3AC44EB9922D215F65D30DE3CC0D016C4C45B3575055D599698ED90E9CAFF139"]],[["0x329343CBEB5337D417E7FA1E421E7EB5BDA68EA8B2BD56537F7ADC549FFB173E","0x356D3BB653361226B8CD41AEDFB8C3D1DD033A6724ABEDDA867EC78ECD6A2467"],["0x068A1AE39D53C2C2704A26922DD4CA682FFD0F14AB03A3057423FBCD1EDC699C","0x39012038238ABA444EF081B5D7F52E3159CDA0FA21E4AFBE21455BCC60247A6E"]],[["0x3D78C999D0403B145185B75C3E13E02E53ADD630D9188391B2C4063DB1F79330","0x1AD9FDB37F507B91F38789ED6E6BC60455DC7FE21C5E50F4E7C6FEDB61B6A3F6"],["0x21E82B63B27B2D433BDC1F37A8D7B712D718555634378C69E8149A72BAF474D5","0x39BD14FBB59D31A9A09A265FD5734A56AF396A91AAAFD31EFD302C75727E6312"]]],"z_1":"0x1FA470583ED0D2B52B00F8AC1AA3FF6B087E49D92497F77C194FC731379CCE9B","z_2":"0x305A33EC494697F8D6C2DFC3394ADEC88D57FE5E5F9889E3103FFD1AB86FCE91","delta":["0x2C48CB76388E4F14AC1BFE6AB77DF908D2265674AA207B3A22BA146A13311EBC","0x397B441AAA5F820CF1D1B44C09C9DA76D8D36CD79B1DE83569774CED8AFFB912"],"challenge_polynomial_commitment":["0x08ACF66E805E266798FD031125FFC3C1199DE5F472C00E7D0A68F0670BD36844","0x2A2B94FA2327FB78DC92135914F62D3066BA736B32D970CF3671AA135743B582"]},"evals":{"w":[[["0x1E5F312A18A533BF9D34321F18422195607CB46FA62DAFF74600C4F4CC14E2C0"],["0x33A137706B87EF3CCA6E96CDEC8F0F5E00D31885D4A63258DA709BD405272D22"]],[["0x39960F788274A564888F112BAB7DC534084633F5228E24474F4F72FD32D78853"],["0x0310A32EB34AAA574E611F2D0D7265568239AD7366C25845E2C8B3C1F2B02562"]],[["0x0179BF077AE899D5E73DB4BAFC6EBBCDCD6F2B41DBDF253F33EE7536195E3B88"],["0x299B37C9E16BD76D655DFFFDDBA624BD762C84C983240BEBDD5813208D759799"]],[["0x22A74D29C975C704D3F959D8699CF92E5D7CFD015608D7A32656E9C847C11604"],["0x3EF1D482AD9D307BFF24065BC6759E1421A777F93F00277B83B355239F874586"]],[["0x1055604D996DEEF0B27C556E5D58766EB00AC7F6EED1A0740B82B00552452656"],["0x23E42F4439954F505C817DBFFB74D24CD73BCD071D7031A6D32D4F8019482613"]],[["0x03383AB35AA120E1132B35B507D5DCFDBC64BAAF634EAC681B67A7C386D113E2"],["0x3D9EFC93DD8E87F2FFD955F64DBD73823FC2C904AD7DE3A2FDD4AA0474FD564A"]],[["0x2E6A4D484C0591706CAA2D6F7B1157EED05D6F3B1EF024896E6301F39973EEEA"],["0x057540EE7352606CDB2E4C96A1DE2127627CFE370888A8E72568F431CF0BFF97"]],[["0x39AB4E716CCBB0948CEFBF9C348AF7BAFF86770AA1E7E0A9125D99297DC33180"],["0x04C3508D1CBBBDC818495DC1755C9D8887BECC33AB8194BE2BC212FA6C8DCA21"]],[["0x0F62B52B5E7769BD5C48CDD4197B24FDCF0D63B06236D783DE94B3C9E6005131"],["0x1547B436691AF98E770FFB5D48CA41FC20CD853851977BF295BE555AFF7C7648"]],[["0x0CF4E00FA61D6328CBB1D5CA8AA153E7133E6350C7FF7F6BA811F2D95A0B2D3F"],["0x26F9D71226763D2D0FF38832E19F48F84967BAA54F236B58D0ED52A3D0ABA382"]],[["0x2E45901A3F0C7252AB38CF5D7B5550C344855F37BDECC2BD6E451255CC1F8CA7"],["0x08000447C90F0FED421FB1117519326CA96C5DE0BDDA116C5B1ED1F5B98B919B"]],[["0x270243E03EB64D294B82A639B3550C11BDBEC00CC8DEC08A3B1CFFA031141CAF"],["0x17531C08682D17527465832A9F5EBFF2BC8796F58EA326B4DCF7A10D67014E65"]],[["0x2486A496E03E3344294B21A9A5C7E57648A849AF3391ED35B0E7F1D02A031160"],["0x3A4BE6182ABADBD8056CA5A9CF5F8DDA8DDB6FB2722A0B134FDB8D76EFFFDB0E"]],[["0x181E003007F597B54ACB9CC1EF3535B9F30759EA39AE20399C78D9F6E6261058"],["0x14989664B05674998CEC4EEFE9130121795C088BFFBBC9865FA31663DB413A15"]],[["0x3E623EAABDBF9D87CBDFDCCA2C8F2E81EC7916A548E5B0AC007003FE441CB193"],["0x1DFD8F151BBF2F419E9BD8F7BA40D8665D3902E066F478D56B1FE21A499AB52C"]]],"coefficients":[[["0x1A29A81E4D32284113061FBBCE5C2303E0E22C477EAC1F6AD32BAA3C8E1E76CD"],["0x1CDA5D3B8F0A8070CF19A5E2F42AF5F71E5143C8B53A81B5A6DC5AA9DE2E697E"]],[["0x14D89E9EAA1ADC58834289116C2F9F90767A06E6403130C97CA301F31F0FC55A"],["0x3C23FB4978FA8C6E5417D8CA491D7804EE95032A0ACB356EE352CEE1D75A7C2A"]],[["0x2F889A49E6D2A4A8CF3EECFE7B58B4A32DF8635D020950BEC99EEAB24507843F"],["0x3CEDC8BB7F7072E8047BF3682E55EBF2EDBE0064B2FB3A914EB361B8AAF0CF82"]],[["0x30C58438258050FF76F133AEC81462EA6C0B11A96AD9AE260CF91396D482F4E2"],["0x3037F76483027D4D147984924184EA9C1DD041469EBE685516BCBFF2DE314F1F"]],[["0x1A60315A6AE142DF1AB8E45E1B3A15125D7285082A43D6A829CABDDCC34EA22F"],["0x3DA453E52ECCBE92F32A2203D959C0E53B2AC7D73CE6143312DEB921A7A37537"]],[["0x2194E320D839600123B60649899A1DE7ACF04E886522621718B3FC51191896FB"],["0x128F7105ED5F9D66D5DC0D9711CC7C16DB02DF046F7FCD39C4D9F7B78E6D6563"]],[["0x3BEE800A990D2097871F71A307634E076298F7189C7C2240593C9212D357D479"],["0x2E9D07BA327C403DC73061C5007DCD78C7E10F76A5B5F73540DA49A2ACC3E8A0"]],[["0x143D89DC08E0F58CCC5FCFEAD0DE217BF0846D9C7383C8CFA4DE9F9A7176E97A"],["0x2C8A27FFD335A48937DE9B1F3DCECCF33BEAA05B6101A63BB8324204C4E49C44"]],[["0x27C9B7689BDDC4AEF8CE3FC3BA5B88D4EC1B8A816997D6709666AFF70EC404C3"],["0x0509095E32FFF90EDFDED464B55F69DAF188354B2116EF4A441F235B3DF18E7A"]],[["0x15D70CBF5AB78F8BA45C7A8192BAB9CC79CC8D45FEF6B8E6DC754EA4EDBBEFE8"],["0x2392DC2AD3567A6E30D3EE5DA37CF76A157614C5FCF2373376A96C40B9C85004"]],[["0x3C5E147F8F4B14E74EBB59A15D7D1047FDEB76B8C73EDB975DEB618A11CE7859"],["0x1A63A6770966938DBCB691D10631A61782DE21F1EC016A784806FEEE7032FCFD"]],[["0x3779EA164C5D3FA5C49B0DDAAE056362B25BD67097B0A6B2927E9DE1CC027530"],["0x209AACBA28C5614936DE00B1066879DF675780B1C6D835141D2C9754CDB90A71"]],[["0x26B8BF6D6BFCF0680A1B750CC8B8F734C127DB2ABCCBCD941F4CABDD0C6C387C"],["0x2D248DA585F4C92E85F16A4B010FF1E757E4B63CEA728AC570B3F351703D25C4"]],[["0x352FB6CAD8D57A9A635BF9E61D1405145046C591BBE80722B8E8C83B8249ADB2"],["0x1230087F041D44FBD967AAAC0D8C8727CFEF6264CC90220881DAE6CEE3DC9C66"]],[["0x0FE381D4FC62727CF7488534E5A179B5B35DF2E17B0B2CEA88D97866768767FA"],["0x10C4B52ED5EC11C4B6837E2409A26A64F1A753DBA02E9ABFFC12BFE81CEC0701"]]],"z":[["0x3C09BBFE2A7EEE5DF39BC254ACC83B8E421F44715CFBB00FBD44144CF10B9506"],["0x1FD0C8141B8A8A802A37776FD13D1D967E2FD460E24D785E0A486C10D7EB034E"]],"s":[[["0x32747100401C853548490BC97F0037F0668C42EBE5D5F1CA7EBE8DC92030E73B"],["0x304E030B82419AAA1FD602735ACB79FC41AEBF40E4C04A8CCBF037FC08D3E0A0"]],[["0x1CDDA74E4D959D488B07F7FFCAE671DA37CB8086AD2829FDC4586AFDC254A89C"],["0x0B340DFAACE8F17231204A83E8EF3ECCDACA5D31FAF560DD329980BA2285298A"]],[["0x101970A7CB8B591D30CB6C0392632C5EE5158FD97C5CC6102B6BA0AD2D82250D"],["0x0E1CC7DD2E582DB6224775FFBE941887BADB6C19EE4652AD297D11C9FC7B48FA"]],[["0x2BF24E59B0E0B71F75DF87A2C68C9F87F78BEB51EF41826D4B48A15ABC8A07FD"],["0x269A2BD62153C71C45BF77301D7532B446DDAE29012FB2529C987829DD93067F"]],[["0x3941192E0BD031DACC5D5C097A88C3AD8C5E47DC1DF6D060B92D8C7AFE300322"],["0x395C1D863DF98C4AF97D584C495620BB6BF7C9A681011C30DCBB26BF8E8E234B"]],[["0x18657EFD79D84D19FE9A00E0FC5F62093F05AAC5B649B9F3253BCF3E49DEE0B6"],["0x255A85A03D047731A92897108E38BBABA199B32CDC3CB3E9B2BD308CCFBF97E3"]]],"generic_selector":[["0x3C31B94ECA05BABA12A9D368DA74005DC044EDF0544217CECB679FE5C50D23D0"],["0x3F9A2415310CD2B8B09F2601D22D8BCCD1BD501556958093B6F49F3B188C09BA"]],"poseidon_selector":[["0x1572BE5BABD537F250E2F140D0910C4413967DDEC7B78FDA86A9C5AF5E16C919"],["0x19F74850C474236172CCAEFBDB92E24B1D6C97D33F9988B81DEEF1F66019181E"]],"complete_add_selector":[["0x0D07F426B17A78CB5C8C1503C424EEF94BE29EF9B39A80CA358B043CD9AA4ACB"],["0x09F3D169F17BD4A69146BC78B6320F754F61E18CB2E802A84C6916C67391678C"]],"mul_selector":[["0x06BB25845CA431588013CDE4C05E81FBFD1A7B97CCB50F5B6FEA67BB1DDDBF99"],["0x04A623669B0348190DCBB8B6AC68847785F199125FE441F74C7DE7C911A7CAB8"]],"emul_selector":[["0x0D85FBC35F1B8CBF3A29B561FD8AE01AE1578EBCDB6F514480A7D3CD5CFD4EAD"],["0x2A002DA7D963CE8E248D1415D59EA059B58C9DD269593C03E3ABE553D574A723"]],"endomul_scalar_selector":[["0x144179136AC2AE964E317882A7241E7FE7D4DE2E89610D672102519F082673E4"],["0x320DAA19A5BE6857161D5FB1EDC080D5375DC77C97DC1D5D81AFD8E11070CE26"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x1A87BDF67263CF22E4AFC4210064B76FB73B998908CEBD0D330F126363624459"}}},{"public_input":["0x1BF01E3BAB78618DA2F8B23CC9FEA588FD0F00A86823AEAC39FDB9C77045CA65","0x0755AF5D7A16858A83006C98021463C90CA34333179745077E0CCB83B28E572D","0x1B86C7A1776AB6C1C5A7717491439E8F6FE357CF013840346B2091F901A80552","0x0BE01603AD101F1C220BBFB8738936AD4A45898A99A7B3C2D30F54EDF8E75E2F","0x19F584C946658E57E50050BB39E9E1450A764D7D9FF441F3D0C3CB2324C83B8F","0x0000000000000000000000000000000082950C531EFB153083D273C1E949A174","0x000000000000000000000000000000003CC957F8DE44E694CE35DEFB900AF161","0x000000000000000000000000000000004B3FDB1D0E301329ACD37E93420F4F2D","0x00000000000000000000000000000000452A0527F896748F6871F4131C943BE8","0x000000000000000000000000000000006045FD28BDFB64187E9D8F08A6312B2D","0x1E6290B50A81982E0BBE2194FFA65B80F96705A269F31E2FA7B8A3A295E48A9C","0x300AFC397485A792113478AB6C21C8FADA8F5C6C7FD690AFC191E05D1E9A1CD3","0x03FF0181E0394F0D8298D9419B0CEE16206A397F59398AAE559649FB5415E565","0x00000000000000000000000000000000A18E10655700DB6F8EBBD1027B669450","0x00000000000000000000000000000000B0BFE3FC079B0BBA6088F6560A9049B2","0x0000000000000000000000000000000055F4B4A15E54C14DCDCDC8BB049E7003","0x00000000000000000000000000000000E30696A30B4B37D78CEC70D2ACFAECB7","0x0000000000000000000000000000000097140D1E40FF1F15546F154F61039EF4","0x000000000000000000000000000000008CDF9A66E1F29F1A7F93FEAB87099BCD","0x00000000000000000000000000000000E7E04BDB004C8B7E264321524068BA0F","0x000000000000000000000000000000005B45B5C4A654029B3DD857CF0DD8F1B8","0x00000000000000000000000000000000DAF9F2BF9590FA8F296BEDE61CB7A431","0x00000000000000000000000000000000607B0702E958AF5D526994A0F258F69B","0x0000000000000000000000000000000021F995C0BC14C07D6400BDBDEE5E31C1","0x00000000000000000000000000000000DB1EAED7DE5F56932F5FE684557E34BA","0x000000000000000000000000000000009A689D72E5623C08FEE667FD38059B8D","0x000000000000000000000000000000005769B705C8B5067A91BDD4C376256281","0x000000000000000000000000000000005403EFF6AFDFD160AE09B23F0280F82E","0x00000000000000000000000000000000594A8DAEB355B183B6C1B756F3BE7857","0x0000000000000000000000000000000000000000000000000000000000000038","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x3DE22911B5F38F652EBEF4B16A87838099B9BAE04951F29D1D4F9FC9CAF256E4","0x16D68F9CB0AB31D3C2041384FFAEB692E4542DFBFDFBC16A24868F24C5427299"]],[["0x3967B87AF7CD208852663E3D65FD6CCA0BAB4E4595B46E66BB6A6D13E674208A","0x16A3006E9657FDF2BB2FDC8440E013C220C1929D1F975018B8CC7F7E650AEA8F"]],[["0x1E35F23D84612FDECC7618244A0ADD25C6488F8DF26C3104DB7E9853615F83FB","0x219E4AA1D12AA1FF22D97CF59E7180CD39AF1C039EE4F66ABF4833C039145E95"]],[["0x1DEF3BA21974A0DCDE16EEDA6567AA721D86F57C5AB0B4C01DC60F94EA031A1A","0x04B1DDC5C31609AC5716F1F430C9ED73C1A06C541880ADDF3583340899F9D9DF"]],[["0x2C80E07DA1D6123C444776667B7B6FAA2252E85FD10CDBA5F6430F73B211276F","0x1162B3FE8E70D1853035E2A3F436E04066FE44551D9F98E14523B3F1BACAD53A"]],[["0x3374ACDCC4213ED4F4960121AD7F0CFFFD8FC422C341A7306FF3ED18E192ED4A","0x08BF37C1A4150851B8B52260D9A6A6FA19B6D58B6063D4A044D9D99CD960D1F2"]],[["0x3AF2FBEA270E6625047C0D4C144DCB041EC3E346490C5BD2D4AAEEDA74A55FE3","0x0FCE1EC49E2BBDDBA911FCB2393107A4F741C317150992AC4F56EEBC2D99D2F4"]],[["0x21F99049A6EECDE087CA3F03E9277127342DE8AAD95EC1F56E3BBC1DAD547226","0x1D4F0F096768719BCDC1A59A6CF1F7922B7BD30A60A33FEE7109D0967B3FBECF"]],[["0x33B9B96453DC8E7DA676F4DE9A175EB98FBD7102CD74742032D59B00750FF940","0x2C57A027D47CEBA82BB9F29777855CE055609E0378EF58D8F65D73711C581EF3"]],[["0x118E0D7372393C34A23DC6A815FE9277FB8DBB722BD106DEF6411D526865AE61","0x139C1D26DFA037527323BD9A1D8871F59DDB38C5B31F5BE68EA19412CFF549C2"]],[["0x35AF2E1311EC1725B99F2FB740BEBDFF8E4CB7B10EDBB6BA446DC3BF764FB69F","0x3D4C3B4E931E4F34A4E444822A6564739C552C041A65B2CF49B30DB1C49435FA"]],[["0x388C73EB5D13C614302182420DFD219235F991DC381542B5289873CA03AB413E","0x27BC13B598710C655A410B2540C248D1DB71A688D92A9A571E35DD1A49CBDBB0"]],[["0x052BC28112C56136E0300F03134452AE67AF931A13D929BB7C2ACF9506B2A060","0x24751B34AC1D1B03780A2D8D3012FA8563214729E5881A5741E9449F5DBF835F"]],[["0x00BBAE235CEBE4E0CB687FB844E3E848FEAB6D32065ABF133802D0D7433AF6B3","0x0BB62FF608C6854036E1C91969E9C2AF911C07BB630D05A7999A3C552AE7CBFD"]],[["0x3871C85CF94615B5F9D0267EA7304B2B2634EA700B0C89B26B7C63AC0BA4A8B4","0x33B9E9ECEE62FA8A881CA1500FB4996D8878898C15137489F7B41431F5D5D086"]]],"z_comm":[["0x3E49ADFD0DA595BF2319B93459E80B91C8E3B2FD6849DCFBCE7AB02C54C66822","0x3AB774B8F4AF8EDA4B628204321AEB88E6B3F5A8CD484A2B81956321FB5B36D9"]],"t_comm":[["0x1DE05F61CC29C5AA2467CFAF7A372F2230516658BDF036D95F7593E062E5A0F0","0x11AD64F7AC11E4CD6CDA28ADEA97B67C8A280B798CC1A73947401C3A15C6BE58"],["0x0921B42685CA12340250C64BC92D104E8E2A42E7E86AA7D16B9B65B99DF20C0A","0x2CE2119F6F983141F032EB3753BE5E9C5E95C006127A4A80A550E7417E4EA3E9"],["0x10567A517716119404F7463E09C2758FE626C56ECB4D57AACB8A5F9DBF604A46","0x11AED0280DCB6BFF5E22CFD3ABD31BBF86E9D01279C9E48F64AF5FB4F9C7FB1B"],["0x140031B8D8500B0D51FAB42C6144EB7627F7E94C9D499052400C7CD96DD406C3","0x158107BCE01A2689EBCE1608CB6D5F6CA19A14C98F44E872DB869BE416950900"],["0x37725D1582E4FB562846C8C1B701BAB96405AC6AED639B049CC3C4C1D4183B38","0x108DA2AFD2F1647DF66A3D9D06FC3214C0211B1764B603D993960CF8F368E007"],["0x3C437F5820E5F12473E1BF17C924210970BFCBAA07AEE7DFC585F8E9149A2F7A","0x2AC86DFD254166D6B97E29E5F18218A05A442C27F3A56345671ED214FFAF34E3"],["0x31187E4DB3622281C181134CD6138D353E85D6DB920D011D39D2381DDCB3E6FE","0x140A453B6CCD2EDC3E0EDACBF3A08A579FCB485C6816317438BC94BC34118157"]],"lookup":null},"openings":{"proof":{"lr":[[["0x28466FBBB2C1F589125746D871EF02F8E3BD697361A72021EC88519458E6E639","0x30B3E22749D28CC0D87C61D61423D0866ABBC7AEB55F0657AD5A911E5B4D337F"],["0x19CE42EAB25BA7B229FB4D7B4091D6A7B1F8462E32B3E9574C2F2C2FA5A2DEEA","0x159D82149FF84CD05502A96B0E537EA5AC9518F963C957994B45750167E3202D"]],[["0x365D62FDA7C2ADDAAEB64630A256EAF05F0A53BC4681C76B5C92632966E1ECB8","0x278E21EC590378833867944C9EF3D28D332A4F918E1010B6FCFBC419345900B4"],["0x2559C6FF20E120D79B1B3F8394C288A35C36EC8B2604446D70C0A76E537708FC","0x12978423F5DAEDDC742F950CD8C8E32D91BB21F1110A593E9302B8950BACA77B"]],[["0x10D4067FE608A7B1BB26E20CF6DF11A522DAD659BD868828C8F7DE1A9B5940DF","0x227EB8F6656D7F23AF81A544D4DB9931D008EF2A1C8E2A186B12145269A7FD85"],["0x269D12B79BF38ED2180C4DB688A6D8602B7A659A4324B2CBF62CACFD84071B51","0x3FDEF0220049435E66467D18A563B8A2BF4620FC2A7618F48E8EBEE729DFCE8B"]],[["0x20B6CA940DD99029D75FD3B48A22B8BBE7F25922DDD95C49973FAE0E6294C6B6","0x31756DB363DE0D0451C92357E9030DD6AE5D32E61F17B20AB085A07DD9687941"],["0x3D92A3670D1DB97651C43977D2B6C578E990968586561F1A904C252118696466","0x1B44B0E5D075D97C7E0A305E90E502E6F13E8650408EFF5D443F6D3AD7AF5C6C"]],[["0x28F3E0163B4A02C4CD7C6C8931D46621B47C0332B17E18B3DCEF92A08605CA50","0x3D2FE91E217128FBD02B0DB96F11AA0EFCEC21D856A27233512DFF4A4DE0FF87"],["0x3F7E5473FC4128CFCE2D9CD32BE38492A3BFFFA62FEAD10D2C2DF1AC381B0F98","0x10C7B6B34518A83F8C78EF9CD69555EF3BB3B8E239101A64A24EA35676079615"]],[["0x07E526846FEE342CADE95D212C342D6F434741951103A4ED101418DF8E2862A7","0x3C0C67AAEF4D7833A79415DDA14B9D9FB251596343FE78686DA135AEE724B765"],["0x083A98232A24CC3DA46F944D206C065D5CCDAAEC972F81DD077574C6421EF57A","0x382E7076B40C9DABB9FE8551EB405055A8303690FE9263CA3FE098E16E7781E1"]],[["0x1D4BA896E4F0AC05AF678556A2B8BB61B832E31B17A93AD2BBE2F8925472C63D","0x1F4D856D2851B9C2036078E4F1745F0391E970E918CB56F21DF30CB99789A312"],["0x3E552483D4F5C465BF8D53C778111487D69798D725C5CDB9E1A0328281243547","0x397D96A4FA64ED80242DE822FB9AA49ABEC07C525FCE80E6E0EE8FD4BA10E014"]],[["0x1460F5F978D92B1CB4A98EF3C35B67719ED0EA0E944F4160494F3EBC0437DEEA","0x25F4751A58739F502D4485F7436115389DF8D5FB5E61A6199BAF7EF6254566FF"],["0x0A4296D8BED34BD9CB0FF412AFB1F0D62604ABE242EB7173FCD3194E9D507287","0x2B7D80A29C8BEA70F52A069936987F602A40D35B1012067F8B65CECADBDC947C"]],[["0x1F245C4BD551EE1A5EEF731DAE3B63F67B66B314A300D678576BDA5CFD3B8055","0x17745FE192E4EAEE45D79DC739F9B3D2165CEAEC17C8CAB6A9A68B8A02C8E69A"],["0x2481A0A5D29E5EA2A44D4ED96D14173F3A842705DDB359325147E2F07D98B50E","0x1CCCBB22055AC556554BDA0CF2B84C57B9AAA6744F13A985DBB0EDAE8DC630FD"]],[["0x00648E2DD07358A801A7A2F910DCC64C3915BD797CE4C9E3B36F1EACD5585E22","0x0BE06E1C9E6FF680A1312AAB92276BC4ED2F981E18654FF7589C26982360D3EE"],["0x0149304D7ADF5C09EB117EC3663B70A825F81402A50CE85C79968D1E8E403F29","0x0B4A847ABD23B0DDF19383D8CEDFF1182C6F2478288699D1BF5D6F8D9346F3BA"]],[["0x138985829F9BA6BC24CB3AF41886116EE76926CDD580485B85E176A093AA207A","0x2038FA7F0C2DB7F363915B7F0FE54F0877F7F884C080056448E92E3F277A94E8"],["0x1DB64D81F77736FDA16B2E8C26832AD2C723B2FC91473DA2D70C128530C5EE13","0x212FD3B2599BBF248C15FB3BED9B21CE5B3AA3AEBDB3800254AAC1E8AA82CC7D"]],[["0x37789F6CC29826A5220F688E6A1001080D97F5E04D1771271D000209C58D9000","0x2C5DA4FD0F8586D06FAD643E47B2C319279E85FF704D00CB392964A6AA11D9CA"],["0x3E52AA64A3250B3A20E7C9E7DBA3F462AF3ED643FDF629FC7E2E3B3797778651","0x1D01704B7BAFB9ABF1B26A33501F19B48E1963AEB1B8E8B5C126BB73EB838C67"]],[["0x07FE77A031F9DE7265FD604713A4EBA150B93BFBF256E6043EE023D8B690C4A9","0x1DC10BC3996E2F9609040178EDC979D0ABC40D00116B0EA39E53B703694E2FE4"],["0x1DE7912DBA3ACE466814DCAF33574D70A7DC239CAD39A9199A8973240A10EB11","0x07D9EE59F856C17633427EF57CF6136D5A3FB4801779CC36A8CEA38E86F8A08D"]],[["0x3B43890C9C7CD9AFC116EF358A529A155759ABBADD763CDDD1D2292EB990637B","0x3BF0004147565B512D8C26D232F288C46129E8651E38ACA79C4CE9C6748A054A"],["0x1B28B793066F7FDA97DE669EDFBB61AFD3365BF8B8BB50920FEEA48345846AF2","0x1188B66434AD03910FFD98AC816978F4CEB54ADDB6D2B186BF2F1E1B3384AEEE"]],[["0x25C17D5F9D50E4885AAEB9AD189894CEE29010E0F107D52CABF0B0137FF8838C","0x1CCA9CE9F567AD492BB6092C4D17B160A599B3C660ACE786E17CD8F2F7DC8259"],["0x00F9B3EE3D0A4CF719EDD59D7E7F9F22552438DFB518DE902B6E81719AC02A44","0x1AD538ACE65586DF12313ADCAB64FAABE3E4F708CC1B1F6FC87652FD82957BE1"]]],"z_1":"0x24A029C354498866812CF6AB85A467CAF333B471630BBBCB0B4074FBC9E70EF2","z_2":"0x39C92F53E41A9B9436B18D94B287F0A0A636C1BF6CCD9546B756E3C3EB35B2E3","delta":["0x19C4780B4BC698A77085039E6C917C92D86D591BD6AB276A1DD2BE3B2BB601C0","0x2DABDEDC251FEBE3207227868C005AB8A1F97095DDD149E90A70F043EEED6D19"],"challenge_polynomial_commitment":["0x137D3C7647011074627D4EAD03AEB4EC7562468AFF13F83A7306B031FD4ED29C","0x2C620D3EF55CF3926A20DD57B97026964C5F9B0DB95106A053439E3096915AE2"]},"evals":{"w":[[["0x163B0E089596F95F4E27BC264101ED4C7FBB1B3CA993FCCB1FB1AAE38CF45D2F"],["0x11BE63D047D26B1B78D42EA622D5FAC2271FEF4F65F3C8B468452914431F433E"]],[["0x0DF739CB2869E1591431C599BB6D88096BAF1E2BCEAAE12692460762FE38EF61"],["0x35CF41FA9DD9D3063116BC57CDDE95F92F15E1B6ECA5103D7A534C02927BA689"]],[["0x369710924F9A5937E9C9CE7A02B0A546D7DF04A5F9AF272B6776BD7FAFD19488"],["0x14F3F96F0D14D8CA1D0B6056DA913206B238E3F65D4D02812C3181B864551D97"]],[["0x172598A26211776EB869C8111AF9591D2346446402ECED2A0C97F51DDBD7C660"],["0x17B9830C37E545046293B7D6EE60E2C8C8FCFACC32923F92AACB4993AF5C4564"]],[["0x3EBA0580016DA0FA369218D07A6345DA93FEFE3820E29FAF8F8CF6EF07662BB5"],["0x136C14E5E98F39BDE9190CFE3460D043F23CEB2B89DB54D8148FFE3E033B1B22"]],[["0x2DCFB6284EC40EFE6C8470D5C3F685AF33D3936FA63663C18C5DD56CD81FA224"],["0x3C8FAD7049EFEF72A534A98DA19C1300B71804433861459767B47B85E2BA9D8B"]],[["0x3715C2BFC607021736AB02C4B0AD1AD5B47C7A53D1A20261227F77E80AA7CEB3"],["0x2990B9B80AD7F76CAA5A35A0F77E7B8BDB52DABDBA8066D948F305FC8565D2B2"]],[["0x2AD05C8555D2722EF32FF5A9737801BA3924B7AD9B6C6AED7F4A987F4FB30C2F"],["0x081E56EA8B321A82F166B6485B4D9D79DC9509F1D113ECCCC5D9FAB458DF5E73"]],[["0x2E8B5A315A37834F75C766375EAA57C7FFAB0D402A10DDAB909280A142A03B6D"],["0x04B13528B434E275A5FEB53589AB7B8116FB589DBA798050F0405A20853B4EAA"]],[["0x25665DB29EC594BCDE91634D434B1AD5B45682D6B28EDEB0612E5624BE6B13B0"],["0x1AB68F4D92C566B0F877B94B94831FD47549DF11C5343059C974DF3ED542450B"]],[["0x161BA8FDFE0F82A41A247D6C4927B335F20D4B0B092F4B7638C2628453323301"],["0x3E904DD9DC4B6687362135C6775224C7870D46821022C56A94389925E76EF464"]],[["0x3748F5BB3F6C9796C92C71DDA69742E0A2443B1AF1FCA6021787BEF55303B073"],["0x2AD6B0AB0557C937BE7C2D6FC7677320D84AE7DEB06F82715FA10AC4FE3DE9A5"]],[["0x13D2A78F8B226EBEADD20F538CB7EFECEE4DD5BF35BFCE548B0D3A5AFD70F659"],["0x28D1A65700109BDE16F89241EBC52610F3191560905063B4B01C1362BBC5EBA9"]],[["0x2CECAEA5B8F85394BC77D49159FC19F3BB4E4977C99B190ED38D9B79F12A330D"],["0x04F2B971E7AD04754901FBC80328CC20EC7595342C128CD5FD090CCEF1F0D8E4"]],[["0x1F754288A309C7881CA1DC1707EA74E376AD7484D14CF3C65159843C8CBCD816"],["0x22FE85AAA68F20B4E7B87EA353EB87457EFED92A8FDEE902C2942BB5F8C2BC4F"]]],"coefficients":[[["0x2E68556C5B6FECF926EFA33CDCAD048D1752A5A123786451DB565EECA83B9923"],["0x16D4A66B134B5F13B64D31FB54AEA72CB909353C9168CE62F1A85A2FC90F541B"]],[["0x1EB75BBC891241AAA9A01DCE1650FE9A01205CAB968BF90B0F4EA6FE5217BC03"],["0x3739EECA0F8EA9BEFABAB54D4F3B463E48429C70477A33D14826D5A3B647D6ED"]],[["0x2168A9C1095CCEE36C38C44C5B7727816853127DFB3ACE14A090DE168A9DB28A"],["0x15324B159D4A4DDFCE151EBB253C06B240E2F58DEA8567C637A7F2E9F609AFF6"]],[["0x3408C83012A6011D196B336FB6D7A8AD35A862808D0114E5BFC302DD1366BDBA"],["0x3D96A6A4F5D049D537E899ECFADD1C1161CA6D3396D931FBB002D2E47DE4BB4C"]],[["0x37A8DF7039A5532EBEC3D23ECCD55CA33229E50DA4A3FEFF65891078FE6DC0CE"],["0x120C1F8CDFCE0D34CB4283FEF4E3D4DB8515820AEEE2FD86DB1D2F87584BE5CA"]],[["0x2EA0AC328ED75B5BB89F4A48A46C816E3D39D9E6BBA86585BC9B99121521220B"],["0x2C67E22FAAAA01E914A303853476C973F939FEF52DC5DD182D5D94800A8A6519"]],[["0x104E733FB7342B16E139053DCDB754874590F736515D179DCBFC18D3998D1E72"],["0x0B11F0FB08332EF28C7E743C2E5C505C31BFF85B769027E43BA3AA898A58DD96"]],[["0x09042ADBF9D3F34349FBA6E0266666174EFFD06599B3549C2AE1B87CF90EDD12"],["0x0CF18489A42E97DAA8D3708B580ADA5B911EF0A229BA1134078DFAE0779F4E42"]],[["0x3FD2177796AA7DC38B9E46BA766475515D3F5B2745F52ACDC8E6C962362E1F8B"],["0x1A7F092AF090B91B8ABB53BC52BC8F593A6D4FA1C8B7204592780710D351DB32"]],[["0x1A7F6E8DDE698ECC833361A0FF4F84E900415D0EC90378DF524D164D8FC7DEC2"],["0x14F8CD42E1F0A80DD0E09F9AC6DC03F3C7444998964EF9E9BB99E64B94DA479F"]],[["0x0C56134AD4D77FCF301E6A0C05B31A3A6A9D3A2DD5BAE07E1EA7CF9A976AD4D6"],["0x198C85C669CD4539FB17F036269D807C06B01299557DD417569F9883F95BCB30"]],[["0x1BE5A17FF993DAC39031F6D617624B9F3A80914D501EA89370E8820ADFA5F142"],["0x3728008EDE682868D6FED5552056667987DDB3B71C7570AD05C71B133BE2F9E8"]],[["0x3D7187B813894678FFE9811C34626C65552E60BDAB184A8C4278C44E80BE618A"],["0x3BF5E447F73213316ED51E6CA81C3EA4E220BEF6949F2EBAE9C69E47A240876A"]],[["0x25EB32059E56407CBC5B506D4B1AEADF0C4567E56962C88B9E029DEBC085C7BC"],["0x306B890189ED2B55DCDC77E896AF286C5AE5233C3AF505F80BD9D96E87235F22"]],[["0x2F834DDA45004A4D1C3197FC6B2BC158F020DE6362D04F6C59119A112A620FEA"],["0x16C10AE9342872C8FB30B9A68E698A467ECBCAD2160A19F3F8D050E486D652F3"]]],"z":[["0x3D35BFBF68210A036367742F85A7C29D3078EA8864D3FECC6E619BF603AD804D"],["0x02946A8FBC67FEB3AB56A80BAC6116E8693B10D6BADED7F878B97F4FD6C7F43A"]],"s":[[["0x0635B0ED10A05F959E456B948F3B44379806D1B7A2A059CF81053564DBF00A76"],["0x02E66A7B69683541465FB281F0C6B89B458644D0C4A0BBD591C8251AE2F27582"]],[["0x2772FD35DA25FDC087247B59E8E147DB3D6A85D907058C2B8706E7964FD90686"],["0x25E6DC659FC0C787BDB36293B4698F19E14A4992DDC9A567A758532B8957D07E"]],[["0x3B31190AEDB6A8BFAF76C87D2DB3093E35E4529C3D40CD1766413666E55F2EFA"],["0x1D4AE8FD2F113CF190C5AC40344A3886F289E00278FD114BDA30D1CF17F23F69"]],[["0x20087177F1C9FB6F21DDE4AC412C2737E02C7FB00668D27B9D28BEC29528851F"],["0x0D5BB0B6CE66A2ED44835A46CE491BEBDA6A98AF483AA007B7DF34153B60CDA7"]],[["0x341FA194FA68C23646F5E789F13D3047D7FA1FE43DB8F9DB814B98F5F9D47460"],["0x21697C6C370D6E179669603B96DCC4085F5DE63D127C2DC289197C75953A8A21"]],[["0x09572844C35D75CF11908D68CD3807F6FBA932B3CC55C8DB283F1B62438E411B"],["0x106C2CB0F6C3C9BF5DF6FDECE18594DC21FCF67700A836732592CDE1E9AC6EB1"]]],"generic_selector":[["0x16834975D5AD335BFBBD182FE3BFCCA51F8559808B4F87333D4D286375999CF8"],["0x3449B50F7686F77929437C83EACAE3EE5446D5E7642E555F8D724360CD3E46BA"]],"poseidon_selector":[["0x1436B5F7C913902FDC6BFA331B1DBFE8EBE18013591D2D0C2A5CCFF6880F5B25"],["0x307DE1556F105E038A6C11B50B9100117AB2586E9D9A6C151196E4D4B205FE86"]],"complete_add_selector":[["0x1EE5D71860AC28AEA3A5DFB9E558B98FE40B59EB0C2573B70EF638DB26482AD5"],["0x0313EF868EC1DF7402AEAFF924D94AC5DAB1B35BF4DB37D6C4BADC46EFC0F017"]],"mul_selector":[["0x1E6007533C2D43A784419CC699CC8A55C24F875C4218DB1ACE109D841C5C6C98"],["0x1ED17460C1C84436AA2BD696374137A4C586CB1490ED424FC8396336C9BEC276"]],"emul_selector":[["0x029A475B7417E24E5B494D730FBAC62C2E5EA551D44C87D77B44E3677940F460"],["0x04D73353DB3E298BAEC0F1DB050C24E234793DC6ECFACF35BE6AB72F6186B108"]],"endomul_scalar_selector":[["0x284359FEAC6757F8415710DB857FC50E2F966A94E1B754F133DC644FD7C43C91"],["0x1A6955D24706E853382AAFC8A196105A3E3AA651934CD012B9C74B0A0E5256E8"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x0E9EBFCB5E5B9F257DF8933FAA8252929136C8FB09DB8B418A6CFB7BF0CFF40D"}}},{"public_input":["0x19DCF2F99F5AC20A5170151CE850C32824251DFB03A30D32952E2E938095F79B","0x10BEFCABDA86A0C7E38ADA134EB2171A1125694A8AF2610022EA8D3D33D50A40","0x28FFA0C99CF37642E094F929E81BAD5FE42F7C99AEA0406D0372A478913D6C46","0x28DFCE5BEB3C1D21532E75B1A2876C49B25E8B26110E67F9A6434BC52FE25EBB","0x2FD68C3BDD56A67966F1273A63A79BA79815167AE5DE070131349D7919453FC5","0x000000000000000000000000000000009C3358AF5AA9FF20A16937E8517C17DC","0x00000000000000000000000000000000FBF2A086C7AD8B022D829648737231C9","0x000000000000000000000000000000001D4544A27F2B7FFAF587F560C9CD636C","0x000000000000000000000000000000002846C97B44B4B7612B697384BC930BBB","0x000000000000000000000000000000008D7C41D8B8C775046AFBBAD52B4BD963","0x2DE05F81D8021F8B1E0149D0B95932AC038EF759022FEE4300FBEC060896F6A2","0x255C5816593793AFEBEBA81035A5E12353AD51681CE4AE6767DE1001A45D44D5","0x3C8B2527E1058099FF9111AF79405E137D8563D810D8C5F7E87B76F7EADCB845","0x000000000000000000000000000000000D5014ABB71B9C4BED0DF4CAF8B5FB76","0x000000000000000000000000000000005D38D4C484054C2B7084F7DFFB2DC150","0x0000000000000000000000000000000040A5D02BE00F63A6F67AB7E580FD93CE","0x0000000000000000000000000000000091F1F1C2A3B7B5187F28D9AAED65888B","0x000000000000000000000000000000007031C5BE333C53195C7C5CB6D5393A6D","0x0000000000000000000000000000000020DD45459752A8C55AEA7C620BC40A0A","0x00000000000000000000000000000000032E974946A05EF551AC84918BDB27C9","0x0000000000000000000000000000000054B32777DCEAC8BEB4302CC93F7EFFC2","0x000000000000000000000000000000001BD4D9C6AAAF724E6F69B2397013866A","0x000000000000000000000000000000009AE4DA291DAFC2379D7DFAAEAB432C0C","0x0000000000000000000000000000000014C572EBE23FF464045D24CC24D6DBAA","0x00000000000000000000000000000000C16A299CD063498A77726B93D492582A","0x00000000000000000000000000000000B4D1C3EBAC20779A087FCD9587F69DEE","0x00000000000000000000000000000000CD74147E940AC1BF7802741EB1657989","0x000000000000000000000000000000000204E0C94BB14F91E3005193A44EADC1","0x0000000000000000000000000000000019A9E5FE82DCABDD8D8DEC0ED8F33534","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x0D3F38FA138A2D28CF561C3D030F58501C1296A3EF3C4F4025729B38B98BC078","0x3501BF1350914387DBE01BC68885912BC07AC479739C5D8C21D0244A010A1C91"]],[["0x1A1CF72509F641867C54334DB806D14BE14C9CFB530B75DA0E9463F36DB26A53","0x006A418F91750A63CF0484BF2B7120DB54CEA527FB42D0AF17E43D086EEE83F7"]],[["0x05F4F8ED9B6063F45D5F2F73D5B5C06DC5FE287EDE1D51EC118D4CE82F09DB0F","0x36859965ADFCD25B22EA95AE7888579595DDC1FB0FC1FFC7CD51DE88DF7E72C8"]],[["0x23C0CF03FBA621174C415B594E381199C9575AFD6B4E6D75F7BB1364AC3B4333","0x2A04315A608334B64F66C91600834C9FDEDFE98C279629823CAF8916C9C1F368"]],[["0x1643CF6A934802AA96688F2A178B43E55E7574A29369B5EF70A86970A4EFB3EC","0x1EAE36D9DD55F39FA3C0A5D6B4C33CB634DB32AB01C9BB8A8A4DEB59C40E54A0"]],[["0x2544EB4961E1C61B977D12BA323061C4A9D0379F63E62AF7D1BB9E9A89651373","0x34BC3A4AAF21285B10352B7DDF9485572EE26D13E73CBA890E65A5457F71AB2F"]],[["0x2461B2A32D48E0498FBB2735AF80CAE44796F494BE57556F50D433B2B5F1E3EB","0x0E7E06674EB7A15312A76D8B00A7C053518EC8697A6DD69D7AED433CA51DDAD8"]],[["0x21F4ED48CEEC81EC86BF453A15B3CB877E207579898C6F0D45517BB598423A57","0x327A06EAF2AAF3F5C21D6C5AD150BF8622769D1F2C9209B92A50714B029BB452"]],[["0x28C8780786331A0CBD3AEFEE4096FD14C2C872E8B6F88C8E2FA3613E32C7816B","0x1E5B536B227063FEEB7781A383D2687451C1A24F1133BA0F63D31038A3B86EC4"]],[["0x18A2DCF4852040706E71987ADC90EA06544A98A75C7631498D3409D9A7AACD7E","0x0B5DCCC89D731420566091E05F360FB7B684416C01ABEB38E29F31D1EF6449D7"]],[["0x03457F00B9F0CA4647B92A96F7AB4FFB67934B5EBBB8A561AF9C6BBF137B1284","0x3F6A4592E731AF78770DA6FB411DE7D79C57DFC6BB5C7D832626F2939C3CFC2C"]],[["0x2E3802069870F218FA4D918B151FC0877FB628F59A06185A101F74989EA64277","0x2EEB6B14338E7B2BFDBCF4E7462822A3E57BA0A97BC1B7CA5DD86E2F3B24CD2D"]],[["0x2D46E5B6CD6297FD9608656C1E883FC21F0A2F8093250C88DE62D154B3DBE675","0x180E00B8F27CDB51F9920584670154294CCAB61416D90DEB2DBD931F39A0C971"]],[["0x020A7A46C7AA8A4BDCA953B0C65C7CC07E93285AB0D7C11EAD2191D69315C782","0x1567E6E59D38C5861ABEB3F309C85B12CC4CE072886E8D9865250C542F3B5C7D"]],[["0x15856CEEFB15FFEDA76AEC1B7ED88D5AC522F01C9ED267C6BE2174C572E28760","0x0CB4122F74CFB490B351D4BD9BBC786A2F4CBE655CA5E28BCAAED5E1D7AF592F"]]],"z_comm":[["0x190E53FED9159FF2ADD51A64F329415AC441AD6BACC5FA685CD0C0D144DDA6B8","0x0B43E789C1A4BFF04BF6372C52A3A1737F67E4459AA15291B710505F83F65BFA"]],"t_comm":[["0x0942C3DB3419A99463381BC2507D0F7675C382A9A7A199E69485CA58C4D4D465","0x377EEDA6C77A82946069EAF7EC15EBF6FCA7A12363C07E93DA9B2974799D5C9C"],["0x3297071CAFC33BF43BD6E323DC5B4DFAA8B656A35ED40629AA2CCD54A9F41310","0x3A2693CB095686EF72D51B0A0D1D833020EC465E00A89D69216B8900A284A424"],["0x35214008BFA4351CE8BC0A9A87E8BCAE6A605AA7C5F70BCE2FA7BBFAFE9557E4","0x101CE256E40733B20A903B6C4D033AA3DF07C5C74481CF60DB160E245764E6C3"],["0x060F13E6F377BF7641B14376CCB2FE336EABD64C09C0828F3E38C1CF38C477EB","0x11FF0FEF13344E5B2A0297391ADB64E9BA3267134608A1DE392706BB4C652AA3"],["0x00A6B45A4EAD5A9F72C397B211BE2FB04F0BFB6A683A2504E15DB16A9843D08E","0x11039EBC5F2D0CE71382AE0D80BDD67A3DEE38139D13E9C1D70EB179E8A5AC68"],["0x00225AFF5EA1EC350023C2C26508612F008F2F2B1FB556D82F4760E9D15D1A01","0x1ABF14A6917EE35E92FD44C9D02C384B96A6C7D235036DAA5C2765D7F7D522E3"],["0x0430A8D8C7E71F010B937A6B9B8E7E1B377D6A954A3AD9686410146779D9A748","0x1B87DDCF482111B7E10DB282126297CEAEEC0CA4AD2DC83B732F80BFF76D9340"]],"lookup":null},"openings":{"proof":{"lr":[[["0x21A6C526C6E3D2F94A37DA3AD4C5619AB84033BEC17C9F8CCC06BCE90F845D1F","0x23AFA8FFC3FA126F5FA6BE2484C217B6E6904C7F651BF5D36B4AE01EECA28990"],["0x059D887E15ADF5A5C8587A959D84047A0F2F6555009B3F284C5DB4AC463E5EC0","0x2A6F676DB33DE6AE7ED61AAF81FA256105BA6B731B46CD010EBC9CB0CAC9B6C4"]],[["0x3D562269DE5316A6F49D9BE7DECDFC03CBB838375B4F99CB54971A88D19AD422","0x1CF44D263C09E0D5DDEF3D9F13674B09FE2BAFD436C2E14FA26438749C475647"],["0x3265C2FA5359F3E5F11B6BDB38DFC7A28131F0B7EBA358EC676840DB0E25E9CC","0x2E24A7637EF568E5F9C4CCA2D9A6EFEB849AAC1609F95B0C31FEDF38D69716C0"]],[["0x327DBAD99F695D7A1895C02263776B54627CDDD89B307342160B63E015108286","0x053710D63B725B7F7FD331590B1B8C6F0F559A888AF28EDF4B0E460982F98A27"],["0x32C34FDE10DC9C06EAC25100C785AA6372B37572D34A09933F1FA90537559ACE","0x2E8C1E36E9ECAEF38EF73CFB0329B9153AE67392CC1F93CFEA93335907D300BF"]],[["0x19C26C699E1754228B68C7E078EC2609CAC775A9FD72712A225DD1DAA21D6D57","0x08AB24457D67764A7C4B748AF105F30597C8F15E7B95028D1F0F2EB73D0340A5"],["0x2A58F8A8C012A08B2719AF171C5BBB24A655AE45F3EE017C72B49DE643797718","0x23AD3F928A50F83F958FB11949D826670ECF2694CF8EE0A84A42CD00133513EF"]],[["0x23C00BE46DDF3F3D6FF0FFE99B0DF2815453E081A9F81EBDB8743785764B35AC","0x33691B5FCA3E4AE91C460FB20A4BA2F4F4CC3B2C7CE7C56DB0B1045525DC76B3"],["0x1FD3FA97C80626A98628597E59DCD0F3958B1E5BB065AFCD22A0BAAC32C0E587","0x0A2028E1085192AC65256FF7E1D32F71DEE219FD45258D00EDDA24307C16FFF5"]],[["0x19483D1785DC8C0B528E28698D5EBA5B0D2A4D6BCBB49683E06AD543BFF325BF","0x106C3059F46DED101AE54017A20DD9F3A52C0E9A3FF7F3B9C0AC1C5708880F35"],["0x22E726936EDEBAF14A33A09F440F6F0A48234355B67D869C56BEEF5089ECE8D4","0x35C81DD6247EEEB5E6A1AD978862F6D86D30819A64F6E82E38852323AA0B02D6"]],[["0x2CD9A754F44D3779888F0C46FEDA7D3E2B5CE1DD14098D521667E804E4342E0E","0x16DC8FD2D14938FCD0A079F4D1A9736F1CD016012086D3D759C40B762702C428"],["0x2F436881B385B72CD667C60A1743F7DFC448BECBE76164997F7A03CD82535A63","0x3C5DE48A82F02D34B35DA43200116687070903D9DEE4D988BCC961601F535BFD"]],[["0x349A8546C9C868B9FB63C090C530ED59CF3E54478770A007B78647BF2B5A4150","0x3F4F228442E177B041AFCB07BD13FA65B48CD85B99482CBBB4F59E4E568F8CDF"],["0x210857B3D6668A24F5B67570D9918460E6CFF4C416E477CB265CA77023EE0D5A","0x04DC124A6F765EE0C0F414AEFFFCA4A271CEEAEBFDFACEA2BB5E89731154A348"]],[["0x32330E5A94026014AAB3EC1D805FEA3FCAFA11F3372EE552713166C1E97A3B48","0x2896268152109308A8EA664E97B6D7B102A5D856A1E8D43621DA50466519FF44"],["0x2E8219E85EFD73ED1E499AC0ADC0F4255226F6137070E0EF3FD6FB1D123D308C","0x0C40A6D0889AE313D958EF6E749C7131B5A7AC8FD827F879D73880A8931EE071"]],[["0x00A03D916DC6114CA5EFE9E4A7A09CE470AFBA0C19C20932AA139F5F4ACABE5E","0x1A5316C5FD41C7862C5B83C969C29F559B17074CA3BE4FBE1D88784B8C41CFAD"],["0x28FC4E384553D21D2A9571A3A23207FE305AE64205A9BCE79761909F784435D5","0x36CC7EC66D84C047DC6E9BCE1E8AC06373CE08BE6329C96A7CB5FB9C9C0D9618"]],[["0x17D083BA68B9D50D518E79E13B4B55CD9742B5AEA53246EE7C72654967056CD6","0x30CE2EABE3657A6C2934F3A38B896756551AED9CF9EC2BC0A19915059B9CBD0E"],["0x27A3DD0DE0590FF9C692EA300F6E0C9C145CEBA41D6EE8D251CAB4C3675E9E92","0x1C9E36C7C68F33FF66D0C9548956860E6E2152A9E107FBD69BAE4DC2B9A99442"]],[["0x2C148B1C71555D70874A85DD6D4D63A0ACE6733282A5D90E9C77BF5F4B8CC3AF","0x36A1084F6765BC511688F49446B32262F2F4E70C5BD9283519EDB3241A5FCACF"],["0x1AF8D3080B2BD8DD0FFF1F650A0EAE4E4849D13F03B8B583EA7F4D5D496852D7","0x3B806E49DA65F8DDDC89BDB3D92FCD2B81837456FE301A15AF2C7DBAF69EF5EB"]],[["0x327F16C1210B41B4E7978A901F230E4D4BF061FFADFE648EBD0E4721EA4E7757","0x2063A06E5165793D8CF3CFC54C71DABBB6ED40F6DA78FA359826179F82D171EE"],["0x31F215B292898DE6C90C4CE56FF834D1E270C8FD4E7F14527BC46D011843A1D7","0x3CC794BBD6002EC3DDE4CEAA37EF8649953E26A113E7455C102A700724057AA8"]],[["0x39FE456E383DDF593DBC7B24E5CB9D31EC859829FC02CADE6F7E7B39449FB194","0x110C26DC9D5903D7EF3068E5EBC2781B1A9D611F7AE78A2B4A4450F4C04B2F40"],["0x22D333A8B4F25312E2FB38230111336D7D9039A50FF90E87E9A5BFD68489DC68","0x1A875137837A6D21070AC52DE5E48A9FAAECE7EEE108390FB8EA064F5D15D9C0"]],[["0x0E6B1B2C8B16168F3745FF310DD5BB9B5EF55F37A6B83596BEF9B887D1989A45","0x1E8303626E49765F10C0CDC8F63AF375C489C911078804D1B50392F4F7C74FEB"],["0x05A3B548019D3E9DD81C43CC1E45434BEE84BE16B85789E6E82CEDC85E79BB8C","0x2D99F86E4D272FC9D29E9E6E8D1A8D6A333BE71268183D97A412F30C459EA52C"]]],"z_1":"0x38E1601020F021685A5F0FB75CCD57F4B3A33E0C140EFF363238881E61D1760A","z_2":"0x071B51436B6CBE7125A20E7603016A9220CCA0665DA09F29BDA1A947CBFA8BA2","delta":["0x36181ADB6B1044E60AB5600529703EE37906C40EB77284030F2D6B55D2AE50CA","0x1A220F57D8E29CDEA02FDDC7B5127DEC59BF5461805FCF595C108E1A385F5539"],"challenge_polynomial_commitment":["0x2E0D4A61428F83B8E661EDB7AC8C69E7832BE83FB429C0B640A97E870ADFA1AE","0x074CD83AA2BB37422B6238E3777BCBA8E4EEA06D3A634579FBB37AD0B3108377"]},"evals":{"w":[[["0x37D3E9E0CB87C3B732431B73419D8503FD46C9B382E1B87A76E8BE7CEE50B866"],["0x2D4622C8AE91D1AB7099F0E7A8C00E6A94B709358E6F4C00BAB5C109B4479422"]],[["0x3250A0074A5C29A044BD36DE98059374EA9EC6A9AEAD3F7CBB74585E560F0EDA"],["0x2C42CAEA86FA0F9397DEBDC76EF5B0B796CD2B310C803CB6F6EE47DC848E2B7B"]],[["0x325934BA0AB033F7B974AD946165795BE539C5D1F514411EADE4734465319A8D"],["0x1EEB5DA3469DEB5F62C27E5CEB0F93D70F438123ACECDDE0337A2C7A9E763F23"]],[["0x1EC7701999C7C33FA80C303129E032379B0E68A5DCD5AAF3097773E35CB22C18"],["0x2D480CDDE8C4449C0F6425F9EB20A7EEC0A471E9C8C235C54D9501E6EAE15B00"]],[["0x0CE9D986610CE47DA17CF84BF53853D2F389DF9486A35D59EEF50CAF33E5EEB7"],["0x1EEAA67AA8E88A1BEA7E5F04209B5B47A1CCE57AA80AE02E4D58B657ECFCBE5E"]],[["0x034649F3DED7E30FA0AB5B2A3615653D1592FCCFFFA5B754621CF5B79AC65ACF"],["0x0650C1F3001D270A056096727AA93563CFEA2178715BFBB88182A8BB01250ABB"]],[["0x294CEB96ACE06B4279A03EF241187D31D569CCF9DE1204DEE6C7936E4D8FD550"],["0x1BAF1255F53E6628E15FC95BFF4406EECABF737E8FD7F9A4D836E172B5BEC092"]],[["0x0A29F0DBF99D22BFAE11599637D454D36BDBB790785EA831A1A8E91C00F41568"],["0x28E78FD3B44D1C6C278E79592A1E555896287DD3CFE60C5625AA4D916BA8965C"]],[["0x20E837660EC1D4CF9D60979A1E7045E68AB8C51AE10BF36EB6E02957DE00F919"],["0x0A15670EA9065C0853B36BD1913FD2C8F70E3759200936AE47B1A3BF003C602E"]],[["0x354106A132E2FFD1AB910E85CE14752EDB4BFEC1DB560095CC8BC7664F2C5770"],["0x35401CE9B75D3FC42C185B49E09ED52277B0F627778BD6EC5599A24D60D6D331"]],[["0x24FE4D368B204C95B37BB6305C21F4ECBDFD5C4FE4694AF58C5152DDFD8F5836"],["0x3265F114B9A4605B554E0BC457D5FB2166D7B2C774322D585AD6EEFBC46DE908"]],[["0x3AD5F046F864A6BC0AD1F2E629DAC7E45C8687C85E8A9AA1F801F022C7A3581B"],["0x2AF0174BB3AAA65CC8FD335078E8EFA8AD03966744CB2ED5BABA52779311FD03"]],[["0x271E7E78451D2141028314B4E097A5BCB0BD1BD51EE4619AF8DA7C361BF9F15C"],["0x2F8499A733A6DD4BE1CBA9B0CF4EB1B068093B153C4C54D50B82995F0D5308FA"]],[["0x2B68BE7FA43BBC0568834366E4CC84A88932BBE48CE4318F12EFC92CFE82C860"],["0x1C694F244209AB408E16420D70D7BA8A77EBD1D585F26AA171D789CAA1385E18"]],[["0x1E4CD3F70FF4705B25EE3BB7F918CDF427FEEFE13BFFABD22C0B5DC9D7480A0D"],["0x19BC6AE22C8A72A049BF4F3DC8322861691FD79814DCFB98C7658FB1B007EDE5"]]],"coefficients":[[["0x2B073DCF8FDA60DE29BC1AD470294552D3C7F3AA1B3B2D1CD85EEFD01A92C942"],["0x3FDD39D09FE033F93FE9E368E88A5D14F72AF97EBE850CF5AA7E235CBAD1DFDB"]],[["0x30CD1A5DA2FA7D59D4B28045D80C0D66D9542CEAB26D252C6342917A73289399"],["0x0C238DC9EB4372933966D061A70D980C963012F042E6B3EDC67AB84298E29FF3"]],[["0x187A0D87DC752D16826D0F9F8CB82B441A23F228DED6CF3E4E0E98231D29FEAA"],["0x3B8EB616807B23FB81825E26AF94D1A31D499F8E08B87BB816C6BFB1E5FEFA8E"]],[["0x1D3857ED7A33E314597E24391A52F8AF28575B2B53AC10FFE25ECCAD4910450A"],["0x2EE58A8D91888305D068969D295EE48C15336BBA461C722115473A4FB2FFC79C"]],[["0x117F0A20095B5CB5888BB69CDE687C964BD7F81E6A4D7C50B6FE0B85756E715B"],["0x1FAF6836C0CF490384CB2F24760426FADF1C1EDF681DDBDAE21A08132CDB13F1"]],[["0x26CD47631A46D218DA07FD0D3D1E9B1CA3F471C9CB8456988A5255CFC8A5CBC6"],["0x37850B464B4D953E598E566B5D6DAE024CF1730D072D9CF2135D0713B30082BA"]],[["0x02AE4D506F91DF8846CE6F22EED05AC3FB2EF9FF96DDB89A6954C495C97014E6"],["0x2DD18F8AA8AEE3C1CB7869FA70A5C7325388FDA9D73E442D14122DB23DDFD912"]],[["0x086FF8DE86FA98AB6A4BB41721F81E6A08AE69718C0334CD972BA47EDAE6A45F"],["0x00B3A17EC9BC4789E2B1363B388CD63757611833529870AA0029F59A136F7CD5"]],[["0x3A58BB8BE2A94812738C3347BA127D41758424F9421ECB5C1B8DD52F78731911"],["0x03F533569E3BDA8D29805C3FEFEFA3D7A97FEEBBC8389CEA7CD93772695B34FA"]],[["0x12E2EA296B6FADAF4BDEAFD97FAE0A72066190E047D05C2E04A7F612C364C143"],["0x0EA116EEC2E08BB62FC09AF9C30E40D93C1163E047AEDBE339045728F95DD284"]],[["0x3C4BDD1481F84D98C14B715A99B5D79296DC44657EA1D17FE235F3D3B558D4DA"],["0x05ADC166D578259A43BAD30D63C8B9CEFDE0CA22ECC5A9BA705618E412AB38B8"]],[["0x29FE12B1E03484CF78546E776350F1CA3FCE494BABB98B3656201BA3EE9A983C"],["0x05A06886088E3221179144BEC46B1A2BAABF2573F5C28D916F9BDEFF09680238"]],[["0x3526C4AC89584DAA308B6810E955C5555E4EA2A7B4F600C6727BFD605D9400AE"],["0x24EABEEDF9D67D7B7C4DD4A054A8438A0FAD1320215C01572B7618B98B3E3933"]],[["0x3B3F89322781E6B475D593E1BCBEFCB0BCFCB28FBD4D1B57572E8CB921C7328A"],["0x0681000D6798E9C8F64D4C6E5AA8109B42F3BD1F9EAB4FEAFF0416F7AC0D3AC1"]],[["0x0681397D535215D79019F940D3D6FED0062D2192A1D3756555FBD98536C712A7"],["0x39BE16B26836F233047018DC0EBD32EFDD4129D121D2B8E0B7AD46A9DFA8BE37"]]],"z":[["0x0A15DA6C7947EFE5A65FD3CF7FBC6E45F44BEDC7B2DF8A61F7DAF477950B11D1"],["0x0C2D67CF561F47D3178E57D0EA5C9B8C97BBCFC4B7E74ECD764424E4C97357C9"]],"s":[[["0x034E2240199FC98F4BB88AAD81ECE049659AA598FF6FB7C3DD01F1FCC7FA81CB"],["0x191046802A2D5E5CA6952293C145054DA0EB075A83A8190660AC022EE122CFBE"]],[["0x0AC99D261E0EA154B41EBC6B9E87953DE54B94C7813B5B7E2A96FDBCFA1735DC"],["0x2112812895B4E84DC0AFF4E206EF1CB6F5A9CF8191C37F6B0AA449A01B53BB98"]],[["0x3A858B69D6ACCA9F7565BC2F7C3F636BBDEFCF329209363467EA2A2A23E8FE68"],["0x06D33EFDF4B5FBD6185C238450D4316F6347BFB31E55285DB096F7791FF4A4A6"]],[["0x3AA702FCEFB32BAA7591C9013F3FDBFD2AA1054ED9DC53A887B3A7F48EB3EDDA"],["0x0607B436DA36FAA8254A41208E1DD181D9DD2123FF2CECF55DFBCB52837A0FC7"]],[["0x322333D3AA077540F3337A3D50DCE81AEAA8619A83EB7C0DB9AD313F7B015318"],["0x3D33238115F670F851490FA91E8F194350578625C5ED3AEB9BC9ED12F8A4CF4B"]],[["0x3A64EA25CE4AA815B41F21E41A1BC9CBBA56A28820C21DD5A6E109CA2749B6EA"],["0x15FECB1E83407220B5210BC5BE8C7DBD3F54E1E7BC6CFD17C79862C216936E6F"]]],"generic_selector":[["0x299F658C3914DE58EC2FA792AAB571BEC95668BF45EB786A1D67783D2590FF58"],["0x0DFE0659DBC68420A583BA1D9DE202E15C8A51A515C4C4310B91B0D1E42AA78B"]],"poseidon_selector":[["0x0836802C09116EADC2DF2E1C9C400891EEBC803ACC6B243875B6493BBE7BFBAD"],["0x27E50A5887624026067D3926DF1442D9D95BA693797B7817E8272BC299917B9B"]],"complete_add_selector":[["0x28EE4354C7881F504C35771EC816B920294E5243D3A23036FE966BBCA62EA692"],["0x35058B54559DC41473A2A1BD700B1C9E369FDB352F46DD495F44CB69AF7676FA"]],"mul_selector":[["0x0BA03C4A1282DFF6EE38AD2B71D3D9D53A368D6CBCD39FBCDD161C5A7E4F89DC"],["0x0A68412BC16821EC5871055F29FC72F4C62B45133BA998654B829CDA70996BE2"]],"emul_selector":[["0x24A36D79C301F436EEE5A18495F3A5358B29CE91BE47DB3807F140EB38D4AB67"],["0x24513F7B5A0E29E9A199D9A501BE5AF0EFFE170BFD55654CC4921F69C5FB1D56"]],"endomul_scalar_selector":[["0x3BB08F47CC79165F8266486FF1E273FD9E6517F5ED76B9AAFF73020D98D5D576"],["0x39D1DEE62B88618B3B907F3B15852A5D996245ECFF5751C16335281FB11C96C0"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x26D335D2179C2C8BDC3E3F6DE0C7D35BBC7DAC20FDD355E42A5EEB71A25CE677"}}},{"public_input":["0x192419836310B35FAD47F99621DD6663CC20A95238E740A5C61A3A8350808324","0x29353A054BF0A23151C24DD76A41728B24D3A145503C6397EF1B76044DCE51AE","0x3A870E5874E028D436BD2F604E68566E048F7F8277F2762D948A7FABAEB76B9C","0x0E718ECBAB6208B1C0066E0F2EACEEAE29AEA91FA34F4C2AA25D60C6CC247B91","0x18BB3A1E9F65B77E783CAD95E49B1EA12812C857FDAE2D556CB9AD52C59EF062","0x000000000000000000000000000000003D97EB064CAEABCDE3CB88258DD56B44","0x00000000000000000000000000000000A95F9341E2C641BEA99D160D3BCF20F4","0x00000000000000000000000000000000D81EED1F4F30D5DDE2BE5BADD04B27E8","0x00000000000000000000000000000000358CD485770C0E459AB8EC6CBD702BB7","0x00000000000000000000000000000000E6B5AF7C6F2641549DFDB3916FEBD909","0x02313DA2CE6D1A43EA35C75D8F1A9AC8FDCA7FA58FE752E2FC8CD49BBD5D7C69","0x373176B83C7D47D0518737B686559C0088F654599CB48A2ACE46BD233EEE3A37","0x381A33F0B319E40FD050A40795D50F1F257AFA750C3C21C1BEAD8D76C66C7BCC","0x000000000000000000000000000000003C86D26AC046DD3E76ACE98A35FE3574","0x00000000000000000000000000000000347389E303F3ED7174A674D00F8469E7","0x00000000000000000000000000000000017FFEB75BFD8286D2119EC47ED31F74","0x00000000000000000000000000000000D2DE8430CF41F1FAFF53AD65FFE35A26","0x00000000000000000000000000000000B81A900725616E533E88493ECAE6FE5D","0x00000000000000000000000000000000F5B813F0AD792F7C1E8D9F7AA9E44CB0","0x00000000000000000000000000000000CF9AA0BFA8DCD5B628CBF85184F6CCF9","0x00000000000000000000000000000000928C6B9D23E0C80884531F83BF9DB8B1","0x000000000000000000000000000000008A022F70E7F1C2C6FC83D747011D2A4B","0x000000000000000000000000000000005D79BD932CE77FF48694008E0A5A545B","0x00000000000000000000000000000000FA2D1F956D9D3DC9F0FA8C59A389B6DF","0x00000000000000000000000000000000FD6D1053E322874E585C28862C97D8B3","0x000000000000000000000000000000001BABFC2F8240C2C38FAA01F274096DAF","0x00000000000000000000000000000000802BA357C842C7CD44F304B37899CA0E","0x0000000000000000000000000000000019352B2B7694368882C3B769D20E0E10","0x0000000000000000000000000000000041E1621FB9F37C9751B8006A37BF0C51","0x000000000000000000000000000000000000000000000000000000000000003F","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x3FF860B8D396C04CE0BC6232C941B47C939CA6CE2F51F440DC13A7420F728831","0x0295A560E0B6D8D1B26E334AF98B5512023AB0F144C5CC6D14C95BE9AF26D34F"]],[["0x15FEF06631155DAEFE9DD757B66B1201F81C552C734FC022032991340A45808D","0x3392A25C71A837684FA3C1E8E1955872DBF138D6CC4B905BBD4E2DC33E51FFC9"]],[["0x1EBDA4C60DABBB5140AE09098ABFCE69DDB1F6B6FC61108B6BCBF146663E5C74","0x311F6436C9EDB704EE10A4956AEC9DAA4D5440078E9789F4F0BB4F76B18B3E97"]],[["0x363D2AC34F3FC3C67820366440C8F42977F6DC79BBC44847BFCB9F082F296A5E","0x36537E310228DBBA67C503E62A6C567481DFB1253755CCB7B3DA82C437488EE2"]],[["0x325C9C0BEC7444DCAD498EAC648FFCE8739BDBED035E0FA2EBD4BF38BF6D8F67","0x3C66D22BF7ED60BB3118D89EE0B3023F84C44B74FC94C9CC8F378E2CF7947098"]],[["0x32058331575021414A154E61F51B3F763397555B1BE633DB994CBC3AAD3CB1C5","0x2F8F53A366F0A4B945115AB893857DD09A2B34C898A809E13F49AE1A1486AF09"]],[["0x3ED89281DAFCECC3AF3ABD4E028C2050BD38474D630BB0FE2308487107C7256C","0x26723847DBE511D6231C696DBA0141E6AC5B8207D7562A6D64D466EC58F9899F"]],[["0x18FB39E30AFB515B11298EC3CED91C48841B9F6BB233952A4D3647640EF67705","0x28594DF4233AB886B72626438DE5016FC30570BC8E864AF1E055C196605BE3A2"]],[["0x2D74941B8C8BE6CB12F6451014F1B87F15883FBCA2665916E15EDF103C16CF22","0x313AAFA7AB1A4A2013B2F3241B5B00819885211F95BEA81CD0BEE977ED0B6091"]],[["0x1C08C96C5113B37E3A8993E069F540694A32230A6B0B53CA09779878024B0A27","0x0B9791241150F003AB8D99061BED47623B064BC87C14238D6E534155BF9D20E1"]],[["0x0CC0837000E88355ACB02DEFADD570196BCEE1722E991FA0E1AA9A9C20F4CC76","0x06CD7D8E4EB4C3844978034CF58982BFF1B0C74CF19ED7E9EAC445B70C291EE6"]],[["0x2C966C870FD948B943ED8CDD2E8FA8A21F2482CDEB1D7A7EE114DA2CCA45A999","0x294C51A701248BEACF72466F93861B05F732D37FF34BD9408EC5A24CD65EC2B9"]],[["0x1B79389CE399BD763BDDDEC60E84154A9178E7F5ADA33593A6533310171F781B","0x1C255EB4ECF27FC0FB013C2CFBFA8836CAF6779906D96D027C0CCA2F390549C2"]],[["0x2F7506051C2EA92B4D8321456473B2E2BDDE64119A116029A9787CAA01E0D0F0","0x203CA841EB5A1DC85EA5AD3FB0FC4F16C423DA0CFB4D5821D0725E1DCE3B6EF5"]],[["0x00A2BB61470AD9341C15789ABCD42106D18A6D5FDF4856F5614D46FA31800CB0","0x397B2665A0226576183C7E3095C558BC0483F765EBD814C80C8D9C3108A95C27"]]],"z_comm":[["0x310B71CA4BFEC61584307793E6D9D5FB30471776CC14FB778C815422049D92B5","0x24BC9ADEAD06379294DCCD6986928B32CBDBE5F510C0C1787EBA448664687716"]],"t_comm":[["0x13955472D9BD2520EEF6A790BB1CDC02C5D5DBEA115319E6C5A9F622A028C78F","0x37CC9376CF5E35BD56FFB3FFB74A45D26A4865E2B69F61B6E21C58DE51460790"],["0x0DDB914D6274071E92B2FDEC976349938E9B4717DECE37802AE83FD381605E34","0x3D62448CAE9A6B39D57ACD50FAB4CB73437CF10FE2E525C26B4637B23F160406"],["0x18865C584B67C43564C7FB4600381C746C19CB32E4C88A263966D38986075E7A","0x1106A4746D458E008B20F89EBB3ED7AE4BAFABBD7AC3AE27D54D299765D115B4"],["0x39DB4509914C655AC4161C432FF6AF79841D524A51838A7E4DCA8BAC9A0A99F6","0x2B5EB89D258E0133B61775FAE985D79038D5452B727EB115D401CC94A60CFC83"],["0x16EB25C97F14D6B9F63E3609DB2367DF6A4A64EC8F7273CF58299C04309B63AC","0x0C04F1CE2B66ACA7B5E4D564B05BC58F64A08D6121148A528E995FA9B1ABCF7D"],["0x39A59479906B87E4A82545BF81D1B0B644A4D1DFBA394B95D0C5774B231592FF","0x1A49EBD3001275CFB61AFCDB71F9B3B603B6A9026668D35781C6B040553B5021"],["0x326D58EC950F4177EB7FF42CA1EB22E87F8A8FCC3C040CFE371C0FCE623DBC9C","0x0BF4EECC02E91A09BB84D370B8243D485D3F81CFE4256A91550D151678AC8900"]],"lookup":null},"openings":{"proof":{"lr":[[["0x2096A4F6392292C9D2853B345CA638EE2463BEE3FDF2CCE08B3B307587B79042","0x0A6BD8496C54CA3582E10046C338FF61D99046D0D8F01505C25575B32218B8CE"],["0x0E54985BA07F9B3DC2E7CDACC747814297FB33EE40DD6A547EC7EC6E2D3D6F97","0x01F6F7D6C8886322C39C5E51DEEC147A3D2FB2C63A311CD18FC7951CF1DBBE9D"]],[["0x083B65D1FD9E4C3F84294F88DBC657DC2147C35EA6A48EBF659F6FE076A905DA","0x02AE7D20F3530758B40BE3DB404E834A87C248DEF5BBA1A59E190B9E9C5B5E09"],["0x2FA4ADA4B309ADF7A20F0AFF5033C882652E747A960BC9FA75571F823F39A9DF","0x1DC4D2864992343C3024BD9E01F00ACA8CA6BDB3AC257478E700A45DBB63C45A"]],[["0x1AB545F996B9C78EF7E23EDE9B9AD242B3B6E70B27BE9291FFFE7B5535EF160C","0x3D20C4D11D181F39FCAE588209F06F7BE9A61BC024AEB0D42ED414F0674E556A"],["0x0F7D4CD9AE474FAAAE8269EDE141C9DF3383815B5DB3CC20BD29D8F5E9784CE8","0x26650ED5AA35FDB026815A5381B8098E86CC9F552A371BB8FD2C376B335795BE"]],[["0x22C16EEEC96CB69A7E51AE1CC9C2BC69A912F13477B3B49110D18565A6272C2C","0x3113E8978FBCDD572D0F2FC9E3331DD759A52699B268B30F228001CA94D47340"],["0x37C827AAFF4CFE8768F77FEF1A9B1ED1A8E7A44B9EBA60C00EE5BEDB1EA66569","0x0666E4594CA6F6BED0154031EDFD1C5BC9C087AF9468B3581FA5B15E9692AFF4"]],[["0x107FA469CD00CEE8E38DBE25CB7C44915440CC818944904B56AC2D431651F64E","0x3CB689C526F256B862198982139038A98A1071CED7B7F6FDF61C0A71D8DFA176"],["0x2E6751017860DEBCF8D324221D95B699ECDAB890EF507245C6820E690EA0711D","0x0C26CABE4DD3F14DFC0984CABCC009F4E84A3D79C5142D699B54CDA3F271600E"]],[["0x29D45C6DFEE53011050CB30BF58FA83D186F61D3F8F23F5A6E0632F2C3E0BB87","0x165DC79784155D1E58D65CD20AB1C67C642C55889AC25D6CE4CBC740C7CF8B42"],["0x16E53C4A0E49A8ECFD63BBF0987B90780A5665BAF5099EA15B9E0238CE865202","0x03D68D181C489F779E38BE49FB0F19F228D2AAC3542CF6DDD88EEE46A32E9BDD"]],[["0x15458CAF6D2DBFAC2F1B9D5084359C16D6DAA4AC27606C52DB7AFA872DAA4A02","0x1221BAFE5BB9A3BED916F3C61D052790B23324E0AC027F03ABC337568369E801"],["0x3B33D07E71F3A0515E0538A1DE0337C361B6F47C802553AD3D58705337085A08","0x313B10D8761563B1C9BD96156DC0CB52D46630DD9C9248916CB057AC023B9EA4"]],[["0x293A7184E606144C202A2482C6908EA1401870B792ED9D9403AAC8A8FC1B2ADA","0x01AAAFBD9EE55F1C396CE297CCE1F466B728FA8D5608862FBF98B7366EFFE6BF"],["0x345B5262EC270BA4980D18EE03276D449FC2982D3A3F5FF6BDA35E51F8F4B518","0x069F75C1B17C5828261BA64B64D1379088D683F13B8367E13A7F6EF01ADB68EC"]],[["0x315FF73A0A6A83A375FDDC36541C424C44B9F9A01CEC0E7695E4F26C23EC6CD3","0x03C52E8B21CE9F08DE62DEA2717809484EF07D42A930A042E868EAD5D21B6A88"],["0x17676FCAD4C0EA3531C1A0F82164812A73DFFA8F3C5F4904C4FA2B73DA52F36E","0x06A37B5781C12A502CBB62EF605278374AAD7692A357D133CF571F811455FFC3"]],[["0x23D31C96C63405F486B5A14BAE46494C34A1289853BDFFF3887066D1BFE84602","0x302544F667B5342804BCDE1788D7D5A3181E9807D3C2F8D725AA35FFB8FADBD4"],["0x362997119ECB664EC8B98707B6E3C1290E175BE8E2F27186148E8EFE87833249","0x3C92851FA18A9D58B7C69FB18909FC10A0AB105FFFCECAA108CB7B2251C28901"]],[["0x16E6106DBE2505AEE3A0DF7F17065FB4A2F3C586991BB23A5C41F0AC1C6818CD","0x0870B06165FCD97A2661D8BCBC4C5F6DA15EA222F87F9D0BC9C4A2ED12CBC3B4"],["0x01824DBDEAAA7514E0FD855064B6CF5AF48BA06FF711997D9AA56FB77FB534A2","0x36D014C4A4E0DB59142397CB66AE948C626E3B8410D38441F194E1AEEF89CDCE"]],[["0x060CA917099F829986BE76C9A596EE155E5966D46B86A9E29DB1964A295BA04F","0x1550AB75AF2695A546CA3C5AEEFF19294D2A8A1087F52937B26A55AED221DC46"],["0x0E82ACF240742C643C2276BDF8710235DBFBC3FAEC6465DDF80AC9B1134E6AA3","0x3C3F10F767EC97880EF4DF3E41FA85EBCDE4E0C9E45B6EDA3B8896CA4BF81A87"]],[["0x0B19A6FC109AC2E2BDD13DDA0DC7F4ECB78E9FC69D9425AF52DA9F8AC7AA8F04","0x235E14F713B0C5B0A1F8699277E7900CED33362D6E012EDB3FFB4C7F08806769"],["0x13D3EEB9772DE4256152A8977C5FB50F8C6682451697F645B24BAF3F0E68CB6A","0x0CC2A0FC7011EA35079AB69085F9E4980CACFFE643CCEED869A1EE23851A4E7C"]],[["0x21567FC64EA963FF66B5AD41B04F24B63C9163462313E1C1791D49C3B17F3B17","0x2E1DD4CC5B2ADF842C0FCA119F31DCD2AB10558FFEB8605DAED8DA21355E660A"],["0x2E1F9F4DA421A4353448C8FA5B996EFD61112912B5381A5DEECAC244A55934EA","0x05B58446A03609232EC46A066B3F34DE73A220E02173E181A9F4059DB0F790E4"]],[["0x1BCB1593F47CEB8EE1B524D9D98301E24F35A071B1F44AD859D8CC6E8D7D3D7D","0x0005E6EB8EFBFA1FFC261C9CD1FB27E4388DDCAD2945768A7483AA956D6C5990"],["0x352367E3FCCB7F78783A69E9BDA3154A6DEAFE189EEB78D892ECD19E2BA259DD","0x3DEB72FA74F762F9BBE813C26A357B27F67E77328F3285BAC839683F3DCF2DED"]]],"z_1":"0x14D24943912FED1F9149995D972E753E166F1192ABC190B9C24E792183F58FE0","z_2":"0x1019D2EFAD2B8ECEA5E311CCE748ED0C0726D322CED38FE7C05821D66914823A","delta":["0x0CC0AF6B2DAA92BF339B3023C9FC647BDE352483E020879D98624F12D9AABAE1","0x20B563CF389B6D90B322BB12549A4BA55BCF1FCDC86A81951AF48A1D8413D78B"],"challenge_polynomial_commitment":["0x08AF4ED848ED324553186115681F2B296EE2213FA9D65565E37F438891FCDC1F","0x129DDD5E91AB85DA8E3DB981F678DA8FB5C50F5BC2FAD19F5E2327A43EAD57A6"]},"evals":{"w":[[["0x17AE1EC4715D27E44C5D0F70DD3659AACAE93990249760675ED33709AC7E8BE3"],["0x0FFF8A25680F13649C90EC4001E803E081DE72E7D48752C69639A70B6446C435"]],[["0x191FBDA945607157A81C2C0AD74F10BA39579219506BC92237F7729EC4534921"],["0x1DDC3EAA0C2E59F6055CD0980CF9366B5FDD315A3EF686746A053167027DA998"]],[["0x2FF3B7F300CC1E3627AECAA99534BD5B4DC108EA84745F998D86E81A896764F1"],["0x27DF64A2071414FA29C4D0E0BCDB37BC9C7113AC4529D0B72B91027FD90C1DF4"]],[["0x23641782ED6549391170034C42672A215F5FEDEF7C87F8AD8F820E0D50A6D60B"],["0x2FD086162C5EF956DD6EFB8D9FA01929CE9EE4DF9D4FE057FA46DBD50FCB0CF2"]],[["0x3E73692BAA1F01B876E2389910FF7CFAA8D32AB2CF14D4E6439CC16AF05AC1A2"],["0x30F01ECEA643D3912918665504AC1FDFD5FE67F6DE2DD7D1AFA6D930B3CE424D"]],[["0x2DCA88D6A91FD5F64B735B8A451AA79F25ED7CDE40B658AC9C32311AB5129DD0"],["0x18DC55DD3D862035A28A2FBDEA14AF4FC8C52BC98C9FF3430D84A300229E223B"]],[["0x009A82C3599C7B6099C1D346753CD2738DC5234A5580314CE8EF6E901BF6FEA2"],["0x1FF3FBE02FF33D264801E56F6AB5525E868133927C66D1FD2C37CF5113A99732"]],[["0x2A5D497A7079AAED1E6F560519D4CC75B0FCC68956EEDDE69E4C39A958746945"],["0x1450C8D73ED904DECF202BF1B3EBFFF9E568CCC12E4F5CA1483CF21F79834A37"]],[["0x2684DA7845E68E1F0DA3BED0E29A46BA08E6753A59938C7A4C8B6F4123F4E21E"],["0x1B464DD6119E2FE68C1FAFF34861BBFF8B21B641FD812B676F412998477B0262"]],[["0x39174BC0D31A4574F0353D44B0B8F7024B0BCB0CF6117AA87CCED6C4EE527C29"],["0x3CC2A304FFA6E20BB4782A263A728CE0AAB4950824EAFBBE5324BE47D6FA7ED8"]],[["0x333D9EEF8151F2FB645F45A228069E409233B8336800FDD1540DF53C8F351E18"],["0x015464A53C3A241AE3C9A616B809FD9A89AFCAA7915426DC361E1BE760AC2D9C"]],[["0x2260CA87E7ADFB78B1B75B89AC191C3C8D46F249EB15235FB8F5350C8B23D351"],["0x30592E85B04A430CCF4206CE4017DF813948EA5736B5F1747BE7EDF39DBB217E"]],[["0x0A1ECA55215657BFD0D00F659B12253E00028702B52BE993D2546DD5C2D632B9"],["0x3802CDDF4D67E63D5D20DFA615AEF71EEE6597BE4FE93EF1E646E247CAD9A6EB"]],[["0x39C4F19A0910380407957BE30D9F018B60D9FE29B43E52F77B4FC9012D71C4BF"],["0x38417B3420485537C123370A5AC07CF0B52DF09BAABF341C80397713C4C3503D"]],[["0x37420E21B7F4462F3E088D78331FEBDFB0609A77787CA02E5F525771FAE37F0C"],["0x06B8D1C131E34EA4C1A76B87C479F33BD77EB34D7E9C594E0F41323C16D8F404"]]],"coefficients":[[["0x3BBC6A24B1C32A98E9FDA1067467EF3F5A00BE2289DDA5D3E14A5461CB3FD2D7"],["0x2FBBB8A3E55CDC6DE14229260682415398A668AC283C2F01C5D7483D6FD04D21"]],[["0x18E8CECAEC7A268AB7196179AB6A4632383B887996DDEE3ABA5D1592FF296757"],["0x02F963182A4EF327D89F3149A32FBA216A76C70AF06825DD6C1DCFA28B5A16FE"]],[["0x0A1B5939CBC649CDED5223B88BF597EBB5E2B5657B6F5FD2945F618D447A205D"],["0x27AED4DA07233341D82E58FFD2E50BACD5144A2780299304260ABAE527BF458D"]],[["0x05179BBC480EDF89E12830296FF9CD9EBA01EE74237379382635E0EC7766F4BC"],["0x0CEEF9345C0BEC32CEF482E9DDAEAA8FC07015DA387EF9131002514A133F3440"]],[["0x35A2679040EC3E0A2993411C5CFC7D73A681E24DE7200A9CE9772176D32ADA9C"],["0x05B78DA68137B0A2467A8412A5FE33C21E626BF9A6CC9CBD9A15625B901C4560"]],[["0x3E781224A6A57FF55B8E5EE733FE3760251FBA5A4A73459CA76686BFC45F35FD"],["0x2B991BD1EFBB2F4C6EFC58516D5554981C82AD016EC09A10103B1274BDB6D605"]],[["0x36E56990A9272E99DA10950CD1AF0BF60E54E6AC7F182F7E4846F13E52451140"],["0x2395E03C6BE93C5E896C0A2F69D99D8C34FEA360152E5C8B565202BE92CC51E2"]],[["0x1A7E8CF2997570943BDA7A5D119EFC29E43D0178CE9DFB59522CE948AE19167D"],["0x0F10F6E9E47F98CE43F4D49E153C32008E19CC9A8AA02856063321173A384FB4"]],[["0x1DD712DC2E40877682050A005CE216658B28D0F9B6C4F3CC13D116BFFF3CF16C"],["0x16409693AB860A1529E1279016011D96C306D209BEA1C566F24C7D312A4A37DB"]],[["0x0E4DA762CD6BD7B5235E48527423015E73C8000ACCFE8D5208864C2A051012EC"],["0x393BBF7B2CC090D41D72BBC998904521124633F533482555DB005F8B289EA976"]],[["0x3C1EAE26F46480654CB6272B8413BD05D0980FCEACF5B28AAA1D4ED3D7E592FE"],["0x05CE87FB7EE9D5B30E20CC95066B94B8D1A30526651171F9D1EB545C37B7146E"]],[["0x20BD224823819FC47866F9B180157752B532E22B457D59BB73663C5E2CE3B677"],["0x151788A479690BB5C7607A5458CEBA04876810572B02D677D3EEE28F6BDAEF59"]],[["0x1B21BA464682770D2A3827CAC449033392DF10B191A25ACBA888B98F233A53DF"],["0x0CC2303AAA23FB3EFD08E6A689571ECDF52C9EEBB9A7728DE84FAA8239113CD3"]],[["0x3AB3CF956A5787C5E423353B75B75812A5109C8CBF0A041B5891C3A947C04A1A"],["0x3AD1AA640445178B6356CD87FD15132EA0DB4D17A25F730B30BA713D58F198B1"]],[["0x0F0FDCE0E405EAA9980F37BE79DAE52D268BBEF26E347E3015270F84DA32A5D3"],["0x37247EF38DD9C77160BA93293215A649C9F74CBA084EEEA423F4CCC696FD0A4B"]]],"z":[["0x06A357C3098D03017FAE664502F05CEF4625B8B6DCFEF11F950AA157C4B788B2"],["0x135CE18E5B5AE38397425DF8582F1D72A6244EF44746BF9FB152F305521E87ED"]],"s":[[["0x3B49C1E0E75581376860483F6CF902C6B20E72272D88A2082D099FB1F54F9D60"],["0x09A7AD9F03C79DA3A503518986D6375C3AC41829FE7C0C4B5EA168EC17A2DAA7"]],[["0x3F645DE7BA640A771C169671BC6288B235300F1EAC74B7363CCB9354ED0FB9FE"],["0x201A6E6C85F2DE089569854B35DBB92E0EF863AEB495626678991F7BC6D5F5A9"]],[["0x0ED230817CF78D7709E6FD717B73FD8625A97ADC198EA70267ADE2791199B5DE"],["0x36D64CFDEEC7E8211D60094D787858468CD4F12FDDD31A5EEF76B342906A557B"]],[["0x160B38C26D198CA4B80EBA8032C779DBA260AFCDE6A971AD793FF913A23BDDD7"],["0x2C923AC1EF6C22A472D5A1AA3A4B13936234D857D290D5EADC6686E29787EB52"]],[["0x290B9E030253CD20B2004CF9DF4D2DC211AF7B207F91756436C6CCF06FBC6F46"],["0x18D518DA80DFC39E423E37AFF9E7CE2D5ACDF684F4A7F42902A19968A0E4D5F5"]],[["0x1D2DB0658C20A0D9248875FA3AC549ADAC91906980803624E79FE46AAB0A4254"],["0x08D2D864538808A338BABBBCB8B4A3ED82C774E5D9D6759391E992631A54B12A"]]],"generic_selector":[["0x05A73857F8DEED60C056FEF4392CD448FF236885E3CB7326B4B3D3A23A47C385"],["0x0E713099D919819DCE80A65F804B0AEB451FBC1860F52B6A6726B7546CE92A89"]],"poseidon_selector":[["0x037462E3102BAAEE1BB4C60BA628D003BAC577CA10C0ACD27C5547CECA04A8A2"],["0x033E6549D55BB735E44541DD64F02A87CEFB47917138C8EE50D7E10B996F2F70"]],"complete_add_selector":[["0x2D21468D3574B7E10C4A16562166D8F0304D4E0E37D88EAE3DDC7A699BACB2D5"],["0x354AC5F7D112AD7D6F0AC06CB5EF7476C036F7EED2AC21D5CA3104C942FAE782"]],"mul_selector":[["0x1575E6CEBC2D6E25C0F1408C1869A360AE4826D82BF05165076AF475845FD0CF"],["0x14A0C2A48A7B10CA999496E19CA73315BAE9E7552033539EB9C2A96868F121AE"]],"emul_selector":[["0x1912AD62383790F00FF60D7B53836676CE11EA90C5AEC49A9DADE4E3B0AAD2D7"],["0x2B364FFFB8BC670A6A097F7DA9E6604FE38FD2D33A142D4CD8D48A4F06F06E08"]],"endomul_scalar_selector":[["0x05CDD59A0CD6DBE83528EE5782168B672E94DCB2F7D0774C945F75FF6578BDD0"],["0x375E18B20329131589AA6C50CB1929F7984AEE45C968E47ACC6B8188EFD78AC1"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x310F04C2BC5991CAE92B71B81901EA51FDA241E49CE3166C8BF139EC30A5A702"}}},{"public_input":["0x1814FCF13EB1D1B82F99FA5EC8C8A87169784E197932EEC174D089BBAB16FFC7","0x012B41A9BC307291AEA58AA1B41DF656D856E7B051D9AE67B8ED7EFAC8FFE787","0x2F64BB0493B00E61AF9E4B9B7D71EC0A7A945E11488503E268A80346EB79D853","0x26A4436DBD475FE11F76A0370719A198CEC53642297538570D4CB75514B6FA18","0x2268BB1A6C8E77D68D3E6B81DC0DB4B16D67D57AC3521E78149A509A2F1B0143","0x00000000000000000000000000000000458C1A56C1E3EC6487153BFD120807F6","0x00000000000000000000000000000000184A515C7D787A8B65A0040BFFFEFCC8","0x00000000000000000000000000000000FCACA9745ADAC8C654C43CAAABF8E053","0x000000000000000000000000000000000432CADD9463137CD606E50362FB98E9","0x00000000000000000000000000000000435936C7459639C4EC1FF46709D22F69","0x0A7D2FED6AB652F6332A94C79AE8A376568C4B826E45E28F1BFBC7024F9935C5","0x15F350483906FFFD6CA57CC13901EF1D601AA62FD84B84FA5DE8CE5FEF9B7C4A","0x2125BF08823ADC525146E228B9AE75F942667F64F45B596DF48FC3FC158B839A","0x0000000000000000000000000000000039B39839EBA885AD5064A1999ED6E655","0x0000000000000000000000000000000022E9DBF035C70C63DE1DC78EB90158E8","0x00000000000000000000000000000000E0A809FA9DA59F27150263A4B04B41FC","0x00000000000000000000000000000000A90EED20C9B77BFC1EFC3C48C90F4D3B","0x00000000000000000000000000000000EEB42032725BA60F47422C89AED3D78F","0x00000000000000000000000000000000B12604E10C8E4840B8089AC00E33707F","0x000000000000000000000000000000003E6F1C0E1B242BCA5EBF3EC8F8402532","0x000000000000000000000000000000006D24CBA5BC4650F8C923616FF28BA9E0","0x000000000000000000000000000000008F0D5860427743808B48DF9BB26CF4F6","0x00000000000000000000000000000000456D777E6C104DE37E6F63C6A832E7B2","0x00000000000000000000000000000000A78C0EEA57007608712422E95FF6837E","0x00000000000000000000000000000000C925CE40063A33815D722B5DE443253A","0x0000000000000000000000000000000077AE636FF7033D6ABE54C7BA55887A02","0x00000000000000000000000000000000E493B333859305383049155DD2EF5626","0x000000000000000000000000000000000E2EC19392E68E95927627ACA41FD99F","0x000000000000000000000000000000002497A501D65FDFBD28DBD609EEE21A60","0x000000000000000000000000000000000000000000000000000000000000003F","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x1BC784FDBA750AEBEA7BB7BBB44AF1387D28A0EBEE0D6D834700BBEE54C62F83","0x2F333DA4F42D1FA201B0F75D7601BCD416B2B0516D7A7B6B5A91F88D30E1D8C7"]],[["0x1F73A2149AAE948930505C2D4011C6F621B6FCF5DFE752BC4E31F37C338761EE","0x14E80C640FFF3D026821A2DEA42A075A5D085EE300F9EBE11AD84D289206D125"]],[["0x0504EAAA811362D7CB7BD6568BE8CAD4AAA8C6048F41F314F84018492C5A234C","0x3235659104506EC470D1A5775D7BC994D9E16B3B0779BB1DC850D747A64D8B1C"]],[["0x00CCD5734240311DA5687227A33F98FA1A13489A7072BEC9E8ED7A93ECD3B8ED","0x304810F259E3FD9392F5B885EEE5C0866B4A797606F55AC647E703FA80771E4B"]],[["0x371B8EF731467693183F4E56F3FFBD4DDCB607DAE8A7EF5EDA667DF3F104291D","0x301E3E3EA49928CACF4874C649BECB633EF17A67DC849EAF6728CA03B82F8A46"]],[["0x0950492C6156A84037543D1FF2C314017A5885A4EEC590B11574D7AEAA477864","0x26843AF22BD09FBCC7E611E18A51C7FFDFA63473A6F8FABDB06B667E7EBC53BB"]],[["0x0F5B20568DFA76EE2A313074A53A669397C73944B3B11C86786C43D2C091BE87","0x28A0F77BD39D1FB06E4E9DD3952E78D140415121EB8F0DBF6729383B90E75673"]],[["0x1107BDE6B6714BB82406EC5F8ACC371777BD729CD514FC6F4FC1B779EA6A9EC7","0x0E18145FB897A5C3404FAA52C605C1FB48347E33E3B734CC8FD6A51F1FC0F225"]],[["0x219078BE1DF3D74040BAA8DF36ABB4CB2C474BE165EE50E5D4A5857BBEC318C9","0x307098C75434128EBA2269C64430502ADFF16A7294DEB16FAAB535CBB2E9A78D"]],[["0x144375E4796A98B43B501908C11A0D73CB769610065D536659C99B107FB110BF","0x2C0F8A990E11DE7D5A69CD47E980C27B8245981BD81D086DD29BCD8E40E45BA3"]],[["0x1E25E35AAEA53B3882C388403A22216472F0FC9B61AC4CAB63B89A992C3A538F","0x1D16220C24B614F862D3FB0A5AB158EEC89A0E4D14951DFC2131528B95BFE908"]],[["0x2FA58F56E4312BE64CEA616B5697C20FAFAFCDF0506E0B6E65D5F137A9C7404C","0x144F3F77B9B056D4CC4CEEADE3C4FE894BB2C1132C2F14995DD0A59EDC6113FF"]],[["0x114F7F468F1A092C4254262F2F1A4B9D34F60FBF88822FAED71A71D8977A3B8B","0x0E61C8DAC1D3607F15BA6F458CD66AC143CC6A09E229B57F6BAFCB76170FC9B9"]],[["0x0AEDAB135394A4947EF218512CA9DAE6FC9750CE287D42555712F3878AC86A30","0x2B64BE73A3B93C311832DF6D218266CB6FE417EDA0B9B03C790C670BE08BC269"]],[["0x1678B36DD5434305AD5179D81963B6E83BF64FA88C18F169A16DDE96557B8283","0x1452E197D38C6B2C868F79AF42D1D143377B9C51F9291235A8BE1509CBAF6EED"]]],"z_comm":[["0x187F2A25AB97C8B921118B3BA7E4C18C997C7BAD097C49DD55EF85056CC30F7A","0x391C95F7C869C7781320F19ABFBD42B73674446FFAC8AD155948760F63617992"]],"t_comm":[["0x20BF87574C8D7232591749584B69DDBCA7E548F7DA8BDB08C57717826A3B3DD6","0x26F039F1213010EB518070045C5294CA0682F1F4737A7C489B11B30D4D38EF5A"],["0x0F035BBD7918B30380783A382CDACB465DCEA194327E9397F0B84B2D45E09B50","0x09D60E982782D2F5F300F453FA04E183AD21DE6B90982FB1F5B05AA3D11F5FE4"],["0x2BE69062FD69D348623C8B91711D3CC8B5EAB3EF19A862A24867E0DCA4CA2E64","0x26124EEF311D8B3F47A66C2A49E6E3B5FBA68BF7B55F47C4C8416A1A3C02B280"],["0x2A4592D0B97CA7B68D4C8F320618ACC1B4EA3F71BDC443EE6823D928BDCECE29","0x13144E4D5C393C92DCD9E8AC375653602B368EC9691D9EC8DC5EA4E3C4E85F55"],["0x346B00980EC0CD60F788CB99DB819361403837C18448368F48F14912031B4AF0","0x2ACB247515BAEBD847000097DA52F007FF00B16E28F1BC342E876015F0C33979"],["0x383DF92B89718E123826DB88399350CAB5A3D54ED24FAF3885E4184BC8BE569B","0x260E64E0FFE252A30E6A677F5A520F5FF3E80742F144A620062D81F39A5C0EE9"],["0x23B8BD4B51D3F7642969314483E5F712CA91EBA34634E2E524D06DD0284CDB46","0x26C7DE7243CF46509FD3E2F7B07E06BFE4424AF9F62FB9E24C7FA47F912BAFE3"]],"lookup":null},"openings":{"proof":{"lr":[[["0x3D9D6BD69608BE02B7519F7314D55B9F90F2C52C2D607611997752660B223DBB","0x1F711FA5C8492FF4960D889CF379DDB8791E4CC6699F832379322D8B8F5AD503"],["0x33A9F761C31B0FB93CCB734E2DF6469F543C3DE256E91B3798AE632ABDB50691","0x2561C2686D8B9446D04B96917820045759550FDED5B6518ADB954F4627FD12AF"]],[["0x2110AAEEAB352371D46DCCE3AF6BDC2C83C903EFEB8AD42C2F1DC3160AB839F1","0x06C876FA4B29E578A852B6718DAB5D6077F781A70275899362199C545320660D"],["0x04128AA441CA5C83367AF3AB6AC10FD9587F09849DC6FE153AEB319EF1A00A10","0x1F8934A2A823B77322C1FE2E0897E3FF74D7DE973248048475B1F7A4E7746A77"]],[["0x358A3290394D63B00CE4568314E2B64F199FB54F748825D7E547C557B92FA5FB","0x146348CDAAE7BB3CB4EF28B09261C0F079EBF4A3BA734CF6D5F0B0CD1D617D7D"],["0x1B06917E496837FD47F6AA99D47D49FAFA5E2C27CC78F9880E4C2B3C2CFA8238","0x193CA35BC7577897159D96875273E295277F1FC008EE78478184EAF94A7BE2B5"]],[["0x1CC73D8E7E653A88BC7B507EF45F69DB2B571DD499750FBC479E92FCDF5770C0","0x1FCC5583147FF65D1AC3C1F7A356C61C49AA74B45BDABB433598224346A7434A"],["0x05F84D459E3A5ABC62EA9C14E1270B01080BF4AFB42021B0C9621AE70F421385","0x17BE85F1DCEF997F45756887F3CF7205F8BCDFE80D9FC7D8B5464F7402813B1F"]],[["0x37ABD33A9064989AD58CEE8A06C773A4E8552E0FC4A7B7648EF58EB426AB8F86","0x23142AD90C216927672F75CAA322FCD165F182051256F410493BB630816E5DCE"],["0x1AF6A82C442E1F84F890C81ECD01B3A63B347D5805EA6D01E6BACDE8596B5D09","0x25D3D5CD5E2FF19323785BA9A67520B37D272FCF17BAFBF2292F492B1099767A"]],[["0x37B0D03ED52A7ED745EC67AEA54CA46471E9E14FB6CCADE06290D5A36004EF99","0x21AABBDF91F9463FB9A0964032B29FAD0BB9218765B89C4D5D8B7382CFE5956D"],["0x1D9DDF82C44FBDCC25582FEF987D0E09EC41643F58286A956BDC1CD116482C50","0x2C72465D6AFBA39407E47DA3FB2EF4EE0DCF4B155152D06A783E10311556D4C3"]],[["0x0165C765E6C1BA3E01D299C4FE0DE372CA73C5CB2D4268A0A81A0422A3A8F383","0x351DE2A31EEEEC41AA928B3EFB0DDA4ED5DC64CA2DFE3A7ADEB61C7DCC82E8DF"],["0x30F9453C71CDF32B9EABC67E5816C90E75521D1A4AD5A90FBC132F374A3C5337","0x19BD9C0CAC9284850FF460A75637610D7A78E61031C8224D0AC63E67F04AF177"]],[["0x307206E4706393EDDF7889536B347E8B92AF22F5243BE1CA7C778150C81050F6","0x2BDA30B751489970260D71EC50BFF9C8796A873F33F0C142CB20592DB3439206"],["0x1C6920851938F7B9C6421F22BE16EDA7279545035ABC86A3D0D60B152BEE1744","0x3CE4A1AA6C92610A5238F86654F2B659B68FBED10B01CF08BCD935F99D3436A0"]],[["0x34DF87E6EC06687C50277CDEC8C04E8A671C1A851BB2D30B7C37FC0D73EF2E61","0x0BB30B9597E66219A3009D0F3F3A8272E636E563437831AB75CA179B9E55C3A1"],["0x1C8BC691AEFB891FBC0096AB28899AC3F2F1671A913B9B12BF93838F08817661","0x04C4EAA14336C6262D7B68708B4A634336215136E15EE757FCE250E36032DA80"]],[["0x2906B3DBBD4D25B117E8927FD6C264EB7B7E04888B383CDB5F5D34B9A96BD777","0x38CEE0CD74EB2139276E90B3D07E992C5655B616E1E3873746E7C62C4B03BDF8"],["0x229575404FEA4A2322449F76E4EAF7FBE7B0664F92FEBAAB66417E13E8C33639","0x16A592CD1A7E63F0145731AF4A54CDC3C2A52C994B681D7B30DB8DE22897BE95"]],[["0x03CDEC8C09A85A37ABCBA8AF3DF67C8FB9DB3FBD8B440CC0121CC57B73338031","0x27917CC8BC25AAF121434D357457CA946B319ADB5E89E72F1B252EE427A68B12"],["0x1E0CB05CCEB1B2E0A18C6EFE154EF612B6C4F0C34C1A1B24047CD18C15E6FED7","0x30213179BEC96B4BEEFDF985F22F13AF7C86C5BA0A381C8D8D82BD096C591E81"]],[["0x34F26FD08029E0D9AAAAB87F9FF5C646295923E40841C6940ADF8FC52255D2BD","0x1E2744BB9B85D777DD84186C68E1B8B6194087A2F9F977115D884383D6C60492"],["0x3E345759166086B149E34452321137B151ED8029C130BE72FD26490AD575E1CC","0x051895D8E7430465D31F35A54D27EC47EB1ACB64967DA87C257B9A403A28471B"]],[["0x24EDC76106CC9FD5E9F4B0061B7A941FC9D5742FCA16023ACB9DEDAD428714F3","0x203F22863BC260EB740544CC37B5032C59B9B812D9E6954A9588CC52D18EAAB7"],["0x36A7EE0AF45C17565062E5F58A530A6D5092C917DA3A8E773A6FF77F84B6138C","0x2D73A5B1729FA564F0365196F2BCB09E6A6D3E371FC083409922254D5CC15822"]],[["0x20746D303FCEAC9E969BD97AC8018F5C21AD3A6A5498BF1AA48E1F8B7674FB56","0x1879E5AC048D944682AF19F39ACB3ACB32CEAB0890EB062276EE1EA22BDCBC47"],["0x2A9DA53DF04DB373FF5F225EAAD10EAC881E69046910EF1E6E35D904F8DF7989","0x38605946B1F6D8E44C098FE8426738879B91871FF690A180CB644824DFBFEF77"]],[["0x0D7D7A791865033E9D5206E93F975ABEEC72C17EF66F4732F10BF9F373EFDA29","0x3A8475939144889AAF20AABC5B5BE397C3EEB58B7E488FD32096E39AE07AECE1"],["0x3F1619B0582782A686E98E4D37F048A68BAE0E154BDE80DE82800AF3C1B219B5","0x1BBD4AAF12AF655C1CEBEE0343B23DB866EC3578F88D7660E21443031E4CB6C5"]]],"z_1":"0x24AFC95D474A1735ED396F9282FEE0896DD55CF1EB890455A4AA318A5DE6BC9B","z_2":"0x23CACDA36E3EB38A7DEE18341741574A9A7CD34235EC44AF4E9C702D08139A1E","delta":["0x3892194A10253B13040CDBDB06D7041A98C8BD85915F3FA86C3FCFDCF892972B","0x2547B519030B9E6FB6FBA7564C8796D6DDEDD10A513CC864EA1A92F741456046"],"challenge_polynomial_commitment":["0x38EB66F3D7BCB104FD232595FAE3415E1CD6E2E53299EDF9B6EC9B89D14EFBED","0x25885E52BAAA68E3AAB38FCF79DFD84B0CAAD72C7B80D1C88A960BE54D156CDA"]},"evals":{"w":[[["0x1AAC600A004ECC203548197D4A52201C2A6B714A40E0E7A6599C42071BA0B64E"],["0x295DAE220662E56C31CD0F4114DAFB7F3B26EDB32B243FF73CAC793B680BBC98"]],[["0x1FB6BA5E84F54C9E6B58AD0FF2CF7871D0F6A1259A9B7EA5696513D70F792EE9"],["0x1167FB86E0A767F617A9BE8C79DDEA91A320D934C9F3EA82C9BEADD3ED45A803"]],[["0x04081F2FF03AC73C982091710C502A563A3E9F0F4CBF01E5815E95F6F9908E3C"],["0x06C745DC78B76A40066D4FFD6570DF60B38E3DE9AEF2CE8893874470A2B40F34"]],[["0x21FD2872E4D523EB34CC8821E44D610BE5AB658C5335153FB324C5424BD5E39C"],["0x2BBA15002E2E6976D1C2E08262384A070F527687CC7362F88B1E500270F85311"]],[["0x2885EE442211B790A0469DC09A88D582F1B03876D0A0E5C4FA7E1E9C41F0CAD6"],["0x0FC9EFF24202C1525B3BD8A649A546FE0919B79FE74F2929A259C85FE4389274"]],[["0x27C2F0A90F8131A0A01345DFE8BFD0D46AFDAB339494E98F8180FE64F47BBAED"],["0x34290F6D004354AECBB0FDB8C9F4408BA4E66CA20B731DA49E1C272A0F49FED1"]],[["0x10031BF4BA20FD52BCC1F0BC9314ECCACB20F808C3ABC4B0AE10D0F34AE7415F"],["0x025482C008DA28B336EA6B7F3FA074E0CFFBB2970FFE45641A8F6173BFAAEA8E"]],[["0x18731BEA546562E3084ABBCCA37CB4180FC7E436C4C192E65C1E4DF988876B9A"],["0x27305D2E828FCED30849C6C484D42AB47A1E04983140B4D3ED6DD348FF6541D1"]],[["0x16EAAFA5F253B8145DA23E29E3F148228F004AC94DFBF1D1A6E2BDAC13F0243A"],["0x1DD9997D0C9BB2216DD196BF93BAE654762BD366EAADAF9D93FA7E0FDD2C686B"]],[["0x03B27F2D4CA27CFFA85BF23611EC4EB4538ADEF0AF51F3B929BBF1A06EA01B4D"],["0x1559C7935BB54AEEC76E88ED3D0DC513751CCC7A978EC38BD511F8A36A45F5F4"]],[["0x1AEE683C0A31C9639324C766413A695EF6080207788F0CFE1E8B906461EE02D7"],["0x19B661F462962466822DB23EB59B52E36CFAE6B81CA6EB493D83C8DA510954C1"]],[["0x16B0B9CC7229411CBFD41B8B2C1CC664CFF0307127A5543BDFD3B70A7D1303B8"],["0x35ED1A461BBB4B4E76A5178BDEB2FEF656B5DAF751B77AC5987F6C655CB254AE"]],[["0x3D1EEE3D808AADDC0BE4FCC872A14EB2205E3CD518135FC36B4135E2B495DC63"],["0x1A6141D716C1BC25E3E34E1E6977166DB61A2AB9FC0B527433B8C8533F0B8350"]],[["0x253CB23ADEAF3BB8A6265EE521672B6335108F36E50F0DFA7FF85514E43BE804"],["0x33F8C01352857DA832280581C1D8FC08541DF04A9D34FD2C21384A0C119971F0"]],[["0x0CC6BB9FB98DE35EB5065D6290C537B73ADDD9A39376432C1C3D16D04B86B43B"],["0x020B8721C6338CD40D165ACDA2236CD733EBA968501C2A6D6DBF769F05397CF8"]]],"coefficients":[[["0x075E70A6EB09C347A39DE6B653B93E3A39525342CE29FF0BA8E8405193A715F4"],["0x3D384C01278E45E9DDD0D287E09E15B4ED28EFEB2A6C65B027BA231D4D8521CF"]],[["0x284E70B4130B85794AAF5A90755EA1349B1733F6393F08A748BA4DB10201BE51"],["0x32DDF8B798BF8515806B8CDB436BF2EE1A1BF901B825E18207A0C27092C70B60"]],[["0x037FFBE8D00F727515235463DDB92C7126D4A2DF2B639395C8020FBC751C6932"],["0x3CC7E773558FDFC180E7182D79F8C0BC34C9AAD0BCFCE58BF9695AA4743BA020"]],[["0x297B228CEBE9EC1DE7EDA9A23740C8695E29D122FE30910C079D679579136268"],["0x30F37E2AFFEFCB873882338FF78930E9E8EC30DC374B215FDCBAFB701F0D031F"]],[["0x043B09B752507E3817A9D07F42600882D7BE63F4985383D70015835B63E63FCF"],["0x04BE1E127BF8E0B48E4AECD5CF892E03E940403835A0290BA037E1596FD11C1F"]],[["0x2D3E64390EA6C28329D7763879DC49D361F455F2C397D9C576213BE272CBCEB8"],["0x2575CF0CE36A0665466EF53D99EF47978519DF0E1E741BFA0A2AAA92AE28F34E"]],[["0x19CFE8F511E626C663881204D09ECD36DE2A2782EDF01CEEDD8919DD2D618C46"],["0x2BF860A6847505F7815636E2A7EE49EA14E96ACF735058F0818E995BFB1E1FAC"]],[["0x17002E23267A82EA6C479C76A94F2FD5A8F74ECD367E3A50B1AD9485ED1ED893"],["0x3CCDDB916F0D9835A07A434878DFADA5B1879D72561D5E049C56E38335BEAAA9"]],[["0x322B105AED5CEE674DA41B07F6975518EC775469AAA99EABC355EC63E79B4CC6"],["0x2B7A3D144E0FD6DE534CCE1EC8BB33784EBB427ED3E4A5242E624E55417E8974"]],[["0x0C6396F4515E0E4BA95273CA8264CF7575D360EAFC4D82AFB5F536FEA51170EB"],["0x2BBC6975D45A1125039BC31C8FD20064D026E39CFDB3A568C0D6EF70E7894F04"]],[["0x1465B0516F465C89432E30C2663795646EA5F75AEB1FE6EC70735B031C7A3D04"],["0x205E5225971E53B9E96C7874E76C53F8268E8FB3D261A78D51DB898B8D15C4F8"]],[["0x3972EF46D324C6A2986ACA4491EA9108309B66DB84AA0349EC61DAD5F7FC927B"],["0x208ED0DEAAD0AA70B801D4276B9D948AB0F2780A685340021562227C0E5D3842"]],[["0x1ACA1BB53F93585C5992CDF7D3DBF7E40AF793B175640359A336B3F43ED8625E"],["0x22D6944FFBFF776CC919587C29EC31969101298AE819A8FE246160DFBC85A833"]],[["0x3EE125023614DFB6AC50B497FB83ADB9BFBEA1BAC6F63775AB51118B6EFC1219"],["0x0CF6F808B57C8F0F006C45838DEE6599EE25DA34E0C4513B8B59716AD4D036C4"]],[["0x275606F2DEBBEBCF382AE313C3091825672C2C5B4CB5BCAFE5928B61A33030ED"],["0x32C7D2720B1E62BF9895FBB2CFD3404848729256F0221BEDE876A88BC7BC1DA1"]]],"z":[["0x3E12A601111A03C94ECD6AA25E28D13B9B18AC64FAB7A7E68D2E28E47A2D6341"],["0x23B9EF4F74278CC40548A6114D3C5E6F5010C182D78E1F9D4D6DEF32A7BB2E9A"]],"s":[[["0x2C0E196E3BD47E5A075D029F23398A5AC29B185D4E69C6AC7E1478604BEB2371"],["0x0F931EE8D04F727F050AFE787FCA0E20F76D555013852087A73415AFB9172BEF"]],[["0x0CF5FDA77D1F26681475243F5AFBE75E40BB90FE00D7BFF139584726DE890C53"],["0x03F9A68C367C11E0E812E9C2F4B4C6DE3250AFFB7EF62AAA9017552A90562E19"]],[["0x03761A6EBB7F5B6B6DE137786AC20B35F92999C02295F105C416993A6837E25D"],["0x31CAF89EF49984FA831C6CE6B85FFBA86298909E5A7F1AAE71C20F79B27DAC08"]],[["0x089E2CD7EC138CDF5F8F710E49162F022F1DC5539DEDBD48AD40D7B778AE49E1"],["0x3D698D10EBFD8E92DE2BC2CEE78693E9FA354A3F1625177193DC07A5F4E7A1E5"]],[["0x103E95D467CD0B7760624E64CDC904F8536D2BBF296B5AC0816316BA5B19B2C4"],["0x2A23CA116B11DD81158280317019A8D4FFBDE922F39D43F9FB0AA1E12B376EDE"]],[["0x2DCCE7B03FD627329C87CE04AAD6E04197D97D1BE02D83F1196BC7F5C30EDF0D"],["0x15ECA1B07F2A713A87026D4BD54B6B81233F1DA10D0A40C3D93ABCA2395114FF"]]],"generic_selector":[["0x210F39EFEACA36E7FD31C98151F00037785133015819FF1C31611AD6946C0E2F"],["0x29498E1939A23C94EF8CC81983CFDFDEF483776C8C3D9FD111C441FC9F1CB191"]],"poseidon_selector":[["0x27278C725A894278CA2313E411196CCC213B6970FE485FF0830C6064EC105D92"],["0x1D481A9F7AC0BB1FF991383F53A8BA48DBBA58EA208E09416641E881C8A908F5"]],"complete_add_selector":[["0x1C26682A1FD30CACE64C3348CD8D4FC27D5C700644579C541C260C3CEE769951"],["0x2056B7BC8C9AD24568ADEADBD459C8F38C9754B6D87907457EFD6266AFA7E022"]],"mul_selector":[["0x2AFF84946956B7472C140667D6328772C408A29597F8685F3DA5AD31CA085A4A"],["0x07FBA66C7DCDB7835AA316C4032A9CD953C70B9E440973411122160C0B99E32B"]],"emul_selector":[["0x08F2748B230106CD292E6B4B5D99ACBC061737EDA09256E7D23C38F698F08807"],["0x20B5338F891C30F3D889F82BA49A4725B4554599B922A4D30F0F29A03FD92A8E"]],"endomul_scalar_selector":[["0x053620098675E809EF44611E880A5487FF511128C79BDF01C7DD9DFBB5BA05E1"],["0x27245DD7AE861E5F01914C7D7BE6BCCA5C78CCDBA23571EE434EC66EE945F9DC"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x0ED90CB00CAFAF639FD14514D7D72B5A5381AD3A8ABCEB3F9A9288F03D99522B"}}},{"public_input":["0x15FF8D342C436D61D3CB5B714679C46ED98A20D3262A53287299AFDBBAE4366F","0x1B78635C4667C814D91E10671BB209F2B585E9491C03C72A0C9DC1A745BDD3A1","0x124050AB7C1C454E05270B451D72825BB24143E2DD97EEB397D21E73CDD8E7EF","0x0947D240D1C4C16ED5802F834314F858EBE0E1F270FC652FC1C2D9A9463A9E8B","0x3007B02203BDD9D1D57C93EAE9F5227785A4E2639A6A849B4FC1FCA71F6AA503","0x0000000000000000000000000000000055F707E6DDE50CC85F5D0F93BF3F4864","0x000000000000000000000000000000002CE8A99985E0E8400CB6028E676AEDB8","0x00000000000000000000000000000000E07F941C0910C26508F8AF5C60EFCC4E","0x00000000000000000000000000000000632E1C5DFCE01C212EA6F2763FCE653A","0x000000000000000000000000000000002D262F3D5E6A92F7291649859202920D","0x040E3BA8147B556360D1B12BDE5584AF71E61AD48A8EE2CA08E79C71523144DB","0x109443CCE392A5B9EA8768E4F7CE53229BE8727BE395AF70473D1E30DE023184","0x381B27F445A0AF0EDBC80D3886B8D32AB9C4B578C0F2F3AAE9C5FCFA10B6D772","0x00000000000000000000000000000000C0622E53735796172BA2A231E2F77BCB","0x00000000000000000000000000000000C7F286AE2BF0807944D56B5CCA3974A5","0x000000000000000000000000000000002C9D59BA6E0D6D33B54ECCDEABF679DE","0x00000000000000000000000000000000D6AC1A4CCFCB63D3A1AB9EDBEB0B91EE","0x000000000000000000000000000000005900E3F3255A1F0A4AF7B7E112A10F9C","0x000000000000000000000000000000004719B0CEC67080E3BB298A5B7F3E3138","0x00000000000000000000000000000000AAA1E60BE35B8F1A479179B7D6F4F24D","0x0000000000000000000000000000000012540194A3212279F88DC838261018B6","0x00000000000000000000000000000000EFB9D0662DE52E039601AF9755BD9F5A","0x000000000000000000000000000000005DD78F5E8D21BE6142A9F3028E812577","0x00000000000000000000000000000000F2B3CD9CC4942FFED3EC07D9EE9DC5E1","0x000000000000000000000000000000008D08CA76FF0A11EE5B8BC024AA96D72A","0x0000000000000000000000000000000083FCAF8196D6C6B56D36F6D3EE21A14B","0x00000000000000000000000000000000BE53D07449BC054E0FC286CFA286058D","0x00000000000000000000000000000000F673A71BA934AE6C3AD122E26BD934B3","0x00000000000000000000000000000000590044A68DCC17AB1D71E97AD7C3C9F0","0x0000000000000000000000000000000000000000000000000000000000000038","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x1B5F34F679CAA629B433F1CF94D6F9E5D41CB0AE7721040A162E13DF345C1345","0x3B7ED20763690F726F92DD90293F2BA2030F174E9843F504A4F2B7C91CD7C8CA"]],[["0x06AB054896DD706F85D606BEA5F88A500564EFF7206FDC10DB86D5238F685AF1","0x0AC1F792DE48DA8373CBCCAC8380B37298A584E166B09FA374F05BC6DE77D222"]],[["0x1111B87AB7C36B224362A32B8D1F48E356A0B30F1BAC343FCA5E88843764F41D","0x09FD2F65756F42BE1D5698AE31AB3FC9BEDF0269A9C552A284A17D766B28E569"]],[["0x3107E26670A7D24667DAE4F96707B2D0FA33E33B965E60352AF19B3AF640B87E","0x1287775CF2215D300A878C2C36826F8FEE44416D60140B35B304D217B5E9083E"]],[["0x1AA3DE3DB9947B12AD420D23F4CFF48FE838B9F145B6815D742EA77C30464962","0x3E7CDDC4117950E3CDF64E1681019B12B8AA2D316733F8640D39CA7DFAD7AFCC"]],[["0x3055094AAAC6E41FAAB2096DBFA2F3A724BC4142DE5B7558F306F018EEDD7AF8","0x3A437DAFB905C749D744FA6A895D9C06C61969F628219569F32121376E55A393"]],[["0x0659D02C6E166383F3F9DC6ACF1A4E08712FD39DBAD442216FA90A70FC0E1C87","0x2DCE575D4AA6FC33013DE90657E70E42CB130D50C6A09667D68B3DB934F2F1C6"]],[["0x22A070B0C8E2095D2FDA9129934D1FAD35AAEBDA12EE7C1C4A9459303EC227EA","0x2E8B6612A60D403E6EDB334C575FE2C8FA8B8B3A6341538996B1368F9CFF841F"]],[["0x0B28F6A7071B5F0BEC809AE39D4A6CC5D2825632AB8F660EEC7A47D19BDBEBDE","0x28BD8AB3CEC112955BEE0315601EC8B20324817FBF5EC54EE3D0EEB43719484C"]],[["0x0F5284B0DAD5356294656382B901DC08CBAFBBC395EC494953D38ABE0DFE4258","0x254B198F5884F297BE17E00E953053421889C10421B4900C140C931A8C72CF83"]],[["0x2E804BA6C2161722CCF1E2EF549776136758C67A987A0B999AE0CAFC97CE050E","0x27CCB60F16C7001C4A04DFB8CCBF474D216DB48ACCC3612988962F56FC2A2416"]],[["0x3C922B9C3F03880E31753EB15958E3B178E4E10F53396AD5280D46882F908CBB","0x331B9D20E121876127187CBE531CA1B7F9E85DC5E1504783DABB4BC65038CEF9"]],[["0x3C13B864E0F3A2C0C0671F0C8D3E45D85D838BC8C82B54AA3D5B5691235A8C09","0x3B0636003C20845A7FA9185ADDF172866A5C4B05E18B275E479D60243C5D1E85"]],[["0x26CE272FDE1FA4C9927C8BE5DA4A3FD7A4913B79DC59271B95BA4F5BF99B7AE7","0x2DEDC98AB2AA50DC2314CB39927880051FD8FEC917687230D86A5421B95A16C3"]],[["0x0D8A8BD1BD94A9E1BFFF37F4780942EB205B2B4EF2BB3872892139629F257E69","0x21CE106BB0216A0E91CAFC2CE84434ECE1919DD432987B00920690B5AEB978B4"]]],"z_comm":[["0x181A6B9D73E164227F635F63E8BB57A26303297E734381ED79BD3715096F3B8B","0x223DE600679E7ECA33F89BB39704B8E2B650BE6891D74F7A56E868F13C8308C5"]],"t_comm":[["0x1A7D3AE91B919A3F210CDD86A393785BD14891DEE776A87A247D5FFC608F74FF","0x39EB81EDAECBC8D879A116BF39E80CF0F888C4339F6EA5A32CED9DFD140A9AD4"],["0x39BEA1CD8C1C7C0234737425F4AEA0066DC7FF2E54A05B3CC6D8A435B8A85BA5","0x311A29D0065E8B76B6665B4D2E5C4BF5F01B216D1CF6F8CC9CF7B4BE3E82C7D9"],["0x38B460506443853C5474E1277E70579BFBCE390CA91C57B0C97D9F4D8F64CD82","0x0CB433A59A4CA0AEEAED01C0EE356A60C9D6A3E02DFEA941DA6945F3C8EC55AC"],["0x39E4D3585342F44793A0023006507EDF65852A4A3E32AFB65339A255DAB43855","0x04BD8541854019CBF4F044903B97C7FE028F51F888EC9E8F6B022FAE93E7D88D"],["0x10B2D58A9C7F13B278B592999B41C10E80E995A042E120842DF430F77AFCB1AD","0x2A69CBA81330E1C23A7FDC4B14520D421F8ABEB5E5CD330F54C0C67D1D76ABF4"],["0x0DAC667C6901F37EFE66C72975DE5C871EAE07376359DA86D361139C62E60225","0x0A8F6A795B0EC98D0D48E526D29021EDEC40F1D8CFCA917CF7A1BC4944A276CA"],["0x2C939C6E333E74BAD4DEEDF3D872D8A7C60D73402D731F344AFEC0192DD92653","0x372504381673E2F2331FC4CEF3C271543ADE9CBB1EC3E27471229051DA70F414"]],"lookup":null},"openings":{"proof":{"lr":[[["0x122DBD0466759CB6C3D38C281E7A0B4C3ED14CB85420B5D8115409E72DE0A1ED","0x29A99DCCD377F1A333F8C3B615944A05FB5C2865EADBA94D2AE5C8724E1B76AB"],["0x00C0038A2ED8C1F3F4E4FD6C2EA456CAF8214578306EB0B4E222DF4E442DC334","0x15AE825E0A3E59FE0724474E9418260C3958AECD9CBD6F5971DAB46DE85BE4BD"]],[["0x20C6BA7B8A44C4CFABCF04C6BF8D8A2618A874FE749C1BAC852F979CB542AFAA","0x2D497D5D7F108C4CFE117D262FB83997086263A5B2BC638DCC336B4C36918A29"],["0x3BEF01FF61E4687A58FD938314980030C98C18B12A3226DDC5CACF8391DD72B1","0x3E4E08597386E9A54E688987CC7C8B6519BDAEF903BFD348F050FFACCCA1EFBE"]],[["0x3CC1341398164D2D268EFCC9A3D74CB0FDC0F7EE5E1F9466F60C330BD3623A87","0x3DAB49368734ECEA16D07B821038EFD008E9FF2B523B2B08AB09E52A40E80F4E"],["0x361DEFDCF4EBB67722E39B0D2BB72E769A8D8D4B87145076036B4B296AE72EDA","0x0A04C7A5016F6688645EAAEF9AF8ACB58AA2A7880EC8CCEF466DAEF4CD6CACB7"]],[["0x3BF8C29387D64DFD415E292732847886950E576D3838BE86AB05B40C94C2CCB3","0x1BF04451C18769C418922FE0AE144713A82FC66E3EC50304FC8FE04D2FE67530"],["0x198DAF1A3A4692A9A4A6ACF087EA7A2137E275CC71D22C60A34BF0C528D12294","0x0CBF89BB169453DF967D96F5DCCAA17EEAA4D6CE74728986268BA5138148D8F3"]],[["0x0CC0D0C3218DEBC29CAB6E95574B8B2BC66BC61292900F7F78EC46667CAD154A","0x3BDCAC3E07FD2F2090510D6162FF9914759253C11EFB69FE601026BE3366F4D3"],["0x3BAF7BDA4F1165B459D98EACB2F8AB3C9B44E66D12FC2FF7F68EB869E225E3D5","0x3ECF2C051D071E979C8A18F5389D39196C1B26F8AF85C2D7E9EC71AD9F2416EF"]],[["0x1F8ED21F778E24144DDB45BC0F48B2D53237D0E694E6040B976C7E86BA667941","0x2EF7927ACA1DEA2197ACA4F16B0337661863722ECBE622D6BCD80230C5104307"],["0x3D3127EE1E98E662AD495E10455FB625035E620C90287CA338BC4162DDA0D135","0x06E3AEEE6701E32150AB118D36EC425E635E1A42864C662D386A8FC19125FF05"]],[["0x12BC6515A340B7573DB5ED731475455E682566107F9FFE529F9703B073693A13","0x27A1EC144BD04A52A11587E7E0C8377EE85127D6CCD158197CF4A52476B46FB7"],["0x0E6E25800078877A818CA5B3B4F7259A8AB76A0415E44BCECF91E8CC3ADDD24D","0x15590EE7A51E9764FD57F5B705C4EDA0787DF60EEFC1BC0102FEDD9A64F67DD4"]],[["0x38B9447E8BCADFCCAC84AC1D9CC80EB56399B1ADB73F148B44AFCB9501D72684","0x2A56160BC1EE0EEE8C08C4C5EC4FB6B2098C3699F507F9266657A7205C323FAF"],["0x278B0A4264F78CFF8E7D413ED1F324896237ECEA2E159997CD637277FDA54D04","0x385958BF3C5C8C107E21CCE4CB3A197EC5AFF91C85344A754A731FEA4232CB17"]],[["0x14041AF6D51FF476FB6D778778D38F8350F525C45EE55AA7A7615696762F9EB1","0x384018A31EF8B80FAAFF4BACC52810124D9D87AA35F6527494C043AF490170BD"],["0x174554ED69CF45B78C3A1CDD07AA83569BAFD2DFD292478491157A0B62B19B71","0x33C9FB3A4042A6BC668329F1E8B281211869641B66B52252B94DCFEF2903D1E5"]],[["0x22643B78753F49B35CDA722EEB861776D803DC4BCADB603B9746F2ECF98A681E","0x3CF90315B8ADDFDA608957AC67885BC2553BDAF6ADCAF82C81C171D1AC201BBD"],["0x210BC3EF6B4ED7D344CD501FBF779AA27A50EFCEC49E1CF96C94160779842158","0x3A534F5DC58412244960F95962E95FC350CE8CB8DE9568F9CF0E702B5CBD999D"]],[["0x2721E8F9D4E4C55D103F8B8B6BFC3E6A8566BEC768978916F309E7EEA51CDC5F","0x0047BC2A72EC7FD815CA14078A0FB7A8620C65766C3F87FA50045C80BDE857CD"],["0x0E7B8A7F4DCE8F3C5E9EFA82DD88E12FBF46D6617D9720E303FC2B060C29E74E","0x1D5FD4E4FD457492229A7BCF8E7ED7B0D70BF7349E1F7C3742AD4862E51A7833"]],[["0x1DD2CED5FD77DEBC24EB8286F041101A9BFD706DBA34F6DDA301236978E9080F","0x0CDBA536420BD4A36379F81DB5130DF2A3AC3730D7A0028CB304739E92F8D1CC"],["0x2BA3ADD2A8639A9A5822ABE4200621F0AC79FDE03D4C0D763C8F64D8B0C986E8","0x32A790F5A69093C4BFA1C469FB4E7B5A86B3C2B33A6233D66ABFBC371F55EED0"]],[["0x09F45743E9A98EE4AC525451BAA1B33B9DCAA8089433F3E6553A7C33BD1A66EA","0x01911DCE97DEDC4171DD5F199872EF68595602EF9B55202E786A503C4A9EA8E9"],["0x1FACCC9CDC0040EB4FBC2425F55CE152710B1FD0125E46252B2BBC1D9D919BEC","0x2DE2CB75D9E635BFC4549C0713ED9B9C89AE9A63C4E75503711CDD5C536AABE5"]],[["0x091053DFB955239F7E4F4B7F93D4E28B8989A9E36E7E7F43B2499C01B838F04B","0x3DB2DB7DA008B8EC9CDD35E311843E0C3621141420019A9948F2E3DE6D4F10AC"],["0x014C2319126F2BAB7BB905235FE6557066D4A82AF7DD20D6ABF9E239205C428C","0x09DBB0FC9C3DD6AB39547321123BAF7E4130EFB25AC287F13EDCB98DC9DB185D"]],[["0x080AEF014E74C8A4EF46BEF29A4EF89FA532DD64C831B2735DB6BAB8DA46FD6E","0x2E66D0E733556CDB5C5A8D725CC12B0C9D93400FB069843C5B2A64B50E9D4F69"],["0x255486456556CDE9E55C3B39193F5CC35F072BD9A5A57C40A160654CAEEA9237","0x1790788F5F2023DB7A2F3FB79373B089D7E328137E4188EC85BF59BD0DB71F70"]]],"z_1":"0x162817AE9A979D89B6659AC917E6A3B209979F2336D405B4D8ACDE41522D6394","z_2":"0x25B9A2A6EB93C56981D53708FDA42F08E804A5F6834F918D41799135C3C4D2C4","delta":["0x27E11E08C86D21AF85EDAF94FB35BF098B61E938C573F6EF8AA51C3B5EA7163B","0x0B6CC52A2E68E783E7541799FA63E281A6A5B2C8A9160806D6FEBD43C8AECB4C"],"challenge_polynomial_commitment":["0x1566CCD9B99C9D53E3EAB43D40F2E8C92051456AAD7DB2696018489E990DE678","0x0F5DCF74E465BDCCA2211787E91583B98C8A98DA622EED9F1093787DE9EB2EB0"]},"evals":{"w":[[["0x089BB921D73BB4EDA8DFB442CC4A2AC9830AC89E13257F6823C5C1E9A7CE23D9"],["0x14E399A4F2A4AFC04B93997C5D836E70CEA7969390EC57AB68DE2530FE967E28"]],[["0x0CD21F51F9E22C4E234006235D406A1A8E1A1987F9CD4BAC4F3C0377842CEF54"],["0x0B308B35511E28B13D2C9E290AF6697E0118C0F3295128EEA63560CBA5A48475"]],[["0x0AB92108AE4E3F742C711CB2F30BDBFE05CCE9166EADCC79CA1A9E1FFF79EFD2"],["0x3A9A98893CC315C9F7BF5D2450A7B8E67944DDF716F3FCC0BCC3F245EA0D68DB"]],[["0x15D57B92A6D5CBFDC5E1722CBBE8D523E51F0BE4001E13D9CFE57215D48C62AF"],["0x30295554B60121591EB6AD82BEBFF6E81EC1475642967C7F7FDFC66A9EF93E12"]],[["0x26CA7F9929CDD42BA060DCF1AB9212F5F6D6EBBE55C8F573BD17D51E3FDD0383"],["0x04E959136E44A47234B66A27FF216756859468E85460B33DDDC04CD02AE8275C"]],[["0x15AB12BB17A390E13E4818E878F6A7746A1F6F2B04403B1D714553CA08BAB8F2"],["0x24D624D4406DA04434EA1D35ED4E200BD22912BF34EB1DFADE7BAC6D11466239"]],[["0x3EA50770EB6EC788C1F0731F637BB4B881FEF360AE2629B17CF68360B582635B"],["0x2E777620CD384B381331130C93D06C71A006C2326290A597E9705D18AFD56A71"]],[["0x3E5A63090D72F7BD62B860F172836C603045D178FA257EC54BB9529DDE5DD71F"],["0x1087FA6E2810E73310EF6EB84B08298E9C80FB6708C50C8E785DBF3D9AC88C45"]],[["0x0AF2D52B59C5FD42E4ADD0A62BC4C90840536F1E5341DC86FA24473E524FB73D"],["0x1E139F8E33361DA8F0AC7CBE025D9CAA49F0626CFFF57851B849166F52B210C9"]],[["0x1AB1B6FB5F9D6FF28C2D3A7DC5649F75FC0B11381D46922A5FDAF3AB5A06FC4E"],["0x21FA5B002CFFDF224DE8E7E826CDB6F57C56F992C1A5F27126712E3B419C1F22"]],[["0x2D1634E5D407D64B5AD3C0D21F1FF84DAE4829DFFC62C5153C31BD5CC8EF3C08"],["0x08247972A51DA87332E0E3107DB58770E72F3E7F528EFB3EDA1A7F7DD86E3C16"]],[["0x26CEB0EB3C0BE2C453B1BA505F2E7895701C3470C90948978A6CC6CFC6CEEA51"],["0x1F1D05EDAD75A40F99EB566ECB0D61BB1B7ED7A9A0FA903AA90F5FD55274CF3D"]],[["0x255A3386D355DA2017D8B7F99096CD3B28ED043DE081F0112A03E9B9438D2DF4"],["0x0098FDF5E7BB9C2CBA0961A5B34F7F9FA2F797EC0C66A58FF2A56263FBD7D00F"]],[["0x02AE3E51DA91D0957B01183D7C2EA23E508850C72548F2243F79DFA874D42FF6"],["0x39A3F7B09262E84D605B25E94E86D29D1AA4A5AF04A282378A0A09C787826895"]],[["0x3484F68EF2DFBA4ADFFA04F0F9AF4C6D8DD504AF2B3141872FE645C180F175BA"],["0x092636B204C8FCC70881C36C3020B2D696F98C45DE0430615D02BF07ABC1F369"]]],"coefficients":[[["0x07F51968DA4DE9C30D4AB1E894801B049642C9C6E8ACF9F8D3614FEF3D33E9FC"],["0x2FC7D638648C8DB6E42637A648DFE6914D1D5AB5898CF2259DC29DD1A4D66DAD"]],[["0x2A264D3DFA3B79BEA22D2FF9A4DF490C97F7272EFCC3E4D98C5A96959DF2EBE5"],["0x39FD10FFDE5D6ADBC778D16708C89E81A7768C125ADFC76A8815A0B96C69B4FF"]],[["0x35B77C446801F7F3A590564F579BC756DB8B9A217F8A77C766A33AEF3981D1BA"],["0x13C292D92624771D9D4978A30ED32EFA2761EDC609AB9F31B75D324056DC3FDB"]],[["0x3604C73AAE330B95F3CA1B90DBABBD4B4AA9BC0DC63B2C8BC9D6AE388F3C08BB"],["0x0645E80AB3BB0B145B21358926E0B413F19E382F2F893F9DCFE32499BC082B76"]],[["0x0770641B4BC9ECE74EF884959335FFC5DF0AF4F62A03DA3ACED4DD41510A1B91"],["0x0C2F7C568E1C188A8511B9A9F57F8101E1706B4DA8D7F3B502964641F3AC0FBB"]],[["0x2657505A5A4BCFF60B9C4BC74C2468D305DF53A746B12100368013909840EA07"],["0x14DD2F58DA9E1E8D90EA4B415A86B74DF6E89C85A0DB79051199CBF65F12D5F0"]],[["0x22802063C81838DE16BB4D76BB28003BE0007AEFE4AF229FD85149D547DFF99C"],["0x12DBFF92DF82043B64D94E78DB8D20299D96267DA6238D9D05549E4DC09316A9"]],[["0x343FD6EE5A2748F339E556CDDB550D00133597E9281FB76C880E4B91CFF0DABC"],["0x3422AAF117A6D2D0171CE67E0CD0C995C288A6CA1AF4E3DF1101CA063D7B69B4"]],[["0x093E472DE6512A99826C16640223BE4332AD88136F4077045DBD572B51559C28"],["0x359AC2F2ECB35576C1AFE8AB12257E0271029415445B83D8327A325D712F3D64"]],[["0x02EA0531BF7BB6DF243D949289FB173E54CD28953D2C75A74F2953CD9992D0A6"],["0x31BBC703E01D87435765D82B9C9EEA3003A9A8C26A3307590E9293DA75AD8730"]],[["0x0AD25BC34D4D75456B044C17B6D730F7A9F56D4228EC85E940AA4CB9B997145A"],["0x2F8BB6F42760253EC82A6AB1EF384B4E9831523C788976E2C50C013B338589F7"]],[["0x1ECAEB43236A94DBE18812F797F9055B6D1CC79BAF67D73123A8974D098BE982"],["0x3E2008519EF8CF0CD707D5BEB0D49965A27774F68CA6502DF0F9732577066212"]],[["0x0837860CF91564DFE2243B4A767D9925605C13829601F854F45A5BBC0B177C54"],["0x388B405A3AE7CC8D102BA91603C062B52E7173CE34AA3DB63BB84FE1864F0E8F"]],[["0x09BB9C55EAA3754F1D61F942AD2B107C3BB6C3E3C0CBB43E83C0CF5A44FF29A2"],["0x27B3D4211DBD7925DB1635AA9EE97EB47F37879A43B627A890D90019814D323B"]],[["0x2ADA287D9D2D675E64A742A0DC7433733156AE14996419DE1226D391B77A891A"],["0x0CE6140EA7537CCD6ACDBD10913E7F3820B62896D9BA8EECB406C09AED04BEC9"]]],"z":[["0x349A4CDAA8629462F327A63FF98A22A78A3F2FE8379BF976D2F372811ADB54AC"],["0x09C864640D6CC565F606790FCD785EFDF4C48BBB994B9E9CAE17376CF52A10EA"]],"s":[[["0x1BF669BCD1A7D8F6EE45FCEB365EA15446A969A171A8A405815F46493E567B15"],["0x3F20B3AF1DEF357FC668CCAD3E0DBF4C97F29601D0B403986F336CF5B92B66F1"]],[["0x2255A613993CB41437EBD93DEEE4FCB42B081FB151F3090DCEA11627901298E2"],["0x1E81FA6CC9F3E84C8C502762A77E154BFB697A473BC849892D68564A6659CC4B"]],[["0x1A6BCA5774D21531045D17C8F8A004024C1B0D3378A757672169A0420E821A59"],["0x337A0A900EBF78F9DB51D88B89C870D7C071EB487782A61E887C88CCF7431D8C"]],[["0x33C205071134F30B68EF0027F75448BFF4D1571CE14B2846D8992139DE3D1FA9"],["0x08E4D79B0BB1605CDACA3FC4BA62B636E22CA25D5B5F865C2F397D50039D1F3B"]],[["0x12CDDD09369B5AB520C3441976220D30AD726099DAC9B56D3186645D9BB4E093"],["0x096A497C72C228BFC98F4FE151A1F57ECB3E5ED3D657194DB92C2E60D468C835"]],[["0x34043D0235961DF96F7EB7C22BD214AC67ED22F1B1D2DF00EFFD47FF8B645A3F"],["0x37A13F7869CA43970BA512CEDD67681087088FDA6B968278F6AC90D4A72A179C"]]],"generic_selector":[["0x168C4894D088F2D35206F03E30FCCD2B081927A7DF3CCA69CA3A793A13DCE901"],["0x3AB0B3D6CED1EA023CC188C785B0C0E7BE2BF1E7E50939369166BB5F4167706E"]],"poseidon_selector":[["0x3ED8D213ED0232017C72F4B60CED24E762E1735D59E6F7041E1D4718EB6A76B9"],["0x12112110344B318C6147DDBD60176F0C1812225C2E9005E685539999FA385E3C"]],"complete_add_selector":[["0x338838047BEA23AC2E0FA241DB562BF036C54F73858A58698A6A0E8C481A3F34"],["0x253EE853C1D0F53CE80010F0734C8CEB9253B1C98F817E8893D86CEA7F9E8ACB"]],"mul_selector":[["0x2C679835D12255C2759E7E27FE65F545EB78FF2EA4031CDE79E25103280BE8FC"],["0x3C5BDF2ADF5B6B196B0EF561E39B3A56F693E50F9E1B4FCA08F0A43B97D23116"]],"emul_selector":[["0x18CB01ACCE94A2D95A3E6742D1C181C7B9257D856C9405C96DD5A5BDD65B30B4"],["0x387D0ACCC52DE9AF86661D1F57A5BC0BE26947F1F422F453AF55DA3102994EF3"]],"endomul_scalar_selector":[["0x1833F6FB37A784FDDF890648EB26EE032CB64C881AB9E8661C6B6B3265941F9C"],["0x200BA0AA1DB637FD3D585A4A06EEA6176F62ED6B48C78AFBD1DC66903F37E7E0"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x39715C3C3B313A2C2AA52AD949DE6ABF5C79D5083980FE2A9AF952F11134CD94"}}},{"public_input":["0x0D2589B8DC9C67073665616117EAE2068E77D4B6490EBB42111D380706BDF43C","0x1CEEDCA6A1E83B417BEBE37AD31307E3B05E5C01A5DEC0ED2F450F80ABA2DE56","0x1E6D3F868B7778E5E8F0EAEF437E7866AD3425327C9626921E67F532949211B4","0x0D6F72037792F71A739BB33E7D799A07D7A51E558D314EDC704DB9FB37F5C9FA","0x3679AD8E35DF0924982C6E08115E5312C1A0103F945B65DB8C5A1F233F69BB71","0x000000000000000000000000000000000D9371B10D8C80149232B931AF0A674E","0x00000000000000000000000000000000F2D98D37DAA0401AEDEE0A29A6C335BE","0x000000000000000000000000000000006DA928793B1B21DE7F8A8CB8A1AB05F7","0x00000000000000000000000000000000EC9D1B5822470CDE0EA6C756AB9CEC3E","0x00000000000000000000000000000000BC014EF9E9C8B91D328A20805E4AA203","0x15B982A3BA57F53A8F601C595FACF45B565BCFB1FEA3B43C1E97F75EADD44900","0x2510A5669C5B4CF04709C6A1436FA9BCEF05025113624C13FDB503403D92927B","0x1E08C37B4A108DD4A4C7C59D710C73B7DA565E45293420F37AFF587C2AF96AF6","0x000000000000000000000000000000009E21BBBCF0221A92776FDF21F824BD8B","0x000000000000000000000000000000006B9020650602E262C6109D392DEE80AA","0x0000000000000000000000000000000082A274D40BC0165B6988A3FF1D71012E","0x00000000000000000000000000000000E7A05A7D9558437EE5A8700E0F2FE6CE","0x000000000000000000000000000000000C26951BA048455E6A894B917F6C4085","0x000000000000000000000000000000009C50F9C2637E5872E5B646CC29156AA4","0x00000000000000000000000000000000E3838997088C9EF15E72DCD622179135","0x00000000000000000000000000000000956C3EC76512F51AC8A806D693EB037D","0x000000000000000000000000000000007EA360F4AA70F2242A9D8FA39B273693","0x00000000000000000000000000000000034AF92B8C8F4B3BFC3E725C6BECDD48","0x0000000000000000000000000000000023069CA01CF9EAD66D680C8BFE3D72CD","0x000000000000000000000000000000000DE828406321DC4E5B6199166A65F9FA","0x00000000000000000000000000000000FCB8B79AFC4F134093AF0194269E35B3","0x0000000000000000000000000000000079194FC119574A65B4DD4B5EA17BCE8D","0x00000000000000000000000000000000668F17A7EE6FB2DDB4BEBCDD77D8F27E","0x000000000000000000000000000000009EC48CB1F0B153ADB9743C21A28CBB96","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x2315074FA662770432104148BCA51827FCA718FC0B658A1F3768EFB9CECC6EF2","0x083BA5F1DFDB8F766B34B95520DA1998FBD73F34665CDEA5C2BD64E50BF71386"]],[["0x39275C5AA5B9364408A4BEE0EC7AF7EB307A82A68A6B55DE9849A74E9FAE5015","0x2515A663F62607C7EC050B78501EA8E05302D787FA35D177299CF4A49DCFA4F8"]],[["0x1135FE9D10865E18648703A2FABB0EFDCC2FE7E812E228ACA0B934EA1AD7B301","0x2D3EF24C39119F2575DE80FF8710EA570E8E28813E951D09254C7A2ACA708427"]],[["0x332528C377D1ED1557E509BE3786C15C09259F30F593E41B5B98AC3E2A902190","0x0163612F236AF7F761496ECD107B035B0DC5C50613E9233DA3B0EE0EC83602C0"]],[["0x15772BC2C77BA58F944F44AD6825BF6D30DB8C0D2885E6BDC7A311D11F57CC31","0x23DCC40B4D09A81CEFE553CB24464E36173D7514C1D9B6A29E21321E6E706912"]],[["0x21A61E93A7EB3D0EF066E3B3601EB29883A3F3C7A784811BF1ADB706D797AD9E","0x3C6EA8F54EE8BAD0D9FB80905C11F76A3E52463F20E58CE179762FC96A92C8F9"]],[["0x1698DAB5192A6394C300A90E44275BA6B3B6393CDD9209398FBD579EFB8BB03E","0x04249AEACF911143A6EA878EF52FF46DD89F6ADFF2853E1D29F87EEACDCE41DA"]],[["0x040B7A154CADAB8A477B712EFA1F9A82D9961FCB100C738347FD60F822385A16","0x19507041A106E6AEEA009B8A556351AB3A9E1A42B89F3102043180C644B98775"]],[["0x32641C548D1A11070DBB867B662C178E27C0E112CC9E30A384B44397F6BA11D1","0x28E6015EBF2FC21B3F39ECAB552B2275D75B4C2BD48DD8F4FAA16915132C2309"]],[["0x2D86F4AABD67F00700FA8B4CE1310B379A62F5E7533563FDB30DE9A8B0D322FE","0x181CD2B17656AA4E628E10A36E4A3F11C9786A209DB265F94152674A00845FBD"]],[["0x31DDC108A70B4ECC8757EBD6F7F9EB5A5F3843302266125AAA7088F17F6784B9","0x2DB4D4150A5F625F487E1BE8F6F136CE93E4857B4F359C02C82FAAFA9C39315F"]],[["0x0D768099485A99829F1FC721264A5C9AED8F0CAD80BC7285DBFA3B9604B63E36","0x0D2ADBCC661AC7293EFDFFC2FD3FD8C803CABE8D255171F6F56F3D9A14D68CF7"]],[["0x25DCE4BA23E261DBEC5D77E380978766708CED28EFCF6B48353825413458A092","0x069BA14997779B20A79494CCB272D076EB688C5C48487482B3262C4ED4BB54C7"]],[["0x25806AD4C62473CE2EB2394E06B19865EE83630BEE1B0803166CA4F36F49119B","0x1496F4B7D0B799A61B7F93E4EE1F975E65C96B49322B92975BE659ECB31CD13A"]],[["0x2260484A4FDB70B2E62ED89A71C9B090BEAA79D6AA21E906CDB1FA672171D504","0x2D82870A18631152167637068571BF57EE900F42C3B70E1AD863503D5C849C83"]]],"z_comm":[["0x25DF4EF47E61874859123D5D6D75A90AECD1605E2CDD3F52A9A672EAD20115B1","0x230555AFECBB8C18CDFAF3BB4783F2666344C3E4E9F4D5408DA440D518212DAC"]],"t_comm":[["0x3C6E9F2B4A17E6A25F9EB087D48152D1C2DD13C37D7518D93C820A217C7A47E0","0x12C937F933AD85FB855BFB580B4BDE7E03C41F007B28CB8A7A73E8D17B6DD33E"],["0x1074971AA185C17DC8D786B097980D3316882C129EC6EC38B295D13C9609BD9C","0x2B5D16BC5E61D1DA282008740FD236C59B5BFF33C6F6E1D60F22B0E6E4061268"],["0x185440C14E5C2D9CAAB3AFB15DF16D6C5EF6D86F5F1B6011ECDE1B17DB8902CA","0x2E2092E9D19EC26CF972804135FC238C05E2B71CA29D06A02A620BB981C70D0A"],["0x3ED0B265FD56F58BC98A86F2648647FF6C11859C7883789B0B31702E7368DBC9","0x234AEE0EC42ED8CF6A688322C47FFFDCF8161A863B528AA76C6ABDE973902A4C"],["0x2164BF08210F2995E1E7D3D60A0FA8B6A95D63DA6F8B01A35789BAB2DD42A8D2","0x3EA885EA6019909DCB187376F87D87E902CACFE00EC03595F0E79D73962EFD5D"],["0x09DBEB07AAF18BB511280158226BFDE8FFB8F8E2B55CE3BE08090006C4503FB7","0x3B48F233CF8DF51C6C19D7621454F979E9869F86CB108A6C53570755BCB91B06"],["0x1455B4908C83895AC2DB4CBE04DD5901A20C06589F43DB54C737515F25BEEC4D","0x0A1DB4981D3195DC8C9434BFD9E424ACB8168B54F250D932D1CDA82ECC71A577"]],"lookup":null},"openings":{"proof":{"lr":[[["0x162F81A4CDE0282D72524990C344B5AA1D481A0C68D2C94FFF68CD1C59274573","0x2CDCC22216A93DB51152EE08E22EFDA5D401DE9D744D8F8608A653A5C746EE9D"],["0x17B52462024F4A5B7E24AB017DAD84ED06A883AEB7AC1AD36EBEDF2546D0932A","0x2A31F19B0319483B8EEC74F343100FD6E92D465635970D0EB003986AD9B37742"]],[["0x25BC2841E1940DAA8A16C6A36740814699EB47C963DD117ECCA0B1FE5659440F","0x36D53CF24F015A8C21AB8AADAED36E146D487A843D9D2606BC66744DD1B7C042"],["0x0846148B53053A66BD742D2A7949E5D73DF3DEACC7F08B22032A940DF01993C9","0x25C74C24EC7BA1EF923C03115F89D89207F326373538CE0585A82402B2A0FBD1"]],[["0x2C901957498D014D3DDFCC92B55C29647ED82B34E6D5BC22EC350AB702C56355","0x2C16E7C75038B15CDBB9769054D7388FD7EA8018F7C2A7C2189610F29A5D9E83"],["0x182A22EDFBFB314B4FF31C681BEB4C98E087360C001A66E32205DAC905543DB4","0x32BA4650D51BE2D0EB8E2CBABEA64CF70EFC259BAF3E622A4E7F7E91EC5B412A"]],[["0x09F8BB720DF326643147B3729E6E8AB5E56E4976F0A155E950B121693717555E","0x38D552CBE3E9223DDC0BDC8B3240BD6743845225DEDA277F19AABFF722BBD4C9"],["0x19CAF67F1D3651277CD79635B8841D18F89276BD33E9D84DC20C585204EF6974","0x241DB68F255D2F83440D6AC96360CE8633774CC439BC02B0D0C1DFE9CE921C64"]],[["0x2A9D20C3D3C95A081287677D572B2EDCC26C600E42922CC9FB45762AC486E412","0x3EE91098FA890F027E699EE53D947573723E898C8723720715DC4570998FB3C3"],["0x3E6ECC0888B200437511320160AF25C0385293B8FC10A5AE77A1756158FF069B","0x03CB00818B539C9EE88953102BC00711AE749C1A18F26AC75AF6625B72D9BC54"]],[["0x1EB298C775ECED51C7CD1A4DCD7422EA5426232867FFB9237410A3FF8680F5BA","0x3C7815017E8DF85A4753C12C472B1F0CB1D48F46AACF469BBF48BB1E778C347D"],["0x19928C8E8E89AC647221EA69A9663E8E0DEA2D28A15300640E983B85BDE54D66","0x19AE506DEE789A7E0D38A7F0CDDC5A8295DD179BD5AC2C846F45A2E70321DC14"]],[["0x23365CB79B40373D18CE6DF0309157E37E5138A4156A3169D93B9661F2CB6894","0x3F649FC61EB58C9A75D9C519CBA0CE8BFD0BD7D07C7CE07AAEEFFDF9B9680A70"],["0x0C8ACD3B55C736E3BCFFF9A7D833FFA0B2B299C8AA91DAFF1547AA01575A2A78","0x1559DEB79914A38879329B881420101EF98B656071A64DF58E015AD30B1C72D5"]],[["0x111D3C6BA3C4868DA559DDE002C17A5C6EA771DE9D45C8460317791FF20E0E5E","0x300EE742792E5B10286A6CBA35D9E1DE5FA3BC952C83FD531F84CEBC6E1DF144"],["0x056057AD2853222093C61AF8EABB39835C87C01C3152A6787A9D87C72D249D82","0x1D88BF26DE6F951C9D85E8EEDFD583DD69E4068236497BD0D402C453442E5771"]],[["0x0B2EAA3615FE101CD5DA140697774D2E774DEF28C6E9782A6B451DCF6D821A9F","0x29B1696B92FDFB4F44EF70BE72AE984FE0D1A80A262F81EE4F3FB3C5D4B3EA29"],["0x1C4ECFB1050378524BF84675F677CF89E55D7A5BAF06569538986503F0BF12A3","0x1CDE5E148F70FB14DE0298B9E611649FE7DE46221F079D92AEBF3D7777129B50"]],[["0x3CA14419C935E74E9B900EF0193C97BEEE29C447D72097CF7D4D41F699A8AE22","0x156E84FA55C62B679F7C6432E8207BB23903BFBC59D51AE9BD21B9AFAEBB6868"],["0x062656437804D02854D31B34B68A2F51F56DE571CA29D5D4BD6914CF6FBBE804","0x0EAC1ACFED4794FF47C4A9B7AE29C32268123DC2C68CE67AC5F90098AEBBD8DA"]],[["0x27EE4D54D340AB2B0C8C03E08373CB748D512A8E3225DEFD57E6B93BD3C2E3B3","0x2F88343F4DD02D5C307DDF44A8DC2041275986F1981CE16420758A8CD2E2B09A"],["0x0E3D8AC714B0B66CE51282CFB338B3DDC084CA98DD51789B32B8A59BE6A9967B","0x32275255C2A68656CB0361BA68A16FE558D4F512E68C8C6D4D2EEC8900E60D3D"]],[["0x2E5E08600FCF4D4E18DDAD1D60834D9E682EAD155FF82F911B3A1972B336EE81","0x39E59D0916B9A7644B201E3945E322888EA988E2D31CDA115856C3C7145DFD8B"],["0x2175A825813F1B51D0290695F6A3C188789C81CD629DC1D1CE027A8E6DFA0D01","0x1343031ABE0EB1B62C6632E6BEA21530DC8398E9722C63DEA5FB93FDBC6F6CA2"]],[["0x25F089A3A6D34178806EE3C05E36EF886202820A57DEE9047A58ECF13155A5CD","0x20E5BD7751AC54BAFD7ED9C2214E2430AAF5A85EE938A1F858AC129499C08EFF"],["0x13CEA327E8AD757C0F68305E2F8E979060ABAB62B1C6359BFE1168F5C44F85AD","0x1825181058A90749CABCB7D619B030F746FB190BE1A1369130B83100811A7FBE"]],[["0x06BBA8C756FE2D0868B8BE2EFA69FB3CBE1C40394E8FA45FBA89CEFBCC026030","0x33D969E8C1F9D61765E2E292C0F4F1C2FF3D1D9C17A2AFC23C823649FC62E8B2"],["0x28C64AB25C8CE7EF0D58A0EA35BCEC5D2B607D12F2A24F8F3EB16FC41D7E36A5","0x0CA195D7A952810BB3F7980ADD107485529DBC3C58E961D54FEE8ABC8051E43D"]],[["0x2EFE963423F62845734C63ECD16AA521734B38E35CCB4953634862410F3A95A4","0x167BA768E453BED289034DA91BECF48646F5081AC7010265A8C9C3DD654A8833"],["0x1DF58CFB007294217F676AF359D8C90523D0B7E1F9D6A771CA5B858259C8D93B","0x27918C8B0A1332058724BDE2ADE25D36B0C45B3C52BBA27DDDAF63892226C6B0"]]],"z_1":"0x3E15015B8D3882FB34C4D37ECAADE9162E20B6008D56379EE9DF0537C3302ADA","z_2":"0x353AF87782913545C15D0A8681BD1DADE8F47EBCAAB9BEB570CAAA1B5C2B3E62","delta":["0x015BCC904769E5EEA7DF9DBC4F4535EFEA930D592FCA4B7A94EBC8C7E2E8BB66","0x0CA2C4318D526B6BBBC68E65F9B14B24585FE7AF8A27951812EC30C9B24DF6C8"],"challenge_polynomial_commitment":["0x37A5014AC9DC1F5B3056752DC5BE212170D753DC4790C7F1506B78C2FD28BDA5","0x0E147061C29BCF1F6CAA7D51856ED9ED7C5386030AAF8145386CBE08D4225DF1"]},"evals":{"w":[[["0x1BA09CE36FC8790FB6F8AA4A95D412C15E26FBB9EF07D6ED1DEEDA14246A4876"],["0x270BE71E92DAFB4E3029B50AC4AC710113CCCABBDBB1ED8A4D50E0D57614E383"]],[["0x068233F2F24D3DDCF0AD7A557BA34D59464FD0342E869DD255A80F138CC2F9D2"],["0x095797ECC18FFF3A361099342A9D663CABAE8A7EC04B6359827A289862417183"]],[["0x09E2D364A1CA06B2BCE79AC38951154F68E49C4FEA012EDBF62E7294538DDC65"],["0x1E56F59CC7E358EDF0BA99E84A924BE92E507640A61E172B9C650E982F5BE788"]],[["0x1EF0D22180DCAF7F2DDBDD2463F1820FB198E00AE99E3FD379976D34DC9DB1B1"],["0x3D227F150A95ACC8C84D3515BB6A341C607C616F7C58D450E370430CAF927E65"]],[["0x1CA8BC118B047886D43CCBA9E855BFD3D1DFD146BA49A7D0D4AEF40C2341E2C8"],["0x09BB0A482B20995E29D1A02B911FEDED29E02F41E033D86581DDC9006528CB54"]],[["0x255C1A74802897842DA992B9CD60709832838C5A07633B5698AAF799E0C343D6"],["0x15BA09896CC7E870B90B70E76CBE12827563F5781FE978168FA14E823DC9DF20"]],[["0x249186AA25EF6F82F614D7D8D0A6493AFAAC8CE90D821102F8C71538E9E0B952"],["0x23428E35F13B4773CB307BF2B26078180505B06D4E4A145E1D3C109C96F1786A"]],[["0x3F7F20F02DC5800799E9AB859FD63B8A1E2A4440FEB74E84808A737041DDB473"],["0x1045B1F4BD69F967151A76DB123A589046DFB4E6BA6BA2F16D1E4A46FFDE1509"]],[["0x3DE827B1E021BA8B368A98B18ED88A44C6046A92ED7272F66E10588B42E4E29E"],["0x0CFBDC2A53D4C3D702A9B1B8BE0C27E698D67E77F2BBB0F0BDF84AB3BF7CDBC7"]],[["0x00F92E651AC62980B4DD9DD425C799FF0BAFFBC142BDE12F41BD32798B6C86D1"],["0x207B86EE2F10634126287009D4D27B665C8225CE32E453C31FC98D4ED752BF4A"]],[["0x3C7ECA30E17B5B5C2F83F71EF491A3F35B3C52F1D784172F8E9A6A3312931B01"],["0x0A67499BC703EF260A6551927C7A2EFA8D68B3590255CB35F4B7AEED011CCE52"]],[["0x13C257BD68911FA5D04AF3F5960FE85526B4BE9DD0E41A860CE34A6D613D9010"],["0x397A11B0F574E1129B92C65EA7E09D11B317C528A40D0FE5D4A744C18980FB91"]],[["0x16BFB5120568A9DF8B4F3D69539D94A2B2A8DBD93653F8CDF420430BED891142"],["0x2F1999CC8BFB6F3846E310E11BD0F9BD281111AEAE5AFA9BC1262DCC2CC26B36"]],[["0x1A87958F9D036483D68AA1951C7EA6A84B5BEBF03BCCAE1AA0644E0F4FEB3278"],["0x12FDE6FB21982F1A513D59344F35525A3C21165487ECA71799BAFD472306286E"]],[["0x3E217FC9E525258DA990B130D5BF264364B0DBA4F54351218CAE7CF164248FB9"],["0x09A0F1D6251DB27173802A649419F930D4330DEE8D8B646AC3EAFC2593987ECE"]]],"coefficients":[[["0x00B65A7CAEA5C4200F6806883EE16F3452396D752EC44E38BB15350C1F334C9A"],["0x3C0E354D61AD7489F014F799E8DC3A6E9D9A651CCF9F75E49954A0A7809B1786"]],[["0x28E97D75529322528EB37CCD6968AE6BA4F138104A09431E142558AEC314DCE0"],["0x2BFCFFEF5E47872B105FD3919B10AB03467ECC1FA691411C140BB2DA538C4DEB"]],[["0x3F8620A0115CA669382EE5FED7384E0FE4702365D92FF624D31AA83448E78201"],["0x342F313F45CB0ECAE646969FA0E62DCCF8E4415683BFAC0FD129C6668F5699F4"]],[["0x2D40DA0BC6179261EEDE773814D5760A75FFF6F1CD8EDE92FB8F2A0692233E7B"],["0x2010CC48982E4DFCFEDCED92574624B13DFEABE28A68A079DC409EF342F689B0"]],[["0x2B736A57E856EA99DF5DCD81EC046BE3AD069BEC4F74AB81493FEB74949D84CB"],["0x0F3E9B95B36FFEFA77055A8CAF827B62B472536EB3FB7E08127D7EEDC3FEBF84"]],[["0x294CB3D63BEEE3FB8DB4568CF717FE35F92EC0CAF9C18CD599F180FC16BD5709"],["0x32E0F58757497A874462CB2CF4910FFD7FBD52D97D810BF66D64036302077F84"]],[["0x2C74F2DF51520A1E24B4DAC79736911CD5B5DC91238224C941A6DDE872C773F1"],["0x19FDF6FEE0895A1EE3294481E8A55CB4FFEFE2A188D599B6FB80BA861582E599"]],[["0x0F94692134A43B35B0864D5623BE5E2DB962D038C564495C30FA7DBB368BDD15"],["0x018AB460C1D403F0FF91C4475A9F6D31832503B95D0EC1D2075AF04BB742ED6C"]],[["0x16782A531DCCD1B1ADD347F18554C2FD613CA5D59679F9FED59D22F5E65E82AD"],["0x276E61FC9202D7163986424C36741EE3536C129725B43EEE2D3F2B5317952876"]],[["0x206EA28602B8E7AF7BFC8380D4CECA3F11858F1E05FA6A03C120BAAFAB5B9425"],["0x19639892BF474D723F5390989A4C359B9BA8126B183AEA2859E263743021BC7A"]],[["0x39CB8042B662B92154AAC71437B9EE90D0CB205F51D267C4A3AAEEE6880BA576"],["0x2743D5F5792C25110FA204979F6B179F308DBBCD1533BBD9C6AFA57506A0D43C"]],[["0x36A1EEDFB017C862DD26D9AED4CF24D7E46DD92DC1DD3B0EEEA1983C17A80DB6"],["0x0219D86DE8315425D795DEB1C5D2AD7DB54C064F78FAAA16641DEE0A3398E2F9"]],[["0x28139BDC0C2A144D32AB0180D87916C86CE2A620FDBF9801D3FF3653A161D598"],["0x2B5D8B26A8BE6B64DD02BCBCB490FBE239DCF9D6DD0FCEDB4DC73BB6477BB53D"]],[["0x2D340B82B0A26272DEC174AE8433ADA74A42D201193370D0FE118DCE6F5DC9DB"],["0x0BD3F2F1C28E6F11CB8E7C816846CA7DB370A5540F605A528E2FAE4F47CC1D09"]],[["0x1295943D0FB8D72481AECF7C178CFB258CD1C361BBC2FBF14016DF04FF8164C2"],["0x11560EB7A2E0F7C5FA4ABF7D2A112224C23C97A6F4E311E487E8FF451CA2D0F9"]]],"z":[["0x18DFDFDFF4DDE4E1D263DE6C2924DD5248100966F7863A445945CD0D4FD35378"],["0x1DF259D6084E086E0E253E05806FBD2D783C8CC9BF5B72AACD903F12C41B0CE6"]],"s":[[["0x23EFB47A3EF553D38348BE28F727B3EDAE542673DA26F63F65295C209592A0D7"],["0x3B7369AE4E366FA90830B12C6D0F319E4021AEF4F4C724FF35B1D8742D161666"]],[["0x10FB57DDA6AD6D60F9B09B58EE12F272336CD1C3530FD6CF413C9FC88B5478FB"],["0x3CD33372AC4393A6A507AE8EB607AC422FB2F234CCAD5A8E9A41B054D3CD5DCF"]],[["0x077AB8741B8473EF2CC9DF01622F8A56A05E96BFB7BDC282B528D8C46D723DB5"],["0x2202D7DC5EEBC9FE388B5D5099475AB235F1E0106F795CA98BEB70C413C9828D"]],[["0x1B5FD281D74EFF74677A07644751D472BE40B39A0611279A364D1F76CC67CB73"],["0x30FF6773DC314F5DA1A2C53AAF55234B3FCBF5E344ABF42C4D742847C679447B"]],[["0x002432AAE3DD92869566E7F28770842D1A396E7CC615891FF66670FAEDB07EA2"],["0x30EC0319C6D9AAE76E053AC69C7F5E1CF25A7C1184EBA134524DD1DB11BEF6FD"]],[["0x394D9068CF0402C6A7C55176E6D079EA3747D55A6FA20D25D500F77E5A175BEF"],["0x07D1940CCD195F7E2F385634685F0BBCA2076BEE4B98404CD02274A088C1396E"]]],"generic_selector":[["0x01718AFAE31735D01B71B0E941B5639241F274E2CA6399D83AB848A10843D967"],["0x2E64C5ACEEF2A437B02985304306D46F700FF9316F7E7CD0DD087EF3DF0972CF"]],"poseidon_selector":[["0x15DB789C73BCC137C1D8D1F659BE5AB2F904A5EFD2D965B0FB387E533263AA87"],["0x04EEEE3F5218A3C60BC95B23FCBD30D903F97CF0C28314EFE428E8C523ED9C36"]],"complete_add_selector":[["0x32352567C78727F30AA8D0CCDE6C1176C6CEC57B171B884C418A1B9FB28383C2"],["0x0F3E9E69B090C91F4DB29B9E1BBF302FCD82C55698397534D718B1036BEEA104"]],"mul_selector":[["0x1C797A17969725ED77F7DB49DECF98C80E7FCD86A74C1B6738E200B7FF220552"],["0x12D898BB90BFF16B1E0BE8C02748B7BEAB480863DC3175C0404BEA67D94C699E"]],"emul_selector":[["0x372CBE0081FD5D111B113485BB480CFC7D53C648B1E4990D2E17D5A42B5CCCB4"],["0x3D85323FEF20752DFB3BD86210C02355A5875F3B2EF34EF0C74D248B1600A17D"]],"endomul_scalar_selector":[["0x179C515BC8E68827AA4B937D6AA8AB75ADF75AA7AA262D70D856764E2CE0DEDB"],["0x2F6E09EBC754CA1314D51E504DF457F6ABF515A8B903AB8E5098BEB0AD57423F"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x0DF80A49B6C98EC596DD3F330F7A1C9FDB90405A362DB7FEA3E3D6A3B7735727"}}},{"public_input":["0x0A74AABE994A1BD3F828422C4E403DB636CD55C221BF62AF0D252BEC7D090389","0x13D6791037EB65385D603FC580C8D609893B5AF0A2A314E680ACF9AF02DBDE31","0x1BEA6AE9A5782B369612AC56D3B70482F4DB33468CC3B0337A68BEDF7F9010E0","0x11DFE57E4BFA743D221E004FF40014701CF9F322D2DB97DE2A4C3049139179F0","0x11D4CE1A9F9D3FC24B170469555E2B9F8F1859CDD8299778310E146D7AB33A0D","0x00000000000000000000000000000000F0E3AA9708DA3699BAC57AAABAA43C1F","0x0000000000000000000000000000000038AD2440D6B9DF12600B3A89E7B01CE1","0x0000000000000000000000000000000059ED3A0E40FA170E24F140C0B26476AF","0x000000000000000000000000000000002FA4E7523E71014A68F8A50D60E9A5AF","0x00000000000000000000000000000000C1966501326A49B9C5958E569782EE4B","0x3C7B7DDE5051655101118AC2EB1FD2C72DD0915CDCCDB483080BD1828A95D5CC","0x07EE362BE3B49B25C4552811D66AA6E4E84FA4CFFDE1A9D1A05D5B188CF4A573","0x0A6662A28F36CB1F523995E2D7F125781A5CAC548A9686C678DD05AF3183E8A9","0x00000000000000000000000000000000E004AE1EC4DF70164F4F58CD614C0B5E","0x000000000000000000000000000000008088409775FCD903EB3863A8956ECA76","0x0000000000000000000000000000000030DE4F461D1A71015519E5B07451F0B4","0x000000000000000000000000000000007F3E52403F8C1B6542E5DF8DAF4CC03C","0x000000000000000000000000000000000B28F9370EE79399CE3085A6CB8AA767","0x0000000000000000000000000000000066053B61A2D265047598B1BC77DA6D2D","0x0000000000000000000000000000000007D2AE5566407FB6A6AB2D44FA30F315","0x000000000000000000000000000000004EB810946EC06F3C6BEA8FC3E9A8D2FF","0x00000000000000000000000000000000EC917D3650E53DC9A18BF396208FFFD4","0x00000000000000000000000000000000B54DE5FAF22331F209D6260049481759","0x00000000000000000000000000000000984F7FEDC5CCA3A1C623FC04D72EA81F","0x00000000000000000000000000000000A463E934BBED97BCF4FC428A161F31C7","0x00000000000000000000000000000000B612309EB48AB3320012FBD81BE7ED6D","0x00000000000000000000000000000000BB51525E19A8131308DA4C4B8C069C0B","0x0000000000000000000000000000000039B3601044F0907EE42C0AF845409646","0x000000000000000000000000000000005FE05766FE3FF3885446B325BC363DB7","0x0000000000000000000000000000000000000000000000000000000000000038","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x3BCA17266AD0381715D5BD0EE731283A1A7FA0FCA8F3CDFC28D9278CFDEE51F8","0x07F5A8952DA8992A42E9670BB5AD2EF58EA7E2B0CE2D076078567AEA74F219E5"]],[["0x3DF7EFF564740B492025F02B3A3CF5EBFEE69113725EF76F6D5583594355245F","0x0F7A98F41C999DFB09E3BCB22F94AD7B61F914899F5C27E1043FAD14E47B52DB"]],[["0x3C1E3868F827018590AFE87DBDB58DDF551EFEC9162F6FB0B199387098F51E97","0x3E83704A4D9C36F51CB41FEE5392CD0D2F739D268E14D22564BE9268CF009D40"]],[["0x089B16FEF8717D2D273D2409C778C5938F38F17F6ECBC93EAE800C82822124DF","0x290B55D80301A41759254424717BDE8DF142AE12D9AF459095F029D3FAD0886F"]],[["0x34AAA7ED25C5E9150D122C9E9FDE4F1BFDDFF61AB97B53D5DAEA4A190FA5FBF1","0x22A4345093D9C805E4BD44498AC5A5F9061164A49919E8C0451568B6CF8F1F85"]],[["0x06A6D5565FC0FE60A4871108BED8ECDE79D583FD3DBE2827E5CEFDE72C75A4DA","0x3B8169927E9A4529DFD4FDD1441D7A5384AE3F0985162AAFBD4C2C53A85E3146"]],[["0x1E6E5EC39840F3AEC9482BAA5D1C9C94660BEBE3DE6C47C3F83F52E04ECE6FD7","0x3063D4729EEA62CEF63975A148D8C5DEC44F832206644EB9A10FB9FFCBD5587D"]],[["0x3255C33218CA9AF0CB0C14B016CD78A6A0EBB28B04AFFEEF2441AAF05A9CC780","0x34085BDC021368E1BCF79195201CFE4F2BA7FA7B4A64388AF9011D443D8C2D27"]],[["0x04E8558535F375B669865E412A9D1DB5D8953A5E752CCD5B09958106FB98584E","0x174B9D3904BB04D67FA6E3BDDB007AB6AD81A732DD4D4B1B383169B6CFFA1946"]],[["0x06827C46CA0AF21A31D7D7C5F582F040206EE9BC3AE2EA88D7097EB2AD0353B2","0x222796AA2D422E3A3D63FEC3C4EA843CBE655B643B9E33E217193087AE428911"]],[["0x0BCD9FA9825F6FCB594BADC77EAF3D31D19BC0FF1F4B687F5FFE535514F349E3","0x1B75B6C6B5ACBE051559CD51A0D2C9D363BA92E4C247025BB9E9683083D16D51"]],[["0x2C0755E21E38EAB6F311BF8DB47A27F1FF4A43F3859C60D1C098CC53F85AB597","0x27853745BAC0C2F14E463C94D1B4510D4F9A55C768CB95FAABF6585137CAF6A0"]],[["0x3E97A1755A93027EF400D0DE8B7A0EEEB7BCFA82FEFD08A56171785733F34AA1","0x12F966898D1623460AA1520BDC5015AB7C9C868E6EC55E25DAE5091F71F9BC2B"]],[["0x0B6655077BDD55F9173496D65FDA56FC65C4C020203B06EA0FA77F2D8AB90CC3","0x1C6D7DCCD5FF1D2B2C025C971EB209DA076CF355B301ACA9A9281402B2606D67"]],[["0x0E48FF3AA446B7BE383FF0B599C697FA35A0BFCF6CE65F6E645962C19F20E4C9","0x07AA60C8FCF02E69446A686A239AB527F61FF71714CBB216ADE7FF3E8517A666"]]],"z_comm":[["0x11629230602353679755486EEE61028C5D6E93EC290C90F48EEE7CBEC3445F63","0x2868B9AD086D9551C6D915747291808DEBA7DE047BBEE1A3BDBF414C7ADE33AD"]],"t_comm":[["0x0754A115E13E32D180156C7DB11F0EBD285544E71DCDBD50FA2871244DE4D3F0","0x3614262E297F8E55618DA48D2E9245778B80EF18BDE715B28346710ED7CAFE17"],["0x10203AA570F4A45C6A5C75416162A3985ED39E8639E153C00768195036BA72B2","0x013F003E428B178FC199B46B36792D67DCD976FBECBE6EFC59028298C6CAC9AC"],["0x2ED3524F8B468B3DAEF94FC6C4F9AA280A2D182A83F3D24F7DFD37CF2B9D790B","0x3FBA46050AA46AB715ABDC2FEE9B9D95B9C6BB2790CAFD37DF86B33AE6DEC8D1"],["0x340BF284D40F6A97E202B6D7EFD56F5D1405F11B5F857F3C7A25BC12A0240420","0x3CAB9FD99FD818DEB263FFE3F14BF785C595437BA37035402067599103AC6D5B"],["0x2CE783E597E323CC5DBA38DAB6FADD4B75B6870D9ADA5B9CA8B2BBA46AD65A2A","0x3E946B42BCD250A9B58242C368F3724C50B729F0C3860BCB5257834B2F942DDE"],["0x19BB692E9AC984A441FD74EFAECF8F797A88D85E83F1FBDCDC60E9A9A9FF6FFC","0x3319BC328DB74EDC95850F5E2F7932F03E2994AF71A33E639B723C9898155F1F"],["0x1BA634FA2FD3DAAF2909C3626C36F0C7F0F41F156C9EB7C08B1BBAF50B3EFA1B","0x2EECB7300BD99254DCA72826968A20EF0E10A046F0C28B5C537395093BAD32D1"]],"lookup":null},"openings":{"proof":{"lr":[[["0x1C859403688ECDA5F9D421393A0DCA604A0602E21B78D0078AB6C770E8307F05","0x1938E491E351F4118E30324C9C8FF5E6C9F390D387797367F2FEC465966254EA"],["0x23713D5B3C059C8DF40019F1324092ABDEDA957D740BF9D82A9153B87ED19904","0x218F4B2B607065CB11D126F81625DC36FF504E12608AAE27F175FEDD1B35F13D"]],[["0x31891AC0928FAC36804DCB1B9ED4663EDE4CD26DD58F31995BF45C38068DEAA0","0x03CDEE658EA0481144A5049D01BFDF2B00DA95D6EFB9D8962A5DFF5CD18C2712"],["0x392367622DB9F2966156B821558C5B7E2358D28B532BB1BE36D60CA5B057093D","0x02FA254FFA688B138B9EF74BD8B5D8CC5A7F76FAE08C88EEBA7B90845DA95C70"]],[["0x37C16286C4C128BDFC728C93B6884D6E0BBE7E48B9ED32DF71137F4F3219541A","0x2CA7AFBC297AEC1938F2F7274BA1EAA0F9FC2432E43F47D9ED19E4962D734B50"],["0x28466A43CDB1988F8AD0BAA90EA7EC74ABD31C9AEEB37740D85282C3C894ABDE","0x050B4BAE359BA123A3D6C4099FC2D6A27269D12E6BFFB7314BAEAF3E38460FA0"]],[["0x1FF5741D23672D46AFDAA0E08C41E660E35842D66B6CEA0D11EB7D894A670411","0x00383894F1AC6F35CD5FCD3AC904A6624171A226C0FAFA7352F484A707524716"],["0x15D26827B627D49741B4589F988627DA4D692B99575EEB68BE4BD1F7E16F7ECD","0x2C14956CB55729F63ED584B8510EAFF03DF527651A695DE69985F3DC2EFD008E"]],[["0x0E55272B2A9CDD5D3BE3C288337F61E906D4F9DE9406262A17DBF982B73C8EB7","0x233B1EF3D0BEFFFA11B056FB3AD607D0AF70A44F5813FD0DE76EC9AD2DE19E0B"],["0x303DB8B6D6D35B06729BF7398C2E742FBF2F11B4AD94DE6CBDA69FF63B8F045D","0x232F9CCD599F46E1B4909C654924B29C3A0C5C70413A7FC7B490E1659DCCB7E3"]],[["0x2A34E165E9E10593594CEFD539A4DF350F8A3471D57F66D45E5E159576FE22E3","0x38D8AC97891656053F19C68DC034663641DD19CD59A35A86F9596A1B8C31F3A2"],["0x3B2ECEF934EB18C0D720B985EBE2A4496318740B80746836D63FB88D5D8FC889","0x068E63C9D7097143FD5E26249ED63AE6EEB8473FCF3FEEFA67C4A4C30DFD8008"]],[["0x1B472AC725C6A4C45C33DCF9934403B8F31CE31CE936DBBBFE3CE61FA40BDE49","0x3F2BD5AD4CC3AF51680920EB66011FDF2DFA63B253885B223758A656491532D9"],["0x21E271F1B0608AFF5CF04905D93E1BB554B35E3A9E994C941499AF14AAE1F373","0x2BFC7C8FC36BEA042B90EAF12E1B85F0A7C0462D5BBACF16D7F55995569D38DB"]],[["0x2B58D7EFB6D8BF042BDB48AAC2AA04ABAA87698557C4ED2B79675A33FFEF61E1","0x06297AFFC6FCD72FFF2943DD723CC6B215067D324442027C2938F59775A53756"],["0x07C81CE10E33AE8527F6F5FC1146C5043F5410E73CCCFA51007E425F5A47932A","0x13AFAD13C9EF4769AE58321772740392250685708A6A3EA951942D4EC8D83E1E"]],[["0x08C0EC3C6784A3BEC3E8259DA058DB296B567A32EF50C5CFE42AA4ED2D2671D8","0x0093714943F47901246320ECCD741AA2B6F195310053254E4E4E37C9AB195F0F"],["0x15E7CE34DE9BC790190C3C46BAFEFA4D5A5A017264C92C9F816037DE9DF24A31","0x1902D401BBA922EA1AC62757356D0A69F889E97A53082B46935E70C3F62B34E3"]],[["0x0D03AA62561CCE871B78F1396C08DEDE782D1ADEA89C81417AF5561D86025D9B","0x3D37D6DB0C825E43134FEC7BBA4A6C7128A610E36E83941BEC370327D261E19E"],["0x2A6591AB6D273ED4D32CC7880349088540B0ABCAA68ABCCEE550634F86D73C3D","0x127BE2F2564547768DB3A6951B144D4F4DCCC982050B26FE3C066A1C361CF572"]],[["0x05D6C46CBEFCB5C9E013253EE3A48480F0F414C961C9242C2C9CF9B7291B87D5","0x37E561D03EE58138C334A3263ABDEC140A38CE785231AFB5BB56883F642EBD99"],["0x00AF689757FDF1FA0474BF2B59B067D5668C4984E0110E2CC3532BED581D4909","0x0E4B6775A869189F2FA2F2A8B9B16B7C5F07CA0FBA1020FB7BCB369FF60DAFF5"]],[["0x3685708303E9B31B038D1208B8708E527A450EFE2724D4D5511D8383999992EB","0x3DD8015174A441AC7A25A6ADA79153CA80B83EE14B72774D039F9591D64EF9FC"],["0x36707B237362CFFCC599A7DC6C12073BA4EC3BB91FB86C02D6E08967BC102027","0x163DB5A516EF2ACE0A3B6169E25487DDFA40EAA28AD555D10BE621A3B8F83D40"]],[["0x2C85B75A1CDDD90BD024A0EDDFFB01236255A5850C74B13EA534622CB09E3C16","0x2BECA54BA6A3A5BCC98030AC1F304F66AC14A76F3BE3A5B36157392C626FE247"],["0x3776D144A9937A174BBDECA46858D84A198D6E4F823DBECCA26FAC7861A203C8","0x177D26C44E8F1DB4596FBFA7B9213089C4E4E939992CC207A3B067C26FEEF586"]],[["0x285A791991D974C05FB7286C071E29557155EABB5EDF26DAB76E7BF5E66D43FC","0x0D7562454F93EAF90985AB4CA0F9FCCC4AC547A796C7910C32F06CCB4E05F5CA"],["0x07F8424ADA739A250F4E15C189246DC0087832527D82888C66D551B2001EAEDF","0x0A73E75D6500ED2CA7A8CFEAC0A0C2F29C82AB2BA6B17943E0A00062999E5241"]],[["0x26E7FC88D36A2BD3D81C66595C307850970BBB76B0A808A3A08DBE99008A7A03","0x3E587F7065B6C3881F8450E8D2F63174A4CCF500480530C5AD4769E4E515CC7E"],["0x22805A060DDB7B404E551A68764850FE2A938A42B74F6BE800AE7BE6A05E6C0E","0x3F37EB95C3285CC3713B496C67EAD8CCB33D2A51379297603518170050741715"]]],"z_1":"0x15EBBDF75F1029A40B0B2FC84FF3BD58BDEADD12BEAFC3F9EF720FEA6B871948","z_2":"0x0F4FD3A4420B773FCD61E8E44E047AB18C6F4D9C60497B49415763542C3A537D","delta":["0x307902DB5B6B5A2985AB43287EACE14D7BCA47044AD585D2F344BC06DC1751F9","0x10BB292E582A9CC7ED44EF608632E97AECC6BE969DE69DE8222F8E13561137E2"],"challenge_polynomial_commitment":["0x1CA9DFF43D5C26033968F39231FC0E38AC07739D49F2EF4B9233CF3B68BE59D8","0x277DCE6E8C1382F4CE22A7E671670EFEC5B58D65BED8D884C6B95C86B0D088F0"]},"evals":{"w":[[["0x2C96E7053362F71FE9107EC05FD9858F7DEDD68D7C2946F22F32A066DF00FE36"],["0x07BF589D4BBCF290CC5AFE1936519BF2C99E50D18CC903DD14A2D602E23021D0"]],[["0x3531D1E13D8435B5F94B48F93CBAC0C2F07F9F94ECF56E2127CB566C2517BD30"],["0x39C8B05D9C524322B8B86B7C298AEA06EA43412A3C5DF8B5CFAAA80850D659CC"]],[["0x07F346FCCBF6F8539CD396E9C5E9CD6B01D2792CA5B738C2C968517A3E86D740"],["0x2A1C883D5A5D6C6051B1437B87880D77013A8A8749DE7562C44824A5177AE66A"]],[["0x1490E3FC77FE3379DFE637AC4943A980EED5AF034E6A1A4F892A612B2BB32DC7"],["0x0AF597A726EA2A1DA336F6C9B8DF07103887EBE6FEF92C5503FF51DEF50A5EF5"]],[["0x2D037C69F84E87F9BEF3203904FAA72E7DAC599B7F60D374C79B62BE8A3120E5"],["0x311127AD2CB48D4B70673D448D403DA5BB66635553CA7F851C3CCEE76CF264E6"]],[["0x17595AFAC8CEB1F793FD9D686DBE693E9A2049D91B61D6CF180747907ED1B841"],["0x193624ED2DEDD67236E9286C4E2BA3ECEDA29991C1C977306B58AFDB17C4C8E9"]],[["0x159A1C2E3CA30C074014FA8CD6C29804E94ED301F9E8D4FE59A5062C21650639"],["0x0834F32503349228D42C81BDF27EB84130A3099FECA8CF56A951C7E9BEC5BB34"]],[["0x3AB7BE85CB4BB8DAF090F9D1B332A57021A451E77DAAD5787602019DA756D138"],["0x04C639B9801A6C3C80E177819D4B47732AEC266810D3033D5A35473249BC17E0"]],[["0x044526B89665469B9A2EF3C8FCE89D4C1823ADC38F6EC56E37D85AFA9D70581B"],["0x1764E5DA1A5A083DE4D26108C5DBB66661B8DD4FD359DFA78E2EB3F2CA985325"]],[["0x13F7C77E8824E3E7E147DE44D3B5110F892D58013DFDE3FB6BD451A555AD2B77"],["0x02B54C9469E6094C46838F7DDEDA273A6E453FF0AB520FE6A9E5BF628196FA60"]],[["0x3F9DEF75C0CCEB6B5516C9CE19EAAAA30ED8B10B863C6132BAD396A7AC5FEDCC"],["0x1E2D769C88E27AE81ABDDB135BDFA423898C1695C8587C1D92D63A2FE86F441C"]],[["0x3E0AF546F308088C6A8FE81DBEA4776537869240D7930457F1DEE8542D292739"],["0x29802FE9B50949EFD278CCE608783F3263497947E3314DBE9C0733456390C548"]],[["0x283339184D8B59FCCDDF7A49178BE85648F4BC81653C40E904D14A3F32893F6A"],["0x0C77593F45ECC379478406B68274D52F27CB1D48DD4F121392967287B75686C8"]],[["0x2AD62295446A7EBAC8D4EEDF8C681C32BAF905B0052890EE5090F92AA0426554"],["0x2A6E18A7DBD2B37A9E49D1A8429FB042C8B22DCF275D5F2F9437A75303BBAE24"]],[["0x247B53FF4A22E9AE28BB28249BAE6DF5CEC9B6C01EC047681BE89178503BEC0D"],["0x0401BA5A64CA58E2420D346632800159285A4B2226DFB3606892121A18350AB2"]]],"coefficients":[[["0x2387832DF95F16EF9101C154C1CCE2FA25752D02BF21F6E11EA73EF6305E94A4"],["0x00219A488366B2F458C8779575D372243E5C9BEC17DF2E9432A9399446797DBD"]],[["0x2612483DD683EA1DC66F656BD27084425A60652DD0DBEE0DE430781F95AA07FA"],["0x13784418BD52107C8B430483B2B62908C7A88FB34FA2E6C7CF400A980D4ED0ED"]],[["0x0D26AAD8F701B77FE901BFDC15C035F303D0BF44077AB73CA7D59245F3EAF065"],["0x3C0F91EA7527CBAF69492C161A5F1881DFD953297135FA940F8E27EFC8D9D08C"]],[["0x1CB85CCBBAA2A2B7D5F8B52F4BF96376470315F43727E49B5395C4811DB55DE8"],["0x37561F3EAD48D8FE8017E230DA90BEEE938C115F2AB71491CDD31EBD2D0F82A5"]],[["0x07AC4AB5B9B3189EFB7CBB728F7CB03C227ED98815725EF974E832EEE957BAB0"],["0x35E6F93BBC6FD9EA3365634C98869FCF1CAC0C6DEA0CC0FFC31E21582335A19D"]],[["0x04E8151E14CC92407862653A9A2675C0E749CAF9F614D74C6F1C130464B401C3"],["0x3943C67F93561DC8CD35C55C6FDD5138D3FBD8220867A91A590D77414C4A448C"]],[["0x2F5DFBCBEE082119141DD5BB1549DDC3664B859BB72382FA06B816BF3B4F42DB"],["0x069CBE27541FAF967EB064EB1258DFBB269A9D09363B7D5EF6BBF6195A61C501"]],[["0x321A55D7B22CDCCC8804F75CCBB9F26466B85CE124F526DBA329BE499302DEEE"],["0x1E2B041E3B95999800097D289D8A8696D01C0B4A4968F1502C36B6B019F6A70B"]],[["0x08208B019600417F8E933F0681C0AF2EC92489D32AAD981322580C12540B1F6D"],["0x2FA5E03EF8C82F9D7E77C4435401441489B160C2FF661286351039D4B3BAAB82"]],[["0x09ED12E5BF209FF4E067F3909D590F50ED56B0A095CDCBA6E337E3B1C1F95ADC"],["0x3CD9C22E2415E60C4A27D2727F29C49BCC05CAFAA9770DA2995B6E507CE766B4"]],[["0x3FD26F79E09EA866ABAD2D01998CDAA5E8E8F98264B778A0BED9CA2F4C57B584"],["0x2A9774C943380E33E4E04FC7244709B038E38E644F1C861603B2B53D75B15A89"]],[["0x3AA34751270CEAB6EDF92AE156931E1F047FA1D087803A82751C40D6B2749894"],["0x144B5919A5C8E90CAE92253B02104F392348A5FAA798583E2105F0DE64C3FAC3"]],[["0x12E469B287065162E5C3C6920B307BF5526CB7A05143F5A5CC7A6B8F190E67F8"],["0x219259616ECEB89054C03B4D32890EE431C900EFFBDC425149B62B2FC8323715"]],[["0x172683EEC15CFE3E881B3345E46796BA6C03B12471E8FD82094082B14F63483B"],["0x0EC594C6E1A098300F28FB8F181C062E7AC9245996B21959AB980BD8722C7294"]],[["0x0C6C178CD4C2A5600AC12BC762F0E96B58470D9E72C57346E652702A869CFCD0"],["0x1845B64CB32F36A371E15032E3D4072EBBD351AD97C9C9B2BFB266B1AD012DEB"]]],"z":[["0x1EB32BD521D03C7D9D2F9ABCC0DF804AB3E5668DBF7C20741B43E4CBB466D484"],["0x37B3F3468BAC6E3F3E5496BC9A711F2BA7452E433B1820EAB2AAD6F3F5A2F956"]],"s":[[["0x161A1E420CC0538D9A18A9E0F188CE4BA5EF8EE4E4BF72499C46FC809F630668"],["0x0A00A234BA4C2721F77729A6183D7ED2F6A078E2E1A431C564C68A93D6744561"]],[["0x0BF9B60C492EA1966F477A1381218AED0453AED3A9DD67D4E2681FA6871414F7"],["0x2013B2D42873FC14B337D71CDA537F557A5D55607523409AD0C2C4CF41FFE88E"]],[["0x38045938716133BF240FEC5BA1BF53424902FF19D2B3692F1FBACB75A26962E4"],["0x1A5619BA0D4FCFDAAAF3F8786CDF1186A572328DC9A26E97E32D1599A1045CF5"]],[["0x289611DF0A4E18BFA8C0FE74D908BF0B47DB1CA034109FB1996566B3012F256D"],["0x0A8141DB917C169C300DA2034AF4266BF60656A0310A937DB3CA6D2C254D4B31"]],[["0x0CF98C5ED852163EBB69D2C842A770F6C066D5BB76E406E81F48F82EAA0DFFD6"],["0x24CE5DD46F9AF571C52BA8B0AFC4A0221F6F08C42DE054F2ADA5B7D0092F9BC9"]],[["0x1DEF46057159EBD97E97A7539006A09154148F1A96A82697C3CD8DC29589F6E5"],["0x0D5265585ECAFCBCDCD1053AB7B0A0A83D83FF6BD13BB71220DD3D0C6396D098"]]],"generic_selector":[["0x0AD6A4A55296A7ED9B1FA64B209B21084E94030B0CC5D14476D13FEEB0F10260"],["0x379D9FC522EE52D2946D832CECA8C2B5895EB6EF30B27025F36F53A365D0CA08"]],"poseidon_selector":[["0x38BF4DB834469E1B3676D86C1384B10DDD7E55A5BF9BBDE7634ACC3E2B6F176D"],["0x3EB3FD4D7F5F224C2466032D2360C2513370DCDDA781A881AAC323219B2DAECA"]],"complete_add_selector":[["0x146E0818ACD4AF7C654FF713FD54D0E57B15CCF6A7FCE2D69378E54FDE74C5E0"],["0x38804560EB33091A0D6979D49DD05444FCA2EC6E34E3EB4AF45620E8B7DB9C88"]],"mul_selector":[["0x2EF66DC1EEEC003684F980453C0AD3C813B4CBB1238BC65BB0B7D6117CAF043E"],["0x0C380B4B8C9751691DD8BB3BF760B5DB324734E496B404FAC87798264D961D47"]],"emul_selector":[["0x1D9C0B1AD72D7A0A096F40926E0C1E52D165051A6D8C404B8393F34E3DA5F486"],["0x20A2742E975D6E1CC89D9AF2EC70C563CBBDCCF0102D364EC57BC59A2F1546D4"]],"endomul_scalar_selector":[["0x0AC633606C99BDE8CCA08CCC2757CD505C85FEF76D37E3F8986952CBDC047A2B"],["0x1783D144A3CA8C4373BB88045C176178234F31B8DD214042209FE7BA9A0CC8E2"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x1CCB32FBD895B81320F2CEEFBB8245CECCB29B3684DB8CEF28643DB9D79A4767"}}},{"public_input":["0x08BF9F7FEF830D23246432F498FE8E9BEB1C5E94F19F308D7D7A15ED810C077C","0x3BAD59CAC3560C68CE37AEDDBAC8F8E82524305B933C92C5E0AFD73216ACC273","0x04C910F6D310375F7450AF7B536CDD7B8F973AFCE3557050FA9F713DD149FF5F","0x0133A40A0F0B18F34D4992D740C81C4244553D2FA0EBDB99E79F1BC383CD7457","0x01FB474B8F7A1AFA23D844C989720D497656CA3CDC1585B40CF24AB5971707B3","0x00000000000000000000000000000000FE40AAABDB926DC7504049C4DDDC5710","0x00000000000000000000000000000000A442ADE75D012E777F0D64E268F17195","0x00000000000000000000000000000000CD4E2483AA78A9E1B98DEFB558F228CC","0x00000000000000000000000000000000222FF7CAB444928A6AF9554E330FAB68","0x000000000000000000000000000000000C6A538743D66DD385A62F26A6DD9607","0x37DAE67AFE82B2E0FE7BF1C49E350F4BDACD81F30E4EE7FA432DCC21AF037558","0x158985E2B31D4C086F7AB1F11357B134BC4126E057CFA55BBC781F2C6D9E7A54","0x39E4E7E1EFB787337B9E3072DE3FFF6D8C5EF662A0C3F9471F2DF110C3336BA4","0x00000000000000000000000000000000FC3ED5FFA52F5B56780F835261CECC28","0x0000000000000000000000000000000056CB36317E4E5D4F026541BD1BD3900C","0x00000000000000000000000000000000B79709C77E702739D1A2A389F0A61740","0x00000000000000000000000000000000BAE47D9545FDBDD1D90CA5C8F3FCF13B","0x000000000000000000000000000000001EBEA3DB667656075F64775ADB2D4AC0","0x000000000000000000000000000000006F2A39A2332BBA2D94B77A7CB139E8C4","0x000000000000000000000000000000005AB5952070B8E37E44230F2546F97444","0x0000000000000000000000000000000026DBE06D047BB2BB0DB9CEA723DB5894","0x00000000000000000000000000000000A75663747B3D7018A7256B0B1FC13302","0x0000000000000000000000000000000068E0A731857084D416CF9C10AE3D89E4","0x00000000000000000000000000000000425B07C6E702B09CDFF00EC0F5BCEE22","0x00000000000000000000000000000000EDC95671D3230201E32E52C64063C83C","0x000000000000000000000000000000006883181850262A1E7E44A5CCDB3FB5EA","0x00000000000000000000000000000000E24BE867E5AE33D2E09D4CB57DF64EC5","0x000000000000000000000000000000001A5D91D99D1816DEA1EDB791541E52B1","0x00000000000000000000000000000000BB4E8BEC5AC6935D9A03546E30C6F923","0x000000000000000000000000000000000000000000000000000000000000003F","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x03C4489E70CB271B5029F92B2B2C64E31945B72E9974DF9730844469A385C175","0x341A37F709049ADE17FB24AE23E8A80E0F60A4AB09F15C3FFD428085C29D58AF"]],[["0x0401019E6046DD4DAF1FA894187F84C8EFF689000982EF50D1CE0124AAC4E417","0x1FE1B4EAF76ED902080A02E0C03960D6A02C9A80E66C13C1010386C307F08631"]],[["0x2138C39B48B24B55035A8B88F0FD9A714022691CA4E508CF9F949A68CA17650C","0x0F823923B9E6747BAB1111A6117FCEA0E61E3C1A6EA13F6FF48462C847B3C563"]],[["0x0485D38B99A7871D120EEDE8DAD995CFFBCD9BA14569722CE67FCC6233C3BCF6","0x1FBAFD3B0D5E965AE775C7A9E7779B77FF2FF04DC0CD7C7EB0D22067C95EAB86"]],[["0x21D8A40A9E241A29A7C186B8176D958FC847DDC408204FE75E27958860C59DF4","0x35D9520948285A0E764A17265630DE9EC0981E386C65A96CFC18698FACB9E237"]],[["0x2BFFF91504C44CA5C5B56021F92C3580D9DD3F052B38F868976D2AFE0DDFD7C8","0x04C293DC37625EEA947876B9889DA1F96E6F2DCDD3BCA624A8B79F175C072878"]],[["0x2C8F29B46BE42540E3EBE357A0D61131BB1702DC9F0B32192D3DD66CA114953B","0x1C532667983AC206F68416D25FBDC50AE80177508B5C45DC66B6DA5E5B8BD091"]],[["0x1D4B5ED274AB513EB22AB8ED6D8E28CA8607EA02218576AFBE6BA51EA59E63ED","0x226E67069A902041ECBEBFB830512E551D667200C372CD7D2A5C3E5C23F1301D"]],[["0x2AAFA57A4DBBBD41FCEF1B8F8E959EBB57AB3B09BA1B9AD432AE1A11D4BBDD89","0x2C45068E8E916C1ED5EC95F975769C4E19355EAB432EAE5CE22754F81C5DDF9E"]],[["0x38E4389D8A7693D101CB4D3ED37227060F00395CCEB1EE160DF7C0E0E1534F44","0x3AC42B007DFF35C6117288DCAE00BB8F492A9315EFE45615340550CB3EC52F23"]],[["0x2E29DB16E8D389F07F16F1FA2AE6730B91AA3F55875337938D1051C41CD162C1","0x33BBABECBEF1F527B44104D89A17E6A0026DDFD170E3B4F41264A119020F03A1"]],[["0x0167B3529BF99FAF5418CD6EB92B82D2C39B15462B9D5E2F18FD12C54C6483F4","0x00A6E71A450FC1AB9A8200B3263101EC167A024F4EECA06CB4A2FDCBF3DACC35"]],[["0x32DCD86870A0127ADF98B9CCF77ABA5FB4E1EE1E27C44064F12B26B7BDC24BEA","0x1726D316CE9774919E271EA05AD57BF7ADCCB1CA7111DD7CDF7CF4B53C16EFF4"]],[["0x107F69628706949BA08EA06A34E0196DB7885DFF52BFACF1822FA8F1F1A8C3C8","0x3FD7CDD56C960C3FB9398E61C5F295668377EF7E7058AB7921F6A2ADF020B92B"]],[["0x0DD5D58F42FA9A42E4DE9F46F47F0D25795F40C890C42013938C31A425C4D46D","0x3B3466A685448D416B727CD8C78A2581EDC7158C37C0E84588C00CCD39DD523C"]]],"z_comm":[["0x15AE48AF31B4F1C12B325387E67370FD00C367BD0C629C6533A038367BD1CF4A","0x04D35B9103FEB3E3A341B73E2E30137024B68E353FA5B2A11AC9950DA4BD4D07"]],"t_comm":[["0x082FAB968D358CA3D00C26B81124053E5D84F056CFED091C0A13A8E7EB590CAA","0x08E9D14F479062DCCF62073454B0F69B4475DE40210AB3F49B4C5E1A66979EF8"],["0x20DCA810EAF72F3965BCC8E84E6C78B5B76BAD5644E34ED77030E469BFCA5D68","0x029A2FA663B686E4C9ECE4CFC62D232EA921C5B9E63FE27C87B53EBB676CBEE0"],["0x13ECB1C7D7A5AA6012111591552360C105168D45B70EE4B46C5132079137A989","0x0CD53AE396CBEE64F4F65C33187F2000077A3661B1BE147FDDF9A4A2FE3A082C"],["0x22663D591537F9C11358B35CFF468BC981ABA3746E957787B1BEF65BB0831442","0x0B25AF8EA8D952DFB2778028DA359FA6E1012756F2E17B9F758629582BCDAECF"],["0x3B0AFB15A177EA970BC1B896D024B0C82FC4DE7983B824EFBEABD7104DC3C599","0x2E1948FC856332620A3B9F4C657DB0C5B0F9E8815B535A460CD18A4C8E45B310"],["0x390F081B4C55C768941F62891C35524A88DC5D856FCFED02D7BE4BF8FFAE50B6","0x1704DE95F330CE723589E9717D1D42D4D1145644C32C888B59C03BEB7EC73A72"],["0x36A377EE058394A69E376583A4DCABCAB88AE91344996B9A031111E2D5ED6453","0x315B40CE1A504568042825B64C6A1F2FB04F609A969447BBFC159CADA85BD205"]],"lookup":null},"openings":{"proof":{"lr":[[["0x3AD8B9B26160D8933B78166E1EAA4193FF6581DDE2BCA81E835FBB0AFDCEA81D","0x270AA99E92E57AAE2A08BA187D1750E4D5CF822A77EFAD2B8D90954432B1517B"],["0x34EBFBC9C94ECC3100315444B0767C93A79A9B68388F774DD6999024966FE7CF","0x22F4A7610225A3B52AA41BF47A97D7830A077CC4B6AF38D8D3BA4E79A43D5249"]],[["0x3443BCFD6EDB17466DFE17C08AD9E300986C232ACE0ADD341F89EC5FB4C79095","0x08E80D2B381C2077D4E8CAE8245663D2380446E37709B05316F77D74FA9EF379"],["0x1F359922D268ED0B28FDBF8D9CF7217F68860A0749A3AB528C918F744DF6E167","0x356FF0F79F8606AE2E249782D07C2ABD97A9199C827043C6833D9F5CEC8F8043"]],[["0x18CAD0DEE89D4D0F1A0F2099D31053E37216E6B02222006EFDF8DAC86C87EC2F","0x14EA6215DC8D5A110C37DEB27284591D8C7BA8E4633BE42A020258856C4E3D9E"],["0x1A149C915AF38053B2D925B488BAE591F3782ADCDD9A44364BC656E0B7796602","0x219C266F844E3BC98D97F1182A3EEE587658EA3EE5BEDCB7436DD511BA95CFB9"]],[["0x25CA51A6E7191AC10851E6C64A73BF013F1DE84942442A69E565C922A967B34E","0x101DF69E70570E1B364D4B0EAFEC733888F8F8BD2E8C2248EC0236D7A89EB99F"],["0x2C0A20AE7D99A26387EE43B239CF987F8586222BF558BBD0F7BC7D8FA95C6E39","0x0B9553EC4387B5B5A827CB6A23462483954EE48C6F40E35DDD84729FDBE9AC4C"]],[["0x2143098D0DC42672EF929649C132F8D9A4CE1535FD24218F04FFF7677BD0EA35","0x0EEFAE80657DDC00B4CCF7E7EE34F094A4E5DE78886F2BB994F4D93AFE0767E1"],["0x2B839AB087125CAE73474FF25C2122ECAA43E502664A418BCEE0D986258C38A5","0x387DD6A358D1ED873DFB82BDD8AFB1FC71D4A9938EB0C91C161CE21343586713"]],[["0x20AA142C23A321DE3D0C3E050BFE30D914DC81FEA2E11528E68E6A6FB3F9B0BC","0x06F0F97CEEE688C46D22E8BDDF9C6A59FF957FB46D296F785B73F94B78EF3842"],["0x289B76F6E361A49EE97E740632692562C37EE93FB7F808BEC689A3ADAE4813AF","0x3E91D5AE97E8AF900C1DD332C5F27451BA03221CC5FB78543DB55E9D4CE10BA5"]],[["0x3EC818B8C26289EC76107C299F988CFD3C1BB2E57CFB9E9BF8E234261AFEBAC6","0x39B6EB3E8DDD42B30E24734B2CA8034ADB3FA68FAB549D46F07E19E0980D6C9C"],["0x2D87EA634152B0B3BF8D5563FB28AAFD00ACA1AC020012D18ED13D9BA39D2CAB","0x0FBD9CB1C732F279D603B002A6D65049A4F7CD4BCBEE4ACDA5D2BE8FF5CEFC2C"]],[["0x239B11234F91D92F4F1143314F4266394EA2415B5F0EB7B3DFE3FACD1D567235","0x1BC07E7232F268EFE9AEA8CCF26CC1939F1CA70C5AA09C75E3FA1F945D6E24CA"],["0x27940D825DEB8DF78CA35E6D45017AF920EF2F575EC740E7A0AB2EA084DFF90B","0x3C9B3DA7331BE1A0D28E69176BF45DE61BD78016C355DAEFD824C71C07D183DE"]],[["0x000A2F62A2F4A1E0238E722A972665DCFEB7FB497F2AB5C541FEEBA3C78B7E9F","0x133C9A8C4AA89F93C32F8EC9F35721170593A475583F53BF32CA2079411B2805"],["0x25405D720937B49E3E3292F889F2C2FC0AE4DCF2B48DB85F55F80384E11E6A0A","0x1B6B2B18B19709ED446B58FC3CD7BB65488F1D9D06B8CACA346243E91E1663B5"]],[["0x13EA93586D989D351897819F6A4A6A7B22A2C9EAE52636517D01D18D20CF0354","0x148CB4A6A758CCA5EDFD69C647D1DE98F474739B979CEA5350B556C3144DF0F0"],["0x3B3285355ED1B92F5595E6B7FB59520C4397690941CA6091355DFC2EE2DBC5A3","0x1D8D6ADD7153C720D3EB0CE496C6EEE577306B9A7C01081E7DB11A6D3A66DB1C"]],[["0x2DB0C096C346616A51C1BA1A9DDA54971A8FFDE69687238D57A7D97D410E1C15","0x34E5F180F556AD75DFC37CBB5CA7FF12F6D65870EEDFEC0647099694EF2CC305"],["0x2E6F1C0619A7DBF59E517B1219EA9FD4C19551524AD8800DCD20BA351F4332F4","0x0A9A951509445247B9C3A7A5BF77C85DE826D8A65E48F090A63CDEDDAE86669E"]],[["0x34D2B93394FE1414A34E62974E3D8BBA973B623FEA42BE375AA7A00CAA21B6C0","0x323C88E376603C55FC7668E420EF17C9AC7F85D9B38BD8BC6D3A1984C76E389E"],["0x261951265179A4D09154CCC9035AF6DE7C418868CA213B229266F49E334D07D2","0x25558E5D981F69B973463A51621FBCCD5B708D3EA53219362097E0C0C974C593"]],[["0x346D72B617CDE152EF29C5A735999B17C8BC52B6ADC3C4A7ED37DDB480FBF7F0","0x24B9920BB9D1F03D290BCA1F9068623C2D73916A8C567ACFB3800BEBB48F874B"],["0x078AA03C0D4220FD35C3CB5D8EBF5E88B81830E2460A82EB41EAD0497B78537F","0x22AABF60D7C0DFB9868D2E4BB4087B172EEB978C47A2E25F1047710BA6BFEA8A"]],[["0x1F835B7E7F4FA3B753DE3E5A3CD7F3D0CD0F9D56C4335D6187AAE6612873264F","0x177BB76F3533FEF8BAAA62C351D8AAAAB0AF6F7AD91A31CDFEB0B2A2BCFAC03B"],["0x2ECA7FEEB620F33BFEC04BFC0E6FCEFCEAFFA9A28D6301F7C87143AE1F3E331E","0x050F3B9D1FB7A6DB58927DF647E63BC439E45EBBBA0856C638BE0E50C95FFEC5"]],[["0x074CEA20F8146D98C64B773E222B4D346FF92BF91C7A520AB4D2F208F3EC2153","0x26193DBF4A2175C66CAE8BC2780EE8947E906BF1B19A17F915EFC8D467C2E11A"],["0x33679387F51AAE7F3024B46DE0E39BA4A37500C69413466A6894D1C803DBBD6F","0x1469F0AD6F89A04DE0A50AA26BB6D5A52DE569FB25A1A231EA7F61C393A6A67F"]]],"z_1":"0x22D61F3D8BE0778496E4AD92AC82BD9BE6905313230912C253679C15D48E0BE6","z_2":"0x0BF309844E3C4999487286C9990F807CDF7D9179FD7CF7E8A5226349107215F6","delta":["0x311FC162E5131177B6E125F8D08F0D85C02DF2308D36581F8F7D980705C4478C","0x3713E2DF3FEB8677630735E7317537604B93498A82552A06A3AF268AABD50E02"],"challenge_polynomial_commitment":["0x3A45EFB475F05275177EBF4ACBBDF075C0F68819B506F340280D25E7D500AC8E","0x11BB829145ACFB183C6BC030FF94DFBB42E6E47E39D5E422A9C1E077B69F7FD9"]},"evals":{"w":[[["0x0A4410084E8A280A79A00EC8E6F7670B6210A2E5AF0316D76AD7C42FE77E5C22"],["0x1CA4855F6705FDDB2A36ED1C8617AAE30625C300313BD3DD731F5658BB321BD8"]],[["0x3A3CBBEE33AA5CCB9378841F17E55356975A0B56A124DA4ACC596DFD9935A18E"],["0x0D5FFB1D49D737F17C40A674C93521E8A92D004EC96C8835A1504140FA227C22"]],[["0x3E1E5DD569BB4961B80E215B64E904B80E852FD2B745D867D0E8EED50F7E8EA5"],["0x243D180417765CABD3BBDDCDCD4F780152132FC462F381E0CD11CA39936817B4"]],[["0x13E7CC4E63732E7DD465CAEA900D646E199A55D7B31317B8A59A8BC57AEA3E66"],["0x1C9E2711C98C45C525D96CCCC383DE27852B8A7AD5CE3F76FA14C4D123B41B66"]],[["0x0A26708A3B0FCFE67B8E2EE4A18B6A6264EBBEE2110470CE00706B317825FC91"],["0x1AEA6D3763FBA147A7BE67A7F93FC75AB03FED12666451FD9078BC45CF62DFF4"]],[["0x251A695B57C766D216F476CE0EB9829CF60BB26F3172939AE2E438AAFB18487A"],["0x05042FA2355219E4A6740C63ED5A8C0F4283E472E95B30CD972D11B1B1298D73"]],[["0x3DCA4FE6EF788F88E03DCF831401213D681457A8982FE48555C1BC114FB6EE05"],["0x0E2FC8F86205FD7F8A245ED427B3F5042A889E36BE4E7DFEC6F3504F610A5BE7"]],[["0x1A2A2102F93FEF09F80918088ECA67105E556EB660F7FF7394AD12AA4EA23B68"],["0x2B358D01286B7C2EE425D5AD7B9B95EA11371AC33783B1BB7ED0783B3F16D2AA"]],[["0x216C4BAB8E15BA088A3D4E179A2784617999E1C2A4F4504094D08E73FE6998F3"],["0x3D4CAB73E62C97B38408C4913FF8D0D2DC34FFFF153BB227F78C4E9DDF70D92B"]],[["0x238EF021AFB7E31104FCF06F74FC720FB9F0AF2FE73EA13BF68C3C122BEC0EB4"],["0x27C0A5E9B18FC77F0FE075F60BBBFC80C2B709CA1ECD105EC92C23B41BDA66EC"]],[["0x38EF1D3AC1F61DCDCC71A17AB03CB43B1028279077431BE8F0DF161921A2C0F1"],["0x3BD468B02CCF20C846EAC653643BCE21969501B445350FF14C89D5B3175D5647"]],[["0x13A0D048AB4502938064042BBDB48C4E2AD843E3596DD33406330771A64EBE38"],["0x3144D92A88B7A409E92C0858278870418ECFDFDD01F5CEEF8A762AE49BA88FA8"]],[["0x19B04FC8840548E393B0F826E9DB43C39B7E1D499A0FA87DE2C2992495DC23CB"],["0x10ED4CCB4E1BBB6C764BAF0459E2027F1E12D7BD3DB7B46C68F32C63F571D747"]],[["0x3FF0EB388F77D2713D74C208DAEC589A08A9720E0310CEA2C592ADB770433E8C"],["0x1C27B403CA088F902415800EB5006294F9DD3486B6CCB77E847BD6A4A4FF8344"]],[["0x2841CF0AA5FBF8E63138BFFF13975B29DDF613356123F3A4E14323D5E5CEEB2D"],["0x098BB48E160F64B6C5BB7E0FB802AF90D5484413B8ADA65D705831644CBA14F3"]]],"coefficients":[[["0x0B5477D3ADF0E3FBD18880A6BD5A2FF0DE70F0A0DC7DF9F6110C22C60A92BCE4"],["0x338033EADD90C15E4195009F2FAEDFA06CFB521DEE95C70DD77CD95215ACF439"]],[["0x0B23144CF3E1AD203A58B819F9EBC70D8EF40114A7054CC71E187984C3A155C5"],["0x23981735949C93215F00A2216ACA3D9F58106D215FED0DC67EE98E766C313023"]],[["0x104E3A0B8B44684CC83EF2EA8B4B26CC255340F168AF73C5BA13489DE51A4988"],["0x36E4B12BBAB112CB733C5B899FCDC3ECBDF66EB76C816E3036EBC706DB3FA20E"]],[["0x3839B01B5000B3FB571777BE088F7B25076F509776265238015C50D276C88D43"],["0x019308E8B33E706E02E8CBE4029718767019A7AC4A3CF11B8D850A1366539FE8"]],[["0x2FBCBCB438090083CD513581B3F4FA759C0ADDED5B096C96753BE8DCEB7E58BE"],["0x099459942E2FE765799619D5F61B51225657AFE0EE1BCC39BEB47D938DF3B6AA"]],[["0x11B050361806743A3BA7B805C99F1F123CE34530F23B1A584B0EB6CC6E18675C"],["0x0480D08C5921F45CFD446ED82CAE58586BE4C1A4BCA7DFC2642E8CEFBC0CAF65"]],[["0x335F4DC41D05B384F715E724DCAED909FA44D62A68CB262C919BC1FAE40DB30F"],["0x15B54B1B8DC70C8D492A462518739B170DEC9E03907D2482A2160500D08905CF"]],[["0x2A3B745D929E1FE78F6D66B37F2E072AA97AF3CE64A61A6D9463B08281D04832"],["0x1041A9B4F84A5E3945B71A27D8B05883D54752B84F19CC2427E833EB63FD0D35"]],[["0x3F6D91C9566490C7C2CC5A3344787738119A1476684F94FAB24590F5EDDC2125"],["0x0FFBABB50B09EF7A01F3EF64F9B8EBE03982508FF8EC3287CB3394BE12010E8A"]],[["0x2F0F215401E0699ED233ED0F0882264212B68F185B3B954B1F519C3AD9D17AAE"],["0x107DC271B40D3E8B4394B69D5E63D52B9D993E1E438B787B48ED007D5CA05815"]],[["0x31D67E9465D5B48FB64DB995C9D20A50C9E01BB77586B2162E0E1BC2639B36EC"],["0x3475BCD68AD255A31792B5C5062C94239A78239E3C314FA743FEC26C21D0321A"]],[["0x36A76E1F40F610E729BE57EA75634AE5E66C9D541BA82E4A83B2DCBF60C0E812"],["0x0CD537C72DE301AAF4D27DCF74EC5EA1494BBD101A17785E9FBAF4226B25DCDC"]],[["0x2A65390F1468D41FFBB7AD8C97029A5ABC1E0B3DB199A4BB26990B13539BD242"],["0x03F70F599D867BC50B3EE34747ABCC60C66B2170650A9AEB89FCC5DB9C5CE077"]],[["0x3A942690780D0EF1BA358FDBDE5A84A8470652A3191EF21140E5BA1AACFCBDA4"],["0x07A3713A8A9B812BBE1189978F51CBEAD7B10D668FBDBC7BBB544E7183C30ADF"]],[["0x133E871DFF810802518C78F012AACED2ADC2EF4ECBCCC37925B16502AD708653"],["0x0A8FDEA46E595426491D39E3F0212788194FA27AD90870C641D1D5295941A02F"]]],"z":[["0x21CEC084F21EC2A0B78B97CB65512BCF8002631C7485BD6841F212DC73F0A675"],["0x35FC187C0417BB6561815314018AC4CA6632806AF035A96E767B863166175E9A"]],"s":[[["0x3DC09F5CA55DD665418AEA23A8483CD5E1437FFA4BB414A65494CED0D97BE560"],["0x3669DDD12B681BCFB306EE1F4F9227021D1C8C5C930D1D8E7FEB3D59D51AD74C"]],[["0x05C1C4B4D28AE2E34137FC625759C059CB66CD26EDE475255CB629860253803A"],["0x0C479A7D4D84C322A487D37086CC94EDAB908E2D7BE2B5FACE73698FBBF00A72"]],[["0x0FE2BFD9DA38EFEBC1262CAAA56DBD8F2B4B87CFD53E18247BD6E31BC1DE068E"],["0x136B92B3DECDEBC5063F1373E007450AC8263B28C90240E605A0A309C457D86B"]],[["0x3C996670C769AEB56F382399E73EBC3B32BA8EC81A199B1D7B4BFFE9EA34E025"],["0x1391B6196699C8E3AAB7D7532C64920645046B2FC7D43BD20FB1FD2F0D4CFB36"]],[["0x2CB0A33F4A6598327D1548ED561B9BF18CFE2A858534A41148EABB961A14BEEC"],["0x04CB9B4401AEF207A1940C68D3E106045D875C695602E8F84912B65C293210F1"]],[["0x2A854517222D300FAAC00EE150F32309B04EFA3EA8D0244454E3500864481D37"],["0x2128D3938BAFECD7BBD71D13608FB5D12BCBB8DF1EE7CC7AF73C0830F110CF8A"]]],"generic_selector":[["0x32730F88F11BD3656876A889D68FEBE45ED620B8C2E659F9A4D7B4200B2352BF"],["0x3F1CAC2A7E8B445F5EFB8B1BB022F6FFD55E8AA4A3061A294A3F77D3ACD6D5D3"]],"poseidon_selector":[["0x304285D12530476B6BE8AA17C50E536800233179FC261C360639C3F105D00A33"],["0x06F99837E1CF50DFE2C24F854560171C14CC8DB1D0F67931435281F3B1D65523"]],"complete_add_selector":[["0x18878C42D244791AC474096378E097C18C97D5AA5A8525F3154804FF447A70A1"],["0x3EE8D82C0C4CE6ABE1302923CE66B8485DB25D53102C114089448B454738A47C"]],"mul_selector":[["0x25B1889AEEEED5EA9D007942055C646559C0C5BFFED6DBEEB3CB0405B0316098"],["0x08F97E4AA4D735414A8DCA15A5391B6352EB2554F17F3F3CD18A1A9D6E18C01B"]],"emul_selector":[["0x2B6E579F0ABC56D1F816509817D2CBC31845EB94D9C9921E621C048A631556E8"],["0x09BAF58307003A5C611478A3EC8B797225B1830751ABEB87E05EE90FD5034679"]],"endomul_scalar_selector":[["0x077B6DF372F8356366136037D7D59CE9080BFCC947D286CF417A78D7A38CFA67"],["0x32731B20186112CD0F480AECFCC24C2A164FE3B5D754F9A15C3B3CCC0E58750C"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x1D740435DDD1EF1EE195DA377CDF030F7AEAE98EF41403ED34B53A6A460990CD"}}},{"public_input":["0x066A9A856476AB7A2DB21FC673917FCF88B05E1E7B7A30139EA96011BE3F9780","0x0223D99E461D0F58A2E86F0205EB11FCC9EA7AC5A31A46ABDDB44475C036D3FA","0x31EE93030EC6F21E56A4E2DADB78D35608FFCCCE69818B188DE08AE99423A68E","0x3C5FF6F8C9412F9A804350E8418D205FC695FDAC1FAFA16C523A96D10ED26804","0x031B828E60C28879705E023616BFE5CC983D8702D0934559139C0819F0DE6895","0x00000000000000000000000000000000443D8005E64467088D5ADA8010F4815D","0x00000000000000000000000000000000393CF14FB7524074E16A998722663310","0x000000000000000000000000000000004A2E83674E14BC075CDAEF9977B316C2","0x000000000000000000000000000000001505D68BF52E8305CF81135E2681079C","0x000000000000000000000000000000009E118BE3330BC56606B1460E01EECCE4","0x139E166C56D81B2BBA29ECB2C23BA3BB6BA4220B76E9B7C75235D7C0CBF039DA","0x009B4BB59D4DE3A9893209273D08FC75EFD802C09DDA3BFE30CF7C2F5C2EB3CD","0x0D599E41FC8C84F298D14A5B221A27874D4A18F99E9A5E64BC18E951384B6043","0x000000000000000000000000000000008FD857577BED54B0EDA39E5CBCE22817","0x000000000000000000000000000000006880982A705D8C8778B663D21E9FF6B7","0x00000000000000000000000000000000462DD753876B88E68A3195D5C6158C7E","0x000000000000000000000000000000006DA909E7454E86A0B5FEB073DB71C520","0x000000000000000000000000000000003FCE3D741DEE02B863D6DC97808F7D03","0x000000000000000000000000000000007945E5185B88367EC2855FF7AD9B3686","0x000000000000000000000000000000002F0027653438F64BE7A01E5BEDEECE3B","0x00000000000000000000000000000000E30E394E3D3C7FE76D12C9E58CEF915B","0x0000000000000000000000000000000036FD207ED2314599396DD08E270E1E59","0x00000000000000000000000000000000E14766AACBD968F2D3072ED2ADC96A5B","0x000000000000000000000000000000000DDF7575014E4ED08BDA8DEBB619ABDF","0x00000000000000000000000000000000B0D037B8D7F9E635D08B86A614B239FD","0x000000000000000000000000000000008A3FBFE336EE25D5FB08E59AA54A3B0A","0x00000000000000000000000000000000FF7378C1611FB9CF3E23C2EB0876DA24","0x00000000000000000000000000000000A3C7B5F46D4513C357F7E2B50D266596","0x0000000000000000000000000000000087ADC3E076D6234CE6032EB4F96C466A","0x000000000000000000000000000000000000000000000000000000000000003F","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x1064D15CD858FAA93D38D7A56C5B1DDBC197FE45EC01795965E73036BA9BE8B9","0x21AFAB376584915355B3F5C5E03B6A3E6506B23FB4625F314C91602166B10537"]],[["0x3FE35A35B8586CF80E96C55FA1C134F8B8201B9FE2801D2237255D7797FFE386","0x3062B546CC97F9E1E10FC74557044EA06B31416F78C458342489AE69E51615CC"]],[["0x1E3AF943B2610878C441ED4F315924EA7C1FC3B5855B04B80E45E1CD9B5E4F29","0x0856CCE28318B7EE67128BAD1F7CFFD80E82540EAACE55BECC670731B44EA8FB"]],[["0x210718C4E812DE79D89FDBE99198CD3150FE235FB2D38217000AF099F5187363","0x2B8DE606CAE581B129B593C766EB24ECCDBB0D51FF98570E0050E4E66DADF065"]],[["0x03ADC359D4F48426EDF6ED96D338211A1D1FFFC76785531754B719B60CD0F2B8","0x2B8072D3FB4F3E4ACB864463153707A6E6F5BAE4E61866F88A6FBF6B9B09E4A2"]],[["0x3A663BA6EF705677081D1938094BC4901AB02BC1E459F706D3F2DD13D8555A7A","0x0A6B92F217C62DC5063DA505C5C220E574D59A6B2BC7165F6E31B5832DA1FB4B"]],[["0x2226FFFBBEBD1DCA325409001773B4FA3B06E1F92C8B5CB116054F3F185368BF","0x2B25F07DAE3D0C5A8B390F93F3B28024A6A872DF695C38BE1680BD60C8F8373C"]],[["0x0B96BC84C227F145EEEA54A94F73FD86234592C3DF1AEB9BC2A731914AC59C8F","0x3F9BBDBA5710AD9BD29A3A6104B6CBA65F952F1DC0286ECB06FFDE83D014F4B2"]],[["0x09E89C0CE5A94DE8C03C4A43C33864E7BF87C8C77A2872992A325BB6EF11B41B","0x33DEB913610F1F95627514728CC4DB763CAFB90A73DA4D8B1F4C3DFFC8852EF0"]],[["0x0E95B62D6CD9008DCE12CBC32F3D29CF4754A03277B875EA59CE1624E180CB92","0x373E9C131E82B7A93AFDC05A1328CC7B9017DE348C27CF52C23B18081B5CBD8A"]],[["0x3D08C941704ACF3E81DDA075E38E80910BCC2A27ABD38AAC61C3D148F7AA5C0E","0x20D65AA1E6673104ADEC854DD8E6C0170478691D411337B9B4CC0FF9E465E955"]],[["0x3F30D03F6DBC74AD3FA752144A317D6E26E36F57F85FCFA8A9FA2362E4A13B90","0x18F83E32778F9335AAE51754378D83CAF028E13F894ECD05B0BA2E4189F64DE4"]],[["0x150678F79AFFB80A55E679FFF76F4346CC9B7BE52051694689649D3102652222","0x1564E57F86A3ADFD1C185A0E27ACBE5C32B363B29F120631FBA48F510E21E5BF"]],[["0x1E291A8361A7C2D59393E04CD79E116F444217838C8C5070FFDD4F447A14F578","0x34B894486FD134A911777EB07664FBC9E9A51BD85A33259223B0FC05ED2CFA95"]],[["0x282ACC5A92FCE6DB55C970A559AB9D1AAD9BE6E67AD878AB1420B3CE0E8426A7","0x31138EC742D289A8248A9DC46CA586607ADA203686FF23E9524D90E44E7AEDB4"]]],"z_comm":[["0x10C819DF96298704F43E70749B9591BD7DDE9238990A2876D71B7DFB867BE954","0x19A965D77EBA210C91907F57A89DCAF14D0B17DCB25DDFAF8CF7B68BEFDC2C0C"]],"t_comm":[["0x35D83B17D1606AA6D8F54B6731CF35F38B924F22B19E3DC9D216B22F8DC21CA2","0x1A8690DE75C91AEC2F5EF1B4D5DA43D8EA5FA54FD019F4239423DE81C1446381"],["0x3306C382FC3BFC549B0124E1B9F8FAB71313B666A991A15A69054D492580EDBF","0x2CE1D9CDE572715FACFA3F6101539C1859B3069CC3641F8DA1F03E87CB421BCB"],["0x3C64787B2FDF6DA71DF5D1E2FAFFE020367E665E8537769F91B3ED0402FBC440","0x0D23D3CEF94CAB4FB68D4BC9A557BA4DDB6C087EF61422A5407E5AEA34AC8B81"],["0x269EB02F875996640D5AC06DCF397202E4F22408899BA9BE211827C8778DCED9","0x0278E606AF0821F22537465DC7FF17D87DF3BA08C1868A012E2696DA76F0482D"],["0x310F3F81DE4568340DE1DEC7C63521B785255D6ABEF61C1CBEA9586D6B4CAFFF","0x0ACE70884B63D8B736520BB3792FD80A443946817910C6C78E2604E7A11BC88B"],["0x2E5716BF580C395CB6B0B036222B8CE095AD2ACD9B86CAD375264B94609C83CD","0x0D0074E3C646ED86DEA1D18DBCD9FE52E1C19CF7F0536A8B4270FB5ACCBD14AA"],["0x37B15D7E9146D7F2D00105792409C76E0A2DB0A37131EC046786CF7C7B021044","0x2BB6FD03451747EF72ABDD77A263190EE4D478B03B2C26E1C4927B88DC69002A"]],"lookup":null},"openings":{"proof":{"lr":[[["0x010CB0FF32471B12AD95A64A61A1F718CE8A9DCF2681FB8A045B87186595506B","0x14C7746B0FFA19AD30DA131384B67207BD38A4176BCBB54F1E2147D9AF9D1136"],["0x052FD9E2FBD19BEE052A4771674D23F119683888E76FFFC7CBCC347F2C7AC09F","0x2EC84652B62236DC07FA9F5F76BA2235487712D1D7E8253F249C182512EF1698"]],[["0x134856846CB34790C40F87C08BC14DD265165B480B9CC1FC7472B16F05E85186","0x28892351EDE22C73C6181678D4424485B21895BDB3709FC2A03279D7096E59E9"],["0x32B2D6F8D2740D801B37C0CDECE345379EE467B0F3D4CDC18DEB5760A9C1961C","0x3A9425012EC5157AADE9CD6228CE601BD6631AA89CF0F3BAE26B186B5C304908"]],[["0x276CC5DB72F3A909BC08B91417F22D5674EE392B0D570136B325A37F7F7C770E","0x392CAB36E88DE89C46F017AA305AFCEDF941C8427037DC72C3A00D779AA70C1D"],["0x1EC5E783A9BF7998ACEDAD772A32980395B7E20BFAE63B6C6B67089C93D54E91","0x02581186C8265D4F7E06897214C7B7AD05ADC448ECEA3EE0700A917F876CEA8E"]],[["0x34058711598A197D08113FE1F021D34F62B2187CF115346DD52637D9A253A04B","0x1F3B3D1371A78D46EFB75634DF4FE224C137E716F556BA4FF2F840D6EC2C182E"],["0x351E734F942E730587DB314497F60D654CF5F3326A998F761E25737DE4142407","0x355ACEC3631E38BBC12EF15B105B2C200C4746F78B78874E7F8425F0D4644379"]],[["0x03A68F60AEA08836E2450E4EDF42CFC8176E4C8192D7D47A789E119ED0063D64","0x25B6D023C81EB4BEBD99DCE6982E8E0A32DDB5DD95AB98E2FF41A0144B65DA5D"],["0x0F7AE63DC56269E2B8F726F5208D77D3482C2868D06140E368698F7425C05820","0x33664EA398612BAF373FC660BAD3A181D0C270B30295C8C5AFDBA6D5270D5FDD"]],[["0x08F06CA9D32202EFEE54E348F28B227EC342BB6D7FCF85F80F891D377C7D80CE","0x3114F9451D9C683043BA96F9F2CA5AADE008E6164D2070455396A84137364AE2"],["0x020436DDEE4122D60714D26BCD906509F8E9A8F365FAFCE98E767A03E96E09A8","0x2B9EEFB54D45CC227DCD2E1F9EC97A6A607C09DA4F0AB664ABA3218FD227AD31"]],[["0x346B9DFBD526AA77CA4DC7A9F77381C8DC706BC018F4A4ABDC6E9C044A2C2C69","0x290093A81568F54EDCF854C87150328C020749F4B767F6DB050A73B5B6E2D4CC"],["0x35150428FF17EAAE12C80560B45BABBC78CC43F43D4A1D88D06DD9F2A3B92FE8","0x3FD634FD1C56B642E6805945F153DA2C58314030BC6A7E7F491FD5926644FA53"]],[["0x361F54FAEDCA06D5C8A665CF716E407D31F13BDCC424EB0EC216AC6472A4D468","0x3BC5173BE0DB7AF04500D6065F8F2449657EC672C1147E6DDDD16C7CE4D9D373"],["0x22CCA3AC1CD1A97DC1BB8EB83DDEE1DC6C3226173067CCCE1E31B7242A66A954","0x0EEA9D4783993BB11D85063073256CBB1681EE65CE7C2C2458131B397A179981"]],[["0x25DADF9DC19852C22C6552C97E0CE0161547E77B1A5D023E15885B50A2E8B9C2","0x005C6E94A6C260E15F129A7B402EE7DE3110A84FF03066C1EA1C664432E91FDC"],["0x0E28CA00C56986F505D1A1BC4229F81895CDDF9320C2AA29E68F3E1E20F639D7","0x1215A02DBDBE6A04798D9BB3741A787BA86934E6EE0EEB81D5ADE9096B7D3D2D"]],[["0x237F15E3E122AB20C33D211E51E4CF94651A309C91174F9463A767861D7ED235","0x3F08037D768B2A759DCC150EF0E958487BFCFE31624DC5695813DBB18EF9A78E"],["0x1B8DC256DD63BB4F9551C39B15195BA54D489826F6FD790677CC065429972DD4","0x1155DF62E613DC8A5F5CD0FF937E6F04B3ADEC901697AADFC39717DC70EEB68F"]],[["0x30D6B18170D168CD87D9254A2E3E78ADB68C135A2DAD67DC7C402F019BE381E9","0x357BA4F6B52559E08AE2CAF0031316A24F2CF3C5CB86960BFE497F3932AED56A"],["0x00FF9694D6AC6BD6CA5D86F9EACD92D2568C49F45DDC485AE62D4823B19CDF17","0x11B67928B4E91D54AE3F1ABA124641FF75C98863A1A6ADF9735B518390F947AF"]],[["0x3E057894E02AEB8548B9A7839368DBBC3B5BEFABEEAF31EAB2DC2AB7E5B64413","0x18D9A3F4523C88A0F5174372C21042A2C62186C0A08F03EF83F297ED9D9FC8CA"],["0x342F09F0F20D6CCE26A089C03D0063C19FB36FCE862376086CA74D2B10CBF2A2","0x006D8EE389476677EE43DE62934C53DE54F8A9DED7F5F7C4401D3046303972F9"]],[["0x076659174C990057A2E321E6DECB683529BB34F1BCFC6291E1031E559E14EFA6","0x368C42EACB44696F0C0416C8321A0B775829DFCE8674167F75C2D9D632F70C3A"],["0x1D3CE4C591552136C613E75B70E6CCF7726C8A98F7AD8431AFA1D92BE42F8C7F","0x193DA3EA3CB16445D29023A99DD7D4EF540968FE9AEA388D7E008B079A729DED"]],[["0x1BD606ED2522610D024509456241D2B11D8C992EE112A177E0924CD375F651DB","0x2D355F2FACA67862ABE3A3B48A5A14D5E42CB87DE4BC8E616B0546DE7FF185F4"],["0x0BE2230A06D82269BBD81798EA1864CD60F4CA7F3F479D10A579D6558476FE32","0x3D7C84681197B4181C397304FCA01DFAC5412C1F9ED020572197209FB028D775"]],[["0x1FE9D55A6F205FE76141C2BD8ABC3AD4CF02657B50074A16A782546BF17B0185","0x19ACA646087E286EFA61EBFD3356C29F83F06714F8E06AA8E3AD7936283F53BF"],["0x3B8F3277D1B15D8AD30E6313BFC8669581C7E56BD15E1CE59707A67B21CE7A84","0x1954F53B18D914789617FC78F5D4B20D3D1C700F1299235AE1030526DB5D0687"]]],"z_1":"0x0BA606825C7DE9D889F06194FC462EC6D4B501F7D5EF8F77C085964B3921795E","z_2":"0x3BAD5011BC956E05F64D76ECECC952D1C86AD29C79E7EE295B7616648D02298C","delta":["0x1D86F3E6A762A07785F5A79FE3BA65B07CFE3725541B920336C821C3AA56B74E","0x050EE60F07A9DCEBD22A4DFBD49A6AD5CE56567E7B25F26EA60E0A035E451E0D"],"challenge_polynomial_commitment":["0x13B1BA2636DB568A26221AE7CC4DCF2008CC1199438562B8229DA34CCFD13F00","0x0C26F8D7090C8174FBB13FC628CA92E273A48B0E796A525468C6A58A0CC41CD7"]},"evals":{"w":[[["0x37DB3D46C9A9DB410D59E2DF275A5A9390CB44C8AA83165D0E8D2C7C8A82E46C"],["0x23280BF93180F8D2314C3CA7C37308F4E4415119FC568F5C22A6C9F8B61300AA"]],[["0x25E9A427031C5D1405EC4BF6C1D203614C4043EA8AD979BBE9A1B4D2DE8C1E93"],["0x17B5FBEA7B39B23EB7A60B871D3E98FE15A4DFF1CEB9BB74A20B5852ABCE3C4F"]],[["0x1ECD15CB8B54DAB9FF91D02ADCDA038732C8342103B9767CE403B53CDAD9B298"],["0x1FDB1F699E588C0213957A6A5732E8EB4F9A952FDE2028FC2924E82B32448F61"]],[["0x04EFD3CCEBBF9EF4273164CA06603E8ECA62D1E4B550949193FBB63EDDAB75B1"],["0x3A3DBCA9BF7980935ACB761FFF6842C712ABE848C4E5BDB59EEF102560F7DBF7"]],[["0x1A4AC0393B780483308ADD3D46F3DDD4555DE02E5E7717279835B7EF73909213"],["0x1648E037653806A595CB515F9B0AB6AFAA2623496900BC36D99A5AE758EC0F16"]],[["0x0C446FAFD0395EBFB939367B586849F7599F264F93F21249878A3102AD918213"],["0x16AAAF3104D056EFA369C4FEA7A27E8AFEBA86DD3AE8CAB94A96CB5C3DE513CD"]],[["0x19D8776CCC70A03BBE45CE579B4CEB16EB2D52E625E51079A706DBBD27F7CE21"],["0x0D4BC53976FECB4569CFC88153AA96B3A1B7091FCFB4570727EC21E24243AB51"]],[["0x2F9AC16927332859BBE6FF728AD6AF6EBB4734D9D94F5721333805318772A84A"],["0x09BB4C621763CDD4F511B851DF7FC720ECB967B5257C9BD1C6641B5E065FBAF6"]],[["0x1490794F17ABB90038D41B33FFBD7AC7F18E772010E83E4525C9BDADF9BED847"],["0x03CE34E9406CD5D859A613A527BA3D06BC8BA0C5ECB9D2164A2465E6F435432C"]],[["0x17A5916E55C6F69700D269A99EBF607C3E6D47CE871CD9E04F790A44114E6D73"],["0x0F80E80108323851F4469B624823EE9242719860217F04689BDC1F05A71B01B7"]],[["0x211A46C9B8A9CD78A6399200887C000CE0661EBFA83C9414DCD98716103F901A"],["0x1CA4B845B2C48DC1D63AC6ABAC73002AB6F15BD2FFB701D01428F400DDA86CDE"]],[["0x0CB4B66B5213EBF331820343475D0674BB27E10EF7E19C48B68EB21E5C97DEF3"],["0x3AA45AF5A6BAFC795FB29C0D8662371DF1D43842F511FFF00D8A4A58CC015321"]],[["0x0A7DEF2C576F29E3A41EFB10D1A357B5298F3DFAA4EBA22F90D82E263C365A9D"],["0x0035E990DE7EE602B5B60BAB180BB9E85F1D6CAABC3E70E784909E649AAB7E3C"]],[["0x1175245F098A2EC67E4E424336932A1515A6E6EC86EB1AE70012E38AC0D7A10B"],["0x0C8EB2868307BAAA679D062C1DDD72E2BC513FB41B9B2F790C6F41EC56B14E45"]],[["0x1A361C58012C99128A0C546992D748B4E304053B95AC4534F2A490A210909EAE"],["0x39AF177B68C98D43071E61DE4AB16153F66B4C1DDC0860E33C216AFFBA790C03"]]],"coefficients":[[["0x2DEFA89AD5F9C730B065E06E3DD68254BCE23A6CD63583ADBC413D8D183CCD1C"],["0x0DD69968C334FD2DA5D6402A714C407FBF5F08FFEC5B9C3A231A3EA1AE60D6AE"]],[["0x291A5F07A3E6267271140A6C78203947730BA4C1850E13B85E12852FCFB7EE60"],["0x24F019AC55015BDDC126BD067FB0009E30328CD187503107D39557C7F547272F"]],[["0x30D3CAD6A18A1B6FAF640345B5532EBA708A2C440894686A4847EE8BF9AD1F2C"],["0x3D0868C145C7171991AC655E12F4C0FF8923BE300EB4D44E9DBE2008D5B81E82"]],[["0x16569A78A8217FCB260D98FE5DD7E4F83582C8C5D3BD19B7D9A83AAC1664D5D5"],["0x184C52317431AD69DF0FF808A5D267F93432E511631E96606C001E15B507D0F7"]],[["0x01C8284768C2D6B526962A6E06A0D76ABFAA4BD65B14E5994FE4BA80D2EAD3D8"],["0x1579467186613D91E5997E84A521C6C4516D2755EEC71787C5AE1D33997268F6"]],[["0x34BC6BC1EBAEFDE39F71106382FE012841B23EE94B32643CF2ABB94E38D2A4C4"],["0x2ED6379377F653EDFDA3CF8138B0C6E77EEF4E1265F6BAC593E82A8A6D185731"]],[["0x303AFB64562088B4C79ED2D33C8427E6CB6D34810FBBBC92385301F3769841E2"],["0x2C329F5DC2169ED041608AC9B0D53F27CC47A285AE2910BE34FBE84BC6184BC1"]],[["0x2C71142F500C55B8551AE6EB8D39C1C35B6779FDE23E19D1D548F09E48444B9F"],["0x305A91F89C6DAA5F8B84B725F55C011079EF8B2BCA63A4FD3802C3F3BA049947"]],[["0x25D33A54ADAAA9EC624011FEF9A5F043185A5981C1C1E6DB652627C1CDDBF989"],["0x02EDD68A5E8AAC2A1D89B0FEF8202697939E9801ACCC52D91EE7A529BD895DCD"]],[["0x1B9794E47EDE48C9636F00BF1AF9D20CB542EA043F9ED6054D44C37192AA47D2"],["0x35E3DB7E0D941E61A4D8113759FB4668E762984A2B1FE46D3A496AB2FE4281F6"]],[["0x19477F2B91DD165B50E55DF727FB0CA4D0C16059901DF27E610E74FF223FEB75"],["0x35D198B5871EED4B04ABE334C37F22334A521AB04626BDB9F51CE733A089440B"]],[["0x00C0E36C64F37B5AF532E78543D04340E158CE350E6EEF3B087DD9384A087BFD"],["0x0EDA8DE0461D65EFF710633505342DCD23045C21C1BD5EC44E37CF7EA91154EC"]],[["0x0763D546A37B219B4ED8DE28ACFD8308C6EAA2B0A9D62E403494281B1465BB16"],["0x2471000008AF643D3DAFF8AD0879F4A60B8870B0B8F3960BFFB16BE3162339D6"]],[["0x213AFD6E8C91B30F4D2FA5819BC911B2F2BD30462EC065254EC93A8A95EA0402"],["0x22E079C809C306668FA2A6E5C3F0FA94D24E66169C230BC9BD5E7796E43551AE"]],[["0x3D16BD199502F82185C05A81B8AA6D1B8A91171E9466DAB9B85FD25F5D2EC75F"],["0x1DD82953D940AC2D839551FAC80C6A9634698A7B03A20E1BBBE55AA139EFCE19"]]],"z":[["0x2AF8E535C2E2BFB186A12C126B92ABABBDEB205FC6459E6DA1BB7A41C9904569"],["0x08D4E68965974FB977C8B110CCF62C41B712E6A0A8BA696A58E33ED9F66F9C8E"]],"s":[[["0x1DA9CDBB8408BE4F74552EE5C1D7D262B42FBDE1E7D2EE20A78DE9D7D0A1A6EB"],["0x0B49C132019231406F2A76D1CEAF3248CEEBFCCA6C4E32E45286FB21D091A88D"]],[["0x3FEB22108992148803018E87A6924593FEB1BACBB0B37F5577380898A0DBD644"],["0x1255D4328FB07451CBC3D7F2283E9D0C579B5E29694CB3A28FB9BDF7D3729D79"]],[["0x11149171B6DBECDFC0EF54B5ECA3360034D84B6C55617CAC671FC2779BD8F197"],["0x36A3B12A87E2AC4F98AA344FF008CB26FB466A2EE18A2B80E41B2F136175F819"]],[["0x078AC5A7931B4D1211DDDA453C664246579C9230AE25FC14718EDA113B853EAA"],["0x277C3EB0EC64AC35113FD4E69A70E3F5DD5B6BB41CFED60B8555708DF4F8F933"]],[["0x2E9CB25A845A0B7BF531EA3A90124E557F88C39E3F60892D975190BA0129C397"],["0x22A0AFFA3692166AF0824529667C49CD8BF1382DDB29D20FDF2B08C0C938151C"]],[["0x305C48ADE06C395E26E0BA96BD3410C9892AAC81AB61E9B0D15F032FC57285F3"],["0x0770CCFAC923AF1F8767E3CCB7124E6F2D44C475042B6CB09617C25DEA283F15"]]],"generic_selector":[["0x0CF32D29E43D8B8F1F949FB672BD9712A9837A76CEA4D2B0710721CD3BB3C112"],["0x2331B6FB512EC9FC42D2416CECE288053BFC04C8FD9B6C995AF54CE050E59E6D"]],"poseidon_selector":[["0x1F01BDCA9E7B34E0B4FCBC06514F9F92CD896E631D3229B57C3FB1A0304FF459"],["0x11F7C551CD09DD5DAAE9B4E5514970E5F45B1145415B223603BFB15C303BF225"]],"complete_add_selector":[["0x16DF11BF2AF17F24E986DFC729E03EEE8C2D1DC8692EF30FD8601A66179D6C43"],["0x2EAE69C61951829A7FC66E5B4723C5293CA213C1204460F19577F3A3ED3C54E8"]],"mul_selector":[["0x0B06EE139F574831FBA9BEE19692A8F1C764C815E99A0B24C949F1A76A00778D"],["0x0DD44645B5270B633589F45824F8F57B091B5654C06BEE2FE88278EF544E465A"]],"emul_selector":[["0x26E3BBBE04AF976DB870B6C7E4FDC609E3786543ED8FA7DC9D56DF31905378CD"],["0x1AD5856424D18B1D674BB43F6EA365E28580CCFC1998D3929E43CA2BDDFA0EAE"]],"endomul_scalar_selector":[["0x00D332929E5B7DEA4AE664519FE854A7E6C7F851E0CE1E28D7EE7B4BC820DC73"],["0x0142CEB13AEAB05BCA5CD6DBFDE8FE37E7C002DBCDAF89A80E9E3DD293096FAD"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x11B072020BF1AF2BE7C883910C417D6D6D8C1036556AE44B6AC7492396DBB99E"}}},{"public_input":["0x06510506AB198FFB0E2965CE71614BAEA8D58E527F4091BCF8BC77D77E324D2F","0x28A48EB9155755A8378B65969247175A309D6FC7A193C255B6DF76A154053067","0x0FE86117AABA669B4E6FF3F6D7D58254449EB545C629C66E17D49F1F7C0669A0","0x0E8B6EB95617DA4151D82D09EFB55BFC5326333F359BCEF2D7F9518530D46C3F","0x3339625BF76E6E618CDCF84D76FEE58DEE56646AFC46EED7F587663994836D5A","0x000000000000000000000000000000003E017C52BDE54FF09E84D15714BDF87A","0x00000000000000000000000000000000AA3093A50D629F4FA8236C740579C3F8","0x0000000000000000000000000000000087851303A07ECA74FBFCC4F0A1A92765","0x00000000000000000000000000000000601B661D9CCE80C8D32B82120A49059D","0x00000000000000000000000000000000420F23B1E8B64AF191423D77EBF4529C","0x13CE48DC56D435CA3F5F78B132F962B050D495AEE94CB2178A00E17AE7942F64","0x1A598569EE710299B992C4A4486A6D6E09C87510F4DA1DE99D9F9CE849CA9617","0x2F7A6B13F8C76D962E5EF97BF5ED3337637CEF45A2BF56439128FFBCE0F9E714","0x00000000000000000000000000000000BEBE7CD0838B89672C099908C53512A3","0x00000000000000000000000000000000DBCB7835E5742129ACE8955709B42ED7","0x00000000000000000000000000000000EE0F35ECEB56B5E578B85BCFE528BBBE","0x00000000000000000000000000000000138BD7949377717A72E77A2DD12B1E88","0x000000000000000000000000000000009617CC10E7B8EAF9B86D7FFB71EAB19A","0x000000000000000000000000000000003D0EDAC5A7C349FA45AED48987BD78CF","0x00000000000000000000000000000000CA03FA8BF6026944D6F204E0D452564F","0x00000000000000000000000000000000E4B9223BCB61C9AAEAA2C17DD596BE8A","0x00000000000000000000000000000000DCEFEBD051C013CB0B66E14AF6538AFA","0x0000000000000000000000000000000092CC41A5B793809D0F62AAF405AEAA1C","0x00000000000000000000000000000000FC1132B860A372005028562CFAB963CE","0x00000000000000000000000000000000F20E43E71EFD4E123DA633541F982254","0x000000000000000000000000000000008C3B013E53847BA7A138629AE1B9F83D","0x000000000000000000000000000000001A4284F79F6C2D2668CD05A4D0DE1C6B","0x00000000000000000000000000000000DA26035026AFDB1DB8FB54E12343373A","0x000000000000000000000000000000000F2A9C496940134C91DF38DB07F1483A","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x3D3C64770FC5A37986086E34EBFCB071EE81E657C34152244FB127CD8F9F0491","0x1D52CDD3FAA931639509DB108C159832A593A09140F5D1ADD9BED790FB08CFC3"]],[["0x1FD0E6BBDA0386DBABA822FF81EF09E9F2D1ACEA85A21D9D755711FDE5F570ED","0x2BE82DC96AF1EE6179E010D3DF500C6A1D716EE433B7F25BEE53463B3C9094A4"]],[["0x13A821E564AD5CBE94391F68727A5BD7AAC7932364684480AD9FB9DA3BBA4C01","0x26EA43BFE90690F6211943EA0B9C05F7FC7D39619C68679189F19B17A3567D68"]],[["0x159701F782BE3A96781FA7B15BAD28E060A635D949DADD0FAADB138B02C6E491","0x0A7917C1327AC15041DCF2FB0800CCE63038BD76BA13437B2D5BAEAC8A85672D"]],[["0x035925B5568F035FEB3940A9C07AF09E67F9DE8E0B7D710106BA13E195896906","0x2E74CDD5E8C0E35E84B0A7007C1A5166F2C9F67280009AD6113312C6DE01B218"]],[["0x26C68595306EF29539FE601EDF89055B88E135489018F230026766B255D2A835","0x1EB74209ACA48314F5554010C5AEC342865521F99A26D6269A6B00838F7D3E23"]],[["0x190CE717F2B80A5D41A2ACC9805501D7031A8C8577D149236BDD28F0A8B45AD4","0x3EBEE11B93EDF6BF3903B44C440CA85CF3B24D3359D14602ACB035BB8D8E2C8E"]],[["0x3BF520EF9E49297BCA2A377C44A449EB273634350E1BD230A62ADE08D48833E2","0x37C89D9B7B8BF9B1BE0CDF9ADAF5D6C43E499E4FA12515121097C4B311BC3F60"]],[["0x3589F64F2EC80BFCD38BD43C8DEE91743EBD158A7D8203D60DAB21F96201D115","0x09210BF54FB003998079C4EF116108E938500354B393035FE9D1A66EEFCC2FD2"]],[["0x342976FF654C6E3C99AAA25BE7CCF7C00587CC6E543263EF81B4EF4A73D156BE","0x03ED454EAF8D492001410FB7106F288B01B95DB90BC58390CB1B7A2848E33049"]],[["0x3D470628B4AA49B743B4E8A74F80DFFE186F2BCA7E43108E9FA31085188C5709","0x2E3B9606340E9950A6C1962A53037DA5D5B4B616D9A7DAE54FBC5F2A44711D0D"]],[["0x0B2FED5A501EFC0CA1552C171EE4CBC4BE3EB7389DBDE668D98459FE6E100D50","0x07FCF3320EC11B7D4ACCF680C58428EB03F2657A766325A5ED0C6CE1C7CE96AB"]],[["0x3A418354239E299F470F552ADFFF5CFE7EBF23A4AD06DE0774DDAAABB2C9360F","0x023A88EC1AF9D51673B585F2E36271D83F1711544DEDBE617DB95EE75A86EA83"]],[["0x07EDC108A197F5501B30AAB8EB72BB1518BD89A03F30BEE40749BB810F9340F0","0x3E3AD03585D52552DEC14208C27E51E9E421723117DF94612EB2F28BA2B102BC"]],[["0x2F042521E14DF062968E65CDE63787EE1488BDA991749D5CACDC8D1E267F6493","0x21E614C958F610EFACCEFD6C67604C52CBB456045F3F547906BD606453BDCBA8"]]],"z_comm":[["0x1462AC87974747EB96887A67E5FCED49440E2308FD6DD1989115060190426438","0x0945987EB2853F4110EABE846C55DF84B44CCE0E8A3D81CBCE27D2FCABC4B601"]],"t_comm":[["0x1D14A1EB035E77FAF7E53E56EBEE5EA687820038CF51CEB2A549AD35408C25FD","0x0634EAE62C995D49297050C0AB3AB458E7C7032A03165D0C57E29AF77B72A283"],["0x0F144E1B73ADB36AAD04908F33B53E282D3EBA8612C70FC7EAD9C8B32515666C","0x143483616DE7175F6290BB4B7EC02C920716D235EF9D018F3B53C1FFBE3372A2"],["0x105C74068D1CE7CF7551813F830F37B23A6A464CFAAA2698BDF2DE45BCCDD475","0x367122CF9A5D4699EE3D57141B98E3A81657D38EC4DB70CD1AFE56AC2F7D0C66"],["0x3DB78E4E1D8ACDE79CEF554393D4AD3EA2E691EF495ECF7FAE3D4C690723BF6A","0x01FC3CFAF9C35E36CF07BC43A9DBC84D9D797E3FFDAF17C2248B98C690C19FC3"],["0x051A5E13DBBB10D8ABA0572A8E454C4EC324F0C6F298EBE7DA8396CAFF5E6B6B","0x3B3C66E67D22E023F8137998FF7D92303E8783AB4B101F9447CE96B8E7FA3FD1"],["0x3E2A105EAFAE134ADEDB0228A3360EBBB32960B311FFE62757A8A689B5068929","0x308F2797A44F9E1BC9D00A95A76F90A796755201177E55CF42B441E8DC69AFBD"],["0x31CA52D4D1523F8AE0AE7F035A1F2C8D95F5EC68C388F6EFE609FCF8F86F20E6","0x106A5147FA9ED2665F6A9539A1DB5405BA0A6888752B592D0B42A0347F1CD229"]],"lookup":null},"openings":{"proof":{"lr":[[["0x2666848E5335AA5BECC2BEEA341BFBD47B58010BA50DDCFABC0AA49B54B639B5","0x20B641573085BE723FA7C337682EEC0F86BAFBA409C0BBE1453A10C7E2BA0B14"],["0x0A73FEB693D88833371D9F9BF85124B36A1096DC4271F01EE2F6180A3188FD1D","0x067EFAE3EDF98E96865017BD7F8FFC6984462B21DA4C9CBE11B302FB299C193F"]],[["0x3109BB8A33688B2D615255CDAD63794E4C0DF3F24FE59418C5324FE2CC44AB8B","0x308D997D0FA798DDF4719A70824F79A8D903B6D493F35330EEC1067CA67C5CAE"],["0x0EE28143DED958F452B4D5F4356CE2E7B73F52D3D7703B924C1655CEE4F5D17B","0x01AC157C4CFBCB92235FF35AFF42228CBF94EE1363BE2C5F766BAC17C32D308F"]],[["0x289DC1714F2E3C785CD5AFCBCEE75EEB935403A7082FDDBE4BFB84EE9CD29247","0x2EDD7FFE064B0DF7BFE0B95672BB3CF7AEECDD70CE62E98194A30B20614CE6D9"],["0x2B753202FE67F7F99A58A67D6120C9BF0A4ECB9FAD8EC6A4442A40E907391A55","0x18C252A95D8012EF0D67DF28AE7EEDEDE11BEF519999ED5E153B95CA66C2B9FD"]],[["0x0C88A4BCDC6A3ED05432CD46361CE17682C955B7BBFBD6FE2952AACBDFBAB3BD","0x317B6B66DBDE113353A5B8A79E20E8A8B0AD57FDC56D854A37F1CB56F5A1D3BC"],["0x22F6BE106194523AC313EAAF5C101EA801FBC213F66F94035D89B795D96751C8","0x16F3CF1933DAE750F402641E5D88C8C94406867332D469A034FE29D12FDAA079"]],[["0x14501737501A747DB4ADFB253EF4DAEE7ADDF4D21A2204076AF499B9553AAF5E","0x1FCED7D0370C774A00E5A6C1E58C5178D1A0E2C03B86BB911AB5BE75DC29011A"],["0x261843F5D3000A59CE475AE66FAFB3F1F7D7FD0534BE3CCAE73940B01F9B3CE0","0x37251E1D1C317660BC811D14DD2B5BD799B581822750EF71B5186C571A9A1069"]],[["0x254B03DD6CB780CF863530821F4194F9679D925C9C7C315A60C5ACB9D27E3611","0x1F7B1BA6E131F8F52851523E06E4BBF3CCF70094B618F4CC7703A27F6DD5EC81"],["0x012EE03DE42FCB78C393A2EACD31522FD9903FE50ABD0823E6863BACDD2D8B52","0x08D8652ADDFECAF2ACE41598C04B69B75E8770C40DFB5858EE17FF36CBE039C9"]],[["0x23306CA5B2A90114C4DAFF644C0A2D79ED8471077D99A99B1578E76D0E00933C","0x03ADB9D65F0A7EDA50056A5E4022F29211D95463561DB98FB8DC0EF4F5DFCA0E"],["0x2793060BB00D44BCFD35A08317C637105DF28018736EAD58D663AA11B2D52CC9","0x1A71E26BA7EDE8305A80DA24318B50ED06CAE3C31C868480DBF25CE722584004"]],[["0x3AE6BDABD0605A8B4FDCEB3357731AE776DFF8D108FB477A39EEF0E79467C8B1","0x25AE8FD6AB280911975AFEEC7DE166D1423FD730478FEB4FDCAE3125658E1087"],["0x1F76EB4F4BB502E76FBECD876DD42E492428915CA0C64D67EA5658F1D9F17D9B","0x27B3C40CC98DFED354BBD54751B8E3BD6C111391B345F7F15B0AD7F4973A57F4"]],[["0x04AA26CC2F0183C7F89DEBA694D2FB859A7214F4DE150B83B974AA6F0E5DF764","0x3AD7B75A22E0FEE743F947710DA7574B4C59BEC7E5F0B9F84932BE8A586951F5"],["0x0C1AA7FE9891449247B7BF5E9F4D9A60563BF37A59D5F5829528D181E7C9EAE2","0x0DB30656F365F6BA7E2E0F794123ACF7ED8FA9C077248080AE966E47AE4A9460"]],[["0x12E529058BB89E6649F359600F2DAB1245DF5E9021FD5D149AFEC789FB3C9605","0x10D6DE0ABA37A4601B4FDACD19FEFD450E9AB07E2CC22D47C34A0AE54934B25C"],["0x271AB840B0CC72B7406EF6F932FA7C2C975DFD9169585D7635E3B1B080084264","0x1B9E0FBCF8DBE62EF65701D7E6E96D672985ADDE33D506C211AEF2A34B41D6EB"]],[["0x38304D11AD65DA699A2201069C79A79A46A4654D2B590447B913CCC2C93329F0","0x218AF26F669A81AFDBF4EF02D169DE3FDC728AE9B2F1266EFF564CF88686C878"],["0x04A5301B78907C5D4B5F65A5A9DE9011ABE9B71F23370BD2209B3A7A7A8F3D8E","0x04643324408CED0FC4FBB3BBA1B00F308DD31434AD69BC875C4CE76AEB50C08F"]],[["0x2111BA9C62A397F1286D947EE84D615D0E4F1248363438454C98A7FD2180203A","0x35E5D26BDB3A98CC2E5EBEE9A3EBDE1A7CC46E18BB34AFA96079A470AB3A5049"],["0x19D5692C2A06B08C65157B10992466F8DE572DFB7C7E63FC59F09BA31F0E3C64","0x0156FD5A373275CE116296897EC0C30F2B0DBD13633443236E2FA3320F6EDC33"]],[["0x2B7D1FC6298070C207F04088828890C94A78ACE3CF7AC56B7BA937A0ABB2508C","0x18D4B81728B47DF1B80E12CA0DC6828B1ADE03D121C4BEBFCE000B4EE3CD4184"],["0x09BDACA9B6CF08171349F2E601A2CA7E1638396F971AFBFAD9D1E4FFE8AB152B","0x20A1E0C6E908CD040CDB6723215A6F081E487CCE606B0AACB159943A862CBBAE"]],[["0x2960C149F2EE0D225F8345204BABFE5BE2432DCB503DE3B2C809EE8D8F65CCB7","0x0BC389BA04846DEC8BE7C268C2FE49F310668F81FDDC4FDAAFB961E13B29965D"],["0x144BEA9E16F05F4D24B976BFADC2B9443A38649DCE700ABF46B6EB659B9B8231","0x14B810926C1F597733271945E2BC46B9C4E7A54659F0873B8DBCBE6CCA210B63"]],[["0x3205097E6DD64EB97C6FEFD667F6CB4CDC7DCADBF8C6E60AF67C81E5A60259D4","0x155AB6DCDB2BDCD55CE13ACF4013D8B61FB382795F535C2DC985FAC960630261"],["0x2E82CEB1330750900271DBC358C607EEF4F041A2F24567207D9BCFF3068C0D9F","0x3711DC238897CF341006B8BF92A726B2AA0FEBFA62FB0D1851767F921F4549C1"]]],"z_1":"0x3D7396A59CF2E6AC5D75EF66B1D67CF5E008367006C4294E70F5B4C4E8D81EA0","z_2":"0x1B3725B6E6FEA55793C0BB832621D3DA27FA04B273C4A4F1354DAA03DFF8CF57","delta":["0x2D8E62959544472AD78C9412EDF1C497843F3345FEC71036BC22B4E3191A6763","0x08984A408972D1BBCE8B96B20129BC6CC97C8D6E1D32FB181930CD4627C98DE3"],"challenge_polynomial_commitment":["0x35B8A1A262E172180A9038007EA01D3C6DD07A2E6C4B843804F4CBBBEDF8A717","0x1E1CE0F1E6F7F309A0E7351331E5B41C8FD7369D49AF4E98161A58023FAE6100"]},"evals":{"w":[[["0x1609C5E46E4B5CFA7E72F6F7BBB93F7FEBDDABA2EB35753A1B909A332E18A0E4"],["0x342F0DB562F5D7B6E317ECB27777AB688F5ECB859A7BF05B00BFDEA51906A460"]],[["0x3BFA6AC478D6B34F585948B9DAB381073D495370A5C77B6179DF40079CB217DF"],["0x036CA832847E97DB0F680A2B44D74AA761F58093A4D274F0C8ACBA8B0D6DA723"]],[["0x37FFCE521D24DA31F88AE88CA299C3927D934A78079321B8F38E3A8F7F52AA1C"],["0x1D3BA708A3C2E3CFB762E9AEEF8EB35D7A32AD59BFF413A5F63B5B0299B56CC4"]],[["0x3B25694D740CC34C099B918BA33E267A1ADDB5DB4020CF81E3910AF9D8DA4371"],["0x338DA7FDF4875745457D7A56B1B0BD4E4A50309EF8AAD88CDE7E0B6A32C6B65C"]],[["0x1C3AEF20576A7768AB37EF9088B267960EDA30F0283815864E0CFC8BDACF4814"],["0x277EB85F140F8A4194FA6B1A291AC75386A2280B748B3DDA49C2217875E99639"]],[["0x017186FD8BECFDA76F628E3B99B2461FA79156E37EACC4D8B60533C27B44FBF8"],["0x11CB9FAB12BA64FD71CC890B1D38AEB30B8A9D25605204538A37FE5B7DE93904"]],[["0x2C6DC53171152D37506DDD1B59535296B4A792F88C91F7A957B409F96AAB58B3"],["0x2592222ED0581FF5F277BF66077B1F40343165DF0843F43F1E7E18992B150950"]],[["0x3DB83AAD9351226DFB25E0D6F3F7921E836B3EF495E144085D20A636B5D6D312"],["0x3316531DC8F1D85C629066E33E9E4CB95BE3CDBC67E9FA5941BDCC6E748FE15E"]],[["0x3FC2954882C842043B3333ECE74A5AF2168B6EF9015701B36F63CE044AFA131E"],["0x172AC4A3CB9FCB7DF445A291B29B05381C9AD6A8827976EC5AC07F6FA318710A"]],[["0x18455940FD655BC17BE3842D05DE47B6749E085B5596259732F72CC0D4F1C4D1"],["0x2A6C470191DD2C694E53594438F24874F062E5F4E22355FEA60FEA5F67B180BE"]],[["0x1DCD3E1A4DE535859F1D7AADA30BEE38520CC308D918D5EFCDB87CE41D0D1A75"],["0x3AE7CB652E040CA20559D29622FB68677363346034CDD3E3D5A7ECBF532A62F4"]],[["0x3379227ABD49B57DAB289D2B2619939C6C81FE1F6F1064144EF9BDFAB6A785C7"],["0x25A5871CB0A6C2604E646E78FA058BC804B55745A4ABCDC21D9AE48671DF7773"]],[["0x071FFB73359AB20E08735DCF27660E6AF23819BC63FA2ED0327E19C090A8E483"],["0x0526CEBF8C193EE7186FF346CC6242E2BF486B585B3D831F2CD8A21DEF8AAC47"]],[["0x3531DE46A94BD5652BEAA8D711EF9D6DFA56B36ED5AEAC61886C4301C28E6E53"],["0x369E387FFA541DE430B65B271B9253B0F042245FA5D74268F6876D5AC3D461E6"]],[["0x25F957147AC1E4CBDF8588FF9441DF59F38DDCD919642515677E371FB2261200"],["0x2AF12DE2573CD9333F8B42BFCEA23B550935C61816AE3B73E9596A795B6C26BD"]]],"coefficients":[[["0x2BC60C9DD51602AA0D6D6BDFF0B77AAF6CEBB5799494377CA47210DD77F15BAC"],["0x14ACB3324F27D38613547485A74A3FEF8E3461B7AE6D0D43EC564D0B7E1C218C"]],[["0x333FBF8907C1845010BC8F4CF1FFD6BF4E1B9C8B0039E24356BEADE47A26D149"],["0x3D73ECF6540E951560F79B059E2F9C8E96CCFCED757A8AD84304982CCFC8A5A4"]],[["0x0B32F6F7DB41004BF8DE02FEDD38D5EED211172013443D3C0661A2CE7838B6AF"],["0x088E6FF90CA8897105DC724B32903F59C122D18E69C6D091CBB9C43A3FCAD016"]],[["0x3F3741459DD2360B0F9DD3084FF2E9BD803442DAC3F1BD4C71476CD95A860888"],["0x0E47454169531A7607D398315E98CB80D198CA5ED2A6F7EDB4F3ACE19652035B"]],[["0x0661266C74CFA335A186F267BA852C695A1FFE6103B6063DB1C203546BEE1438"],["0x1807C9B806D5ECB64867BAB650B4638907CACBDCE3B2C2553F2793BE09CB0DDA"]],[["0x28E4981002C948E2D46A34053C0511651AF8C3EA529469C0BF955FF53F774A70"],["0x26A4373E157C0CD567470D75BF47425CDA2E0EBDCAF47E0B996F2F9DA6B7DEE3"]],[["0x07A5E7376E439B838DFD409FC84F3AFE912559274F4BC6C8516BD2B21405BC04"],["0x2CDA926B617DE660F03D3AF46C1113943EFABEAA06F31DF784994EB687D6BFD9"]],[["0x3D3944AF51FEA842BFFAB4BB16185B97FF6D2877165C6FB750BA927EB3D8ED31"],["0x2408D9AA597DD1B6AEC22AC54881B68EDEFCBDCFD10A45E441AF7C18A0DEB305"]],[["0x03B631D7232724BED8708FDE51D54F64D4E98EF4C39B320DB669A1F7C6F2CEA1"],["0x31A768C12FB9345DA9D0F79BA32C67F8228FB0DAA8008155B4F01DC554A59864"]],[["0x07160D89FEBB13280ABBEF01B4906DE183716AC9DC77BD6242D6071ADA3BD4EA"],["0x2569697554B1351D3483DF0019C559A1EB8613662E73CBB458291E3AD442C9BA"]],[["0x1857B59A5AB7A02F691360F8B284931FCB4B1C76D66499156BEAC61EB448D53D"],["0x291C33640CF4C0DF1E32A3AE24533AA8799CC682521764CC1CD9B349FD83D58D"]],[["0x15A80BBFFCDAC099619D3D50EA8ECDAB2EB3579D611B0B79EC161BED4842FB3A"],["0x3761CA82038E6B229B9F5CD512C1C9E603DF04180C381102D3DF5D89E8A8CD2B"]],[["0x34389703C84457DB78DFBFD3511B296B419B7ED73114FA4FC1031A58FF407E24"],["0x3D389D5CD8DED6447F8DB9FFB0F7AD15F451851A6DC529DADE9E5B9725069ECF"]],[["0x2636E809C0DCCB2D12DA54CCEFE3A5A69E4460455F92547AC3935028F71DC562"],["0x2067451C3757744C39E361AFC8918BCF2EB70860639297C1C7AD2056E008A6B0"]],[["0x355AA2A1D73933170E18EB17A2143C7874EEE8D870018B46EB67FA8267311DA7"],["0x0A54BEEA582166C5F3271BACF79C7903628740C21B1F944FF5962F5226E6F700"]]],"z":[["0x0FA07904004E6C01853B2189F2D73DB85124D1547D202D5FCF13CFA5E7E3B950"],["0x21494A679AE5634EA940456EBFEE97C6E58F490E985DBA95B69AC0CC508790D1"]],"s":[[["0x0CF2825E98B2EAC7BBAA01A53D4C7CDB81078CE74DBE3C44EF5C02EC6B743BCE"],["0x23CC0B58413F1C70086C153B147C5FD74FB73B7AD24ECB9E820A4C5A13C3AFCB"]],[["0x1F101EDF1DE14C8B1ED2860B81CE21D88DA3DC2625E5DFC646458C1A4CE12264"],["0x0E42EB303E16C8FCC642AC13CC980B2F34257AFA01D5BE8D0DB20A4D50B0B5D7"]],[["0x24005F8C18E0945DE0246639557DD28E7BFA7D802F7992B99CA9A8E92A5DF39C"],["0x25F24C277CD3E35FA24C661C7AA82715B1525A2B8876CA2D58B4B806757BAAD7"]],[["0x2DF4242255A0C227260BF633D152AC264A778BE7FD4D612BBB16FEB00762D25F"],["0x38E5A2D82E9566A894BEBE7CE64EE4D003062E0676CD553171405B71E1941387"]],[["0x386D1EB0AB80CB153841EC74E6EB9F8075B55C3E67C45A9124633AE58DF5770A"],["0x0F2132508D25E5CAE9BB90593BBEF6D9CD5E48511A59CB030E0801846A4F6FA5"]],[["0x086C3F8CDFB3AAFFCF12F38A461E4DAD80CC6B7AFB3938E3CAC2EAFFC83A6440"],["0x338E2A36EDC4D46967EE7934E250C41638EC00D47213E24DBE0DB83990F0DC24"]]],"generic_selector":[["0x32D7C12E011D8040FA68EAE6FDCB4AC9936D17BC65F51CA07FD2B4C0C4097513"],["0x1810A71B28C010EF5F19DD79D5C68C12376EE490CFBE2665B4EEEBDF0FA45A67"]],"poseidon_selector":[["0x01D2B6EB79DBE2F04A144556B7AD9CDB077ED0CF8145222F301EBDBF06F069F1"],["0x32750E20C5F77A71311C0CB1E65DC603631DF6E78F7746A4EF16839A05C37718"]],"complete_add_selector":[["0x3C21DB43710F2CB177FDF327871EC587741CA543D5386904C2A5E3A1AA203C6B"],["0x1F812E244894E244CE4AF13EA37E5FDAF6D431C05EAACA1B9A2732F026CFA5F8"]],"mul_selector":[["0x2B8C4D64BFAC28EFB5C024758603F1F24E24BFEEB171D6F6380628738976944A"],["0x001DA9E763C18F1779BAF148C804C4BCB9E230E34870EABCCC94A3907B7B564C"]],"emul_selector":[["0x22A5384AC11DD0F69BD38700459EB12614C23830EB7ED08F03BA8F7DF066BE74"],["0x2832A29915305EB6DD1673F772EF2E63541A12AF992AE9348FC70E0BBF6C24D5"]],"endomul_scalar_selector":[["0x0115C04879866B36C61FACE2561058FB02FD86BF50A366B8188F770574971528"],["0x33151A56CA1E1C1E8C4E901DEC6BF237C7831E4D8A993389DDEB7F7D3CEFD3E6"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x339162E346E701066177DD775A02E828878E96FD7AA8D77904DF5ED5A39D9700"}}},{"public_input":["0x0548DAAE4D5669F5984DB7FE868E1865B122672ADAA2E42026EEE790A445E879","0x0B9407455D1BE086EC10629499721C5BFA06CC8FCB8D15F40B89623EAB2AE8E7","0x0D43F95ECA0D2B45B6EBE1C43871B7001A7846D2B371C812CBEA5FBAE6F29AC9","0x1FEE45D0F07C0C14B812AF1E0F251F95B8AA6059A25EAB45B3FD8D4C1ED4AAC0","0x1A15D6505128E0E55D0BFD8FEF2243A444FDF7494BF3567F7253242836FE8E91","0x00000000000000000000000000000000AB5211A26AE811FBE1EBEDDC4321E532","0x00000000000000000000000000000000C2C809DCF95193336CEB5FF36D340DE8","0x00000000000000000000000000000000061F09B1661A4E4B3ED03915A4C6664C","0x00000000000000000000000000000000688926A916B9CC102C1BF545AA795BE7","0x0000000000000000000000000000000022A32C7746014C458A14E03856E235E5","0x0A0DFDFD736189F54AD91C8D2B29F18F39DFC6C343C24EBFD661BE2FC4F0DF92","0x01D5885D4A389C94B371862298FB2BA366ED1BB6DE888DD58088040B961BA6AA","0x169C131472DA5BFFD57EF788BF5BF81934483ED35FDDF09FC40091C59EC34BE0","0x00000000000000000000000000000000E225C2F1D386A188DFF0D980A0F2C27B","0x000000000000000000000000000000001B3098E4EDF966CB4A689B08B6D36DD8","0x000000000000000000000000000000004B9B8642AD844BCAF4DEEFFF8F4E580A","0x000000000000000000000000000000006E1530AD2CC8960A822954B9760ACBDE","0x00000000000000000000000000000000871F614BE89B5281E66F2CAFE20BABDB","0x00000000000000000000000000000000827D0369FF0AC1BCB07C2CE9C105D480","0x000000000000000000000000000000002854F56F776EEAF78ABB9E106301619E","0x0000000000000000000000000000000009F1D9B37D9CF48D83198977C52E7306","0x0000000000000000000000000000000051652763C992E97D05800D7F059DE489","0x000000000000000000000000000000001BA528AF331A4FBA8C2EB0A379744C6A","0x000000000000000000000000000000004B1932231C391C00E005AFA33622E447","0x000000000000000000000000000000004071C151C4259791F6557EED91668D13","0x0000000000000000000000000000000013A73B3C3EABDDBD518AA4DBC94AC02B","0x00000000000000000000000000000000FACA620C9063A67F8569909921FBD2EA","0x0000000000000000000000000000000020DCD0ADC2F02BD7908C859C52C43C72","0x0000000000000000000000000000000073F7313EEE3B88E2273BAE5507921DA0","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x3EC17E34EAF1BA09E049C4C9D9A8C1E4349C6FB0F6EF569C3DCBBEE9EF6F199E","0x1DAAC0B500373441AAC46B4A31781A4B3D710F30146756B1ECFE5DA1E5A46359"]],[["0x0E056B0EE5C6141846562ADB5CF335DD7F2444B7FE7CAF9E1B3D30DFDD5DE3E7","0x2EEF72432376A0E059EE16DECF0548D5F561A8BC4D17E64630C5DE68B87A6C02"]],[["0x3B7CE2011A9777E32E9E3EC710F46611C8FCA4D8B00EE5DBA07D767D7AF7C4B7","0x33E9902FD0294FD19F1CE317B3099248B2E1183D94527624992A906D853BBAE8"]],[["0x1A07711D80435ED95F31106B746830A7972A2BB6C913C589CEE9C0BED6624E95","0x19557EC3D824FF794567D1D27CCD43770DE219E97898EB19BCD5D992E7D77E8A"]],[["0x3124575D5D2A734BD36F2393739916FCF8CD98EFA915058BF5F065DDFEEC4E2F","0x2032815AF5CD15A566AC3CC8BEBC4E57FA26AE1041158EE8459E89564A899718"]],[["0x2307EDC81738630C0FF1D381AC3CCC44B235F4691C5181E1497A384B31398C31","0x2D05438134A156FC0500C1636D26E079FD95F2C7A60A1E79C7FA3F5E7DB67A70"]],[["0x14ED8872E081249A75E2E0A6F4E46055DF0D1598C0F1B6FAB32E8EF68C76F00C","0x3A1DAE8F547A3F82379110D83AE09D0DF829D498FC37281F28AA31058D452AA1"]],[["0x29E372A1E81D5B6F84C306E2D9AF80ADAA08362F39C5808F63D7DAF2054E0B22","0x200914D2BEB0D0324C27E7EE9BC4EF24AA60CC1A2DDD0F54B1E8D5F5B536A088"]],[["0x185A6CCC8EC2379629FE26771FADE77E372213A18D1233F5BFF3D8B42FAA0F4F","0x09875DE0EA25827F3B0B091EF7DE6B300C10D65F5CC56D1CCA7C1B85B3D6420E"]],[["0x175DEB62D84829C28C69E876445F7F1AE14EE2705B796387F293999E85F92CA5","0x0AA268A3A3AAC6673FCB360885FA001052E2234D1ACEBE69F3E699312F362939"]],[["0x3B5EE47697FA828ECC9066C1FAA093D3F5AFF67B384C7A006522B14337F4BAB8","0x3164E22B354A46711905338276696090555841DAA9BDD8C301DE2B06397AD062"]],[["0x242D313768D754A041971513ED83B2504D83F0FCCF8BF528A2EDED8CF1878FD7","0x275F085AD4AAC556D195F0D927E8DBD5AD1854C9F133247181D7A6EBA512E185"]],[["0x257C94D50D898DCCEBCAE6C3143921311D6E3D237A314BA30B400BEC9A3A34D8","0x0C75D96B7C17B566332F9FD90A17E2BDF9564FF552E0ECB5FA01CEF3023B9819"]],[["0x0B1CEF633ADB219761050DD3F061E6E990CED56C39811D7483BAA0CFC156DD18","0x07322182816492EB760B6A48DC73DB541CFF2AA5A990507D677DA5A72081D3BA"]],[["0x36F5202ADBED05E2D31EDAD69AF3C8CF9D7416F958C1CFD49790EA10284A91D6","0x2E86C52ED4F649A1D63B0FA9DF8C7024A394B3DF27567591A0E5FE8E65059FEB"]]],"z_comm":[["0x135259D05B336487F88972DB815B210447F902CC821CB998ED8880598B88F913","0x27C7F021EE9ED37B73893D143F1D353E5FF2E780B5D98BD37695B31D7EB9B83C"]],"t_comm":[["0x387DD722A6ED4129CC3FBD310B08F630D6E24B3AEB1A8187F15A95ECF28491D8","0x0484CEC2D390BBB7D39AC7C5BAEC467FAE62EC2277B14948CE12E749D79D9CBA"],["0x0CC8B86ED1F38113C91CB563E5DA0ECF7405637D194039EE209A799692DBD455","0x3B70AF6D8DE983123D7B1A564B9F2529B4433B1DA3B22B39BD7FA773BCD89BBD"],["0x1B557999B1346FA31FBB86BFEF379733E84A112E1391B4C165CB7B0D1CC9B419","0x0EB090B8D6B7E661738AF439D9A76B38AA4299ED90BDC0AF46ECCEE1AFE08393"],["0x1275AB8AFEB9EF8D83D869089C6D065708E3463E78DD5B7DA6E5145D5DB0F518","0x15C04C4A2D114A8F754036A16E09BE517DAC2F2ACB6E747A439B2C80262CDB04"],["0x0C863F6351D20EF9300A35FFD74CD1AE30F0DE0A644610EF22D3A5E41AD528AD","0x1FE36DD63F4EED08F715C812143A63478E5D2F9646893E381214EB3233E5EDC9"],["0x1D5879ABD101F4176A6F82CD6E4FC19F204D2172ED271CC7EFFBB9A68E376062","0x1AAAEF449BEEBC9E8B6C66545246E8E509A8FB538020F3FDBCCB72E29BDF23A1"],["0x0A574EF0A3714E58CF4AB023600844D1C816071500A89318C16E8F1FE9139AA9","0x00B04B3FC331E6576E8A703CD6699488D671852F2EA8DA95C14054F9D5B35314"]],"lookup":null},"openings":{"proof":{"lr":[[["0x30C4F817E55C2CA3F55DB4DC12220C39D17D35B262AF86B1E102D9ADD02F6A60","0x0FEC4D8F4087063632A68CC0C6816EDAC846B3838F533261CE30803233B9C094"],["0x32B63BB35B8BA53251ECFD62CEECC03BB750A9462554AB9437C8F7AF3DE4E10F","0x2268615BD68420A5FA11080B8D4FA844C84BD2350C136767C0392EC2C1C1FD52"]],[["0x2D74AA7A86F9B46D6AA37CD0FD9FF28BC36CF77251A28DB538F836DBBABCEB7E","0x0881375D8D5884AB9A848DECE2C930F4D085A989D1DB9781245C0EC0303600CE"],["0x06E1E8AE92F3E8688D4445B1AFB3D0898F328E13E032AAD12F1823C708A8D2DC","0x039503A2D1D57C72DFE11BC341DCD8E1082BD55B10E10433ECA6C56043730FBC"]],[["0x0F8C08521D79E3607FA95732CDCC893A1AFA4AAAB392ECC813E2C53DF03B832E","0x17CE8627E4916E2E4EE93AF29D3CBAF9DB4A2B934D0E46E5533B61B3D9D1E403"],["0x38A28BE00CB334A9E36CD8FA95CCEB2A48257C102A5BB470B9B13133784D903F","0x1A16C1611F4AE2D0B6851891E844A3481B08A8FD3E96CAC8D8B53C6AF83AC1BC"]],[["0x1DA89124685B2ABB677B2CE43FD9045C9925D10388D38902504CAAB3BC3A311A","0x2B335917E6917D23EE44DB65DF2AAABD8032693CCEDEB75151FA7DFE2366FDBF"],["0x0966B73FC488D9B6242B4980962FE0A3A30239DADCAA772AFA3B3448F67C0E4C","0x3D5A92263D723D4A286F995B6AB589E690BF00DF59F04BFC3DE8C87CD1F579F8"]],[["0x378A6FACED204C4C4B940EE0F064AE457E336012117B8E3C6F488E41C33581FA","0x0D3D21E247A7D295EDB5D0358AA0708CFEE4AA8F6B31453B528D852F5CD264DC"],["0x10F1CB90F4CB545D3BFE2370E462C62EF076A688040181F38B9C0CE525834576","0x01E3FFE3F14633618B2C413631CAFF862EA83CC0C4065CF472EB8D29B5D47365"]],[["0x05E6889D86C319745B1ECEF3A48A2C3260982838A0858B056BCA880581383C0F","0x0F21DFA70796C8B6BCFE79594C5AD2EDA04D08F8FEB4733BF36034EB141E88B2"],["0x338304C1BB819D3642D422BB42D96E3D2421D39800F09D5001DA6FA79ED22E6C","0x16CB7757B992F4A6714F803515FAB3CCF1BFB3175C4733FF153D463D7E519185"]],[["0x369D27D94FADEBE0CFB78D7B05446110BED164FEDF38506BA58476EFCC87EB28","0x33916D59E750EE522A806E1E1BCE5CA2DC4F085E420B2910FF0C5447536B876A"],["0x304F2A4C467E37334975F254549D7D24845EADF582BC14980E9061F909355747","0x05B6638FD44A0BF924BD16DC40044C6CD8E985933C3A1EE9615E23FAEDEE10EA"]],[["0x0632D476809D97991A9C36085EA88058B949643F54E1AA63AD548F7030D65311","0x3FBE9BDF2722A649728E59673D7CD5B545799EA743DB8B0E47FB10E5330C992E"],["0x1947C5DC919689023AA4DCEBF79D25F99ACA6CBD331ED0BE426DCFF997F96CEF","0x11EA49F0A0DB75B4BA74D291E4A36761049EDD62B998C7A93FD3CF32898CD574"]],[["0x0B80695C75F6E3554A48C893B9CC3542D2218C222920B74EE70AA42D1971583B","0x31FE1AA1B2F2F41C7DAEFB7E1016BDBC5FAC258BA26AD4108A520BB92EB6A9BB"],["0x3BF80391E313407178DD8EC98A0964AD946E0DD26FE4FCF93A07BD95A7E81254","0x235929EB7C5E8F6CF7973409A393981539F3377FC1849374AF4F49D4932B5C0C"]],[["0x1D20DA7033EEEB60939F17A0F1DDE5245A66D40BA593FCDD8C84743578856AF8","0x353551BC7C285A005184CF3806D2A9DAAF06F29A1DCD4EA9BBED2A27C738A4DB"],["0x067A12EECA2B00C9F9D3649AFAA3115029D5AD2001FBE1AA0F69E076F82A30F6","0x0CBEEA93A801030D4D45408A23348D51345AD01D651D276DC44606E27F10AA21"]],[["0x1E319D6E54BC774E801A54D7D7D91B04FDDE5985D8F6C3C1D0DDCE44E804B1F0","0x0F57441E53492B7A8C3767BC535240012D87F590954A366DF7882EC6DCBF5D24"],["0x3BA7B7A523137FFAE90053599CC66CF1EF9DE7E56A44554487D1C59D548B4267","0x3F94B98135575669565B2A10376B2361EC9B347DD6D78EDC553241A60CFC7AFA"]],[["0x22DC1954E9A965D0FE685AEC5CE42978A3189FA972FACBB192FDCE29B36C8CB5","0x3D7B960290702051132A27A8CA9232CCA8FF20B7F066ABF8635EDC812EB557DF"],["0x22A79DD6206909572A91BBE6152184D44367F1A991A9942AF2B16219F6F27708","0x38A79244B4EC28FC71D2E53D967D50BC2EA305A23025B664834FFFAA01D16D75"]],[["0x0F96D8C87D1E0B0322D0430CA9CDA036FC672A78A4AC03F81F7E470FCDAB0299","0x06A88F4BD550631D49CEAE3BE9291E0C105DE2D1B5FCF063B490433819639889"],["0x3A187A14660F8C3EB5A98D0E42E1CF2671769F0DBCEE5FEAC235DB86D2FCB374","0x30608E0966831386210390630301F289392BCE3422C54F5426DCD354289789C2"]],[["0x330711705D60AFF83B629D6D8FCEFE1BA705278063078E172D71EDA6678BC097","0x1CB5F7706BAA1B2AB68560A4A9D703EDD9F65809C7D933EED888E381CD1C9799"],["0x19B69D79DB80729F536ACB95F031564A029A5B76CCD08AC8941EFD5ADEC809DE","0x154049F485909FC0593AE3B3768A465BCB3ADF89CD42E26A99AD6DD3E80734F3"]],[["0x3D4D1C6FDA53E25F439C505010DD902097BD862C0C64159793C978AF6281487D","0x38B92A1721A40AFD8280C4EA158BA460DF15B203323DED6024AA9156026761A1"],["0x01A8ACB60BFDA8CEBDE0BA6325AC2D7549DA7EC54E45C073A45AC9091879FC8E","0x025E76A60D45F15C1EC84DAF82E6FCFC9304042A9CF29F7E6632DE9EACF74FD1"]]],"z_1":"0x09AFD31A1F567C89A533429706F01B28B5113EB1A96B35E53C427A28241B64D5","z_2":"0x276BB3C9A8055A12C8E25881A84AD6C699DB02110C8FE2449714DDFFEC56BB15","delta":["0x30E39CE37D32B42C051623FCCFCBBF73B31355B4B3C749AA94B840957C6B3884","0x3024A192844F49CF9AC3A1EC8278EC8561F15DA497873B9D003825C0FA0A83DC"],"challenge_polynomial_commitment":["0x2E213C73320627F2687701F2AFC3181922CEB18A5D700CF381FC45CF37939989","0x1B4B7088709C832D0A18581678786A3FAD5EF80B0FC0181FA0D2AE8737F0FF74"]},"evals":{"w":[[["0x0F820924B2CC8D86B49E2450CCD56DD9CF73C77C24C9607024F7254519B7C0F5"],["0x03BA6FD5DF9D2DE1AC1005903D17EFBA652D6DCBB66CB7B76FC8C1BD13610E11"]],[["0x3D2CC82D2F2D6D02889CA570D8BF9CC20E93C734F4DDE780DADFCE3B043DC23C"],["0x3EB7641D15BD37258922258DD388B2E2623846B38D48A721A3C6FB794D43ABFB"]],[["0x2356F2386DCE0291381968BBBB9CD4C61E6D7DE2F13081B3C1619FF0AA497FD8"],["0x284E8232569A555C5C093D5B9B70D0E36B8C85A6BFDA05F76360734A538F826C"]],[["0x027FF66DB499513EE1393427C4AA620A358EAE65A2EF21513AAC07AA04A2B39B"],["0x237016D7841C44F04EE966E243DD6A3D1A4090C71CD34E8B71BA9C356A51205B"]],[["0x3DC9E8FDD0DCADE4C3045CA41DA2F38DB65CC27DFF0C46447D5D7414C72763A6"],["0x0F58FCA5073369B58708A19E69B727A96E9ACC8C42B3006D9A5A821E78961C36"]],[["0x3B7F2EC9973C697CE6201CCA005D4ED89331906C70D6EE0275BF96B69FE27418"],["0x1249F0172531D3FB701CD44CA80216CF1D897B6039E9837E3E8593C4D4BD22D1"]],[["0x1A51843BDEA05BD9E637E3DD43E7F56BD05843BC7E1E148B42BD378F198A6E1D"],["0x24B1BFE5C4EA69B41C093519E03E5FFC9DB7D14CCA796AD882E19389BEB912E2"]],[["0x31AD2F13B330F56D31628A71A5D8B6F94A096B93543A3F9F69C7883F5A1E56EF"],["0x1C34516B2769A268E8ACEC6D1450A5DB558EF732AB9E28A429DAEB0D6540C4D0"]],[["0x24BE322354D7B6463EF82BE933A1B9EEBD85ECB38A3F6EF26EF9C928B5EE9B00"],["0x2F7026F72D7F7B63F86E7B8AA964439394C9514E993064D927D04D6E21A8D35A"]],[["0x1E8A2EF1A64CBF064345E848B796BE0CAE0C9CDF4FEE000C7160CB2D50DC97F7"],["0x0B09D18856F0404A3065F4FE0E61D28F99BE3A3B4A732578101DC2B0A035F114"]],[["0x1280B554BDA7D7BC6A27E570DABC2887331B9179B9F9EF8630EE8E5149ACD117"],["0x358A36298E0FF2E4E5DCB7E8EDCB9D3337865220C5A017C72B1E14B5161847D4"]],[["0x1E22DB439FA6666FF7FB350E0938D4913E57403EA472A94AE59D985FC9070B78"],["0x23CE3FCFF22F4AE913C4272EE0A19C7E3593102D2E653DE7CDEED68004024B0F"]],[["0x305514A318886749C399F99FF9AFFE82CBA8555FE328556AF99C12C2CEAA025B"],["0x19D38D48C88DC94E4055D39802514EF6662926D4C5BC482D229793277A5085B5"]],[["0x13EEAAFE33F35336C431A873F16FC84F15608D68E7488DF14FF8B88C594B18F5"],["0x0F0D4EEF80E0F91C50C8F76368E07E1CCA077E59E7ADA7BB52C6C8173FADA679"]],[["0x178BD74EA1650261B942A4EAFA745DB6551064E38C0EE9493CEAA499582B957F"],["0x37C40E15CE9B5A960A3DD8DFB5CF62F35D70F171AEB8530A8CAA1CDAAA74C56A"]]],"coefficients":[[["0x11AF7B3286532E2E08A5C19FF2E9CE30E574DE0C39E902B3816DBDA15684B3EF"],["0x2A078834F6F11C1D123B7CA2E3126ED70147589AB94823EEE90DA4EF316949A7"]],[["0x379B8A551C1E42553810490E9FC3CAD4B629D4FB5853070ECF6B8D1CB40249D7"],["0x36928500C89795415053B75F3CAF66B4A9C6FDE31F88AF72C7175A437EA56B0C"]],[["0x036B3B0D0378D6D616825054FDCD3209BBDC15C5CA69F068990A8CEB2241988F"],["0x2EA882C43ADB0B5E12C0BA7FE50EBCF0775E8ADF0E5C3012BB6E877BA55F3B60"]],[["0x1325AF8E13C4DF7EBE1DD377651D1984D20BCC82EE6E2791DFBCB01BF09AD757"],["0x072C1B84AAA6B2AFAD414754EDC86F0FF4B36146C30F0A095DF476E643896A56"]],[["0x2C5DD8BB99113FEB0FDDD527665A0BBA43B12BC118F2709BC33A949A950187ED"],["0x368099F5A700A4B1D7147C82D3F2FAA225CB579ADCF32846E2CD6D98C0192DA1"]],[["0x12D7776C94B9FE5D49F74D40D7F8BF6A8CC7BEFC69985D1C5614C130FCE41296"],["0x3C82E9E12957427E8EE0E407E367CECA23C9EB804980CFEF83E65188AA8C1621"]],[["0x357D82FD4A22ED09A93F6A97913731ED1D3C8C07F1FA0DA95A5349C9838A6400"],["0x0812F5107EBE2CACBF52047D6C642D6B3DA5C6945344304A6543FC1A01B21B2F"]],[["0x1549358D047E1F64511221E5D8145CB729606173B938E29F99CB69F71E5A259F"],["0x21A474C6F8D2EF1EF81AFD894605E1378A4AC40A3F097B42F916F09BA9A15497"]],[["0x192B13D227481C28AB6DAADDE0008888807126B922950658F10374117187383E"],["0x1236F9EEA7961FB37B7146006373A2B08492B456A2DD5C645770D9A67939436D"]],[["0x3AC62FB0A5C98A073C978B8B79FA434FB8FD0A77465A6BD3AC160C69B386BD5D"],["0x2C6D4A2338CDF78479AC48E935EAA79E830158B3240CF2F5E3547DDEC0FF2208"]],[["0x01997CAD05640A9144B85428D6BB506A5C6C0D9AFC87E792642108F3E7742D24"],["0x28705B514BCDE3988297C6D1BE6C086879114B7DB46407F9F17AE0CFB746F9E7"]],[["0x2E08E6549A95CE67B6B9423367FDADD490DADFD158CB4F6EA16B0697B0C5892E"],["0x3BFFD82FBFC3F275161A548B8AE70639B1625E7D499168309675AC15B7C9BE14"]],[["0x351E2C3CEFA530991D44EB5D3183A4B1F2E22984C128B5DC88CF8D4F176501EA"],["0x206DD5B0FA201D82E833C82499848B645DE1FE961516EC8F0A4F51928FF1F6FF"]],[["0x1775D738DEA9220E31FC5485A653EA0A7670BD5724C279B253EE909C84390C90"],["0x24BEF6BD0B9848354EFC1F9282C11A08194807FAF34544DF3A09C54CCE6171E6"]],[["0x2AC4E7D11F8E7FCAF0EECDB9EF461A2A8DACFF9F023A8BFA3393630E1DA37005"],["0x089E6437D5C2FD840797292F5CCBBB0C12975213D90C776E1CF8CB695074AC98"]]],"z":[["0x0F3B77C40A8640C454A49406AA2364061B73BC8EB4794ABDF8AB94D987C2AC44"],["0x1B19EC55C1E1E768CBB67375C1DCCE922332E18D8ECFA89BC6E5A01AE0A3BBFA"]],"s":[[["0x3364041B828758C3F1169F4BBACC6DDEDF1EDDD9361A3749AF3F735C5C6805A8"],["0x1AD8D396E69F34A0CF2D11BBBB5112D965503FACF9CEDEEC6F1B3CF4FB899091"]],[["0x28655668D5532FF6BAB1C0120D362B9177A82C503904874D8E2265FEE84A1ED5"],["0x033FF69AD710EEDDA04F465021D49A56F96500143797867FCCA88AFFF67081D3"]],[["0x3AADB866E1EB1F16EE40381179C615E95C5B960D227D9C9D44C654F89548B665"],["0x13744227053C6D00C68DB88DCD565DAD1955758D428988826E9147EDC7323380"]],[["0x350EEEA1BFF15C16077D3EB795AD9D0576AA9BB03373178E61175D924CD3BBF2"],["0x2B204E8F73058A5E3E690AD3DB3D0878F4E9881E150D7D7E636CDD235A1127A8"]],[["0x06F629EB6A39846392660363C7BD2C23697BD24268433DE03A283E40592EC3FA"],["0x2DD8649986EF1D5656BBF7AF160C0258AEA83867310A979EEAF6A0B079072265"]],[["0x06CFAFC1AF4A04F88538348D3837BFA97D6129DE6D888E3A6388FD1E1348BF72"],["0x0140D4664A9119D6289F7803474B31D7599A454DE4A087896CFE10B4962D4F0E"]]],"generic_selector":[["0x0DB98E9D9DED013D7643C98C966B6D37C05E444922786075A75D811571CA467B"],["0x323F37ABB34DBF2EE5F23B3071CAF295868A7A3C372868D79C1E17DB5CD64639"]],"poseidon_selector":[["0x1E904A14FF675870E7D969E88E5D6BBD3952227D33DF17E18E1D745E0392A39A"],["0x3547D81411649F68FBB441459198A3E71852029AAD14CFB8C528A306F0747B64"]],"complete_add_selector":[["0x381DA2B9A6ADE684B68D55A609162B3F05D2A3A7AE3557AA4FFF6045E18110D0"],["0x1E5DC16811A98CA29F61E168DDC00D576CDA12EADA016D3B1577CF6CE2254B82"]],"mul_selector":[["0x217B7AB3CE1303EAB4DA23CB6AC6A4F861FC509A5B306C818B16AF71C2AE170E"],["0x08DAB51B2FC911E3D1C1FBA979FB2AFCE03E6137955B2C8FE215ADDF86F6BB4F"]],"emul_selector":[["0x30540D030E6DC773EC8A0C16BFD383F46608008FDDE3FC846566E43EFB13BBB9"],["0x05E1325052B6B60FF0BEFA3B00C00CC8DC65B6ECED5157F654BE1D52AFC88D16"]],"endomul_scalar_selector":[["0x2947E711B6023C6EC5EEEBD3EF187C7EDCF4CDA4D2B94C975A920242DB0596B0"],["0x3605D2C35453234AD5FE8C557712B756681A53EBEDFFBB6F17B109D91A9380F2"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x1F4DEDC4858652599380DE566A95FA6A3FF13377BFD61D2F70FE0CD443C60517"}}},{"public_input":["0x03F5ADCE5C65D51DFF5347D5C7CFC82E3E8C3D6AD339AC8E41BECB73F48AA3DB","0x12B36C092493C134101888D55E538250A72FFA9B6D883C4FA29F69402839460B","0x070FDA0FCDB65700752DFD52E98D47B19AAD2611EB21C8E8796EE70B2C701125","0x0A9853F3891EA0050EFB61BB23C62AC1D74908AFE830D3E396BBCDFDF0428107","0x24341757A0F664FC330EDF437098779FFDA2CA8CD272401BD1AFB788EC3BAA1D","0x00000000000000000000000000000000C468A9295963490517E4E57698332D67","0x0000000000000000000000000000000001980823F518E83E975BAB412F5DF765","0x0000000000000000000000000000000049B7D348CBDAA519DF0ADACC21DE6DB2","0x00000000000000000000000000000000957E4FDF160C5B02290D7E1702AEC94F","0x000000000000000000000000000000006B34A742C5B120AD588656A0CC7B4D02","0x16D385ED675068239A34DD47DA7AF18CDD659273D5FC54894BC8C785AFA911F3","0x3585B5D3522F0A86CABCCB2BF133D1590D794DDF08197EE8337986AC9EBF8ABB","0x2739637B27321A6FEDED3CA07F62D111C51F569D20AB8A57EEDD81E14B7B6CEF","0x00000000000000000000000000000000769F79958330A5FC06D041FEB3C7320B","0x000000000000000000000000000000001EE5F67A93D2050B01425AA001BE5649","0x00000000000000000000000000000000B339D3091C91ADA23B6AB83FFF951E91","0x000000000000000000000000000000001A7C0FE37D2A9BF6D97310BA986AF26A","0x000000000000000000000000000000009B72555CBA84796713A8E6887FCC7917","0x00000000000000000000000000000000592A2EA3DC0BBE5B1D1CA28F75723CC4","0x000000000000000000000000000000002CA991772EC020E6DCC2C3DF715BB8D7","0x00000000000000000000000000000000445C8145C59778B29F1FC5B5DDC35B3C","0x00000000000000000000000000000000AD496025AF395433C6D3C464F35229F8","0x00000000000000000000000000000000147ED33974E5A3998AB0ACE46ABB2D29","0x00000000000000000000000000000000AEA85F94A59B982BC5AA1061472925A7","0x00000000000000000000000000000000376474416C51A23DC500799AB668E816","0x000000000000000000000000000000005A0C55F27ED77B677F543DBAFF516B7A","0x000000000000000000000000000000007E375DE40BCD6CF4A5312E532EA47105","0x00000000000000000000000000000000B15D7D59EC5EE750049890FA82877B30","0x000000000000000000000000000000003DDE223B6D0E554B92556BB0D4B36981","0x000000000000000000000000000000000000000000000000000000000000003C","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x1BDB781562030B5931220A592FF0BB1BBF42DFAC61FB3667DB10CEBDBF0FCF7B","0x16558E612A9C612246067715E6AF3767B8E8927C877CE51C7C6E234F6BCFB6B4"]],[["0x3C7F363A1AF3B6CE80FAEF8AB63678964F497D1A0C78C48D60EBA0A172336FC0","0x1A0F005FAA7E18F0367C27C8E2A9F4822F3C07005110886DB15C6F97221DB5D7"]],[["0x34B74F0B0ACDFE7BCCEF3F1DB2BA106F051EE428F88D45F9E6F8E13E7021C8F2","0x1FA9E709A8578E901DD0185464E1151620F491601F6B0843649D26B939B274A5"]],[["0x39C451266FE8CA3CAEB967063342A9EF1FEBDA08BAEE42E31F369FB95EECDC4A","0x19C714135272DAFE37FFB6A4A82BACF2393D8DCF7F8382758978C39757D60437"]],[["0x30D56DDBFB82EBCF34D933F975544B6776A4AABF113A5E5D5FCEB1CC796DF1FB","0x1EAD432B16A964196B76487DF94349225150868C9A1A2C0CEDF520AF704C8087"]],[["0x0DF8B4077B9C52B4DF62C1F9176A88E3283671EF259D16ABE52B620B52C62DB7","0x0A0E465E3551CCBC58AA71D0A82C852AC456155F09B186449F82C937580C62CE"]],[["0x19F3776A163CA7B734760D41079329FD9D13F9BED18E2426642A7C1F1F720D51","0x2E45B9E8194852EF269776FD6EBA061F0ABC3E5BF7EFB0896B6F7170DF0D7458"]],[["0x383E281E4726A7068375132A8C142F18FD8F93D320CB9D3CE0B02E080687A09E","0x0F0B1552A262788280B433D871E2050BE2BBD1591952F229B26B37D50E9A3D05"]],[["0x3FFCB8642C6BD16D1287D99D2D510A8B460E6EBC5BA133327F675E01CE9C7EC8","0x3D91D091EF36217B0194EDBE46D7A7D070C3F5E7BC6582DDB654C6EA60083777"]],[["0x3B7ECEF79B62576FA02695876D38891376504B276A8F43BDFACCDA35693610CB","0x28E63A39158041A922141C6ACDE8F756A7D0DA6818049C5848F6C99DB8574F45"]],[["0x0DA4FB3C10767C51C836B772629553A73B1F6F0A110723FC81459F80C28DD982","0x2D611A2A868279BFAF20F8C3E8E5AA4A06780934AEE3B769A746C261FF200918"]],[["0x1268C8F3589ECA95C9249AC67124CA6F85CB21B25B5B2D208BF4FB84933E2109","0x2B08880317CCB9F55F87D5DCCB0BB4CCECFDE4148D861A198BF757DCF4AC0220"]],[["0x397D42F10BA0EBF3CC7FBFC0E3220819330E4D1B0C5D77EA770C0E33E5618C52","0x08D901A991FD9C4AF0E7C0BFF7B945D1E9B99B566A5D1D76E480FF5C0CB06C3B"]],[["0x3F7906437F7117F8165A7BFB8F57AE67E7CCD91D6C45F689AFADF796CA19D231","0x2707A905651EA2D3BCEDAE7306BF3FAA64C4FDEE84C8D1820A123F527EC1BE96"]],[["0x28836CA34075EEC737D0A00123EF024DDD1DD7C37ECD930F7700FBCC72D4A555","0x16FB02B8166188798014075599DAFA772766B0C73F96D405A1646AFC433C3DB0"]]],"z_comm":[["0x016F4CF05B373E45DF5D40A0D21A79AA3CF2CA287C5DFE53BE3464F31383B69E","0x02DC65A977B928E45752FDBD9875DAECCB03C7A0C975C8B1BE6B3522E760CE67"]],"t_comm":[["0x3F10E374B61A8D84332D0E328D22260E9ACFC891E1728D5680EE485F7248B1ED","0x1540BF419AA0A04BB142FC4C8CE9AFB9556FA4078A498C5BDFECA3438C89850F"],["0x0EBCFF719B8A9A28EF7DE8BB941497AC9D881F70AA41A536FC3915012F9BA1CD","0x2343EEE257C42BBE83E029EF16CDA148A369E045DA85B317BB3954C32BE98EC3"],["0x1E3E700B8EDEE804C11722F17DCC79BDD1C68D997E54D99FF0390BE335F5D63D","0x0604A71814D52071DC51A61DB5E4DB9C1A8528AB8246DB0DF24AC0EDB878F4E9"],["0x364FB22A3EB0C56B8DEF56704028041FD41D514E95A412183B57979718F62652","0x36252FF3809B166CC2F33E5449CCD988F3E4EAC31350CEA238B9C145AABE698B"],["0x10F581EEE72A4DEA3BEAD9ED6F1CEAFB8CCB29647A4F4FB2D7EA80EA8854BFCF","0x36570459DAD8331384E92498DE492F3D25E05D69040F12CE96245564DFAE1763"],["0x3943CE598E7C21055489F3E533693589C38C92F9AB60ED39F0323C43A09F5535","0x1950E96E978FC233D8E5F3C43A9D56AE08850F1C173F29B57C9746F71FDB971A"],["0x399CD98853DAC07E1D990831FF18DBD0BF9BA738D4476104F8FBA0DA1C80BC0C","0x22A59E95E4BC4B798BD0CAF4011716CD0B255E1F90685F1E387563D69C5AA6A2"]],"lookup":null},"openings":{"proof":{"lr":[[["0x1F4525D34ECD7DB3CC2FB1F6796EF95E01F2825F761929AEDD489FE80A1B3DFB","0x360E9B2B0FFB3F024CA9CAFEE4C555420788982B393DA9080A285E7F0B788709"],["0x200F701509F4AC31EE10888CBAD89F0DFEDD323DF1AE3ECB7AA0CFD9F10A41D8","0x2BC276187944E0BD5E5FBF058A3E0BE789479B411FC00090596CBD05500F2005"]],[["0x2454849C11BCDB8BAAABE591236EE0223C0ABF24AD2A1BF528B7B339FFE6EB27","0x34A52EA0E4FE1A8733E06497761E1A614F11D0718A7DCAB77D31A72140B41C1B"],["0x030D0BCE39C0649F87BF6267784182CAC23BBBE54A1DD6AB3C1E7AFCF9513975","0x02EE6BC9C2B7AD43E6B271902FB695690DE667E5CC7E3F9BB1878D29906B1C4A"]],[["0x212729D1B70F6546633EF381BB1F42F7522138884CE962042D4E45AEC20F9EF3","0x34F46E64FBF1F08EC7473E48B33A4A5E5F08F2DFF69459D6AE70D557023592CD"],["0x2394D92F15FA2FC118CF76383C0CE97CF95C00B948736D508570436136EF7D7B","0x293551E6E1F86BF652FFC808E03C3E8145E71BE6949ADAB2F94174BFA537DFF4"]],[["0x3484A77D666C05F0A89B4598DB29281B42F6E2B6990C8A780ED1E49A43BDD53E","0x1B1A3F802118ED04F9DE721B81EACB9539A1982D9402FBA8B0AA1A2249502840"],["0x2F6A635D61B351FB4F63C63C0B6DE495D5056E89AE596D93BCF2D00DC29F0B25","0x18E7B1F823B8D732D01E86AF2A025F87C0163B52D6CA3A19C8DFD8E8725158F2"]],[["0x1A7B1280163E6A3C2803AD01B0DDAB647D7E1C702C07B4F4332912E603046CB2","0x1FCE6692CEA80E04F26ABAD562BF27999A32858E27D8EF474EA0EAA437AF589A"],["0x096B5991AA3971D3D7E46223F6DB844F47A1E24B2ACAC32A701D0959F635F297","0x386456C8C89646CCD06FC38193DDFC4AEC5257CE37760563DF111D8231818E69"]],[["0x2E7A4034B342360BB5200EF9C121B0A7B3BAB1E55D757F18EB391227DDC440CA","0x1507C876C1C08D7B543830F3002980984B8EE0F23D63D127E1B0DF56879E6D28"],["0x30DBF7BEFE0FAD6FC79578CA0C20BFA5DB147B49084AB573AC4766F40EB844BA","0x274ADB8B9EC633BE6A4A83113AE79143428B205452BCD4A0E4E157A7F021558C"]],[["0x0E3E67E4D9097E80A9274D48E6E6928928EC5FEF512BFE56BDD484BCCD3DDFC0","0x274379427B4D4FF55229F26C6117A07A7D5BEC2154CC458301AAF3FDA0834503"],["0x2F27C66944C7E813F0AE365B51A29EF4904A9CBD81D985BE5313898650D55F09","0x3E61952E7982C79006A35388F7DA92149B8D824F454A0644BACAB53B68523544"]],[["0x0139A0664F0FFFD9C90ED57DB144A5127E44073A9B1C0E70EA37AFB1C6573EDC","0x0296CA3AA35F2C9001A9052409D2C2218B243AF1272212ACA39B8B8BF889C5BD"],["0x38E2398D6C8424D175A34EC57FB07A476B8E31576A104EA8C89A10B013A7F497","0x3B9FBF45B7D33DD1F3E37B247E6D72BF3AE5F2AE5BB8509050E67D0244CC0C84"]],[["0x2FF1DF180517291E26D9C00E6AA4EA17A31B896B8716B7F0C90EC09BA64CB17F","0x1FECB79D0EDE3B36FE0A50E34B3ED2F2998CA007ECBF3C63FD01A5DCE1C876C5"],["0x057356DD394AF65D3A9C8DB44BB61C40D2A18DF9D66F8B4A5765F29430DC7643","0x26388E8BB61D2B1CF34FCBC1AB1A7D166C32682320E6304B026062444F12AB1D"]],[["0x36ADCA42284D99DFEE0CAF09FF1C8F9E097EE114A4ABF0A38DAC2D87DE9343FB","0x3FC4601E29C7F0D762390C7DB45339CC0D62F4AD214432795BD930024282F7D5"],["0x3BD066E95639E0E67C074639DA3049C75CA8C632FECFFFEA0B7AD30025BE972E","0x160B0FD4F667384749C67546C741E33CAF3F53697DEEAB77D740EDAB8A6655B6"]],[["0x11BFAC9FC4D2DC43CC0E30B4D712944295798E3A863BC821A47E46F54334AD2F","0x035AF7B09E3A34E55AA1C5A629C624EDCAAD9220DA0B166D9A0A0976AE247EDF"],["0x040E2828B721647F8A7BDADC36293C01F9167ED2F6D5563E6586FFBE90A3D39C","0x015AE4F13932E9EBE5A8B62EDFB3A925763AF749802A6C8B9E48DEF956BCCDBC"]],[["0x252DEBA531FEB66F54B346F4B947CBB920E20679A338F92872A8E0B6CFE3AD0D","0x119CF032F64B536301CCF9F1950491ADE3102BA94432B147BF5C9288968BEECD"],["0x1F21921004C48F6D9BAD1C8051F449497489D7C3CE6F8E3244014AF8A6AF07A8","0x00335B61840291DF56CC6D8E8E584BE610028BFBBE2E7E30B6C237F51F070270"]],[["0x000FEE2457533CF9E51643AC34F845E87847507F48BB8F1D287E8C621080D0AD","0x008068C4194672966C7DAE30D1AD4089DE119D4FA3BD02DD4DEA99262BFC3B75"],["0x06E417F973F2483E85CB8F6C74B36C743D9206C5F53346615B19F59E2D542457","0x218112F0145B8C6C8457D3D855AAD37324ECB819B43F5063BF6EF2972E698A97"]],[["0x04FB10A8BFA22FCD2B9E279E4FBC4C370441F439ACAAD4C8A40B716F710E6212","0x0085442CA255786D421D94A78F2771148C22E3CD4C3739EFF24D59EBC5B19719"],["0x39F462AD5B4E1EDCDC4177D728DF6829AE38C5EF4F20D073A042C358F82E771D","0x33601AFAB0850DF88AACD55373F22F326586A6DF707B1F2CEEB63A01F595485F"]],[["0x241BD7D53970D9679D7C52CD9D3456C10CA8C57A203CCEE6CB9E4F74F707D8E2","0x270BEF85A44C2D55A675EA6AFCD5568A6D85560B96E8621296EB3BA8B80920CC"],["0x0D858A2D27973E3F9E1C7EBBB1D95EB11C83566F012CDFAC198C76FF1C6C1B1A","0x26519B535F438E8DF39DBD508328301AA26FE971E20170FDD06FE25249C38A9E"]]],"z_1":"0x0649E9E80ACA56ECE06BC8166FB50152B9A3D6EBCD7BF3EDA16C40F8EABD25B7","z_2":"0x320E4D4C987596761ED4F5DAFD37A800AB0E240F0209DB9B9420719F5EF2954E","delta":["0x3DE0A5CC883675E3328E727D29B00840B40683C3D1AC5525B484481E8E8B3DD6","0x3BE025C0350D0C8C24E830A5043D17299CE789CBEC634E644388082046FDE18F"],"challenge_polynomial_commitment":["0x1619113FD3D2996C685564F8EFF426065860CB3238211B0CA432F8BC503B8116","0x0FA1F465CB0144AE3864103744C8E9658A59E5AC4DE60CC85D373FE24D399853"]},"evals":{"w":[[["0x18E9963AA9E9E492707C0374A23D133F668958D6074984EC6E99CCD2FB698181"],["0x1CD74C60BFE20EBF0385F2E33029D4EBD9D517D71206F659FDD8979FE0629C00"]],[["0x1F76968A409D284C76690597426D9B28ACF6ED27880C1908B989621585B9D1ED"],["0x30B30ECC6A596C62C55C573CBCBA23653F76F7CBD2C58621EDE6527B20FDC292"]],[["0x24BF6893D969E651CCDCDD9DE1E21A6FC88A46C2BAC88CA74E33A12CF4924E3E"],["0x1FAD8BF3348A4E39A13A38266A60A1F0DAFF5C0D19D52E09950A3C4042B94AE4"]],[["0x2FE0B28E3AE067524582F54897F1349934627B0F57BDC02D8E4B3082A68CE0C7"],["0x21C14476C96AB3FDD83096E33876AF60E9D1A5887E25F0747D8CFC39277B3D25"]],[["0x3DDD46B600E291BB23CC7906255102A75D837AC588918B1E9A9D996D7C7C737A"],["0x2C1568C4E0FACC48B2E2AC2FA5BC7D748F21A8B1D3C81A1355A71C27A3D266F4"]],[["0x240BAC9D111E0E3BC387B75C389060E1C86C965F079E62CB3B0E016A8DABDD80"],["0x2228DCBCAE735912EBB6493A466E5C4A0890749227982056AD37BEEF9362904C"]],[["0x020A812DDBD867428821B4DB6D0C1D8142FB7F61A9A3A3E91FFFCE9EB422FD2D"],["0x3656AC961623A51CDD63D01B4A069705B292D5508EB88DFC6D6C889772E0C76F"]],[["0x3F4196C1B91D3B5A915BB3651AA9665A8E94F5003E421CBDCADD64E7A1017115"],["0x1843DBA604E8B7DAA498F6E02D764B403C7FFC4B5BA06373E8A2EC4F6B5FF1EF"]],[["0x2691D544C85524336D88E80B6E787ED176D108D70689172475C3302006884F0B"],["0x013FBB61FE864C34EFA00F7BEAA62426ED4B0B59570E96561638AA6B5BA98958"]],[["0x12FAFEE9FF80FCEB66E3361DC8FDE31F2D866F60E6F324149F3002B6A2E4BCE6"],["0x3D3A42AB34E6733A16972C2999DC47577CABF781F99B312ED43C717544A6956D"]],[["0x3811BA4F4CCF9355B8D6B6DDE7B9F89B8CBB659DB529CEDFB67D6307CD39BA7F"],["0x0F11860E416402D4F76B5E0CC6AE93E4C43A0F3E270F03F4839C8CE098CCF515"]],[["0x054DD85D9E8A1B73E1FBB3E7822400315242BEFCB2C4B37EB27117920FD9C999"],["0x37A25D65258CF60C574F06DA2C3823C468CCA1110EC8F495A8FD62AEC485CFFD"]],[["0x299D7F6B346B5EEFCDFE3018D517D9AD485775A27D0A8A5A69FD873C5F15E199"],["0x1E8D205076B2C96AFAC6D13E58758B98B3B80477A10325411FC942112F48A146"]],[["0x0A307FCBC494A8484B4234D4A17122F59C37D38EFCBE4E296555E78F2E8293A1"],["0x1C86AE46A73B2C0055614C0A49EF1FD1406E8614295B619A9D5F79E68438024D"]],[["0x3037B4FB053A9E73EC59220A8534A30BBD84B8D62AFF6AC77738D11B897B70DC"],["0x2C4B610053BB3772122BA14B0FA5E9AF22DFF1330394AE58F2E5760E3F081BB9"]]],"coefficients":[[["0x327D9D73F17CBE87FA3005F5E3E683F87C024551FC561AA9BD7E77A2871B5A18"],["0x0E18E73DFC0610CDEC2FF5A21767D8C1EFFF53E12E9CF71F8B6916876044C106"]],[["0x2F00FB64BF7E3278E2E3C026CA00C16BAFA5AF673ED9197B9804886CA04B7142"],["0x1B6F9CBFE8C83FDD0C7ACAAFB3F0412195488F157842AF87B054532E00E22EC7"]],[["0x2C07C684B0121634F02F1532628A295C59B547FA7C11CBCF06FEED775971DC98"],["0x01F294169E2E9198D4E7E09508438BA15CEA5D98AD36F33F58172A1FC0FAF8E3"]],[["0x3140C29E6C506576CFF04ECF0EC2EA3D911E38E0BA0F837B1E342FA90B0B7C87"],["0x2C8AA3AC14CE1188B9515E294B789AF75790CB1A1E8C406B21B5F4C42F06B407"]],[["0x10668AE9B0624AEE94CCB9EF0B402D450097C6C2C96850C84ADBDCB53AD1E95B"],["0x032FABE8B2226AEFEF2BA4734E2EF3B0D500332CDF480FBBFF91FED9D13570A6"]],[["0x0C14F0E75E7C359BEA8077672DCF3D08E776BA98C3A695C5600815B93A2A29C6"],["0x14FF152E75AF0CE743A22BE36969E36AFBC5D752E26FACD878A469C058E51C1C"]],[["0x1E4041BB4CB0A33D06718D57EDD9DB6C02007F1E7E457639E538FF053AA13EA1"],["0x09BEEF41C0D7394443A0F7929036618353671E10189C86542A0E6A7112A7C670"]],[["0x36127B5D72DD99F909F3C2449569BBA59441BC3D969959453073D3C512506E03"],["0x3348CFC51278134EB16983BEC6A5E0DA22989A29FBCD7EAEDF5252F25FCE7EDB"]],[["0x03E9EC45401327A9F5AF96B261CD86ACAD400B157CA6E417C7A5F3CAF1498963"],["0x19B1F50CD327E333002326F90516BE10C9D63E97D7F31607172C1AA466B4783A"]],[["0x2C783FF19B5C2C8B9BDD2EF3AFFBB698C43F3D5F851B946742D0413DD6506CE3"],["0x0AA5236D6D2D9F60833B98C74B5D1E3576672329923FB456E0FFBFE0C6157085"]],[["0x1E9EDCD8E8911CD18CCDFD8B181C67F257D44935D055DE3924551BCB1230B99D"],["0x19EA28E003859D45D668E91CBC1F1BA5B09382F848FF8A474B3BB0D7A9D768BF"]],[["0x3E0AF62AAD584FF9736BCD4956FF155A8AD29B321C157DDDBCDD7E74FC03695E"],["0x3929BEBFB80AF1589FF0BFFF436002BAD54BF527DCE4D8C471DE8B1D21BF1B92"]],[["0x18027EDA419D0A3B356D2EB0BBDA3667D251AB149A9EFC8598DB5A257D1F3646"],["0x1D6783346FAE0B4E3F8B60EF5D26E9E1085D424775F154E09FAB631AC2DC6AFB"]],[["0x010D21131DAE4FDFF0801CE1319E28A0E9E800A9A079B8A60FD6421ED34F7027"],["0x038C99BA3CA3E7C1F69A4CAAA000EE1D8C9442C98612F9459B277BC55921718A"]],[["0x2CA99A9A62071DC5AAA5E11458540F14DF4D58A17A25B8D3A3A8DA30BC824A31"],["0x3D1748538C220FAA52C116BF0010352FDC542286B07D10CA91675BBAB735F472"]]],"z":[["0x0B82B9AC60AD262C68ABB2AD737D664182A8DA9D0A59D8664B73C076F514A80D"],["0x2358CECE5EABC0DA366A4132E11E717DBD4CC4DCE3397599403752901B6547FC"]],"s":[[["0x08E0D6CF634A95768F2DF64126B012A5EB734676F8F7AA53F6D161BC73248DED"],["0x20C7B7CCE4DCDFA4437C7A02AC22983AB911372A863C15D64D6F14934D1E4163"]],[["0x1F963E7D58C98E8F15D0F665C88FC0DE397BB43540C1098E3305F586879A5334"],["0x390A823F395C6F50B597A99BA1AB2BD709A2F3B83CACB2C714DB5EE8B1F4EDC7"]],[["0x1C7ADC162BBBF868983FF8A33630E6A4C5C275B61F93E37527B517C83129AB8C"],["0x0909C4621F039BE9CF88EA0C99DE2E346C5A9D79EB5AE5969FAB70FF04416ED3"]],[["0x079960587B948898FE4A5DF9DEF9FF21E050D79D1F24ED47608F6EF826E43203"],["0x15A822DC80BD9AEF4374FF533EA93A85AF0964F81A2C56B30A67F26FCBBEEA4E"]],[["0x1BBC32D994D5F11160D94AB381010A914FCED67CFAD941D1B61B4A0EC6A0412E"],["0x1C3747F17B6D68725822BF8A81D86AA18BE5CBAC02F479DDBB66CA4ED3B912B1"]],[["0x3B32F6C3D779A1BD48D1B3B0F8B04516C125A6F981E7F542F2C5CAA4978EFED8"],["0x1F05372928B0264FCFA73FB0A920D11E1790244D860334EE82232D91F9669EED"]]],"generic_selector":[["0x27B6C673F705024D2B72FF76EF55352797B9B1F88CE7B9408FF125B50008D490"],["0x1725F8A070450FBDA04B12912119C29F9B9E83F994E20F5EA609FFF01A29D8F9"]],"poseidon_selector":[["0x2BB5C1EA56C26F5FF38417E45C6642E9A8296E64B2205FB50A7D6DC9E25BDFA6"],["0x02A469B42E19404ACCC4A8C5117AE745CA512D6008E7F051A0A8DB138AA9AF1C"]],"complete_add_selector":[["0x11B0D95539661C2ECE3F9CBD582785444A3BC7292CED1A73074189FE0E754D94"],["0x048317C913002DF6BC4AAE8F854EE16A54A522F6BCA78F3CDA30D0BE0602893D"]],"mul_selector":[["0x146D5E0754155140B0038F81D4632DFFFB57F235F3647006F81CA5941FF1B95D"],["0x0982554BF1064049476E4E4977F43527738DE98DDC5015030D74EE2F699979D6"]],"emul_selector":[["0x28770D45F496A9583C7F10915C57A127D4AA5DCC1B976AE7664464692D5DD3AB"],["0x1FEE77BE8F942DFE0643734E3AD5DD02500D98F015B24B94F5B6A6132AE66A70"]],"endomul_scalar_selector":[["0x2F54F23FCDB31205FD5EF9EF90A93E1C59800348DFB4D35AE6DBAFF855892F6F"],["0x28699C60AD2C122780F11F41099F85FD290669349B1C47B0159FB8F8CF24E745"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x131E7D1F8B5574AAA9D8FBC73406FC59C2922933ED4A76709CA21F3BB762B1AB"}}},{"public_input":["0x037BA1D1875DD43B2ABAC9E55AD2442F49CB5578A92817F640F42145687AFFF6","0x32ADA3CF30DE41F57DE034610C240CEBDF1DDC7799C154EF5C9B4DFBE2A1F464","0x33B274992EDE6851A2494ED0D930E2D37E04C167E68C763E6A117FA6A1CA10DC","0x27A67C42BDD11B750539278D4AC3E27859A4CA5EE351A95C9BA89CBC055C50CE","0x1EAE9A1383468FFA87B3ABA280E9BFE14FC94CF960F006FEB1767A4DD4E45BBE","0x00000000000000000000000000000000ACE53883886EBEDC42383CF8718A44CC","0x000000000000000000000000000000009F76DFF143F5592FE07ED4322EC9082E","0x00000000000000000000000000000000E9BA1D3CD912D23CB1F30F4BE54154E3","0x000000000000000000000000000000005282E89B8CB5670CB82E0E65D9553021","0x00000000000000000000000000000000C4CB315D3D7F1BD325FBF798F58CF253","0x33C10B905AE731AF0C1B52F2DC9B498B0710D44327B5008F930FADFA94F76AB6","0x11D6CEAA2240F25F02680E1E533F7FD3D566CA02C722129070AF06C1281EFB95","0x1D0CE9D695A92A1F073F9DC56324B8B9A1B55E08AB16FB2C5AD2149E630C9130","0x00000000000000000000000000000000A7B02DF96E61387B9E9ACA33F68E05E3","0x00000000000000000000000000000000F85206BC00AC7F2C22D91F0079EE2D32","0x0000000000000000000000000000000031F19435275CE8073FC1846A2539E088","0x0000000000000000000000000000000053D4689FEF154285BEB919894A190AC5","0x000000000000000000000000000000009BC3B67E1B18B88EE970106BCB44072F","0x000000000000000000000000000000006FBACD5456B4C05457A1F22BEB8643EA","0x00000000000000000000000000000000C53A1D38CFE75FBF5226F13C15A5EEB2","0x000000000000000000000000000000001B8FAE310867AD9C457536EDA867C3B7","0x000000000000000000000000000000003CE1A8724D16B2D0CBDC1350716B8BB3","0x00000000000000000000000000000000BC50D611E631E59BAB6709C9483B7089","0x000000000000000000000000000000008F351C215D9DC6CDACFDC414ACA94D01","0x00000000000000000000000000000000B690B949B4989AD903274177CA8FA99C","0x00000000000000000000000000000000DA263902D67D63C22218AD20759B22D0","0x00000000000000000000000000000000C55E9ED910568937E12F00D5A698F02E","0x00000000000000000000000000000000B8204B9295DCA4C90EC73BBF941D16F0","0x0000000000000000000000000000000053B66FEE0E7A9A74515781252C987933","0x000000000000000000000000000000000000000000000000000000000000003F","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"proof":{"messages":{"w_comm":[[["0x1E6DC78C7593D85BDE882C0E93FCAD433BA1EFE81387C010D639B11282B8936F","0x1F59A863101D70EF8FBFAF20F8C33398701CA41359C5986EB50988E9F75C7661"]],[["0x396A5B098486DC634B865BF8FC334085C1D8092403C3866EC4804FCEE7D3CEA4","0x182FEA99F6A48D3D55EF1F0A79DB3A4C00A07543F6A579A0B7C4A34F59E935AD"]],[["0x3DDF4D501C44CF8108E3C2C1B85EB33C31C7E7FECF491FA5C83E5E0F7321F3B9","0x2D8EFA45EF252F279EAAC52FD38C49919C14792664DC8ED6A719508EBA1380F0"]],[["0x377E01A8B9C08E5C705C94F30037839F9A2A2F5506D2258F85745BF3DAA548D2","0x1F8E04B1510116CA0C40DC0D714D1E19152D0015237E31C2DD0065E21E96B91B"]],[["0x20A1C31BDB1E83F0B8A1E14C41EAE5EFEA4361859DA7ED47517EBD40D94DA787","0x160DC0DF81BE4A32B2BA25A937E69080EC845C3169E1B5D3C7CB118195FF98F3"]],[["0x0E28F7481683C461A9B738B412FD4C326AB65D51FA1412A233C0180E6BCD0F39","0x0EB006AADFB88A0F31E98FCA9EA5A283358F3F1DD2AA0B5F69833E907A4F38F6"]],[["0x2FC52D9F3C5568E097337B25501395B868DEF733786F30113DF9C43CD8C4747C","0x3922999B31CC7201BEFC5C8BD37E7EBACED8B7A2B74819FB14D612E63437BAE8"]],[["0x26F62FEAE6DA71C75BF14A1AC8ED7211A4E1F3560E7519EEC9B50D06C5192F49","0x3FE8FFB38053E2445FFA4D5FE1FAE011F25F93BFA49CA2658F1BBDDA57918A0D"]],[["0x0B36A974BECCB671DFB961594C2814F87EC9BE7806BAF508238370B4268B5B68","0x3BB2019338CEBC085273E034F939E5F4204E25A42A4C59EE3E221B549DB05AD0"]],[["0x3BD2164C90F03037457C93E7603A1B6D5BF022629204042A1103E71F22655567","0x2C4CE2747C160F3F1172BEF790A114077BDEE987C740BBAE0906382646A3EBAA"]],[["0x273FB6C2735EC44BDF7634C325AF26BABE84DE40F7DF7DA611316315D976546B","0x3B52EB92995EFFD5BC1B475BF1880FCD95779CEC0F5C58ABD9A6CCD69179F12D"]],[["0x3A37AAEED54C7DE7436FFCCC8765CDAF3AAE4BB698F07BC6A8133C3DF3A7D3E8","0x2857FAD98D6833C47B3E46BB42B44834C3439981C7F3E97E04C72D6B7306F6E6"]],[["0x2EC63EEAA8199FAF5CCFD97ED6A19E2AD4007D99AEA7E4716DB52AF84AC2C16F","0x00EB288510AE545C9D12DC3CDD25A1E5C0734C799557FACFA2C19360013EAE75"]],[["0x055F6C33E934548DD2F33206F072CDCECEBCFD65B9AF8AF6C6426E65E7B45473","0x11DF83CFA6A578A99B3856FF6F4F030C32ED777AFDF221E8336579877C4E7533"]],[["0x02E9BD0DC4B2AA8EAA29E338C3110DA111CD59D60CEE6E67497A1FC7653C7608","0x19AC1AC45DE89BDED3DB505AB1CC97BF9C337D1C1654799C0819D8009F8A38D6"]]],"z_comm":[["0x06176C5D00EEBD25F21A65D4D0B1E20F0AAA72FB2A38EC0CB7CB803315047A37","0x14B4685854DA78071C5A50EE472A46681E5C0BF042A6F2061474EFA68703ED3F"]],"t_comm":[["0x13A6F72774CC1C09F187E3D18383CC2B5C2DC0C2FAC8B6063A9B68D45A8555B7","0x2E3CDF0B347F4B6E88D4EF4B4764B11A7320FC61A527181486FCFFC5FCB986DE"],["0x226EAA1EED0C4360AB84B2E71E90BEFBB49AA4DB40DB7719AD90545D146AA3C2","0x2D5D7D5246AC9DE70EDD83B295B3B3519573BC8E6C1C25A61CD116CDC16FD4AD"],["0x0A78B13745B24657FE114763E6E756949262DEF5043484C8E6D8B1419EE71528","0x0FA8C27A5EE629387ADB601795743D55B399BB74ABD048665DE5BD531E987982"],["0x1D2304C69A695B52AAB5EC2D228401B5F2298C66CB35095220C934E6BAB1D677","0x214CC86F0E84CF5C19B7CC0A8DC7343EDC1521DA5D066766AA28FEA6B566FD96"],["0x0F96EACD8D0B55EFBE277301626CA55DF7145B93A10273CE40525A3A3A9B5005","0x3A94C6DB382E337CB26FED46DE7727D63ABB6C35CB4F2196296A16951B136930"],["0x0EA1B02659628F9EDA2461AE850163DB19D43DF786D25269B2245DA0780F17FE","0x0FB996BBA8ADF1D7403E04440918E17742880E822624515DF805478A4BDCC611"],["0x193B39AF6B2B92D5A4C2562BF6AB830CED8C5EEE203F6897A015E5F9AF16838B","0x2B1BEE4D23CE3358E468AA2239CD7554E5A0E2AB1E50E36CFD9592D1CC98E6AB"]],"lookup":null},"openings":{"proof":{"lr":[[["0x32CEC8556A3EBD46590C82CB89EB8B4E66CDC06F8AFC95CAB0266508C50A7C87","0x06F89496AB865EEE509CDC95CFA55637A598D5296462BD528A7947F14A6C2EBB"],["0x1A842B213FFD0CA1704E30210467530BF9390227331A401F1C8F48F75D3A6864","0x090DF84A66D460C48E8B90B88994525CEC13995FAE8880AE1D613C40CD881DE1"]],[["0x0CD1D38FDF092D114F92F967A2323F778E52E38F3BDD67589EAB2EF0242BA03C","0x3D5EBFFFC486AD502E428849B10858A2115BC7D9AA9DA96D887F8A8FBC297988"],["0x14616971BE5841C9D8F18C7665F8F85019AC987E6C0A704AEA5C80B9CD18EEDF","0x27223DCF7FB8D33411E4A45EC007E9E51E0933FA08FA661E6AB1AB07D58ACB6E"]],[["0x071958651C3F933BD9E49A5DB9A2C01AEA9C9C3E5952827A430DB26C3316D196","0x313D87CDCFF486359B09155BA117B4785419F5A12E1E62652D1F51A07E377043"],["0x1BD5DF25A4EF2F658B595CAD6FBDAFB0C064754EC9BE362E87C9B6022924D191","0x1E2D6CB05E03FDFF9EE9EA5A91BD832CB611E4A1DA3B9EF54A25CF7B7EE6672D"]],[["0x1E0CC6688269EC344520DD7D406F46C04C1119B23CC37434E0F7C4938995505B","0x27C648A5FE6983F0B14796297F611519737E1AA46940843D62322EA722B6FB33"],["0x0DDB58B9E156983A46264CF91D16DFF95A19CFC6F19866DA6E5BE12B6DACB818","0x1E9F1ADE472D8B89697E00918FC5A8646AD7D461F99F14A9E717E6B416690514"]],[["0x04DFAE125F215BDA5E7742D1EADFB4FB20A6BEBFB520CF0BAEC923AF3E603F03","0x3FF1D843BEB73AB7E90FC74454188C0F83BE88BC1EDAE9E2196B90F90BF3DF38"],["0x0B6139E1FA31A87DE9F355D5561D424FF0C038F6C4A007835260690624A45108","0x04EFBE52EE1B098574148E4BFCE24F8307F660260BBE8D7D5E927E4A56988421"]],[["0x288315DD42C852B69C50166C4CDB60A6BE138434FADCAB7AD008F48588DD90BF","0x07EB9AD12E167CF072561A2FC86DFF3E6F666AF6C64E14E3A5189B7B8D103C1A"],["0x0761646B6AC9D607AEE63177D14A4A1B6074C6E602915345061A631D8BD385B6","0x346C3BE53DF9B37DBF1AAF21DFDAD1AA708E833CC7936F5BFA034D14440BA45F"]],[["0x0EAA57C98B2FC1B1F3B368B88C4D62A194285FE990A1D6CAD19D1676E8604E52","0x1879F19C029AD430BC02A16185DB8B097633439C27DA3EA7597E889BC9EF8B15"],["0x0FE967D94E1B7F65DD79384822FBA4EC2F85CBD94485289FEB969E0D8DC6953F","0x11D053ECB1F6ECABD1C759DC107842C02F0AE08F56466FFCB70850701308C71F"]],[["0x3846DC3690D805A42E6FA9703B75E4BDC043C733E4555127D6D809E2EBFAF7B9","0x0722932C24FA33847A2349E3E9309753FF8FB17A68402191BE13CF5A951FCCAB"],["0x3E6DCCC7D8CF3D9F39B1E94830A053DCC2FDEF5844646A41B31E39DAB369B98E","0x025CEA974D18B61F287D79EB0136E03FFC5AE61BFA0132EB5694CF8BD6F9703F"]],[["0x112714F1233795FC22DEBA355CA7F1E17633AB9E6FAEDF3DC0E6C17AC2564B38","0x3D1B097AD70C0276019EE6795C854DD96014C3D99E6AC052AF82A13A7F736763"],["0x3834252B9C1D0FF8E0F38ED6D75E04ABC56EE61F26526B8403E9B2459074B47E","0x29C398156D400349E650852E0E444F407347C01C5AAE39E32275F254EC3DC875"]],[["0x0E8FDC3ADBD0D2AA2E44C6BCF1A0FEA4F1D5AEC80684D1A32606CB004A7770F0","0x1F0FA2C00840B91E65500860F4AB785F67A16FD9BA49DBCD747353D447D8C081"],["0x15157C9E6948C21CBBC48952B58F17DDBABA9F9293CDA3A31F5599008DB0EB21","0x302ED3456455FAD47AF157D33C633E9BD65BA460A1280AD904694A7E1B6E60B0"]],[["0x1D1CFF25F6DF3CE37081D67EAC1ABA155356C2CA2DB6307593AC18DF78F13999","0x0D87F0ED878B2C7B3195DD95D17A7B52ACE0BFBF38E94E7B6FC1B76A60798875"],["0x30A6FF59A27685DFF0185665CD123AC6285F5A6D6D084E00BE7AC3984D19E46B","0x1098B90843576EFC12676B3B856A146B22C61C09AC6F8A6BB7510F1703F87788"]],[["0x0CE7DF1B89581D1C6349D666513D43BD887203085A2925A9F6456DA42883216B","0x28E7BF2979880A9907E3AE257773F7BF2E00034397487225F9830A181816B24E"],["0x1F0E36D6FF2BFDA3DA74A40EEF6EBF2FB4C71F22CD009D350CE76860AE8A9B26","0x07ABB3F3E6D0ADABFC2F5A4B3AE2AC75789B42805F5943D7226344DD220642A8"]],[["0x17ABC89DE1B2F7C5084D12D3EA7659E6F7260F2F7BE3E853753C44D5B214A078","0x3F62424D633FB56EA5761AD741E04BFF153F51BEDD0BF3208FCAF9FC56F9E9D2"],["0x2466CEE490CD1300139717C26F166D1FB3265E01E28FF388BA553354155B62B6","0x27FB07F59912F903F3237A59BFE8879565E58898BA02DD587466FB597C698E15"]],[["0x18857A83739484A58A46F1C56FBAF14EE91BF1BF7F3C70CCC1FBB2832323D780","0x371FB2939C80124D1385594744A3ACCE6B9C4BA2980BA172EB7415ABA6622E65"],["0x175FEEEB437423DCB059521D7B126F354161A28D0DABEAE97A4017EBD51E803A","0x111D2F4DA1FD6050B8831A4B3B9598DFCFD369A780C180F2874D9743BF59C7F3"]],[["0x189E1D1C8C3460A0516DBB5D60216CF7EE7C8EC31F15BB8014F7F98F81C109E0","0x0FE92FAAC1C166653B97FD662F88185DA80D2D3E0EB23F2A183B0754BCB6A662"],["0x2FB55D94B0D8B70E5BA7F8E78BDEF4D0BAE310CF8DDE47B34328C393987F17CB","0x33453B032DC51EE0FA74A81DB95A5EE0A38CC47E4DFB47AE5557D84BBD9F0F9D"]]],"z_1":"0x1F686342DC2FDC06AD0E925FC08C59BD2784A0C87FAC2E6FA6BDE99A1DB19740","z_2":"0x2161C5D5D1D6BE4F0AC67D57BB38B930AD4A2AA414041493BEB7E57224C18513","delta":["0x3EF5C5BEF176AE18A74078342535F8323295683242ECAE4217ED68E56727FF2C","0x3540AD44FB48AA4EF287120842F0E86B36785A3B17154846239EB9EF2700C954"],"challenge_polynomial_commitment":["0x0287939BBF82444189CACEBEFD51D05C7F99246EA9183D40D7D24676B4B47E77","0x11CBEC4250CD13D7D29495E10110F579AE5DE512983419F97A248400F316B7E7"]},"evals":{"w":[[["0x192152EAE71978F7533582F086BC7EB219E5B94864176D0EFFD8F5174111D361"],["0x03ADDE751F6C1F04FF5A3370B88E49F71E216BAFA26B2F16D793348E0A329823"]],[["0x3EBC7D837F6F625418072A9968FEEC978959FA548AE75B58E65A7FE41BD125A2"],["0x176DE283290461E63606E399BDB42DD83FD51FD8B0639AFE5DF4B28E18897AA6"]],[["0x1B4337A2E7AD856C6B0A5A2F61A3DE7C10D16E8CACDE980E821FD12AB153EA85"],["0x06A90876CC1963D05FA1A2ECD7F0C8CB319FBBDE5A6F61072E681EE2E550E6DF"]],[["0x01A0916AD354ECA8B893D98B45EFD64651EA8A098ABFBC99FEB2285747195B79"],["0x3A0DCD87C2E08A5464F2A999969C638A52A2951FF91BD651D3B60DC602A20FC8"]],[["0x09A72F92F0F03B06178293827BFE38346C872B643FF773EE97AF400FC4360DEC"],["0x05F23420F5C2B150EAC38B682236218260D5FB1AC28820D5D717F28B73C590F4"]],[["0x07C8C087502C5051814274FE5C19CF6E2F7E9DC66AF156416DB976C1887D121D"],["0x02D96F321434219A41007AEEF58A9450EE03087390B4440DD795639016D6225C"]],[["0x3760C00B7A55E0AB5E37053803B8BACAE94B168DE430AC1196D09D180B64DBC4"],["0x3010BDFC828F773648F7AF991406B503F0374FF93933F49F5E9674481B4F19C1"]],[["0x2D683296BF722DC329284545BB2C90196F77F5E05E0EBF0FC046370E2A6AFF20"],["0x32C029159B8CF36E71F58C765DCF704349A00742E4D9B2177C942192BB2AF25E"]],[["0x32BC9634D963471CCF82FE71C06A88411B88D8B8D261994A6F1F80A4D991FFBB"],["0x2DD3344920B6254E153DED7EC5E108BF62D62F4CF587BA296880DB24674C6240"]],[["0x05169C96C354A7A6827BB42EB093EBB3540EB0F59B73CBE3B8CF43DA526E2AAC"],["0x0AEFA455E42F80A6B22479A953A4BD9EBA76C6541F5CE36D86EB6ADA37A4B7C7"]],[["0x1387526F46264F1C9929E3BC32890B323F239C2087BC841AC0EA093CD3E3658E"],["0x28CA018A715E886513226D64B8073F8017D3056101EE43B5EE561AB510B3EDB2"]],[["0x29AC966DE4E9CB1DBA8F0478557590BB92215D5B4244CD587500CECA6CCF0BA3"],["0x205B7D63FED55E8BA4F6F83B11A1E7BC37E07C7A2A7644FCBC5F1F2F34EB4226"]],[["0x3AE1421EE28C1CB3320129F45091722B495CD7F440ACC60C1C60F1DD5D7A7366"],["0x3A9EE92EABB131E7FEA4BCC6031E674199953BE893F9800618C6F90731D1B73E"]],[["0x27789B110C295A41AB3C65DBE2326476BD74245A8A806646105E46CAAA26189A"],["0x13756FC676AC69279DC8A8C25BF04586BF98E120049E31843283994F2F0F2ECF"]],[["0x2DCD4E59534390B35901B4CE0C972DF02F06646464D633180BA6C9105C23B99A"],["0x212ED8EE062B2C563C1A7D4CF942B0629513A50A9944707666BC6574006687D0"]]],"coefficients":[[["0x328B7681AAF9FFE10C25C08289DC4DF7C7E9018399DED78BE13E332604FDC25F"],["0x1263B357CD2D6333ACFC2B1F752E1E9EEE54010B0DC0E085216826B03EDA4535"]],[["0x2D5C9E7D8838FC6866584A5B5CC5ABC188B5C114805B5703C5D68C19716BA2CB"],["0x13D08BC3A8A8CBEEE72DE6432B7A713118DF616C3F82FF000C6516539B4A8F04"]],[["0x1DC18851A8FE0DFB695AE6A42E32D5B86C63AAAEE89B1AAD7AE5D778608FF6BF"],["0x3427C1E451AD1A2B6CD24C2FFDFBA1DDB6E3560E75C46A78FE04D9A0935B10DD"]],[["0x309F8679C1D0C2A1F370AEA368672CD6C00EDA6B86BBF1D8301BAC436192B8EB"],["0x00059F4870A535E6960DEF3A6E786F15BB4218DDEEF1524169C0AFE0B2751DCF"]],[["0x2716B7EFD75CEC1162702A24EED430C3762F7ED0261AFECB9A4492E1D9C4411E"],["0x13AB333F8388917FA3AA280FD51B7D1069E371F81B73B3B05CC6380897AE911B"]],[["0x369B2924C093175A27D039AA9225136162379B6C9B8FACF4EBAFCBC45519947D"],["0x0398F8B684CB98B5F32054493AB28D858E7F50519EB30AB4A5E2FBD7C9079C2F"]],[["0x33E339E6073A915A9FC1FD9F1A0DB56D42A2855559510A9D68AF311784D2064C"],["0x153E799CA8B55DF4625673360C39A075452DA20B5A0709E707EB7CE77FC964DD"]],[["0x3A5BF5972CC7FBDF29430FC4DDBAAC3BE3DD3DB454164DEAC42979D4D5227D25"],["0x0F5BEBBD69326AC253A948D8EF54AD8C12C9B29564944947259F5770258E6F10"]],[["0x07C3FF4E2EE5397552119E62CD1979706DD80948FE299D317C3860E39D8EC597"],["0x3BEBCF7E7A5B4844DF3B23DB71ED8142104690864C6C140663B1083267852BEB"]],[["0x1A1F0475E57B6F30CC7A0D352A228A4004282F6FD9A750C4786CCFD3EFB473CF"],["0x2E48ABD882C2B32A957800C5BB7D6EC4C881D46596FC4403259CD5E7BDBEB139"]],[["0x29DE7AAEEC2DE89923F9583505BA94B2045D5F3EA3FB135C9C8DCFB556EAE37F"],["0x0F0E52B2A7EF0AC5130213BECDE1AE7394845BF1EE23A5165B90FDA080550361"]],[["0x3FBD58CAA69D57CD01A0F7355A2AC8B86510EB344248D319D421B215D0FB6C1B"],["0x17D91E4719A9BFCB0C1F793DFE66A2EDBB01B4CAB1CAA9FC86A9C3C39190619B"]],[["0x2DF3B179FC16A69B1791291C1D5D214A851DD4BD5B4DC7F5F4D69BABCB6FFDF1"],["0x36991E11A524AE7DE1835034553A9B78F9C8F42AF256885E9070971E580ED433"]],[["0x2B5BAC3F7C2D76ED24EB535272A8009B5ACCCAF8B08EA1BE6B4E9BBC0F199E74"],["0x0346025C5B85342814178C23A7AD6A3651FC26068B6CB69C698DF0C7BA1A0115"]],[["0x08CA0337F91E1A1A4DF8B4CA22048F79E46FFAB0F3219E27C5C0E6CBD1D324D2"],["0x01329EA7E632AAA4FED0928FE36B22316278753AA80D04E19684F1EEEFC504C0"]]],"z":[["0x25D819EB299C7B857BB40A71655B62CB962E4190F4C53F11FA9470347027A444"],["0x307A7F8EA84A56CF7C16371AE71883A3AC146FF9D650499FDF351C0BA1EEACCF"]],"s":[[["0x3AA4DA9C6717C3082D5CC53EAF3C8C91216D313947068072B5089CA38D6627D4"],["0x18040A643FC45CBEE6C0CD16F8F7A58DF08FBFBAB9BDAE0E06171AF32CAAD97A"]],[["0x2382C55B506B9DF2261EB9AC9BC9C332FAA736F4AA80270F9E454F3510D4676E"],["0x2C5A782027AE4C1E4B993B3803F4B49E6C10D1273AC8B0DF403FE46BE4A71874"]],[["0x2EBDAF9C9B38D751380671054E6D5C4D3B95C94795D96F4730EA53ED1F65E02B"],["0x26D1FF1B595D280E6860E8C1F2531DC386981C2BAA68F00BE6BC02C5FCCF1E92"]],[["0x32C2163CA6601DEB98CF29D60CA94B16B8F804872BB1819F6548E32781C74AF8"],["0x308B384287CAB13F3427A29A81C6D900D729D29E2CF1EAF57AC292F2C49BACE8"]],[["0x17BBF1B5A81D0D4BB24B359B3CA328CE54D7D91AAD09177F9CF792C6E15DE563"],["0x08D1BA8D279C34DD87636A4AAFD1A4EAB358A13FFC3E052B44A952314689C5C4"]],[["0x20E8AD86B80CE22814B1964E737828602C712EF4792617818B72143232C7CBF9"],["0x1B3A277B9BB25F5E27B9A119F20AD63E4EE99F24F14BE56480A2185B4BBEAEFD"]]],"generic_selector":[["0x023CDCA7978513BEAB418DF3F42FF6EBEA67AE672D4042D15F5A6080DE942F32"],["0x08B38C49CB38975A5B9336F1A3F9984A0FB59F93FE402311C5E5B69804D099E5"]],"poseidon_selector":[["0x03C4652F8CD8864D53206FB268CB44C322C682DC3B838769F912475328711E1F"],["0x2ED4901347FC53B339D555250E9503E56F0B4157B25DF5C3391CBB84988CA7BD"]],"complete_add_selector":[["0x3AF4888232FA305364249E9D22C744F8F888A3E40DB7448248FBCF84511CA4A6"],["0x1B0CC2A988D5233F24F6504F4B16779779CC8263D68F34CEF33C3C3A3008BF2C"]],"mul_selector":[["0x0E68FAEA4BB99B86FA829D3DB94DE4E3E77225323CC49CFECFCC4017CEF68822"],["0x30A3D956FED4CA6862E26C6DA9BDD97234F752D0EE707B093DD232DEEEC0D2F2"]],"emul_selector":[["0x2C1B5D7C5CDFBD1BB84A4612A5CB740C3E7A2A922046272A030FEBCB36C2EDDA"],["0x1D373BBC0CC5F81003FC1B343A3644CC16451B5641D769421A353A6E5E9D9253"]],"endomul_scalar_selector":[["0x1663C1B380219CF0000FD984CC3532C5B1C73F1AA71D8A55DE10652E1D0A9733"],["0x06147FE4EB1DAAF6003C26997DBEC11A0428B08F6B6F2DB177ACDAA019E53AE5"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x0ECD654DD8F8EA824774576D8EA61D71242D37780086D302E0D1984888B16410"}}}]},{"verification_key":{"domain":{"log_size_of_group":14,"group_gen":"0x1AA07732B05972ABCADC042243371883E38CCA91106ECAC1E26A77C64BC5BEC4"},"max_poly_size":65536,"public":67,"prev_challenges":0,"srs":null,"evals":{"sigma_comm":[{"unshifted":[["Finite",["0x03DFCB4E16040203FB6F71C84F06AFCF55BF2F551D6C9634E8F0745E6E58D797","0x0DB239D577F4C48010A66A6A5EE9E10A4A47ACABCCF85521EF371A8DEB8DD655"]]],"shifted":null},{"unshifted":[["Finite",["0x35C8B2B948C8A6E69B5C5DB117D12D28926D871C77F7B08F61B1FDC5DAE27C91","0x2C6FB344AD89996BD915C5740AE3F8515E045E7EC9D2D7B30732654D38220737"]]],"shifted":null},{"unshifted":[["Finite",["0x277D3D64A031123DEDE03E1A2EEDB67048C1AE52AF948688675465D4996AF4F3","0x36BF69168F8718D10AFD650C6D5360B35C4111A58EC2490E8B88CB9A5D0392DD"]]],"shifted":null},{"unshifted":[["Finite",["0x39D0681C4F2912E343D503383D0AE5F9217592A7AC86D812418D1D505D78574C","0x1F0BF00F1274913D257274BD6EB8E888BBA62BEAD1671F412D5651FBE290DC0A"]]],"shifted":null},{"unshifted":[["Finite",["0x07DCDB3EC13EDDE252B8FDD4313CEF98E9845A22B01B243FEA29A2FF8EA801B4","0x228F779BD68AB259BD2BABDEDBF1AD4F0DB715E4125C22825E4E04D7756BFEA6"]]],"shifted":null},{"unshifted":[["Finite",["0x0605FC33E1F8764B344F48F5880052DDE88D013C2E12AF67EB6C657B58366C30","0x179E0A05EFA10045310A1BBCF40D7803C01CA6066932C734DD01C576A47CBA3C"]]],"shifted":null},{"unshifted":[["Finite",["0x1CFB514CEACF52C43A2FCC15647601F35161BEE717393C84AB417B94E2374930","0x3643111B60F077A8AFEA5D2ED02D94A862A6CDA369429E14EA5890DBB64007EC"]]],"shifted":null}],"coefficients_comm":[{"unshifted":[["Finite",["0x3B6FDE90BB135E387A1BCAEAEDA9219DC9EB33C937D74231F694D46BBED102A5","0x0F00AD3E07469EBE86FAB6DAA05A821F7B717E6F6A64763697569812C62D6AA9"]]],"shifted":null},{"unshifted":[["Finite",["0x23B37D4005E47CEF9F88D588C4374789C669CB64E42B8ED9011AB5005DF25BC3","0x39B142F466E3A13A3FEB7D10EE179F1B4A33B5918A0B0DDDBB7A3F9BC1DDC5C1"]]],"shifted":null},{"unshifted":[["Finite",["0x1E85664E8EEC093FF4CBF4157CE8FC3C9F0C8E521F96AC3CE97EF910EDCD8FEA","0x33E5EB0995CF52AF11BCB562C4A93E37B3B8B276D7994F873BC32CFBAC888B25"]]],"shifted":null},{"unshifted":[["Finite",["0x00D82D1CD23054C86A2EAB316DD768244776EEC613DD034D82980AB3EF8479CE","0x3EAA8686E20EB34EE3A1824830FC7357444D2963D4F2676F2E7100FC831C7795"]]],"shifted":null},{"unshifted":[["Finite",["0x0DFA5DFBB75A2DF7E247B2070EAF69CF3294270F80191EDF3D62AD1B3C27BE16","0x3E31CED51CF78EDB960803F32B3DECB1E902A93F9262DA83E4767B77E9915266"]]],"shifted":null},{"unshifted":[["Finite",["0x0FB45DC41A92137B6520794F1B533E7234498AC80CCFDFE1125D9C85EF58AEB1","0x342D098F79DDD1B831B15BD28C734D6B628DD2B67B4946A3ABE745F73820F981"]]],"shifted":null},{"unshifted":[["Finite",["0x2389E6051D3A4F32F8A30843E32FFBB0E83231FCF257B0E62EA1B51C18B2529D","0x11D01DE0B25A0FF8EDA47E75447F4E728E0C69B6911905B49F6F5823DD721D0B"]]],"shifted":null},{"unshifted":[["Finite",["0x12F3C07BF4950497B8C1E1F72E29F37D855B7069D0130515B8677ECFBB7821EA","0x0402B27E506D3EA67BC6AF2EF788E53423A66393CA16E2771BF2B0B95E22C3D6"]]],"shifted":null},{"unshifted":[["Finite",["0x31ACCB9A51AF037CC182237CB3A4216299D40188EF809B536350AB751D2E3B54","0x377F62AF69DE797AD96022B7D499568845B58B8E2B6BBD743EDE3D6E498F9CBA"]]],"shifted":null},{"unshifted":[["Finite",["0x34B96F686607566CD8AD46582DA2DF2AA67FE7383CB60B50EFF232581A9D1631","0x243C24CB6A45A928AA424B990ED6E6B274C12F6DD12407BC91F9432549075847"]]],"shifted":null},{"unshifted":[["Finite",["0x04E28681D9F09262B929D29F5393FA014B220F8154B3118EDC14FF92629B8629","0x35EB3DC61171C0885965D77BA688C2201AE1D3FEA1F8BEDFD3E355072747986C"]]],"shifted":null},{"unshifted":[["Finite",["0x009872109C31ED5F295114C775C6A5B2E7C922FCDC89DC2FEBB475E9D281E77E","0x06B437693194E34E5A2E413F8FD6AE976234460962C43EF40251FD888EBFBC77"]]],"shifted":null},{"unshifted":[["Finite",["0x10F444D1D2136F13CD5E9A7AEC3069F7A8F5D300D6244270F45E3F822191451D","0x0BC1EEDF44F65A5D51CF5FF18A2C2D0C84130BBC00692A2F4382169DDE670410"]]],"shifted":null},{"unshifted":[["Finite",["0x1A6CCA49E747DCB22116885082AA1C278071ECC6071C801A8569CF6A2C6E010B","0x12D70042389FBB4F82DBA9179B273B1C65064F3C69FD43EDA9E1F0C8D36EAE27"]]],"shifted":null},{"unshifted":[["Finite",["0x2FDC909C65FE2403EF3F67AF6157EEC8B390ADFDD85033C4CD55E35664FC3AAE","0x3DEA26C56327D452D9C5C211C7D970BA726F5F67C02E6603D34CA0D2BB035D59"]]],"shifted":null}],"generic_comm":{"unshifted":[["Finite",["0x2AEB8018289A2F6D20EC12A6F5EC44A74FF5DBFC7488C8D845B76236BB71C995","0x335A3041B2D9996D2F45ABDEB9DE509F80EC2CF67DC8872A691DD047EB3AC2E4"]]],"shifted":null},"psm_comm":{"unshifted":[["Finite",["0x2514781D3AB99FF31D4E2F07A4197BBAEB6942244F2C859D5BB0065797315F80","0x0077842EBBE7DB56DF6DB901D63D9F3D0611413AD186982A37AF85F4B8614818"]]],"shifted":null},"complete_add_comm":{"unshifted":[["Finite",["0x311FBB7026C37A63E721AC68CF47E980686AC9BD1E439A456BF37568DA983436","0x00D754D934E7EB34157E4FB6B64C4C8DB85504829704958E0B907A3495318400"]]],"shifted":null},"mul_comm":{"unshifted":[["Finite",["0x1D78C6F0605D496FC31467C8DFD7AD8750E132AA79B68C3D0FF3DAA9D5B7975B","0x0D658DD927948C17E1C00CA221CF8C7EC5E407DF9377C3B81F50AE1F0333B79A"]]],"shifted":null},"emul_comm":{"unshifted":[["Finite",["0x341E240EA53D69BD3E03CD3B5BE4B59B9B69356A1616B6BD01672E1CF5339990","0x122DAC40EAC81691834C3AB6792B5640A14D40507C322117FD1F0210C905CFFF"]]],"shifted":null},"endomul_scalar_comm":{"unshifted":[["Finite",["0x24F0A6E2E21EB928EAB4D17CF8535EBCA96F1414527E5C9B5373A80D8F45C5FF","0x3FEF82792D55E142380C0F5290A86FD1B4D8647CD8FA49B160D96A9C031F82DF"]]],"shifted":null}},"shifts":["0x0000000000000000000000000000000000000000000000000000000000000001","0x00B9CDC8FD0BD4B27E2A74AF7AEBD5734D52D75BDF85EBF1CAD03413E914A2E3","0x0033BFCF8112720332825BD83D44D92CADC0C30466E8102C419C30FA2665695A","0x0087F4BB29954E16960F2DE3A1FA5AC7B62146DB348C7C9F0E8BF10B2C8E8411","0x00EC71373B9F6CF15ED1949647365DB60B2E26C3A8ABBA5BB06BF23E9DBE5893","0x00F39197CC4C55084C68D31F64F1A172406B585CB86445F00C248C721C496D10","0x00B8DD039799DBEE12D2E6A4299A83E067353C0143C5DFD203190C239159EEA3"],"lookup_index":null},"proofs":[{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x381B27F445A0AF0EDBC80D3886B8D32AB9C4B578C0F2F3AAE9C5FCFA10B6D772","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x14CDB0282F9F92E3F4F1829BF9BAA34E6205DA971A86ED1327EAEAAE8A4644A6","0x23856761D50C430ACF67BE2A45F5EAB5713AB1710A8DA38F66E9094637021D0F"]],[["0x13A823D71F1A804770B4B5A1323303FB9E5C6F088BEB92FE274249B8096DB053","0x3D872686201C1CBE0F70F0CB951CCF359F6ADA68C45FFAB78BE1E082B84CB56D"]],[["0x101B0DB6229DA2962CE43E219ECE2CAAED93BB4C4AE6F9A3C04676AF677E61F7","0x0C811946101C1353BF6264F5275B46ADE3B10785674EF9B091E5003548641153"]],[["0x3968039E72F18DF6DBA8A3AEAF9EEA15A8C8C1C85AE752F9EAAAF35385F2902B","0x020C0F2D6DC04454C823107191DDEA3BA79F1D84C5067FDD6711A3BC5BC5F18F"]],[["0x3A3F0DDEB1E06C51195F8C25D85489AC6581A2C2BFB6C70DA3EA3939ACC19C36","0x1D16205AE891D2BE4561D590342C4E6ECAC09033996FE6AB34BEAA8D969C82B8"]],[["0x057EB72A4D79656E80B34172C78FD7661446EE1037E83E31AB493F1000FECB25","0x1196A897FB53E93C7867DCAA530E47579718A6B4A92D663C41023DF38160B5AA"]],[["0x314CB9AF7FD90E610BBAF79639C52DA4DA31E10715FD54B4474DAA0FD939AFF9","0x0EC720F0C394D2A47B9CF188E9FCC3D7AEC1C6B7F36663904BB2F80F6C921F23"]],[["0x1551EC4B83DFD06C70833ABF32AF104292933CE8A9F37DF905826AC32E7633F3","0x249A2716CB6DCB7EFE5F171F9CC6AC60F24B9A77279316526DA6FFD1A342332A"]],[["0x32B0B488F5E789989261DFB8F01FD125DD0107A8DA8AB85E7839B84D42972D4F","0x23A27FBA74A60599CC1572158714326C82DA05C5CC5C2EBDD4B0EA04AC1F6836"]],[["0x3CC7C6561B1D741C76DD35666E5AFB1F283D9A59EDD656418690CD6933330057","0x1CF4C83C38C28606C43ED0DB079AD8CCE2225A463318CDCD3C5C4D6396AB265A"]],[["0x2F09B32AAACDEC4A20A865D93DF9BA84A7C8F4C645D053B6942A798AE430CE52","0x2B53F07B77CDA408A112926215303C517D4A9D030883D16DA1B05401B0F1BEDC"]],[["0x0F14F736C45E2F0CFFEB174BFB5AA32C181F3A52316464C6307C8468D9A74630","0x324B3B1DE4279C4B897C54ACEE3A8975C9526BA44908F91EA623DA51F572958F"]],[["0x094F80A368C13E6617D96BD28481F3856E0F3E42160DADFE8D737D438BFFEF16","0x2C9C7B3FBC250A05B1F621417A95E22127D3A94709DEE8E34C8B0DDEA96DDC59"]],[["0x0DDE58C78E345B95A16C8FABDD52478E7241C2065EAA24ABE4EF6795C58C9DEB","0x05C9A88CD09233CEC5A6D4F3856CCD286C3BBBD0BC8E70B3C79FDE96A984A661"]],[["0x32E136B9CA2F332AE26C9435BA41C713E6246AA63A63745C7294BA4244DAFBA5","0x07D1FF3D149C6254A39DFB8B820814D4EFDBF6C1F05FCC9676146F51C2B0C69D"]]],"z_comm":[["0x16227F7A17D1D5DB2EB2FF705191A299A117A282765BBD207FCFD8C9F56B6371","0x15FB4ED27A4C3BE15831582772266640C02131EF249ED27DF11E9668E72A4683"]],"t_comm":[["0x0F7B081D21BA5BD0C2073BB7AC80CEF702B47A28EB8AE62F80B9D9349CEB7389","0x2AD77CD60378C9B29BB317DCA945B5B01A0A1DC3F04912463C9BC6099C6C9FFB"],["0x1AE9EBB8B2DAF34D27F3E5A3A916E0F4C8A43C5C8A2E4E135528CCC164400738","0x2A14FCF31292A6B3C01C7F6B43F23232A944634C64FF7780D3B29FB1644593A5"],["0x39B6131001674B47D6E7107B612C067EB3DD10EE0A93C670963BF863C38CBCFE","0x257B9E1378C9168FCD03A4753D1945458AA42DC8DB1A0098E47C39936011426D"],["0x196CCE9DF00B95EB7D37879B263281FC697BB8719FF4C25E543AC30C024D09CD","0x3C14867D6CB59A27842394D9C0225F5DC13D1400BC5EAE5F5286005773D0A99B"],["0x1D645F9DAA95D37751B05F7F7C78BAD23CD99196F920F5200824EBC10101F9E1","0x079A84BFA85845FEC4051568ADA713831EC4082BA4CC12874A98368F638EF2A9"],["0x0893EDD14861EC31170432EE9A27407BEA90B0A8E70E4D2F5A309A8AA7E39236","0x085B075F6D83BE89061211F84247DD9E62526C5DF25B30F2D69405A50E265C3E"],["0x117DE96A4EC1D73D7B183DC154997746AAD605EAD67928ECB422EB5E8F453FE8","0x30DA447BE78AF7E8C521F66D78280A6233779355B2A147EF7C246FB0E01E80A4"]],"lookup":null},"openings":{"proof":{"lr":[[["0x08B8454D960DA3105A94C07FA697167172DF49A6C3CB717E192F70BFC35019C0","0x3F22A2F12B90E1904B0195FB3A6DFCA6A4A86BC816FC9FC987EB9E2F85B631AE"],["0x3F3C931D86D6E5DBA49D280FE615FDA5ED3A700681734013C29C3F91C2D159F1","0x122EFDC372CFAA0EC158ED206F27A4B7C6B1EC646EC33FF2C3DF1DFC2AC87246"]],[["0x1D500AFED3B1B5501229F73C5150896F346C3FF5648D4585A6B3F52F633BC281","0x18CD3EC3B734883919928DDF46472C38800BB7EEF43595D0652B4F6C9567F3D4"],["0x2E002BB29BF1B891D5A4723F364F612A176852D9BE5CFC58B8DE9845AA44107C","0x038A16318EFF6A2DEE48EE19F561E34DE93FFFA658D80425AC749FFFF8AD278C"]],[["0x1A1A5BFD35A8C395090CE6E0DCCF07E1FD49B2553B922F961AE1E4994758703C","0x22DD545F89A1EE902021BDFB70B0D3CCCA51BA7CD5B283D5C61641A77E9E2D7D"],["0x3BBE8AEEB4F036F1F049C17AD17DAFB3CAFAFB1C25FF360858260394F7A4DAC8","0x1D97A4D8BCABB64CF4463FEDA7F57202B1A08877F413F653B262AE6EA0897BDC"]],[["0x2168B856C42E23181216907E226CFF2F3AEF00B318051FA89B6221FA9E931856","0x3754231EB2735E44216E199E4EE5642FF991C9112D67A659394246744CA139EF"],["0x092A85D3EEAF6ABB2E37AABF860DD9F6AE7D47BCCF40197AD59DBA98C81C7B35","0x25ECB02FE1F22A8B8F28348945847EB8C6FBA9959C65EBA46F5DA8859A74B93A"]],[["0x33753FD5D38EF24E39EBF3C7AA31AD0EAAF1F6518B427C4EE82D5C9CA764CC94","0x17C82E9CD24E9B62D19C995BED99979259A39F9E9908A15ED13DD1B7988DA07D"],["0x38C13D1B441C11D40B44288C5361E4E4FC919B337B84807D65C92968B2B0FFCA","0x18F83D40FBCD2F93E9742F9EF02F63F45F1A7CFFE74DD7693BAF5A23CF946305"]],[["0x1FBF088F2660C1FB43071AEC33C714E3F40C9FC068AEC6566E3757A016D2417B","0x03CABD9B7D78B44CDF965E918E90F1AEAC3CD38D56EA3E8C87B1319F7CE8C223"],["0x3B1D0A76C8FB42A6F9A5924AA19DAE91DAA4B2C0DAFCE05A13579FB9BC2F1995","0x03A49CA16C5C97DB6E783751524BA3826D728166C4E2D399C901B00492256467"]],[["0x099FD62D3FF5158B35A1A7194E449D5958052D1778255E71A07760B0F5CB8CAC","0x226E249F7964562C8AAAF5D74187252A7233AB8A68B2CE76AF3D76969F36A3AF"],["0x289E303836BE63DF9497892196CE0104934CB5DB127B263056F49D075AC15501","0x365BAE8FB44068669B5480180B173C2C73689C4269589D95DF89F3800B11B3BD"]],[["0x01B57D951691C78CD766C5FF5D44B06CAC0FC8724EF01A558912182605BC939F","0x1F7A950F7CAFA5D3EEF347B67243DF7944B260BD50C14469C170E65926E9E575"],["0x3E301CD7DB8A025F3A1F06A13892DBA7776CC5D099830FA336B7F2D7E40B139D","0x311B186C5E77CB1C5624006F12C52D4BB1945CEC9A1D2F25C4051F2661C24B4E"]],[["0x094393BCA27C43ED1F4CA0C6081CA0BB6C808733EECB9C97692B94FE0B4850D2","0x01BC4BBBDA9D3D28A1FDD423E3B76053DF8ECA9EA512A16AB6B13F8F3D3D5FA2"],["0x076CF09633613D89CECCF0F918C0A72C4ED557D5E06DFAD37BC046851C2AB786","0x0D484CF539D56C7EF43F85CCCDCECECBF4302FA2929F776DDA37050F05CB3AED"]],[["0x3023934BFB7A0D0F1DA4ECBC385BC31D39CE8D1B3552B627A2F2F1C4EAAF6F48","0x2586F1A81C96C96127A1DCFB51A6E56B20024DFC08AC6625582182C86AC092C8"],["0x048F1C0CC82A2302EBE7578DEDA88B6BB3099F29EAFA28D32476CA17A6CB6404","0x3AE6DD6E0A94FB255B0A49FC09CFAAB0F9DB3B7789AEFED6F8A1C7DF5D02986B"]],[["0x36B1F1A1A3B7E28B06AF1F086321A146BCDC562CB4F4EC07DB887D6369E188D3","0x2153B1926368420377FBF3C868A36BFA65DB540DEFD836E97311070D7A6C3D58"],["0x3464AC888F4B2023D46FF475093CEF1ED186C1DFC4D47E27A1801F8590E0CFAD","0x149ECD36F190CDD0C7436045CAA872EB65040FB96AEB4276146348D331118330"]],[["0x009DFD2B5C29972641186DDF1CA0211042477E5E58AB2CC8E44FAC8592F3E9D2","0x21B6B5139FF6A57D42FD805ACA25C34DE9F8CC082549C68B7B4D16BD92FA132A"],["0x12EC049BF5B6117977BBA50F128DCB999D9E7ABF48121E354420858A04AD4F08","0x3E57C1DC45A8A15A749707D1E57913CCEEDECB5B75CDABF3C022B38600B71EE6"]],[["0x01E0A7D8E2E23D53AFBBD7E52C3AB76AF3FAFAFF913E2D985EB10DA5AB34E8BF","0x2323B5A0BEBE7E4241BF3B6245DA3495599D90BB699AF5C6868344209A45A6E5"],["0x3B2B79D76DBE333F8E09343077B61A51474D36A78B4E07A3FEE72A9F05B01AD9","0x1D6D42976851BF3E027B393561EEC11D51A94EE848CDB5D2252EF94DE825D1F6"]],[["0x28C4ACE8AADCDA3E9D5E6CEA30FA4187F757417B3614EC0665D3CBE39A4497A2","0x0DAC782EA7668F7014F7012DEE4F56612D17DB48EC8B749027C18D1A72DE50D7"],["0x2E5E30F595BDD2FBD64A9E64F6FE161594F90AA018E0EE489111ED2AD55DCB6D","0x32419294885049A41D4615A489188905510699CDA2151CC4664F049CEB92E5DE"]],[["0x03D7DF9B718A53FC9E7E89DF94BF29026BD50EE16E242BCD96593FAEECD32CFB","0x208989E6982897A76EC46EDAB5F5533135B18E637BAEDC43FDB024679077DF69"],["0x2C9D89959DDBD0DF6A74C278FADED7483421A69FBCB71A6357DAC162A66FC56B","0x26565C14B8D5C43D53891BBEF63549B2E3C1D68A1091B58CBC21B8BACF687335"]],[["0x1579D3DE5DB554F5F51F8DE40FFC7BC278D92D6394B352E4D38D912D7A2BE48D","0x20083BCC2A6AEB6C00F5555EB319F141B44E8E536B609E1AF85C8B824A1BE9FD"],["0x27B909ABD0C13290572B62E10CA55CF221D7B19B95755CF15C309A22169B2AFE","0x375E992F8FAD3F19F6F6BFB6F60E33EB2E0C5AF295D8CE89E7FF30F539AFDFB8"]]],"z_1":"0x37874C32923C7363B908BB88B0A64FA4086F74A0D4F73789D51877DD6BD3DAA1","z_2":"0x3439E250A9FD1346E20D8E1E8E5A939037B64C46574B30F8BDDA381A6EA38FF1","delta":["0x15615089C7D7080759B74F90208D92548C63744CBE881E4BF5B6902D88DC4114","0x320AB28122C1E7D29C515F7F464D0CCD74016CD06EA10D757F56CF3E182F24D1"],"challenge_polynomial_commitment":["0x10EB5FF400D25C22EA12A2DE71641CBCAB745A30200B894DA7C2D6D717357E74","0x1B9EBF4D59CBD0C446A84966FFE2AF34C4B2F7DB18BD6296BACA2E0107DEC825"]},"evals":{"w":[[["0x3730C4B533883BF6D084A743EDB45291E8B30B1FCCD935D2E94AC1A8C7C85C23"],["0x3DBC75FC7353F111F7C5FBECEAB8CE86141517D3AF66F81D9A125D49C6BD1FA9"]],[["0x3E901C32E5EBEF0EC18946365452168A9E831819712425192D9D6546F4A13BA9"],["0x1F7CE2DBBEB4F882115FC6528992A820F0053E34F4F00CE62976278C6479CA25"]],[["0x1771223008FCB4EF6F590B4EE34969122E484B781C558E077CCA20FFFDE8D1A4"],["0x2DE5E4B62604840D698FCA5CA005214F0F78F62430561C0A9FD1DDA306DE6127"]],[["0x09330F29C4B8CF3E1D04985DC8E3F61AF2DFA364CD00B26153A684FF4BBD3B3B"],["0x3F627BDEEFD46EECBB1256FA05B10FBC6C16CEFD56CA4BA3073487BE9CA97DD7"]],[["0x3108EC80CB32735F3EE43C6430672955EE2B7C12BD901169F17A968512862259"],["0x1E499101E1ABA4564B2C016F6B368B47604E0D10088225E1D08296E9CCA5B985"]],[["0x20C0146FC8474269C1303928642960ABB3CB59B3DD50BC01B2F200EE7FA4D725"],["0x1140A2E836458931039B01C54155AA7C48C0AE80912929436158706E47BAB5AA"]],[["0x00CE91B3EB1BE0B00A101A1F4F1FF400FD672AEFE62C17F71BC8D2CC7250F07F"],["0x35411EEB59248678C4D224B19577E24D5048FD67D6BC60BB67371D6733A8AA80"]],[["0x2A2CC997A0F82CF3D3E78C866983EB66C68BA3E5C15F63563C6B724D46DE2C0A"],["0x057C0D2172A6E0CE092AB430D65C41DD917BB73D0548B2F3D1D00F31598F41BC"]],[["0x12DFD68D4080B0C1F51AD8B9124F043CEED778891A5EC33E5C18645C785B26AC"],["0x186D574FCD78FDFD533022CDE6541383C3BD514E61A1E73BE1D13B1AC750703B"]],[["0x3C3713485B0BFE557B534835937ABDFE0EF4C730CD7D01C6A8C2D27213A0F542"],["0x07F9901744C2C994FFAD0AB065E3BE03AC350E63332DF5FC765501E4E5AE6409"]],[["0x127CEEF4E8FED87C7803505B3B4061A2C58053DC6C12DFA31FD96E178640BD34"],["0x2EA06DE7B77EF6076A345927879B5EBF58C433AD399C2D94C8427640E34F7A30"]],[["0x33374D485229E9C607DBE147A25B4DED3C8E88E23F29A0CBB989C3A9FF5D6EC3"],["0x1C342C846D5BD0ED224293F8DCD12816568570982FD7C7D06A8D2B8D74E52982"]],[["0x28F6562375C79A97A16E8816178753D179978B34EF0FFE8D9D09211CF61745EB"],["0x36F4258B5DE3AD48641B3C2456F57A69352BF0768C105A9C2B83C982189AC196"]],[["0x1477FB6FC7A89C28D5AC65DFF1A7DDA7B7C2D93C053747D19AC3A338AF430601"],["0x055DFEFE865A59C830DFE6665E3A52386AD70F6F25DA8332C6179F945C7E5069"]],[["0x34BCAC3B4A20E3344A7EB48549FEE302FBF668D97CE16A48929D87D6031DFC16"],["0x030B67B0DCEA0372B5D9DF264545AA3218DC93FC8BB889BC126603A27A7C758E"]]],"coefficients":[[["0x26F11E65BF2768A828C3751D61FAD7D58072F449B6A78ADCC9A8660DE10B69DC"],["0x19F3328E013987D7FBE9AF0395AF6C7EC9398B7E3CFA2F01D5833399BEFC2B6B"]],[["0x093210B8BD609826B849B2D836BC1927EE538B95B205322D7FB8B22BDBCCB0D2"],["0x04AFA815FCBAC8903C7FBF34DF701F87F05E35E1D7E872849EF7C78BEB3F966A"]],[["0x01090E0E2C1D8050ECD4399FBFBF805717D28B34A7FBB7C62CB62F312D38752E"],["0x139C8BFC985CDEC87BAEE2B373537431EC94AF42F0C3D4E1BC2AE94C4450156E"]],[["0x00CE5951EB6304E3ECFA42CAB26BE0C5FA256146CB96DD9E0348B3A08A9B3C48"],["0x15BB5C7BE6D217F28785DBD9800DB1B5CA5E58A36C5A42295BA4F57C9D579834"]],[["0x1CF999824EB764DC28D4A92BEC44D5ECB39A5E932B872532F0D8971AE5871403"],["0x2DCAEFB6E84BCC07D4E78D489B08784365255369DD3A25978E57926894D26A62"]],[["0x1AF8BEF2434AE58907F8108FAA0378E92AD79462B4E97A14F7838F50BC900691"],["0x1C1E06F5D1F4A681262AB7AD1186595D11B472CBAE0E0F1F3717D24EC14FB4D8"]],[["0x08E83AF1835F99A8405AC96B65B3EA23A22DE4786FD6C08D686F90B678E57A54"],["0x03AD79126C5C2E7AEAC39F083ACE0A22E192EDAF3DBFC30DBC6A48546BB3BA75"]],[["0x27ED632C48502C3D720391324A6D7D5139413F7483D617750478A690E7767B6E"],["0x193A4A8B9ED50BF469FF5ACAF0A1EF745ED080894C05C83801ED4242FE2B0A18"]],[["0x2F8D0C96477FF7412B6B5707A6470CD857908E98083EEEBA08D9EE9F9A76BFA3"],["0x0C3B95EE624E94A58546639699AD18EA115C7D19F024F89B553AB7011E0C6A33"]],[["0x1994E9FCE11B9664383EF3D605AFA048D5F1303E39A71C424BA98EEA91DD0C7B"],["0x2A4C1CF437B121FAC510A0B782EF56F6CD15D0B3F1BBD62AC197082ECAE4D3E5"]],[["0x184948CC4C22515E1208EED8D7B613AE7570A3835A8ACD8046683E3B8CBF77FB"],["0x1CF5CF4D96E0BF71EB9923D508481225FBD388A3FB7819C33710DFC56A25554C"]],[["0x3E49C5053941F43530133726E0026A3160F7C9F694F4F061BB823B5058BC352E"],["0x3A80FC2CDC9310F5456ADF2A4BA8C5D72EE37D642E4119D49899B587C082C61F"]],[["0x34E863711563020D3D4602F0215FD799E03541F6A21667F4CF779DCEA0698C7B"],["0x0D474AA9F1A2CA4992BC565B59A1E417CAB576FBDAE014B51A8D36E3F5DBA18B"]],[["0x2A226180607F0B3AB9A1E8473825B3348ABDD2ABA73D1C600532F30C6E6FC79D"],["0x285AEA8423E43689E2D453D02D528A68CFA9DE7DC4662F867E0B0BD707DD625C"]],[["0x32868390A8E7CA80DEFA075E42B066032A8B9C0E68AAFBB46C7205EC3B874849"],["0x30ABED1216C6E423D7B6369535BFF88FC7B7A227A4ADD94D160F43FF4009DACD"]]],"z":[["0x26735AFBE01FFCC15205B28018B097E5CA01194471A6163B23B6228035BC5EC1"],["0x13ED1C84C644BF76EE4B6E9347D969E105F0399BE253CA099502C7C310E011F6"]],"s":[[["0x307BC69AE990BA1AD5A92B3CEBE7D591263C6083ABEE98A3935B4B4901482E75"],["0x240DAE9F8FE2451613545FC08AF676861019CBFB61FD6C83B1F7F6FA0C038E31"]],[["0x30714043734A6C12AAE74497C20EA136C3B9A70459BBE983C7F3DC4ECFC6544A"],["0x1FFEF323ED139C4A17CC6A5C47670439E5F299FFF63A86966BDB023B6CEDF8C9"]],[["0x239F5F5D739827A2747B0B849B3C18B7A842EF51F6E12BD153720D7D886DA5E8"],["0x2B0FA56C46BA2341BF06DB46F44CBB613D4A824F130A2FA3BECE43AD6B24FFF5"]],[["0x22A813AF6F0E104E17B659906DAE05D949CC3D809DE4945AB89AD5459E488E41"],["0x29D74C5AE916666B10DFD34DA7B2FAF98B79C1E91B01ECCF9FCE38A15D7F53E9"]],[["0x3958998B748132AA990ADA38529D14C857646CC8E14C7BBE1CEBFEFAB76B164E"],["0x27BFFC8220F4EB07AEC3117504DCD75D9B75A0396620C4AEB99EDAF3070736BA"]],[["0x31973C263EB16F55CFCC6A1F4F5ABEF577A5FFD566C83DEEC8E2F1835B4F1C68"],["0x30EC6F6AC7AD4AF60AFC5E2EEE8C92936B56CA6EA56B1C7F4DE84F202AB8F41F"]]],"generic_selector":[["0x197FB514DF7171F98B00B38ACD4B5CE3D0A1921FE5B4E6FF66D301EBD7C81E83"],["0x1CBCDE480E134DD759CAE9CE07535E3C0A5C275D6AED3E48A6B33DEBF9EBE79F"]],"poseidon_selector":[["0x1A6A8CA679E9F8A884D099E32C888804CF7A5D6DC15FC236277B59F0CEAD5B10"],["0x39D15A62302AC5B60CD8B11B1E2371DE0FF6E69295458B28F04D4121D60AB8A0"]],"complete_add_selector":[["0x307AA648B9C4CB0785B195FF2F9C48CBCB3553093F0E1937FD6EC62E7F80E82C"],["0x3E1C08CE7102C1A589756553BC918CBCBA1C3FB1E3C5C0D4045D0D3909F3F208"]],"mul_selector":[["0x2145DF9761AC4416B95C5242154F98ED2AB14439047983C6596DC155D4B7A03D"],["0x0171856B3926A7AB21D436C49E4C9A0FF669B46869958ABCFDDC80B19E1958B7"]],"emul_selector":[["0x0C57A4C859566495F91349D12C59A0C9B04FD39B6D62FA5F92E1F133632AEFAD"],["0x0A6D30A5DA9842647F672FAA3715D62E91FE87CA1D714F6483112B1B9FDBEF65"]],"endomul_scalar_selector":[["0x2C97A5FF10C105B3207DE23AC1B9DC52252E7AC16EC9075661C36DDD7F824EE6"],["0x37C4F4AD89D9172811E6CB2EEC61664D64914ED40B64BB132ADC969F665FAAE7"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x3ADC2715A13113002B39F5BEFB7BFBB50A4AA82EF3A030C385A239B0A620A53B"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x0A6662A28F36CB1F523995E2D7F125781A5CAC548A9686C678DD05AF3183E8A9","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x0BB5F7B15C6ECBC4C6C2F734E967555D7DA5B02310F4A3C49361450DDBADE27F","0x3578614B78AF234869ACB881B3017EE0F0A820748F1F14A3A372BD09D1C8AF53"]],[["0x0F266D9FA53A77823B46B3D7E794E2DA255BEA12232DE326F38D16DAF0758826","0x34AF6FC8EB5838D9FDFA1FEFFE947286F26220F31F90FFB8A6089566FBF0F339"]],[["0x15110EBDF746F7416F7D91E6097D09B9AA3ADA8141D62FA9CCF24B305D5C6850","0x1AB04015A929646987DA804A01247698251D3753B6A021A6076386115ACE1C3F"]],[["0x1AA601775E7DE780C9C07F74C9C114347393FBEAB93ADC69B13C56698DCEDCDE","0x219B0DA2F63DFF5B1CA84CB47B3E16B3E6BCF85AA2487A853129AA7134873933"]],[["0x0A8A165A12006DE0B4CAAD29AB312E1439355D6BBB1D350BD03D5109AA157740","0x17BAA527FD41E2BCA9520F912F9FB7AD657D43F51D07A57BCE8288D573EDFBBB"]],[["0x03F046EDE9D52A9D65DDD0FE3D324401951CCDCF82FB6D2A1AB90F023CAC3955","0x0B9A36EFB1154A7B831CDE5EEB08685FDF8FE94420330A15CB6D2074627E4D92"]],[["0x164341AF5215A836903BAD8378C46AA0B59429C7B8AC2E94A2FF13EE266B5E7C","0x34D7539D48566C3E1292278F73622B55F00D10B80797AE7EE36053B57170B01B"]],[["0x03FB540DB437B33A55AA7C0B69B8F3461569B8ECB6F5CD558B7662213B0F415B","0x17EF9A65B2E85974AC9B0C76533DE677B9A9A9AC3EA6A0700F496A5391553767"]],[["0x3248A86A6B1710D4E2C59FEA1E906D4333FB51435CE65F9A7ADB5652751E4A91","0x1CB6657789536A5A8490AADD00B4C5E75B213BCFA8EC7782ACEF84B1DDA73968"]],[["0x1758D606BC1AE0C0F9B2AF99C235931DB62241F257B84E13420EEE5783B19DA1","0x2FF227240EDE73AF5CF079F6A577C74FDEB4615599DF0AB40F94266BCBBE6950"]],[["0x16B701FA69125A186DC72C60C064212B7F3D84004C8B9C6C800A54E844402C55","0x04572C2ECACE388BE039A4D8CC39FF99BF00B914B73CB0879EA99159EBFFED33"]],[["0x2404AA6D5E8ED5041AAA4B868DDAFCE7ECA026871B901B9A8BF60CE49032793B","0x2F74BE46A949C05C0BAEDA1AB504DBB4E83DCBBD31AA475F75C8DAF78478133C"]],[["0x20220481C467D899857804B1D82584DDF06E95E46DB6F03A3B5A39744CAB84EB","0x35B3F672026DA144452F100A60E5B0DE78966F3BB85DEE3B55FDBD0F4DFFA988"]],[["0x11010D890C3B9B7C63CB0CACCD71DDE17A2F4ED7B7DDC1FCEDDD8A73D406B7FA","0x16D6FC7A59DED461D2E636A7AE1DDC6CC8EF7B8421D9FF9AB9B9D3389FDB9322"]],[["0x28DA659E9BEEADAD8AC9908F55986AC0A8C88C67CA7FCEEF3E689BD4F4A24C08","0x1CF3C4F3E3154AA5B144B171B880CEE3C04ABB7DB4A3880BB43FCB706F198E20"]]],"z_comm":[["0x1520F8B77AE3D3D0ED440E2C4F11B7F08E242EC89F19621DF9CB3374022476E6","0x3FAB39C3F3560C6C6E50196808A0CBD3609512710A1A8551B467A987696A4AD9"]],"t_comm":[["0x0EC1E6D275D1C7F6B3820AB3F70F989EFC96F14BE0BADA747A86D8E689F9D9D6","0x3A2DAB9E873C7FAC89E31198A0984D6D860BEFE5B3D0A374D84D86534B902935"],["0x2B2EEB80465A94166AD86B1BC65B14EDD6D667D7BE8DA13922D693E06E79597F","0x3F726C90ECACEDDF4A2C2E091D47FDA42636C201A180879CFDBB35B4E16E9B4A"],["0x34AF498E99C73A0DD277DDE082B0D44F9C1A888A224313A495B1EBEA77916E24","0x2931F1F7F9DFB2E56C65F0ADD6F2F8F8F432A00901FB55340151137EAE63450D"],["0x323C53835F0ED0A6945DA7349F3E0B6DEC0E1E1E8D9F6B004E9229663BF90103","0x3A9614A8838996DEF9DAC324FEE2DEAA0F90374A299EAAF0980506580D294F29"],["0x3630D3C0C2C0BF3510E008244CCFC19E8BF790C14F95755994B23F22B85EF8B5","0x3919B0586A488DE30D6A620ADC7227DA551F495D0BB2C1F906F54AD471CFAD6E"],["0x0B8489894C4FC4B2E9FDF9CFF66F7F6126CBC543ADB84E36D75BD47B6F66CEB6","0x2E82DDBA4618A0476162577F676146657BED6B644B9BF016EBDE52570878FEDE"],["0x0C34183EFF651AA79E16C44853D72F69002CFF35D88F58D977FEE32814EC8098","0x0984B9C0AD187F5A9BD5BBF1832DD1D45DEB4FE414212CE8B8FE9FE622214CD5"]],"lookup":null},"openings":{"proof":{"lr":[[["0x2DA5DEA0DD518BC3FC8C2CADF62A97255893BD1DFCBE23E5146BC9219EB22237","0x12FC52829D3AC21780EC94F1AE64D1C2AAC8C6826179A15355D0A9959F2B12BE"],["0x06F5A78F0555E8414A7501AF8D9B6A9A9CC7D1D7F52CD3A4357FB0EEE095DC0C","0x373199365EF7420400B0A63E4EE5CB57353814D648577407D0676B2D402400AA"]],[["0x16EF67299E6A5D95F136A59D7396E28F0EC2B693CD4D597E92B8588EF1137BEF","0x0CA41F8CD8FC4F9228A8F9D313208754ADC7885343E6C2FAB32AD3FB3F5DFEF2"],["0x200FA1C0A6A07F21A72924EB6EA82957EF8FABC36BD696F13D180BFC2559F118","0x244C0442C751594FD53B61CBAFA6D55ACF447574633AF4630B5D477B938753D2"]],[["0x0C848F20C436472A64DD5DFB5497133FCD1599940D6F2C456FF7003474EC0394","0x365FDED60A6D99947BC95F5030884DCCCBAD03655DFE480337397053477B2902"],["0x1FD24777FA3EB495174A9BBB4ADB3A5CA0FF74BB551E31DCDC02AEF96B65D227","0x0B77921622A95A3B651B16A32BAB58BC24B89328F4A1892D6EAF6E21C0D85CD6"]],[["0x1FBDEADBF743A345A57F80F2D5CDC66313CF0C894D25BC10A60957586B87236B","0x2371100118A474D5EA2BE98F2BEEBA7BA4E25EC51CB9B29DFD9BDBB062C3AA3B"],["0x272BCC6182E23D71AC318482EA124F983B759726F9FCF87957DC58A60CAF044E","0x023CF50AD2CA29A57654129BF818A1856CA46F38C5CF0FC0BCCCC7F0D8760577"]],[["0x233740B3CFD0B5174BCB6C345D8DF849945A96567F11F428C5F059957931FD54","0x19C61C619B0C8CBBEB50F88D6683F3B0A0A7FB220248914E02E680D38ACB88F1"],["0x0DB7AB38A4BF9481E575D30A4B9200A11E84AA61FB927658E4A5FE69C99CF3BB","0x28DBE3D4D40A7DDA7E399B99E4D18B7FF483346C676548826DEFD750B7AC2EE1"]],[["0x096ED80361BD07C5751D83065EC597F648EA39ECFFFB1CD92F7AE2E21AB5466F","0x38FA372FE3636A699BDD4F69FB198A7F0342F611685A1AE12F3EF14B42463F76"],["0x112B631ADA93313BAFBBB9964D13CE3C52BE23EC2F9EFE87449B7B6ABBFDF3E9","0x00F29533384E5BA835ACB6DCE7BEFD57D25DF16BAF3CDBFD19BC25452C06B1BD"]],[["0x2451E544AF4F6F762E31BC773734FAF39FBDF3B9AD911DD7873DE7BF80533E26","0x02C16CC3EF1554F7407EFAADFD50E4AD24CCF425A31673B24FA9C7D803E09BD8"],["0x2527B0B64C7BEB66EBBA52727EF8C34DA6BF7F5D19854FC2EC23E421863A61DE","0x34BF401E4B95DFEA399E20CFCCFFE397E53917352E9A737EC27BAE10BA714408"]],[["0x102238A2C8E0DAA6E1EF76579D3BFA898FEA81C8F11517B0BC9B76E1C33AB70C","0x1B7809A3C3C478EA36710A32ACF3B1FC8596B2E88F9FB1C25C05E8A94987F619"],["0x1BEEE953915B43A701156A6C8894BB396F7B4F462A9DEFF0D3BFC90DB42EA15C","0x366EF2873067AD9C5F6C517BB426D13AA7C704F848A20A771638778580FB74F6"]],[["0x1166BFB821DCDE28E2E0ACEC392B885A2EDB8AC749E952A2E519799114C1C52F","0x2DE3BA186A3D01948264998CAE838B42F4492F12939F04DDF7BD2BA41C1117EE"],["0x09F07EF93A3FDE73650450270D6B0372E66AA5E045DF0542BA117B56A3AB612A","0x29C24AD1853E178DAF0C29B4295420DDB3C56BEC16844B33F6EE3469CEF01F3E"]],[["0x36D44457ACD7222043365EA28834D63676AED75A9A63D0406EED830EFB9FFB23","0x058442ED4754809939A90E66CBCDA208BF63772943236436AA6619BF389F3A19"],["0x09D8289142CD49FFA7F698011A718A784A15F892DC12F00CF6A5798E3913CB21","0x27C61816C700C6F01ABE02DAFCA97D3318A16302928B087FB3854A443B2AB47A"]],[["0x07F62561F3778D2B9AC56F400DC79CE5C929F7986F7CBB78ED502576BDCA6FE7","0x3AAF326DB26EC97FB0D7050047F19B9C52D043FDFD4C57173EA0EAF32279F7AA"],["0x253576ADBCFD1C91E37C599467ADAE1C043722BF2D1B7CAC71313F1B407AB308","0x08199E78707F3452F3EC05EE24E315D2094477FC38063900B4DD4C0E17A3A5E0"]],[["0x033AB5DFA9D5C7E90C9E621C857A3BD65F5E4759241E2A4704E82AB848FDAFC8","0x1B8CB5481C0B466ECAE8964FF80AE6268AB1E4AE6F22E54655340C830EE69360"],["0x22598801B8305B3A612996AA2016AF4EE866732810E1E9B69D336847E98E1AB0","0x060C263096C174AA81DEC474C46B63E6E20C88858E8B13A303255DFEFA1B843F"]],[["0x34E679B9180D7C1459EA858C490F0DDF9DC53F73BD904FB2891B08E9B4339683","0x02F27D793E82B1E8E52290E79E7BCB4007A2DD74929BE9AFDC689BF7E736B229"],["0x120BA64BC46FAED9A6EA0E65488FBA31B2E66AE5F7C2AE14FB3CCDCD39B342BC","0x1C61E44A57BC72C7863436CF91D4396B8903D7177469FE931A39D4F7D88361E7"]],[["0x073A346102B2AB97EEF5A70CAC132DA68EABCE394DA8FCBDCAD5D9DE71ACCBEA","0x37615356D6C25E5D4F7E694E81A215ABEA510E41F7D8A144A534BF00BEA017B7"],["0x0D1331C0B3010BE3E6942EF53E935B9779DF088E771690D72773F6C030EDC7C1","0x0139F9210B9B82F6D0E0914F31698A31C6C2518A047FBD418401CCA96E0752EE"]],[["0x2E0D174015C8E08546FF29CB3714DCA67E5F7F0E1D120FABB8618C39BEBE04A9","0x2B1437246007F0ABE9023EE6F5B3FA118C7F5F0C9DC77A28F6723C1EDDAB8586"],["0x34D6EBD7CB578E0B4D3BB18B198618BD9CD9413CD8EAC3D7798E365450D48125","0x2426430B54390FADB878BE2DB710A81CE287F3ED1F6C919B0A0EBCA989CC4423"]],[["0x3EE37A653696B4A46FB8D9F244F1707E4FAC94BE55EC880A64E1A0DA7644C826","0x2B3FB70E19EAB2201350FB8BE71861EC951C60A7D7120119F259B0DF04DCF71E"],["0x084226E717DBFD55E6D54764A26267BFCF828498E5C92EB11F639F4F1232B5FF","0x3EA1C5433D7B95C3443AF2D74189A3E636E2944DB8526ECF760839B99D621520"]]],"z_1":"0x1662A092D57FE0CDEDEFB9793EC1B14F56AC7DC9C2011A9A50DF156E0EE59519","z_2":"0x19C089346ADD25A841CFFB63D628A55A0D06F8F4653AA870853EC8D6F28D8DDE","delta":["0x1E83E650ACC9E04C2C119B919DB36D870B2FD08074C61F25E02A50A395DEC6A2","0x1ECF94D5F40697C9AE6B1B0CB4AFADADBA2B857BEDEAD7717C6298B3699D4363"],"challenge_polynomial_commitment":["0x0209D2BEBC66C0120BDA193C694486FC5653A64835F38F5761F21F3013F58358","0x365788E274D799212D178DE416ADB6D6B95ED0FA9CD6A8FBCA1D59742A3E2681"]},"evals":{"w":[[["0x2E4A26C1CED2DE013BB41C3584D80E90697F1685FE9391DE2A69647CFE62565E"],["0x04827E1925CAC61EF0155407676A923EC889C43E012D05A57E1704AB2C180B26"]],[["0x223551B729EE88893DB8AFF0247F1E1D56EAC93EE602F17419EA35D6B484D65F"],["0x1312C2E592B030DAD55AE214A726E19B921B4A5097D5AF7CB1726CC10DCDB3F1"]],[["0x289175729202590F83E0221F688A0D52B527F19CE1966E329BEED2F4BDA3781F"],["0x154F7126DF385DC6F4FC30EB57D3BF5AA33ED223CFCFA0595F167A422363E3C6"]],[["0x1374FD8A266726645D6944E090281EBDBB4F459F4F3AC894EA5FBB04E8968F21"],["0x124D355CAF368E7E5993160DF4BB593EF5518AF85D6E7C7818405BD3A43AE1CC"]],[["0x2038A47FF015371D8D4610ED326EF491D371DAE7F3EE28297BFADB9F031A7EC6"],["0x233DD650CABE5241BEABEBB5FEF2863BA51D52D2740803823FAC9A247A045B99"]],[["0x04DBC8F99E8E22D67FA0A8213B346F6C5CDBC3456871C7DF652976E61A34E7AD"],["0x267E35EDBA243386D3B6A923C118879D7A270FDEED0B108F0EBE875E6704EF13"]],[["0x06DFCB68278C955FAE96126C8A0E15057F2ED8DB9D3A1BF4AA868DAF115FF316"],["0x0904D8756E10E71A870A84267558C1B35A732724A2D613E09D86FD39BEC192E6"]],[["0x1FECB985BCD2BFEA4639BA2AF75005B35F173C142655699D270D3B249AE19BDB"],["0x3510BA5C025497B8A22F8769410E6D0D64804A03BFE06D4C8E4E8F432E491493"]],[["0x212C39272E351682EB34A230146C761266F3B42650494D011DA1729CE6604E7F"],["0x085A07D97E61AB0834B6DDC51C22021128705E09EB04E23133E42A9FBF130C1B"]],[["0x150839671C84423A58F5CE8FE76B850D233B203A9539F144F3C466CEE288805D"],["0x3F3348F4D7DE8D771100997AF41ED4600BCAAC557D109149852437B2C83F421D"]],[["0x0BDC811A54833D28E0C0978309D7F944E6B248543BFB441E739772D75ECDA269"],["0x0E043F7655D7F28041E870B7D2F89DD66C122036FFB4D1DDBCA0E27CF106D417"]],[["0x0F3A1A25689EB80AFFCA73B4A4EBA761EBAC808A5D9014935FC7E44D1D2FAF12"],["0x08EEE3DCB038FAB465C88580BE10BDBB354A432117AAC02CA2964405CB85918D"]],[["0x1F78CDB62B9940A1954251B464C4DAA73F4666C19B2191031073A43D66AD72B9"],["0x093F514D76556C5AF9DBFFD285C548C30309CC8F9A127597EB29DE869A1B264C"]],[["0x028782DCF90B092E64CCCA09627A3100CCBD8740CA9AAFBC1E5335C6DAFA6BDA"],["0x32DF7A4925DC46A23B1B8D592A495C109582ACADBA65551AD74409D6A2B113AE"]],[["0x28003F9F919C9F3A42773CF180A1684B0E27289E2E220A66C2E2966A2CC7E46A"],["0x3032AC4CAABB5183D06B6AF77DEED29B8C39380FB286A21B3ED74E1A925528A3"]]],"coefficients":[[["0x1CD29B55C4C76CD3DFFFB262AA44B07EA53B0D65DCE5B091915392A33F3B91A7"],["0x0C4156F5B033DE15A29E480DF36817EDB6DBB43DDBBF1708019CABD410A03D9D"]],[["0x123E409764D61C9832CF246162C62E8071633738EC7469FBCB40DE3E1B1A39A7"],["0x1331DC32881988C06A687B9B68EFEC7A3DAD270BAE0FFB42157F0F370C9DBA78"]],[["0x010611BDBB64CF7204BE5D5D43A0D2428406EFD5DA95BA8AFC4A74F33D87A2CD"],["0x188977B3B23F78003D42E93DDC37C4F0B1D92193BAF7C9704A3996567D7D1378"]],[["0x016E3D4B4E23F99B3FA3AC73BD1EE6FBBDC6711AAF58E47D9D1E481EF59E9AE9"],["0x18C891C82BFE3D407169B6A554A2145075B6E444F36DBA8691E0C8C3564FE083"]],[["0x36617BB120733ADFE0240BA9051F2B6BB890A8408CED5D8C827FACFEFBB786C6"],["0x24CA59F3503820E19D3E9B291E11B593DF54B9E5D8E2A2FC56D6B57FC34CB76B"]],[["0x17E26D445B640A756E20CDE356777EF481AE345FBF545580FCCBF2B446C8C2CA"],["0x29AC5036F564583CA4CB8B0627E0DAC3AEFCFE50B3CB0D300B75DDAC2DBF47FA"]],[["0x010641C88F63311BB368C0C8BA34E366B771FC585C413CCEAEADD6A8D2F5D3A2"],["0x382056F9A846183EBF0A4E5787736BE8BC91319ED45E416F917D0EA90242AC01"]],[["0x07DFA2418868FC0F6FC835547CE4D944228B55E4C90B199666F8B8D25B90B578"],["0x1E06EEE8CDC229243D944E165BA26C6D81ED908AC28C3D180E0D393014B1CE45"]],[["0x2A8E859220DA7040983757CE070A746AD65AD6FF7C602EDDF6BDBADCC7042A21"],["0x01EFC70485EBD8013FF9FB426416D8B90EFD1EE115257BC15F4C192641BB04D6"]],[["0x3E1FC9969FC5604B83C26A93DF7A65221403247A071315629DF9811E10342868"],["0x26252D1A7A6C12E997736E787C67A6793C3578B1C3BD885A2806C1F2CB8EEEF1"]],[["0x0B49CEF6C6507302EC8E8E5BB40E2A203C39EAE85E61A127A5D4B39BF12310BC"],["0x2D404CF890754BA5115B1A30CF3E5B8D8057C57DC8F35472E37CB0F17AB12640"]],[["0x151EA512303E2A20F1964C5F8F8403031AFBD2ABE57B3C5BD8D98867C981D98F"],["0x04832A4445D4C828BF3A0B2223CFC8E15B63B8ABC948177E5FDE63240D6C1F70"]],[["0x3D556165E229B88D7EBBE600597769EE73185F01528DEFA09D96EEBDC282EB0E"],["0x081C68776CB522BF15B80BAFE15332EC0F129C35E09C67FC7A572A7450667478"]],[["0x25152B698660E065AB898DD164CAD3B6685E8FA1BE1B1F88CF9DA7CE10BEBC7E"],["0x3FE3B215675EB445422C1A56CCBD47E1853E5FE3AF430E18FFAAD77E3DF4EFD7"]],[["0x12C6BDB7756793DF51397436A8E8FB1648C3B521E486ADB2BB77EEA892A14CDA"],["0x2BDE2288E19CD2ED81584466F2D3C7ECE06B3FEF94E9D585644BE9DE9190EADF"]]],"z":[["0x174C0E30743685374B5760D2318E25BFB97E8AF00F2D6E7EEB9E8AA519247F9C"],["0x03E84D13A36E64D2971F8218EE4418B089D3C503835EE3D3CC2BE7E7FBB5A46B"]],"s":[[["0x0A024C7D79C346F1692503EB4EF78B587E2E89685D0C445FF27AA68FB05B8BF8"],["0x36F5C71D6D7FD98B91498FC9040D90066B0F739CC316374C60A0412142E4378E"]],[["0x3F731BA304BEADDBADD0CAC49C48AD74CD4E55A8004DCAB62986D9757067F3D6"],["0x240FC4437277CA0DDB46C48992041625086558C48D6BC0E9C0DCEE607158D025"]],[["0x3AC33F7D580E4227BF50528F2E92DE5D88BAFCA70228995ABEA94CBEB8818BC5"],["0x0F6FCB2D07021D7A624BDC3924F52E96E152C0E08F5BCDF035687BFE71C9028A"]],[["0x2E30C3D99689BD1FC0814A3BE2B52C3BEDC93A26DE1A4396943FF5701E6CEFE7"],["0x3C37B1AE57D5FE27E5F7778061AA0DC688BBF1CD8AA3BAE1E46DC71FDFB59281"]],[["0x3137BD72991CBD5A88BD686834B80354B0ABA5CDFB1CD8D233C5219C218C68AD"],["0x1620D5E641B37CDDBF536CAEF3498BA8FC925802BE9DE104AB7796C2AAAF4C3D"]],[["0x28DBC998DE12C22D065DAAEF13FCC4B2B527A1014D1E1056B45590FB8917D8F1"],["0x23C0B28BDFCCFDDE1020AC7EAFAA80C611844FA1AE82D58F5A765171C983F004"]]],"generic_selector":[["0x2DE118E5013685446C137CC02F21460A17706DBE6CAB5431FC2A4973B04968EE"],["0x22B111B2302858077B934A4BF4D05345C599B34D039162A78D381CA6C0371779"]],"poseidon_selector":[["0x2ABEA59662A48E73F1EF52E7DC455D9CDEA389AA26A6A8CA4D14D8082C927FC1"],["0x06DF802A8E6EE392D8A9C88BB47FB73B0A58E56CAE071B40B436456A8816160D"]],"complete_add_selector":[["0x2B22E52463FE4AF6C059C9E9EA56662317C67B0DE1674E6DBFE42EE79B0B58DF"],["0x23421D0357C26659942FBC3D13251E2956303A9874CFCBF179D3D3F26EB3F1C2"]],"mul_selector":[["0x37FEA09D089ECEEC4831AD2BCD89C507D049A438E2DAAB5008AEEE7889D12A18"],["0x30FE19614B5E1F7128335D38778CBA01FDF7D27F138070CA50B71360EE54CAE2"]],"emul_selector":[["0x3497824B0D62D108E76BD41543B0BB118443F28EA30B71A001BC9715C1593827"],["0x1957BE09FD6AC5DFC21F2DC5C40BECA2F0CF6DD8BEA34DB60D620969F25AB1EB"]],"endomul_scalar_selector":[["0x15AE7B23B61A7FFD804F8DAD842813D9B9B2C860A46E0970D0AEAB189A948BF8"],["0x1938883528B29DD7EE7F04B364E4065DFB0DC5CEC03DD2DB92A9CFA670CE3A0C"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x2DAD3B2B90E0B358FC7C8A913E6B32864B221A6CDB473159BF118EC521790280"}}},{"public_input":["0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x17BB05FE9B06127FFF4DED6B27190196E85E1D17474736620D8AF8898460DFA8","0x0000000000000000000000000000000000000000000000000000000000000001","0x1A8AFADD7570C6E8E2866E07379E4C3AD2FFF4D136FDC30A4CDC7A49419EC98F","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x114D8A9F88FC1DAFECD01F2133A590B5DD2CCD763639F8FE682F9642A1E9A776","0x0000000000000000000000000000000000000000000000000000000000000001","0x19E974CD6787237ABC93B2DE4DB6FD40252EE961D3FA3B76916B10FC612107E1","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000001000000000000000100000000000000010000000000000001","0x00000000000000000000000000000000729BEC25C3EBE79C73CFB870863507C1","0x00000000000000000000000000000000B3F3D28D6AB928117B8BD69AFEB30089","0x00000000000000000000000000000000B1AF98833AEB80F20A5BB62857AB4F25","0x00000000000000000000000000000000C3F00FFA7D12868B08A1336DCA69C50C","0x0000000000000000000000000000000000000000000000010000000000000001","0x0000000000000000000000000000000079974358F97618633382B3C9ACE6BF6F","0x00000000000000000000000000000000DD7AE6402944A1C7DD3A2B06E9888797","0x0000000000000000000000000000000007DDBB65CDA09CDDC6E8E530F49C9FCB","0x00000000000000000000000000000000A921BCB02A656F7B532C59A287691A13","0x00000000000000000000000000000000F85C5F00DF6B0CEEE29C77B18F10078B","0x000000000000000000000000000000004D1B97E2E95F26A01DBDA72D07B09C87","0x00000000000000000000000000000000A1FE6369FACEF1E89C75747C56805F11","0x000000000000000000000000000000005A8C718CF210F79B5C2B8ADFDBE9604D","0x00000000000000000000000000000000A6888B7340A96DED22C0B35C51E06B48","0x00000000000000000000000000000000C1C68B39DB4E8E129007D7B55E76646E","0x000000000000000000000000000000009D40C715FC8CCDE54445E35E373F2BC9","0x0000000000000000000000000000000097A927D7D0AFB7BC429882844BBCAA4E","0x00000000000000000000000000000000EFE66A55155C429499CA3D5BFFFD6E77","0x00000000000000000000000000000000951FA2E06193C8404B7DB27121979954","0x000000000000000000000000000000005BD1DE3CF264021D2CD1CCBEB20747B3","0x0000000000000000000000000000000000000000000000000000000000000000","0x03FF0181E0394F0D8298D9419B0CEE16206A397F59398AAE559649FB5415E565","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D","0x1A67EDC50E05479A8A35A5D88D2A3EFEE4A4236ED2809BF345937F862612105D"],"proof":{"messages":{"w_comm":[[["0x3518E75BC035CE27790FF721224A023A5A2198AD2278AFE25E2FEEEC7B1B03ED","0x39C69D6A8C6A39555A25F57F024D673F29D29E0B50F46C666B8D9AD723FA8292"]],[["0x3FB01D08D84A17C08CFD41D547036D48B325199B02C8DBA098B2F7A91DDF62DC","0x2EF74DBE702D3F6EBB6CDFB803260DCB8038B9E88CE89177616DFF3C478A1AF5"]],[["0x0B7FDD2F9C735D908154D6DD693523D5CFECC76D48FC920E734CEF253C7951D0","0x376664DD8124765B370BFEFA343D093F5C4929C5070C7E3FF4DD3D543702C494"]],[["0x393567368D860171E1C88D09B912FFB13D5E24BD8B6C4BEE916BEE77E5C05130","0x1B7E10292F9024648DA814983A919BA0E97202B1EC5BC565D1415A3B212CD7C3"]],[["0x3B3E34B1AE1D83A3693DC88237F5068D71657F26DAACA240B58001E17D1F18FC","0x35CADDD9445CEF45582F447F52C182F37C3EB64935515A59585F39EB734415A2"]],[["0x34846CCB43E37D6B029A03066222A4E18A0117C3BC443E4F858969282809A516","0x3DDDE35D5BDD65515B12C427F607FB0CEE657D41A961B342CD58DE21C02906D4"]],[["0x1D6660D55066CC59AA70692B3CC453EC4057CA87B627574736D86E684D890537","0x3CDDA9D01E4C0E879315CCF80AE3B652195798B5B927E3F0B46E09E0E56B1FA8"]],[["0x18C4183ACB77E69400E917AB54103647336D29F538A574475F03D0087D3B9BB5","0x371AA2E29AFA518DA6D9A94C08551F0DD67B4A89D357AC864D2E47895698306B"]],[["0x0911F4EC67D5FE9544335FC1E5BAAFED386F9F78018FCE53009A71E4CD1011CD","0x33EB06EDC54D247C10BA07C8DE4DD961E20CB30185B1E3D3BCBA1D5195A2C978"]],[["0x1696ABB7D425CEB175EBD428338F7F8776E390196D0A0AFFA13198FA1C7CB688","0x1C8EEB680BD891C48FF19E2B08E39C574B85D2B2D3FD998B68064FEA60CBA1B5"]],[["0x07636244B829588246F098B7ED41D54D465041F91E17A0552B5516BB98209110","0x1E503762FADA6DFBFE5F6C2CD5780C56EFAF4DECE91BF03A94F773A438F8337E"]],[["0x1D4DFEC29D1A726E5CD6F2CB190548848A0713B8079CFF6E6BD0591AA706B5BB","0x29AF8CCB3D68B8AFE0975101CBD4F5C5652ADB884C979295DCEE5F7707C2604F"]],[["0x33F971A1362EC9CF147A40B8F075B71BDFFC066081D7ED676410B823C918EC9A","0x159323F00863DD5E7EB591D89521C211E44CE376F1CB04095AF550574B1AD175"]],[["0x021AC3473C21572E0B964E04790930FFFD7866E5D6B08FC858BE23655B57635A","0x11510F10D4700C625E306F19D7313243CEDF112744198ED114B10769BFAD6146"]],[["0x340CEB356E931450B18BCAB0990542887B664AB3BEFC0B938B338B9741060104","0x3C0E28692654385D179B8DA21462CB9561A97A41EB659B907C905532BF5E4ACC"]]],"z_comm":[["0x39C8F16C89FD225186DF45E26CC2907B3EA6D89173C4AB6480EEEC5B0A9EC7EE","0x2D3EC41A4ACBFBF5ADD79CB448F6AD463F23CD7518D3FA866597FD2405D0D16E"]],"t_comm":[["0x3DB08E4F207E68210298FF0D116CD8C86760B377203ECCFA91C30DB3D30D72EA","0x3E121D7E36C3432A54863AC5EAB15184A6EB3AC5B10791E6DA64768CADE8F95B"],["0x15EF32D1CA4FE3599A09B75A108FF28539E3F6D5A996BA774D6536889F052D70","0x28179E64AA0A17D1CDCD94A606B5382528F134595F318C6C7F5C138BA05F1AED"],["0x0F71C25E17E5068793C8BB1889F2A69C2EE4328EF06FADCD26963B4B71E66784","0x321E054E66848C646A74ED4D9320844CA8608E59698AB83DC43E293F69EC2ED9"],["0x31D4256612969FB2D56C7DB0A386250805939F4DB33BB7E64515BD0CD0A7B179","0x0FD710096307EDB8AB06200F884B86796FB71ED9EBCCAAC734F82E6F2188B980"],["0x350A73B7BFF15C78BA434C317CEB5CD2DD67657E1568CE2B3B459407C14CA35A","0x2B4F06C43EAB4FFB32D712339414D9C781AD21A0378AED033B24EA37BC664821"],["0x3F8F85D8818EA0404CBB5F1F5D07B5E33FBDCC84E02FED4C63CCF088B47DD4B5","0x09AB1203F2A98FE0BDA8B5B13956056C3F2B54DB16242C639EC3822A536FD936"],["0x3C247561200C8163CE7DE9C904D7B7B31F54138A36B0833355C62E1C2FBBFE52","0x1AB80CCE79C65957AE00D73F331F696CAFD019EFC73E4AAF88FE1EEF6A13C60E"]],"lookup":null},"openings":{"proof":{"lr":[[["0x22E371D1BF3ACD25322B00FF6C8178E0B83798094D9429F5E63F3F82D2AAAB09","0x2EC10E422125B0F91683BD631FCF25914D798E254E3565BE24F908D145C6FAF8"],["0x01F5515A4E4A15E15B7D13FA38FAA29313639B20030E59FB850E479ED9E1D218","0x36FBAC09BED28DFFD1BE076345EA68C6BEACC124EC3971AA15C279EB71C7233F"]],[["0x2BAD00C2AA85A8F47A73DB5978A2BC3F2F42169B709544314ECE1F4B1F7FECA9","0x058E95C2DB30678B509A774DA91121BB6DB570146728A737886ABBDF9D48319B"],["0x2E168986A70E2994B670B463090506A0F0E2DEB378924268F5F4D789A7C9BF21","0x1876CDE5B19EB2433E3D8CE8CE115781B2B94305B37AAC41D40A031418FB30BB"]],[["0x07055F08D6A0EA630DA40E188A17EAFF613C5E56095CD0081F8A7054565BCBF1","0x0D5FB9C86ED6B8B659700FDE40DB4B536469B8BC3048D5776C4CC7731030BA6C"],["0x1877D7846252E6F6748967DE883104D89719BD3EFF0BD059C0DDA5421F1AF756","0x1531F58257434D69BE63C0815DE7AD5EC39341B05DDFC5F9A7A963E51CE5379C"]],[["0x22A634ECD8F00E808F7F967B9C8575ABFD890A7954FFF767C8A6C7AB094A2C3A","0x2E98D8F7CE659E396D45E7FFC487D766D6180FF56E97A9A64908905203003D45"],["0x20D0F46D2AA0E573B5839CF54B3997471BFA4A551EE3C91F601DE52E7C7B275B","0x1E124B1E03AE0E5DC8A5609B60B73A2B07BE27520345BC41009218A8B6716AE4"]],[["0x13E9AE37EA45523FF00FFEB7107C567021B738D4FF02236631A8E1BE942791D1","0x0302933146A79AC229374D1C2E71B26CCE3C19E00186A68C4C06E2783614FD14"],["0x3E1CBCD573502AA1395B59E34192DC9FCE8110CA82E70A01628EFB6117FFB0D5","0x28D7961DA70E4FC6A7BF98357AB6FAF646EB363D72E43BBE9E35A42529DA2BDB"]],[["0x2AB4F1BD0C85749CDB8F36E009F4701F579B55B83C1B5189F5C3F96F81607E1C","0x2582CA7A79496CA8408E8982E95A3DFBC164A85F8AD4CD364A6130EB4CC36DD2"],["0x2C18AFFC179D23804251543DA5072A1E5B7B4DD06D3BCF6B7F43829C8A2AAEF4","0x2A9A5B55C312C440DFBC56D67A231DC9973D732C846014C73CEAB5DFAD846994"]],[["0x2B6355F64D74B7FDE590B22600468ACBBC7FDB6D7E573BE0C1C4283D46FE640C","0x0C68D338C476A89ED37EAA1C8027AB73D5DE29D1597E4DD44AA901505848D315"],["0x02C3FF7600AC09B065DCD12DBEA5D7B102168BB04A707F191E9979D0004A96D1","0x271E5F1EDC78A64138136C1C4B30161F8CA859A96BF42AF228EF7EEEDB6F75F1"]],[["0x35A87A2DB7BDACB5F59156A2D41A23E3ECCC9FECA92AD0C6D489853BA9930835","0x19497D5D37E776BDEF570AC2AC5AC2E9A2E8E726E33A7889F0CF8524C1822A00"],["0x26965FD65FB1F0F083709E193FE5DCCD96ADD1264BE4BFB3DEA7B6BDAF11222F","0x07731E6174E5582482EBB138309A3B60415751D768205D3F4B8E1A30F5C13274"]],[["0x16051F4847AC8ACFC8D17C7AEB27BB429ED83DDDDF8446AB855B3BC09DEC7682","0x0C25B3131936AB8ADA08D8959B99B55F0AAA99229C6BD948A8CEBC79038B5E1C"],["0x2447E4FDAAF5509BA8A595B1EE18A3CB99E66C4A15C0EBB494EDC7F4C9D0EC84","0x34555D81E3D3653340B4C09F96AD8AF86C91D265A410C19E887D0F109D2FF457"]],[["0x0A11D834102D36F9C4D443837342D774953AD4299252BDB82E3E1B014634535C","0x1626BF598BDB131EA19F7E206BA9090D78344C8C6E8799A31C610FA679F199AE"],["0x26FBD6C00CF6A7D0EE43011D0CFAFAD0B3C3FE3FE61DEF86721B5DFE2FA17B73","0x319E4BC80153D7E68769CD985412D145068E127CD46415941AF4B959F8A75759"]],[["0x18AC5C4871009446CB65940E4BD31A959F9D6BEA0D7B6B3F1FB58CFCBE9EB6F3","0x07DF323A935AB3F40D2EE2650A718075BB14DA31698FCF785A73B4404CF208C9"],["0x3DF28C8176DF79C75AAD8AAC96EB984C5939902368E5565F171BCA03B505A333","0x13709505041B806C2B7A2A11237F43E999D290EDDF0C9AF39EFA776F2328BF40"]],[["0x037FF782F6512D13EEDBB2EC08603AE41C7EE9C360D115D5B46AE3BDA61C012D","0x28A1C89212AEF2D5BC8B191B4A8D9B55A97AD3E4B6EFD7F9EC5E8969F6A7B820"],["0x30603165BC95575E8DBFB7CB24E85ACFE307BB30777BCE9FA7A6130801FD138B","0x24FEDF6D6A6A297659FBD4D2C7B9682D20834AB8C0DA55754EE7A150526D2809"]],[["0x0E473C57277C2C9A4E6E6EB8E393936126B81E4A7E05A7B41160DBA4D95FE4F6","0x2B04B73D307612AFF8970B12B22879B8EC78940E2231C7FE16E323B41C930233"],["0x29428CD7FB3223464C187C3D99E8C272DE97707FB90EE90D90D3B111B9FD0E31","0x01FB1BF5A236807B27E39E35E83F39CBB902AE6270D2DAD563B7E681D10ECB01"]],[["0x144AA4E1C8B3DB3B2D48A1758BF7F9E8D07DB8AF808F06F556C1E67EFE9FFF7B","0x352C6C14B3AB0DC06710E322F3F88D86C3ACB2C45C83B2537987AF30D1E86302"],["0x05E567598F091C000FCD6E47285CEAA894D1AC2AF087BCC3157DF9FBE6E33FF5","0x2BD1744F9E6D6894F2308C6F371F9E8F92EFF6C5BD993169B2D3A5E7CC280309"]],[["0x0375B5071E923D7809B2D8FF0BAA9353684A3E9FC6569AB33A5E983FCDC10227","0x38311AFF61609D5DDC9A41FA3DF9EF80B4ECC3BCBFA37F860AAE3D10DC86130A"],["0x0E6D2ECCEAB8B6DE6D5169DF7AB1B9B865441CD657B9FED036708A40C2B1A679","0x0179C0E84DDA9091975FD12BD418F643A71C2B8332BE1B62756F2B326B55E538"]],[["0x34A3ACB563DEE9DBBD6FE9C6C61842F6388AEE967119092F9626F74F3284206F","0x291C4F9419AF1D746CDB40915076EA5E3C91110B5A13DFBD4586C6AF8C15645A"],["0x3B461993864B3565114BF33C1724C16A277923841D64550E908DAFA6CFC55D37","0x27A0F5514E2B458A20AA8577260DF51BBAF1FC149F2DBFCC663F3214AB26D7C5"]]],"z_1":"0x124D213633E222BB2AB523345F18841EB19060D283D84D12726FE181AC403F68","z_2":"0x11B45528F3913ACAB031B95F2CD6633E9AF000F6502B6DE21E59C756F5EA8AA6","delta":["0x081821467090805764FF9A468005F342A08F7A244AEF6070B1C7F229CA43BDB5","0x2AC645C9746B4CCBA70EFBC68D567F03A741B3A662ED327053D2B0B831FD4ECA"],"challenge_polynomial_commitment":["0x0D6CF7F6A8EDEB30179CB4F68F02752309CBBDE91CE9C3D369B0F433B3AE592E","0x3A7B462C871D306273110C8017EF6568401B142CB01EB5A6313496A8306FE7A9"]},"evals":{"w":[[["0x1910579E281E1E8D9B99A41D32F37A3E100A1CFDB968C9519D64A253936F8F87"],["0x2E75D6852DB303A6F73E92A50D7921E38FFCB9C39D741FE87593F916E478D2A6"]],[["0x32DFA89D5BCF3D1A8F9D8DEDD5A02750C587FA8133B94A933E4CCAE47DC849B5"],["0x2DF334A2764B9F564EE2280D7D6696DA607F17ABB8158B975DA44E5FAD35B8B9"]],[["0x288ACBEEE3788A992558EDD01CF10F95E3115C81F3C1DFB62F833B4D9F6BA446"],["0x3A3718FE35CE897BF77C342E513F687F5AFC39B3F289575648502C83264A4960"]],[["0x3E01C3B8A26491BA988DABB17B9613B9C01BA273E542AB20F1B5CDA35A89668D"],["0x2CE65BB2C701A2A44D86009732192B1E739A659E390936980C4F89D866965586"]],[["0x3B11ECDCE7C5412D5B204E8148549F8C475D08226F9487F79EB20C64FE4EB9B5"],["0x1B58F703778D8BE8B2F3630836F4AB2463EB174F7E4689E6AE4FAFA949966901"]],[["0x31243E3F0EC9A0622F781D6E612B8AF9D28784BC13854CE85D03E3A2FD4FDE4E"],["0x38A96869F3C1BE05E44115C07A583EB7CA54A1EB706F54E28DA59948924299FE"]],[["0x13E0A980A6D8E9C9325843243B8C140DA0B047AAB05AB95419D5771DBE4A0D4E"],["0x1C397491D4447A6353EF46ABF22CDAE613DEADDA6229823ABEF11ECF8952147B"]],[["0x023F50BF6C59174F5F46B71413D7B6DDD1C67A413D12C83A5ADA1712AEC08992"],["0x042936F656D67A29D72A790D4D0DE81DCB1DB6F4D2F46C0CD8CE5AF127D200D2"]],[["0x2524F736B6C8705C06A938321F2D6FECB1C152FF47DEFCC133AB68839DA2993F"],["0x3D9AAA7A9D64B617832B22BE912536038CEA500E61E07FC5415B5E619A57E0B3"]],[["0x1C5F0A251B8F847C46173DC782EB9241F26337E49E10933D2B4DD380F28E61A0"],["0x22DE333F8267B38964CFB1CB3F175334ADD4567EA9557FBA316368598ADB0C63"]],[["0x1D121C0C3E0408CD11A0ACAA9DC7362C892BF93D628518B1B72B9AFA0DF3A8F5"],["0x1EEDC47BA439DD250F8CF2A7225C3410A78DEF98F7E5E3D8E8C900304852DC14"]],[["0x3D413299BF694D95DDB8FB741708CCE6B1B92EB8B9FC9508C35FF68F9D37650C"],["0x20FF6397B76F4957E90E23E729899C51DFABAC33E49B90C135971C15D09505C5"]],[["0x01CBB6A4A1D89F4A506194245BA524B960F2EFFD03049AEBFD40ACAD8222B956"],["0x038BEC63132ECD65811A7ACA4475CA314085419326E37DF10B2397C5032EA690"]],[["0x2445F88467BEC3051A37078A10AD20CC1D553DA7A2C3358C016281EE283B4AD0"],["0x03BEB6D678F1EAF79185F5D896927A6DECC01203E008DBDB67F66DA3B49FBCDC"]],[["0x37F01CD4C51CAF0863741638CAEC47A2FFD21859E0469BEA01C7C801BD22C23F"],["0x2C426CA1989380611781A1F74EFC259F0800539714905DA86EE89FDE30B7BDF7"]]],"coefficients":[[["0x373DC4B73EFA00EF123A6B6A1B0E176B33C8ECF7E93D5BB404C5BADAE9004968"],["0x2EC803F9E1361AC080A857EDEAF220AA8F28A915138DD044C63A2A16DA1A8D34"]],[["0x39576073A56F20E2CFB68C36F42752E6065EDF7F0033666E04C6CAAC00FE3BAE"],["0x2DA0255B4E653ECD8E34CAAA970075EA66B66F88B4E87B939F1FB1FDF3D7F3BC"]],[["0x3A5ED278FD06612FF58E11CEDB3CAEBE297F6AC5783D0B4A54A728B4D84BB08E"],["0x23066AF9EA76D98332CF258E249322D55B5BC8D6C665FEFC2153AFB0570BB2CE"]],[["0x0832A11C77742033D3D8AF70D36E6BC50092C87F3C72093B72A68E443378E754"],["0x122F25D122FBDF544BEFF14A67B38094E866210BD17599CF792C8A75DDBA95CE"]],[["0x31EBF3FD86F8495EE99BE381A5D8045423BC268699B794B545FBF329E8F13E70"],["0x3C6458976B293C4D05255DEFEE6666357F8CDBF7402B9356331277E00B4E6FF5"]],[["0x146CD77001E48248205938A71C402C27DE213E04C7181BC01E27E66B77B556A8"],["0x3961CC6E9158C171798BC4C7FFA5CAF1D2813BBE93E2D90B373443B502A7E2C0"]],[["0x3FDBB710A3F8F8156505917F68EF4762C7AC461673F5C81DADE075DBD7FBF272"],["0x0E23F54ED3AC2A789A69CB18E59E2E347CB49449645342A164422AA191322523"]],[["0x01822BAFFDBAD352E399E9C86F944569007187E3AFFB5D7BE4B011BFAD4B4223"],["0x32229D06A68208FDF50B282A29B47BAC4ACA210F7A093C7829C7FF33609EB30E"]],[["0x24B5093E395C555F081857B58D779A795874774B2F2C79E1555E4BEE089EB900"],["0x3FF7533E2FFCEE6D6F285346C1AA99FBCAAFC277B40C7A4E91D853784D474F55"]],[["0x2001FE7421181BBBBEBE766F9AD28696CFA951A4271287DA5710435A8DD2E88E"],["0x0CF2D60A824DAED99C6068F58633478703B482B4FE57D67B51E4794B2F6F2D68"]],[["0x27771ADECFEB9F84351B0D565ECC3774E7CB59F098B6CAFBB2159678D08ABA57"],["0x22ECE3F9902408575A3D84AFDC84D8E1563DDE0AAF575F6A9003E5C063E32F99"]],[["0x2A4F0FEC73E8BBA66B211268FD65B3C928F42C1931B0870452C589D620CD4D93"],["0x317CBA3D440A7B88C735CFA0EEDF90D4D0348B32D0DABFB06A25FE3DF830CE98"]],[["0x3BB29043D6A99B6348FCB78DCCD413136A61851FACC6ACAE1601FE6BB15A70E0"],["0x2B0F50C94DDBCD9AF33F0B3F8F572CFFE455FE86038732B7D96A66D2375A60D1"]],[["0x1A92F2B2DC71DA09627A64C36AE7DACAB3B9FBE5B0C7B896AC8BDE17951D2F50"],["0x3DA2211E59159D2AFD437B94353B7060F4494ADBD0F85B6661F1D92547F02FD4"]],[["0x03990088BDBC4ED57D185257A5206DCCCEAE252C9F133D2DC8FC670D35219357"],["0x2ECBA93AA2A75F04B11C8052FC1080DD3E413B45218C230BF789408DD943D494"]]],"z":[["0x1E5224DEE56DDDD306808F31F98C815033F71A2881629AF6454CF32A3586904C"],["0x0E345171961E0884F877EC69F171E4570D1196A342E7C7CEC712AD20979624E3"]],"s":[[["0x1CCEFF40F4474A9559BA1F66630229E2202C5F17BC10383D62470AF6886D6955"],["0x1D3DC7641A705B6D50D16907A5635FFF289998AEB44567FADE107DA04F904ABA"]],[["0x34E9DAB02DC1027268D872A797478A05AD3F60F32115DFE90A2C2547B1C224E2"],["0x02235B5333A5BA13C67261EF44F5318DCD033788703ACA9E9B371425ECB95B63"]],[["0x2A61CF497BF6B5C4050B624ADB384BF176B002CCEDBC9D94A9B2041CE126D8A4"],["0x07149021A01D7355AC2215FE3B8AF6BC18A8772A8395A6279FDD0D186EAC9064"]],[["0x18E5C0B643B7DA36F3157CA409E4A3C88CB75603551D996C606F28644BB67D87"],["0x118637816209B98EE263112EBADAF96C084EF74225D93469E7C8848303736D82"]],[["0x1051BEDC658B00FB9EA658AC357F2A3284B4D535540C58FD7BA93B67ACC3AADE"],["0x05001B960FADAA59945BDF0AACF24F30F3CC9D519EC9FC44371E8915BECEA661"]],[["0x022E3928C70E11E72B144FB6FF28BF8C66249F31612A13D2F10DF10CE539FE6F"],["0x3CE07C79530C66368631BD29E57CF773F95A389D003B50081B1DC33E15F13A32"]]],"generic_selector":[["0x06A34065FF4C824D70EFF78FF84DF1F6B1EE05CD51A94C3B495A7480483B5AE6"],["0x3CEAD31AC7EAC7FE546A4706D6D79B823E102B74E545F8743F0ED0D7704403FE"]],"poseidon_selector":[["0x006DED2383B975D66559CF4F7F4080F24EE7A6E373E28CAA33555B27F8DB74D3"],["0x0EADBC09CB534078C3645E17B616B284E3DD3E17DA740BB3D4D2AAAFD27F2F16"]],"complete_add_selector":[["0x3991D21A6CE240D8AB8AF9D462CECAF4E20F8B48D9C30529A30FF69BA019A054"],["0x1C892827AFC601E2FBC1EF5D49D7E952F2B7B40F4B5F55AF246C7487AB673BED"]],"mul_selector":[["0x14C638D6026F7F8B0EA9DB3CFCF086047B3209FB17BD37D310E05210D817B353"],["0x001A11503A25EE20E1EAC17D95E2EBF6C3150560517F22AE55E381BF0F131E0F"]],"emul_selector":[["0x2B3BED67C1D6C243946A044F3D2B76711F2C9312473CEB635AFE3D8C3453AA92"],["0x3DD504B9168A909730E2344E7F710D515266B2C0DBB4FFB5C587964637BCF3AA"]],"endomul_scalar_selector":[["0x38125C70EF120863A4615290316C14361EF11A3018BA7AC59CAC3ADCAF59E145"],["0x0449D39950BBFE8C6C7BAE6E12A0C9B08E9EC9BE28F2AD2A5E74832D0F875FB6"]],"range_check0_selector":null,"range_check1_selector":null,"foreign_field_add_selector":null,"foreign_field_mul_selector":null,"xor_selector":null,"rot_selector":null,"lookup_aggregation":null,"lookup_table":null,"lookup_sorted":[null,null,null,null,null],"runtime_lookup_table":null,"runtime_lookup_table_selector":null,"xor_lookup_selector":null,"lookup_gate_lookup_selector":null,"range_check_lookup_selector":null,"foreign_field_mul_lookup_selector":null},"ft_eval1":"0x0F2CABB89A45F955BB16726FFAD86EC91CDB6F3CC306351656B8EDBDC81F0FF8"}}}]}] \ No newline at end of file diff --git a/src/lib/transaction_snark/test/zkapp_tokens/zkapp_tokens.ml b/src/lib/transaction_snark/test/zkapp_tokens/zkapp_tokens.ml index d05da4c3879..cb9c5fcce3e 100644 --- a/src/lib/transaction_snark/test/zkapp_tokens/zkapp_tokens.ml +++ b/src/lib/transaction_snark/test/zkapp_tokens/zkapp_tokens.ml @@ -10,6 +10,12 @@ let%test_module "Zkapp tokens tests" = ( module struct (* code patterned after "tokens test" unit test in Mina_ledger.Ledger *) + let proof_cache = + Result.ok_or_failwith @@ Pickles.Proof_cache.of_yojson + @@ Yojson.Safe.from_file "proof_cache.json" + + let () = Transaction_snark.For_tests.set_proof_cache proof_cache + let constraint_constants = U.constraint_constants let account_creation_fee = @@ -21,9 +27,10 @@ let%test_module "Zkapp tokens tests" = let token_funder, _ = keypair_and_amounts.(1) - let token_owner = Keypair.create () + let token_owner, _ = keypair_and_amounts.(2) - let token_accounts = Array.init 4 ~f:(fun _ -> Keypair.create ()) + let token_accounts = + Array.init 4 ~f:(fun i -> fst @@ keypair_and_amounts.(i + 3)) let custom_token_id = Account_id.derive_token_id @@ -252,4 +259,11 @@ let%test_module "Zkapp tokens tests" = check_token_balance token_accounts.(2) custom_token_id2 290 ; check_token_balance token_accounts.(3) custom_token_id2 210 ; Async.Deferred.unit ) ) ) + + let () = + match Sys.getenv_opt "PROOF_CACHE_OUT" with + | Some path -> + Yojson.Safe.to_file path @@ Pickles.Proof_cache.to_yojson proof_cache + | None -> + () end ) diff --git a/src/lib/transaction_snark/transaction_snark.ml b/src/lib/transaction_snark/transaction_snark.ml index 1072d8ec28e..b8966b98d4d 100644 --- a/src/lib/transaction_snark/transaction_snark.ml +++ b/src/lib/transaction_snark/transaction_snark.ml @@ -4223,7 +4223,7 @@ module Make_str (A : Wire_types.Concrete) = struct assert (Or_error.is_error invalid_verification) in let constraint_constants = - Genesis_constants.Constraint_constants.compiled + Genesis_constants.For_unit_tests.Constraint_constants.t in let `VK vk_a, `Prover prover_a = create_trivial_snapp ~unique_id:0 ~constraint_constants () @@ -5004,14 +5004,14 @@ module Make_str (A : Wire_types.Concrete) = struct } end - let multiple_transfers (spec : Multiple_transfers_spec.t) = + let multiple_transfers ~constraint_constants + (spec : Multiple_transfers_spec.t) = let ( `Zkapp_command zkapp_command , `Sender_account_update sender_account_update , `Proof_zkapp_command snapp_zkapp_command , `Txn_commitment _commitment , `Full_txn_commitment _full_commitment ) = - create_zkapp_command - ~constraint_constants:Genesis_constants.Constraint_constants.compiled + create_zkapp_command ~constraint_constants (Multiple_transfers_spec.spec_of_t spec) ~update:spec.snapp_update ~receiver_update:spec.snapp_update in diff --git a/src/lib/transaction_snark/transaction_snark_intf.ml b/src/lib/transaction_snark/transaction_snark_intf.ml index 4499b0b7de5..68e7637176e 100644 --- a/src/lib/transaction_snark/transaction_snark_intf.ml +++ b/src/lib/transaction_snark/transaction_snark_intf.ml @@ -419,7 +419,10 @@ module type Full = sig [@@deriving sexp] end - val multiple_transfers : Multiple_transfers_spec.t -> Zkapp_command.t + val multiple_transfers : + constraint_constants:Genesis_constants.Constraint_constants.t + -> Multiple_transfers_spec.t + -> Zkapp_command.t val set_proof_cache : Pickles.Proof_cache.t -> unit end diff --git a/src/lib/transaction_snark/transaction_validator.ml b/src/lib/transaction_snark/transaction_validator.ml index 7eca705aa22..f44091193e6 100644 --- a/src/lib/transaction_snark/transaction_validator.ml +++ b/src/lib/transaction_snark/transaction_validator.ml @@ -43,7 +43,9 @@ let%test_unit "invalid transactions do not dirty the ledger" = let open Mina_numbers in let open Currency in let open Signature_lib in - let constraint_constants = Genesis_constants.Constraint_constants.compiled in + let constraint_constants = + Genesis_constants.For_unit_tests.Constraint_constants.t + in let ledger = Ledger.create_ephemeral ~depth:4 () in let sender_sk, receiver_sk = Quickcheck.Generator.generate ~size:0 diff --git a/src/lib/transaction_snark_scan_state/transaction_snark_scan_state.ml b/src/lib/transaction_snark_scan_state/transaction_snark_scan_state.ml index 7a1c5e9f3e2..47418185c32 100644 --- a/src/lib/transaction_snark_scan_state/transaction_snark_scan_state.ml +++ b/src/lib/transaction_snark_scan_state/transaction_snark_scan_state.ml @@ -248,7 +248,8 @@ let create_expected_statement ~constraint_constants |> Frozen_ledger_hash.of_ledger_hash in let%map supply_increase = - Ledger.Transaction_applied.supply_increase applied_transaction + Ledger.Transaction_applied.supply_increase ~constraint_constants + applied_transaction in ( target_first_pass_merkle_root , target_second_pass_merkle_root diff --git a/src/lib/transition_frontier/catchup_tree.ml b/src/lib/transition_frontier/catchup_state.ml similarity index 100% rename from src/lib/transition_frontier/catchup_tree.ml rename to src/lib/transition_frontier/catchup_state.ml diff --git a/src/lib/transition_frontier/frontier_base/breadcrumb.ml b/src/lib/transition_frontier/frontier_base/breadcrumb.ml index 2af84b6f168..df7297fbc6f 100644 --- a/src/lib/transition_frontier/frontier_base/breadcrumb.ml +++ b/src/lib/transition_frontier/frontier_base/breadcrumb.ml @@ -314,7 +314,7 @@ module For_tests = struct in let send_amount = Currency.Amount.of_nanomina_int_exn 1_000_000_001 in let sender_account_amount = - sender_account.Account.Poly.balance |> Currency.Balance.to_amount + sender_account.Account.balance |> Currency.Balance.to_amount in let%map _ = Currency.Amount.sub sender_account_amount send_amount in let sender_pk = Account.public_key sender_account in diff --git a/src/lib/transition_frontier/transition_frontier.ml b/src/lib/transition_frontier/transition_frontier.ml index e97cb10ae67..52389205353 100644 --- a/src/lib/transition_frontier/transition_frontier.ml +++ b/src/lib/transition_frontier/transition_frontier.ml @@ -12,7 +12,7 @@ module Full_frontier = Full_frontier module Extensions = Extensions module Persistent_root = Persistent_root module Persistent_frontier = Persistent_frontier -module Catchup_tree = Catchup_tree +module Catchup_state = Catchup_state module Full_catchup_tree = Full_catchup_tree module Catchup_hash_tree = Catchup_hash_tree @@ -39,7 +39,7 @@ type t = { logger : Logger.t ; verifier : Verifier.t ; consensus_local_state : Consensus.Data.Local_state.t - ; catchup_tree : Catchup_tree.t + ; catchup_state : Catchup_state.t ; full_frontier : Full_frontier.t ; persistent_root : Persistent_root.t ; persistent_root_instance : Persistent_root.Instance.t @@ -50,7 +50,7 @@ type t = ; closed : unit Ivar.t } -let catchup_tree t = t.catchup_tree +let catchup_state t = t.catchup_state type Structured_log_events.t += Added_breadcrumb_user_commands [@@deriving register_event] @@ -162,8 +162,8 @@ let load_from_persistence_and_start ~context:(module Context : CONTEXT) (Persistent_frontier.Database.Error.not_found_message err) ) ) in { logger - ; catchup_tree = - Catchup_tree.create catchup_mode ~root:(Full_frontier.root full_frontier) + ; catchup_state = + Catchup_state.create catchup_mode ~root:(Full_frontier.root full_frontier) ; verifier ; consensus_local_state ; full_frontier @@ -384,7 +384,7 @@ let close ~loc { logger ; verifier = _ ; consensus_local_state = _ - ; catchup_tree = _ + ; catchup_state = _ ; full_frontier ; persistent_root = _safe_to_ignore_1 ; persistent_root_instance @@ -437,8 +437,8 @@ let add_breadcrumb_exn t breadcrumb = "PRE: ($state_hash, $n)" ; [%str_log' trace t.logger] (Applying_diffs { diffs = List.map ~f:Diff.Full.E.to_yojson diffs }) ; - [%log internal] "Apply_catchup_tree_diffs" ; - Catchup_tree.apply_diffs t.catchup_tree diffs ; + [%log internal] "Apply_catchup_state_diffs" ; + Catchup_state.apply_diffs t.catchup_state diffs ; [%log internal] "Apply_full_frontier_diffs" ~metadata:[ ("count", `Int (List.length diffs)) ] ; let (`New_root_and_diffs_with_mutants @@ -446,7 +446,7 @@ let add_breadcrumb_exn t breadcrumb = (* Root DB moves here *) Full_frontier.apply_diffs t.full_frontier diffs ~has_long_catchup_job: - (Catchup_tree.max_catchup_chain_length t.catchup_tree > 5) + (Catchup_state.max_catchup_chain_length t.catchup_state > 5) ~enable_epoch_ledger_sync:(`Enabled (root_snarked_ledger t)) in [%log internal] "Apply_full_frontier_diffs_done" ; diff --git a/src/lib/transition_frontier/transition_frontier.mli b/src/lib/transition_frontier/transition_frontier.mli index 3217ae52953..0e719016fa3 100644 --- a/src/lib/transition_frontier/transition_frontier.mli +++ b/src/lib/transition_frontier/transition_frontier.mli @@ -14,7 +14,7 @@ module Extensions = Extensions module Persistent_root = Persistent_root module Persistent_frontier = Persistent_frontier module Root_data = Root_data -module Catchup_tree = Catchup_tree +module Catchup_state = Catchup_state module Full_catchup_tree = Full_catchup_tree module Catchup_hash_tree = Catchup_hash_tree @@ -52,7 +52,7 @@ type Structured_log_events.t += Persisted_frontier_dropped val max_catchup_chunk_length : int -val catchup_tree : t -> Catchup_tree.t +val catchup_state : t -> Catchup_state.t (* This is the max length which is used when the transition frontier is initialized * via `load`. In other words, this will always be the max length of the transition diff --git a/src/lib/transition_frontier_controller/transition_frontier_controller.ml b/src/lib/transition_frontier_controller/transition_frontier_controller.ml index 2e417cde552..7832ae682a6 100644 --- a/src/lib/transition_frontier_controller/transition_frontier_controller.ml +++ b/src/lib/transition_frontier_controller/transition_frontier_controller.ml @@ -15,7 +15,8 @@ end let run ~context:(module Context : CONTEXT) ~trust_system ~verifier ~network ~time_controller ~collected_transitions ~frontier ~get_completed_work - ~network_transition_reader ~producer_transition_reader ~clear_reader = + ~network_transition_reader ~producer_transition_reader ~clear_reader + ~cache_exceptions = let open Context in let valid_transition_pipe_capacity = 50 in let start_time = Time.now () in @@ -73,6 +74,7 @@ let run ~context:(module Context : CONTEXT) ~trust_system ~verifier ~network in let unprocessed_transition_cache = Transition_handler.Unprocessed_transition_cache.create ~logger + ~cache_exceptions in List.iter collected_transitions ~f:(fun t -> (* since the cache was just built, it's safe to assume diff --git a/src/lib/transition_handler/block_sink.ml b/src/lib/transition_handler/block_sink.ml index 35fed68a629..3cd698e9fae 100644 --- a/src/lib/transition_handler/block_sink.ml +++ b/src/lib/transition_handler/block_sink.ml @@ -138,10 +138,7 @@ let push sink (`Transition e, `Time_received tm, `Valid_cb cb) = | `Within_capacity -> Writer.write writer (`Transition e, `Time_received tm, `Valid_cb cb) in - let transactions = - Mina_block.transactions state - ~constraint_constants:Genesis_constants.Constraint_constants.compiled - in + let transactions = Mina_block.transactions state ~constraint_constants in let exists_well_formedness_errors = List.exists transactions ~f:(fun txn -> match diff --git a/src/lib/transition_handler/catchup_scheduler.ml b/src/lib/transition_handler/catchup_scheduler.ml index 5d925a58d7d..6602464a66f 100644 --- a/src/lib/transition_handler/catchup_scheduler.ml +++ b/src/lib/transition_handler/catchup_scheduler.ml @@ -402,7 +402,9 @@ let%test_module "Transition_handler.Catchup_scheduler tests" = (Transition_frontier.For_tests.gen_with_branch ~precomputed_values ~verifier ~max_length ~frontier_size:1 ~branch_size:2 () ) ~f:(fun (frontier, branch) -> - let cache = Unprocessed_transition_cache.create ~logger in + let cache = + Unprocessed_transition_cache.create ~logger ~cache_exceptions:true + in let register_breadcrumb breadcrumb = Unprocessed_transition_cache.register_exn cache (downcast_breadcrumb breadcrumb) diff --git a/src/lib/transition_handler/processor.ml b/src/lib/transition_handler/processor.ml index c1f81fcefd0..9217894e595 100644 --- a/src/lib/transition_handler/processor.ml +++ b/src/lib/transition_handler/processor.ml @@ -511,7 +511,10 @@ let%test_module "Transition_handler.Processor tests" = (`Capacity branch_size, `Overflow (Drop_head ignore)) ) in let clean_up_catchup_scheduler = Ivar.create () in - let cache = Unprocessed_transition_cache.create ~logger in + let cache = + Unprocessed_transition_cache.create ~logger + ~cache_exceptions:true + in run ~context:(module Context) ~time_controller ~verifier ~get_completed_work:(Fn.const None) diff --git a/src/lib/transition_handler/validator.ml b/src/lib/transition_handler/validator.ml index e5a9ba87f58..60e87915a80 100644 --- a/src/lib/transition_handler/validator.ml +++ b/src/lib/transition_handler/validator.ml @@ -137,12 +137,11 @@ let run ~context:(module Context : CONTEXT) ~trust_system ~time_controller let transition = With_hash.data transition_with_hash in let sender = Envelope.Incoming.sender transition_env in let slot_tx_end = - Runtime_config.slot_tx_end_or_default + Runtime_config.slot_tx_end precomputed_values.Precomputed_values.runtime_config in let slot_chain_end = - Runtime_config.slot_chain_end_or_default - precomputed_values.runtime_config + Runtime_config.slot_chain_end precomputed_values.runtime_config in match validate_transition diff --git a/src/lib/transition_router/initial_validator.ml b/src/lib/transition_router/initial_validator.ml index 47391013dfd..5faac1e33ad 100644 --- a/src/lib/transition_router/initial_validator.ml +++ b/src/lib/transition_router/initial_validator.ml @@ -1,6 +1,5 @@ open Core_kernel open Async_kernel -open Pipe_lib.Strict_pipe open Mina_base open Mina_state open Signature_lib @@ -233,8 +232,8 @@ module Duplicate_block_detector = struct [%log error] ~metadata msg ) end -let run ~logger ~trust_system ~verifier ~transition_reader - ~valid_transition_writer ~initialization_finish_signal ~precomputed_values = +let validate ~logger ~trust_system ~verifier ~initialization_finish_signal + ~precomputed_values = let genesis_state_hash = (Precomputed_values.genesis_state_hashes precomputed_values).state_hash in @@ -244,131 +243,98 @@ let run ~logger ~trust_system ~verifier ~transition_reader let rejected_blocks_logger = Logger.create ~id:Logger.Logger_id.rejected_blocks () in - let open Deferred.Let_syntax in let duplicate_checker = Duplicate_block_detector.create () in - O1trace.background_thread "initially_validate_blocks" (fun () -> - Reader.iter transition_reader - ~f:(fun - ( `Transition transition_env - , `Time_received time_received - , `Valid_cb valid_cb ) - -> - let state_hash = - ( Envelope.Incoming.data transition_env - |> Mina_block.header |> Header.protocol_state - |> Protocol_state.hashes ) - .state_hash + stage (fun ~transition_env ~time_received ~valid_cb -> + let open Deferred.Let_syntax in + if Ivar.is_full initialization_finish_signal then ( + let blockchain_length = + Envelope.Incoming.data transition_env + |> Mina_block.blockchain_length |> Mina_numbers.Length.to_int + in + Mina_metrics.Transition_frontier + .update_max_unvalidated_blocklength_observed blockchain_length ; + ( if not (Mina_net2.Validation_callback.is_expired valid_cb) then ( + let transition_with_hash = + Envelope.Incoming.data transition_env + |> With_hash.of_data + ~hash_data: + (Fn.compose Protocol_state.hashes + (Fn.compose Header.protocol_state Mina_block.header) ) in - Internal_tracing.Context_call.with_call_id ~tag:"initial_validation" - @@ fun () -> - Internal_tracing.with_state_hash state_hash - @@ fun () -> - [%log internal] "Initial_validation" ; - if Ivar.is_full initialization_finish_signal then ( - let blockchain_length = - Envelope.Incoming.data transition_env - |> Mina_block.blockchain_length |> Mina_numbers.Length.to_int + Duplicate_block_detector.check ~precomputed_values + ~rejected_blocks_logger ~time_received duplicate_checker logger + transition_with_hash ; + let sender = Envelope.Incoming.sender transition_env in + let computation = + let open Interruptible.Let_syntax in + let defer f x = + Interruptible.uninterruptible @@ Deferred.return (f x) in - Mina_metrics.Transition_frontier - .update_max_unvalidated_blocklength_observed blockchain_length ; - ( if not (Mina_net2.Validation_callback.is_expired valid_cb) then ( - let transition_with_hash = - Envelope.Incoming.data transition_env - |> With_hash.of_data - ~hash_data: - (Fn.compose Protocol_state.hashes - (Fn.compose Header.protocol_state Mina_block.header) ) - in - Duplicate_block_detector.check ~precomputed_values - ~rejected_blocks_logger ~time_received duplicate_checker logger - transition_with_hash ; - let sender = Envelope.Incoming.sender transition_env in - let computation = - let open Interruptible.Let_syntax in - let defer f x = - Interruptible.uninterruptible @@ Deferred.return (f x) - in - let%bind () = - Interruptible.lift Deferred.unit - (Mina_net2.Validation_callback.await_timeout valid_cb) - in - match%bind - let open Interruptible.Result.Let_syntax in - Validation.( - wrap transition_with_hash - |> defer - (validate_time_received ~precomputed_values - ~time_received ) - >>= defer - (validate_genesis_protocol_state ~genesis_state_hash) - >>= Fn.compose Interruptible.uninterruptible - (validate_single_proof ~verifier ~genesis_state_hash) - >>= defer validate_delta_block_chain - >>= defer validate_protocol_versions) - with - | Ok verified_transition -> - [%log internal] "Initial_validation_done" ; - Writer.write valid_transition_writer - ( `Block - (Envelope.Incoming.wrap ~data:verified_transition - ~sender ) - , `Valid_cb valid_cb ) ; - Mina_metrics.Transition_frontier - .update_max_blocklength_observed blockchain_length ; - Queue.enqueue Transition_frontier.validated_blocks - ( State_hash.With_state_hashes.state_hash - transition_with_hash - , sender - , time_received ) ; - return () - | Error error -> - Internal_tracing.with_state_hash state_hash - @@ fun () -> - [%log internal] "Failure" - ~metadata: - [ ( "reason" - , `String - ( "Failed initial validation: " - ^ Sexp.to_string - ([%sexp_of: validation_error] error) ) ) - ] ; - Mina_net2.Validation_callback.fire_if_not_already_fired - valid_cb `Reject ; - Interruptible.uninterruptible - @@ handle_validation_error ~logger ~rejected_blocks_logger - ~time_received ~trust_system ~sender - ~transition_with_hash - ~delta:genesis_constants.protocol.delta error - in - Interruptible.force computation ) - else Deferred.Result.fail () ) - >>| function - | Ok () -> - () - | Error () -> - let state_hash = - ( Envelope.Incoming.data transition_env - |> Mina_block.header |> Header.protocol_state - |> Protocol_state.hashes ) - .state_hash - in - Internal_tracing.with_state_hash state_hash - @@ fun () -> - [%log internal] "Failure" - ~metadata: - [ ("reason", `String "Validation callback expired") ] ; - let metadata = - [ ("state_hash", State_hash.to_yojson state_hash) - ; ( "time_received" - , `String - (Time.to_string_abs - (Block_time.to_time_exn time_received) - ~zone:Time.Zone.utc ) ) - ] + let%bind () = + Interruptible.lift Deferred.unit + (Mina_net2.Validation_callback.await_timeout valid_cb) + in + match%bind + let open Interruptible.Result.Let_syntax in + Validation.( + wrap transition_with_hash + |> defer + (validate_time_received ~precomputed_values ~time_received) + >>= defer (validate_genesis_protocol_state ~genesis_state_hash) + >>= Fn.compose Interruptible.uninterruptible + (validate_single_proof ~verifier ~genesis_state_hash) + >>= defer validate_delta_block_chain + >>= defer validate_protocol_versions) + with + | Ok verified_transition -> + Mina_metrics.Transition_frontier.update_max_blocklength_observed + blockchain_length ; + Queue.enqueue Transition_frontier.validated_blocks + ( State_hash.With_state_hashes.state_hash transition_with_hash + , sender + , time_received ) ; + return + (Ok + ( `Block + (Envelope.Incoming.wrap ~data:verified_transition + ~sender ) + , `Valid_cb valid_cb ) ) + | Error error -> + Mina_net2.Validation_callback.fire_if_not_already_fired valid_cb + `Reject ; + let%map () = + Interruptible.uninterruptible + @@ handle_validation_error ~logger ~rejected_blocks_logger + ~time_received ~trust_system ~sender + ~transition_with_hash + ~delta:genesis_constants.protocol.delta error in - [%log error] ~metadata - "Dropping blocks because libp2p validation expired" ) - else ( - [%log internal] "Failure" - ~metadata:[ ("reason", `String "Node still initializing") ] ; - Deferred.unit ) ) ) + Error () + in + Interruptible.force computation ) + else Deferred.Result.fail () ) + >>| function + | Ok (Ok res) -> + Ok res + | Ok (Error ()) -> + Error () + | Error () -> + let state_hash = + ( Envelope.Incoming.data transition_env + |> Mina_block.header |> Header.protocol_state + |> Protocol_state.hashes ) + .state_hash + in + let metadata = + [ ("state_hash", State_hash.to_yojson state_hash) + ; ( "time_received" + , `String + (Time.to_string_abs + (Block_time.to_time_exn time_received) + ~zone:Time.Zone.utc ) ) + ] + in + [%log error] ~metadata + "Dropping blocks because libp2p validation expired" ; + Error () ) + else Deferred.Result.fail () ) diff --git a/src/lib/transition_router/transition_router.ml b/src/lib/transition_router/transition_router.ml index 5f49c4daf8e..1963be75d00 100644 --- a/src/lib/transition_router/transition_router.ml +++ b/src/lib/transition_router/transition_router.ml @@ -73,7 +73,8 @@ let start_transition_frontier_controller ~context:(module Context : CONTEXT) ~trust_system ~verifier ~network ~time_controller ~get_completed_work ~producer_transition_reader_ref ~producer_transition_writer_ref ~verified_transition_writer ~clear_reader ~collected_transitions - ~transition_reader_ref ~transition_writer_ref ~frontier_w frontier = + ~cache_exceptions ~transition_reader_ref ~transition_writer_ref ~frontier_w + frontier = let open Context in [%str_log info] Starting_transition_frontier_controller ; let ( transition_frontier_controller_reader @@ -105,7 +106,7 @@ let start_transition_frontier_controller ~context:(module Context : CONTEXT) ~trust_system ~verifier ~network ~time_controller ~collected_transitions ~frontier ~get_completed_work ~network_transition_reader:!transition_reader_ref - ~producer_transition_reader ~clear_reader + ~producer_transition_reader ~clear_reader ~cache_exceptions in Strict_pipe.Reader.iter new_verified_transition_reader ~f: @@ -119,7 +120,7 @@ let start_bootstrap_controller ~context:(module Context : CONTEXT) ~trust_system ~verified_transition_writer ~clear_reader ~transition_reader_ref ~transition_writer_ref ~consensus_local_state ~frontier_w ~initial_root_transition ~persistent_root ~persistent_frontier - ~best_seen_transition ~catchup_mode = + ~cache_exceptions ~best_seen_transition ~catchup_mode = let open Context in [%str_log info] Starting_bootstrap_controller ; [%log info] "Starting Bootstrap Controller phase" ; @@ -161,8 +162,8 @@ let start_bootstrap_controller ~context:(module Context : CONTEXT) ~trust_system ~trust_system ~verifier ~network ~time_controller ~get_completed_work ~producer_transition_reader_ref ~producer_transition_writer_ref ~verified_transition_writer ~clear_reader ~collected_transitions - ~transition_reader_ref ~transition_writer_ref ~frontier_w new_frontier - ) + ~cache_exceptions ~transition_reader_ref ~transition_writer_ref + ~frontier_w new_frontier ) let download_best_tip ~context:(module Context : CONTEXT) ~notify_online ~network ~verifier ~trust_system ~most_recent_valid_block_writer @@ -339,7 +340,7 @@ let initialize ~context:(module Context : CONTEXT) ~sync_local_state ~network ~is_seed ~is_demo_mode ~verifier ~trust_system ~time_controller ~get_completed_work ~frontier_w ~producer_transition_reader_ref ~producer_transition_writer_ref ~clear_reader ~verified_transition_writer - ~transition_reader_ref ~transition_writer_ref + ~transition_reader_ref ~transition_writer_ref ~cache_exceptions ~most_recent_valid_block_writer ~persistent_root ~persistent_frontier ~consensus_local_state ~catchup_mode ~notify_online = let open Context in @@ -376,7 +377,7 @@ let initialize ~context:(module Context : CONTEXT) ~sync_local_state ~network ~verified_transition_writer ~clear_reader ~transition_reader_ref ~consensus_local_state ~transition_writer_ref ~frontier_w ~persistent_root ~persistent_frontier ~initial_root_transition - ~catchup_mode ~best_seen_transition:best_tip + ~cache_exceptions ~catchup_mode ~best_seen_transition:best_tip | best_tip, Some frontier -> ( match best_tip with | Some best_tip @@ -407,7 +408,7 @@ let initialize ~context:(module Context : CONTEXT) ~sync_local_state ~network ~clear_reader ~transition_reader_ref ~consensus_local_state ~transition_writer_ref ~frontier_w ~persistent_root ~persistent_frontier ~initial_root_transition ~catchup_mode - ~best_seen_transition:(Some best_tip) + ~cache_exceptions ~best_seen_transition:(Some best_tip) | _ -> if Option.is_some best_tip then [%log info] @@ -464,8 +465,8 @@ let initialize ~context:(module Context : CONTEXT) ~sync_local_state ~network ~trust_system ~verifier ~network ~time_controller ~get_completed_work ~producer_transition_reader_ref ~producer_transition_writer_ref ~verified_transition_writer - ~clear_reader ~collected_transitions ~transition_reader_ref - ~transition_writer_ref ~frontier_w frontier ) + ~cache_exceptions ~clear_reader ~collected_transitions + ~transition_reader_ref ~transition_writer_ref ~frontier_w frontier ) let wait_till_genesis ~logger ~time_controller ~(precomputed_values : Precomputed_values.t) = @@ -509,14 +510,13 @@ let wait_till_genesis ~logger ~time_controller (* [sync_local_state] may be `false` for tests, where we want to set local state in the test *) -let run ?(sync_local_state = true) ~context:(module Context : CONTEXT) - ~trust_system ~verifier ~network ~is_seed ~is_demo_mode ~time_controller - ~consensus_local_state ~persistent_root_location - ~persistent_frontier_location - ~frontier_broadcast_pipe:(frontier_r, frontier_w) ~network_transition_reader - ~producer_transition_reader - ~most_recent_valid_block: - (most_recent_valid_block_reader, most_recent_valid_block_writer) +let run ?(sync_local_state = true) ?(cache_exceptions = false) + ~context:(module Context : CONTEXT) ~trust_system ~verifier ~network + ~is_seed ~is_demo_mode ~time_controller ~consensus_local_state + ~persistent_root_location ~persistent_frontier_location + ~get_current_frontier ~frontier_broadcast_writer:frontier_w + ~network_transition_reader ~producer_transition_reader + ~get_most_recent_valid_block ~most_recent_valid_block_writer ~get_completed_work ~catchup_mode ~notify_online () = let open Context in [%log info] "Starting transition router" ; @@ -576,9 +576,28 @@ let run ?(sync_local_state = true) ~context:(module Context : CONTEXT) ~valid_cb ~pipe_name:name ~logger ) () in - Initial_validator.run ~logger ~trust_system ~verifier - ~transition_reader:network_transition_reader ~valid_transition_writer - ~initialization_finish_signal ~precomputed_values ; + let () = + let initial_validate = + unstage + (Initial_validator.validate ~logger ~trust_system ~verifier + ~initialization_finish_signal ~precomputed_values ) + in + O1trace.background_thread "initially_validate_blocks" (fun () -> + Pipe_lib.Strict_pipe.Reader.iter network_transition_reader + ~f:(fun + ( `Transition transition_env + , `Time_received time_received + , `Valid_cb valid_cb ) + -> + match%map + initial_validate ~transition_env ~time_received ~valid_cb + with + | Ok valid_transition -> + Pipe_lib.Strict_pipe.Writer.write valid_transition_writer + valid_transition + | Error () -> + () ) ) + in let persistent_frontier = Transition_frontier.Persistent_frontier.create ~logger ~verifier ~time_controller ~directory:persistent_frontier_location @@ -589,7 +608,7 @@ let run ?(sync_local_state = true) ~context:(module Context : CONTEXT) ~ledger_depth:(Precomputed_values.ledger_depth precomputed_values) in let%map () = - initialize ~sync_local_state + initialize ~sync_local_state ~cache_exceptions ~context:(module Context) ~network ~is_seed ~is_demo_mode ~verifier ~trust_system ~persistent_frontier ~persistent_root ~time_controller @@ -609,9 +628,7 @@ let run ?(sync_local_state = true) ~context:(module Context : CONTEXT) let incoming_transition = Envelope.Incoming.data enveloped_transition in - let current_transition = - Broadcast_pipe.Reader.peek most_recent_valid_block_reader - in + let current_transition = get_most_recent_valid_block () in if Consensus.Hooks.equal_select_status `Take (Consensus.Hooks.select @@ -635,7 +652,7 @@ let run ?(sync_local_state = true) ~context:(module Context : CONTEXT) let incoming_transition = Envelope.Incoming.data enveloped_transition in - match Broadcast_pipe.Reader.peek frontier_r with + match get_current_frontier () with | Some frontier -> if is_transition_for_bootstrap @@ -658,7 +675,7 @@ let run ?(sync_local_state = true) ~context:(module Context : CONTEXT) ~context:(module Context) ~trust_system ~verifier ~network ~time_controller ~get_completed_work ~producer_transition_reader_ref - ~producer_transition_writer_ref + ~producer_transition_writer_ref ~cache_exceptions ~verified_transition_writer ~clear_reader ~transition_reader_ref ~transition_writer_ref ~consensus_local_state ~frontier_w ~persistent_root diff --git a/src/lib/uptime_service/uptime_service.ml b/src/lib/uptime_service/uptime_service.ml index dd03afb23c7..1ac91eef195 100644 --- a/src/lib/uptime_service/uptime_service.ml +++ b/src/lib/uptime_service/uptime_service.ml @@ -194,9 +194,10 @@ let send_produced_block_at ~logger ~interruptor ~url ~peer_id send_uptime_data ~logger ~interruptor ~submitter_keypair ~url ~state_hash ~produced:true block_data -let send_block_and_transaction_snark ~logger ~interruptor ~url ~snark_worker - ~transition_frontier ~peer_id ~(submitter_keypair : Keypair.t) - ~snark_work_fee ~graphql_control_port ~built_with_commit_sha = +let send_block_and_transaction_snark ~logger ~constraint_constants ~interruptor + ~url ~snark_worker ~transition_frontier ~peer_id + ~(submitter_keypair : Keypair.t) ~snark_work_fee ~graphql_control_port + ~built_with_commit_sha = match Broadcast_pipe.Reader.peek transition_frontier with | None -> (* expected during daemon boot, so not logging as error *) @@ -216,9 +217,7 @@ let send_block_and_transaction_snark ~logger ~interruptor ~url ~snark_worker let best_tip_block = Transition_frontier.Breadcrumb.block best_tip in if List.is_empty - (Mina_block.transactions - ~constraint_constants: - Genesis_constants.Constraint_constants.compiled best_tip_block ) + (Mina_block.transactions ~constraint_constants best_tip_block) then ( [%log info] "No transactions in block, sending block without SNARK work to \ @@ -362,10 +361,10 @@ let send_block_and_transaction_snark ~logger ~interruptor ~url ~snark_worker send_uptime_data ~logger ~interruptor ~submitter_keypair ~url ~state_hash ~produced:false block_data ) ) ) -let start ~logger ~uptime_url ~snark_worker_opt ~transition_frontier - ~time_controller ~block_produced_bvar ~uptime_submitter_keypair - ~get_next_producer_timing ~get_snark_work_fee ~get_peer - ~graphql_control_port ~built_with_commit_sha = +let start ~logger ~uptime_url ~snark_worker_opt ~constraint_constants + ~protocol_constants ~transition_frontier ~time_controller + ~block_produced_bvar ~uptime_submitter_keypair ~get_next_producer_timing + ~get_snark_work_fee ~get_peer ~graphql_control_port ~built_with_commit_sha = match uptime_url with | None -> [%log info] "Not running uptime service, no URL given" ; @@ -377,9 +376,7 @@ let start ~logger ~uptime_url ~snark_worker_opt ~transition_frontier Option.value_exn snark_worker_opt in let slot_duration_ms = - Consensus.Configuration.t - ~constraint_constants:Genesis_constants.Constraint_constants.compiled - ~protocol_constants:Genesis_constants.compiled.protocol + Consensus.Configuration.t ~constraint_constants ~protocol_constants |> Consensus.Configuration.slot_duration |> Float.of_int in let make_slots_span min = @@ -467,9 +464,9 @@ let start ~logger ~uptime_url ~snark_worker_opt ~transition_frontier "Uptime service will attempt to send a block and SNARK work" ; let snark_work_fee = get_snark_work_fee () in send_block_and_transaction_snark ~logger ~interruptor ~url - ~snark_worker ~transition_frontier ~peer_id - ~submitter_keypair ~snark_work_fee ~graphql_control_port - ~built_with_commit_sha + ~constraint_constants ~snark_worker ~transition_frontier + ~peer_id ~submitter_keypair ~snark_work_fee + ~graphql_control_port ~built_with_commit_sha in match get_next_producer_time_opt () with | None -> diff --git a/src/lib/uptime_service/uptime_snark_worker.ml b/src/lib/uptime_service/uptime_snark_worker.ml index 52720f3b189..04fb9d61f24 100644 --- a/src/lib/uptime_service/uptime_snark_worker.ml +++ b/src/lib/uptime_service/uptime_snark_worker.ml @@ -13,19 +13,18 @@ module Worker_state = struct end (* bin_io required by rpc_parallel *) - type init_arg = Logger.Stable.Latest.t [@@deriving bin_io_unversioned] + type init_arg = + Logger.Stable.Latest.t * Genesis_constants.Constraint_constants.t + [@@deriving bin_io_unversioned] type t = (module S) - let create () : t Deferred.t = + let create ~constraint_constants () : t Deferred.t = Deferred.return (let module M = struct let perform_single (message, single_spec) = let%bind (worker_state : Prod.Worker_state.t) = - Prod.Worker_state.create - ~constraint_constants: - Genesis_constants.Constraint_constants.compiled - ~proof_level:Full () + Prod.Worker_state.create ~constraint_constants ~proof_level:Full () in Prod.perform_single worker_state ~message single_spec end in @@ -78,9 +77,9 @@ module Worker = struct , perform_single ) } - let init_worker_state logger = + let init_worker_state (logger, constraint_constants) = [%log info] "Uptime SNARK worker started" ; - Worker_state.create () + Worker_state.create ~constraint_constants () let init_connection_state ~connection:_ ~worker_state:_ () = Deferred.unit end @@ -95,7 +94,7 @@ type t = ; logger : Logger.Stable.Latest.t } -let create ~logger ~pids : t Deferred.t = +let create ~logger ~constraint_constants ~pids : t Deferred.t = let on_failure err = [%log error] "Uptime service SNARK worker process failed with error $err" ~metadata:[ ("err", Error_json.error_to_yojson err) ] ; @@ -105,7 +104,7 @@ let create ~logger ~pids : t Deferred.t = let%map connection, process = Worker.spawn_in_foreground_exn ~connection_timeout:(Time.Span.of_min 1.) ~on_failure ~shutdown_on:Connection_closed ~connection_state_init_arg:() - logger + (logger, constraint_constants) in [%log info] "Daemon started process of kind $process_kind with pid \ diff --git a/src/lib/verifier/dune b/src/lib/verifier/dune index cff355fadd1..b3492ab39b4 100644 --- a/src/lib/verifier/dune +++ b/src/lib/verifier/dune @@ -27,7 +27,6 @@ blockchain_snark mina_base mina_state - mina_compile_config pickles genesis_constants signature_lib diff --git a/src/lib/verifier/prod.ml b/src/lib/verifier/prod.ml index ea67d35e684..fab57c576e6 100644 --- a/src/lib/verifier/prod.ml +++ b/src/lib/verifier/prod.ml @@ -148,7 +148,7 @@ module Worker_state = struct (id, result) ) let verify_commands cs = - Internal_tracing.Context_logger.with_logger (Some logger) + Context_logger.with_logger (Some logger) @@ fun () -> Internal_tracing.Context_call.with_call_id @@ fun () -> @@ -160,7 +160,7 @@ module Worker_state = struct let verify_blockchain_snarks = B.Proof.verify let verify_blockchain_snarks bs = - Internal_tracing.Context_logger.with_logger (Some logger) + Context_logger.with_logger (Some logger) @@ fun () -> Internal_tracing.Context_call.with_call_id @@ fun () -> @@ -181,7 +181,7 @@ module Worker_state = struct failwith "Verifier crashed" let verify_transaction_snarks ts = - Internal_tracing.Context_logger.with_logger (Some logger) + Context_logger.with_logger (Some logger) @@ fun () -> Internal_tracing.Context_call.with_call_id @@ fun () -> @@ -396,23 +396,25 @@ module Worker = struct if Option.is_some conf_dir then ( let max_size = 256 * 1024 * 512 in let num_rotate = 1 in - Logger.Consumer_registry.register ~id:"default" + Logger.Consumer_registry.register ~id:"default" ~commit_id ~processor:(Logger.Processor.raw ()) ~transport: (Logger_file_system.dumb_logrotate ~directory:(Option.value_exn conf_dir) - ~log_filename:"mina-verifier.log" ~max_size ~num_rotate ) ; + ~log_filename:"mina-verifier.log" ~max_size ~num_rotate ) + () ; Option.iter internal_trace_filename ~f:(fun log_filename -> Itn_logger.set_message_postprocessor Internal_tracing.For_itn_logger.post_process_message ; Logger.Consumer_registry.register ~id:Logger.Logger_id.mina - ~processor:Internal_tracing.For_logger.processor + ~commit_id ~processor:Internal_tracing.For_logger.processor ~transport: (Logger_file_system.dumb_logrotate ~directory:(Option.value_exn conf_dir ^ "/internal-tracing") ~log_filename ~max_size:(1024 * 1024 * 10) - ~num_rotate:50 ) ) ) ; + ~num_rotate:50 ) + () ) ) ; if enable_internal_tracing then don't_wait_for @@ Internal_tracing.toggle ~commit_id ~logger `Enabled ; [%log info] "Verifier started" ; diff --git a/src/lib/vrf_evaluator/vrf_evaluator.ml b/src/lib/vrf_evaluator/vrf_evaluator.ml index 3c61388e9ae..bd730fcdb24 100644 --- a/src/lib/vrf_evaluator/vrf_evaluator.ml +++ b/src/lib/vrf_evaluator/vrf_evaluator.ml @@ -77,11 +77,17 @@ module Worker_state = struct ; consensus_constants : Consensus.Constants.Stable.Latest.t ; conf_dir : string ; logger : Logger.Stable.Latest.t + ; commit_id : string } [@@deriving bin_io_unversioned] let context_of_config - ({ constraint_constants; consensus_constants; logger; conf_dir = _ } : + ({ constraint_constants + ; consensus_constants + ; logger + ; conf_dir = _ + ; commit_id = _ + } : init_arg ) : (module CONTEXT) = ( module struct let constraint_constants = constraint_constants @@ -385,10 +391,11 @@ module Worker = struct let max_size = 200 * 1024 * 1024 in let num_rotate = 1 in Logger.Consumer_registry.register ~id:"default" - ~processor:(Logger.Processor.raw ()) + ~commit_id:init_arg.commit_id ~processor:(Logger.Processor.raw ()) ~transport: (Logger_file_system.dumb_logrotate ~directory:init_arg.conf_dir - ~log_filename:"mina-vrf-evaluator.log" ~max_size ~num_rotate ) ; + ~log_filename:"mina-vrf-evaluator.log" ~max_size ~num_rotate ) + () ; [%log info] "Vrf_evaluator started" ; return (Worker_state.create init_arg) @@ -407,7 +414,7 @@ let update_block_producer_keys { connection; process = _ } ~keypairs = ~arg:(Keypair.And_compressed_pk.Set.to_list keypairs) let create ~constraint_constants ~pids ~consensus_constants ~conf_dir ~logger - ~keypairs = + ~keypairs ~commit_id = let on_failure err = [%log error] "VRF evaluator process failed with error $err" ~metadata:[ ("err", Error_json.error_to_yojson err) ] ; @@ -417,7 +424,7 @@ let create ~constraint_constants ~pids ~consensus_constants ~conf_dir ~logger let%bind connection, process = Worker.spawn_in_foreground_exn ~connection_timeout:(Time.Span.of_min 1.) ~on_failure ~shutdown_on:Connection_closed ~connection_state_init_arg:() - { constraint_constants; consensus_constants; conf_dir; logger } + { constraint_constants; consensus_constants; conf_dir; logger; commit_id } in [%log info] "Daemon started process of kind $process_kind with pid $vrf_evaluator_pid" diff --git a/src/lib/vrf_lib/tests/integrated_test.ml b/src/lib/vrf_lib/tests/integrated_test.ml index 66e73614dfc..3c01dc598bd 100644 --- a/src/lib/vrf_lib/tests/integrated_test.ml +++ b/src/lib/vrf_lib/tests/integrated_test.ml @@ -84,7 +84,7 @@ module Vrf = let%test_unit "eval unchecked vs. checked equality" = let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t in let gen = let open Quickcheck.Let_syntax in @@ -107,7 +107,7 @@ let%test_unit "eval unchecked vs. checked equality" = let%bench_module "vrf bench module" = ( module struct let constraint_constants = - Genesis_constants.Constraint_constants.for_unit_tests + Genesis_constants.For_unit_tests.Constraint_constants.t let gen = let open Quickcheck.Let_syntax in diff --git a/src/test/mina_automation/README.md b/src/test/mina_automation/README.md new file mode 100644 index 00000000000..529eca9f28d --- /dev/null +++ b/src/test/mina_automation/README.md @@ -0,0 +1,158 @@ +mina automation +============== + +The `mina_automation` lib is a small utility which helps to automate local app execution + +Library can be used in various local test and automation. For example to test if archive and extract blocks apps gives expected archive state. Main feature of an lib is ability to detect location of apps. App can be build locally and resides in _build/default folder, or can be installed globally and put in /usr/local/bin folder. + +It also has automation for docker if we would like to run docker command locally and use some output further in the test. + +Below list of all modules with short introduction + +### archive blocks + +Responsible for archiving extensional or precomputed blocks into archive database + +Example of usage: + +``` + open Mina_automation + + let archive_blocks = Archive_blocks.of_context Executor.AutoDetect in + + let%bind _ = + Archive_blocks.run archive_blocks ~blocks:extensional_files + ~archive_uri:target_db ~format:Extensional + +``` + +where: + +- `extensional_files : String.t list` - list of paths to files +- `target_db: String.t` - db connection string (e.g: postgres://postgres:postgres@localhost:5432/archive) + +### archive dumps + +Usability module for downloading dumps from official o1labs dump bucket + +Example of usage: + +``` + open Mina_automation + + Archive_dumps.download_via_public_url ~prefix:"mainnet" ~date:"05-04-2034" ~target:"." +``` + +where: + +- prefix : String.t - dump prefix usually corresponds to network name +- date : String.t - date suffix of dump +- target: String.t - path to local dump destination + +### docker + +Usability module for running any application published as a docker. + +Example of usage: + +``` + open Mina_automation + + let client = Docker.Client.default in + let logs = Docker.Client.run_cmd_in_image t ~image:"gcr.io....-mina-archive-blocks" ~cmd:"mina-archive blocks ..." ~workdir:"/workdir" ~volume:"/home/darek/work/mina:/workdir" ~network:"localhost" + +``` + +where : + - `image : String.t` - docker image in which command will be run. If does not exist locally it will be pulled + - `cmd: String.t` - command which will be run in docker + - `workdir: String.t` - working directory off command + - `volume: String.t` - volume mapping between docker and localhost + - `network: String.t` - network which docker will be attached to when executing command. In our example we are using `localhost` which allows to connect to db from within docker + + +### extract blocks + +Extract blocks apps dumps blocks stored in database in form of Extensional blocks. + +Example of usage: + +``` + open Mina_automation + + let extract_blocks = Extract_blocks.of_context Executor.AutoDetect in + let config = + { Extract_blocks.Config.archive_uri = source_db + ; range = Extract_blocks.Config.AllBlocks + ; output_folder = Some output_folder + ; network = Some network_name + ; include_block_height_in_name = true + } + in + let%bind _ = Extract_blocks.run extract_blocks ~config in + +``` + +### missing block auditor + +Missing block auditor is an shell script which detect any gaps in database that can be fixed with missing block guardian. Currently it is used as a sub component for missing_blocks_guardian app so there is no features rather than path to app detection + + +### missing block guardian + +Missing block guardian fills gaps of archive database + +Example of usage: + +``` + let%bind missing_blocks_auditor_path = + Missing_blocks_auditor.of_context Executor.AutoDetect + |> Missing_blocks_auditor.path in + + let%bind archive_blocks_path = + Archive_blocks.of_context Executor.AutoDetect |> path archive_blocks in + + let config = + { Missing_blocks_guardian.Config.archive_uri = Uri.of_string target_db + ; precomputed_blocks = Uri.make ~scheme:"file" ~path:output_folder () + ; network = network_name + ; run_mode = Run + ; missing_blocks_auditor = missing_blocks_auditor_path + ; archive_blocks = archive_blocks_path + ; block_format = Extensional + } in + + let missing_blocks_guardian = + Missing_blocks_guardian.of_context Executor.AutoDetect + in + + let%bind _ = Missing_blocks_guardian.run missing_blocks_guardian ~config +``` + +where: + +- target_db : String.t - connection string to database + +### replayer + +Replayer checks integrity of database against ledger. + +Example of usage: + +``` + let replayer = Replayer.of_context Executor.AutoDetect in + + let%bind _ = + Replayer.run replayer ~archive_uri:target_db + ~input_config: + (network_data.folder ^ "/" ^ network_data.replayer_input_file) + ~interval_checkpoint:10 ~output_ledger:"./output_ledger" () + in + +``` + +where: + +- input_config: String.t - path to replayer input config +- interval_checkpoint: String.t - how frequent replayer should dump checkpoint (per slots) +- output_ledger: String.t - path to output ledger folder \ No newline at end of file diff --git a/src/test/mina_automation/archive_blocks.ml b/src/test/mina_automation/archive_blocks.ml new file mode 100644 index 00000000000..2c0dc47c89d --- /dev/null +++ b/src/test/mina_automation/archive_blocks.ml @@ -0,0 +1,27 @@ +(** +Module to run archive_blocks utility for the given list of block files and an archive PostgreSQL database. +*) +open Executor + +open Core +include Executor + +let of_context context = + Executor.of_context ~context + ~dune_name:"src/app/archive_blocks/archive_blocks.exe" + ~official_name:"/usr/local/bin/mina-archive-blocks" + +type format = Precomputed | Extensional + +let format_to_string format = + match format with + | Precomputed -> + "precomputed" + | Extensional -> + "extensional" + +let run t ~blocks ~archive_uri ?(format = Precomputed) = + run t + ~args: + ([ "--archive-uri"; archive_uri; "--" ^ format_to_string format ] @ blocks) + () diff --git a/src/test/mina_automation/archive_dumps.ml b/src/test/mina_automation/archive_dumps.ml new file mode 100644 index 00000000000..908a0bb2ec9 --- /dev/null +++ b/src/test/mina_automation/archive_dumps.ml @@ -0,0 +1,22 @@ +(** +Module to download precomputed blocks from o1labs official gcloud bucket. +*) + +open Async + +let bucket_name = "mina-archive-dumps" + +let download_via_public_url ~prefix ~date ~target = + let open Deferred.Let_syntax in + let dump_name = + Printf.sprintf "%s-archive-dump-%s_0000.sql.tar.gz" prefix date + in + let archive = Filename.concat target dump_name in + let%bind _ = + Utils.wget + ~url: + (Printf.sprintf "https://storage.googleapis.com/%s/%s" bucket_name + dump_name ) + ~target:archive + in + Deferred.return archive diff --git a/src/test/mina_automation/docker.ml b/src/test/mina_automation/docker.ml new file mode 100644 index 00000000000..c3892ba230b --- /dev/null +++ b/src/test/mina_automation/docker.ml @@ -0,0 +1,134 @@ +(** +Module to run docker command in given image. +*) + +open Core +open Integration_test_lib +open Async +open Printf + +module HttpPath = struct + type t = { host : string; version : string } + + let default = { host = "localhost"; version = "v1.40" } + + let with_base t path = + String.concat ~sep:"/" [ sprintf "http://%s/%s" t.host t.version; path ] + + let container_create t = with_base t "containers/create" + + let container_start t ~id = with_base t (sprintf "containers/%s/start" id) + + let container_wait t ~id = with_base t (sprintf "containers/%s/wait" id) + + let container_logs t ~id = + with_base t (sprintf "containers/%s/logs?stdout=true" id) + + let network_connect t ~network = + with_base t (sprintf "networks/%s/connect" network) + + let image_create t ~img = + with_base t (sprintf "images/create?fromImage=%s" img) +end + +module Requests = struct + type t = { unix_socket : string; curl_app : string } + + let default = { unix_socket = "/var/run/docker.sock"; curl_app = "curl" } + + let post t ~json ~path = + Util.run_cmd_exn "." t.curl_app + [ "--unix-socket" + ; t.unix_socket + ; "-H" + ; "Content-Type: application/json" + ; "-d" + ; json + ; "-X" + ; "POST" + ; path + ] + + let post_no_data t ~path = + Util.run_cmd_exn "." t.curl_app + [ "--unix-socket"; t.unix_socket; "-X"; "POST"; path ] + + let get t ~path = + Util.run_cmd_exn "." t.curl_app + [ "--unix-socket"; t.unix_socket; Printf.sprintf path ] +end + +module Client = struct + type t = { http_path : HttpPath.t; requests : Requests.t } + + let default = { http_path = HttpPath.default; requests = Requests.default } + + type create_container_result = + { id : string [@key "Id"]; warnings : string list [@key "Warnings"] } + [@@deriving yojson] + + let create_container t ~image ~cmd ~workdir ~volume ~network = + let open Deferred.Let_syntax in + let json = + `Assoc + [ ("Image", `String image) + ; ("Cmd", `List (List.map cmd ~f:(fun x -> `String x))) + ; ("WorkingDir", `String workdir) + ; ( "HostConfig" + , `Assoc + [ ("Binds", `List [ `String volume ]) + ; ("NetworkMode", `String network) + ] ) + ] + in + let json = Yojson.to_string json in + let path = HttpPath.container_create t.http_path in + let%bind output = Requests.post t.requests ~json ~path in + Deferred.return + ( output |> Yojson.Safe.from_string |> create_container_result_of_yojson + |> Result.ok_or_failwith ) + + let connect_container_to t ~id ~network = + let json = `Assoc [ ("Container", `String id) ] in + let json = Yojson.to_string json in + let path = HttpPath.network_connect t.http_path ~network in + Requests.post t.requests ~json ~path >>| ignore + + type wait_container_status = + { status_code : int [@key "StatusCode"] + ; error : string option [@key "Error"] [@default None] + } + [@@deriving yojson] + + let start_container t ~id = + let open Deferred.Let_syntax in + let path = HttpPath.container_start t.http_path ~id in + Requests.post_no_data t.requests ~path >>| ignore + + let pull_image t ~img = + let open Deferred.Let_syntax in + let path = HttpPath.image_create t.http_path ~img in + Requests.post_no_data t.requests ~path >>| ignore + + let wait_for_container t ~id = + let open Deferred.Let_syntax in + let path = HttpPath.container_wait t.http_path ~id in + let%bind output = Requests.post_no_data t.requests ~path in + Deferred.return + ( output |> Yojson.Safe.from_string |> wait_container_status_of_yojson + |> Result.ok_or_failwith ) + + let container_logs t ~id = + let path = HttpPath.container_logs t.http_path ~id in + Requests.post_no_data t.requests ~path + + let run_cmd_in_image t ~image ~cmd ~workdir ~volume ~network = + let open Deferred.Let_syntax in + let%bind _ = pull_image t ~img:image in + let%bind result = + create_container t ~image ~cmd ~workdir ~volume ~network + in + let%bind _ = start_container t ~id:result.id in + let%bind _ = wait_for_container t ~id:result.id in + container_logs t ~id:result.id +end diff --git a/src/test/mina_automation/dune b/src/test/mina_automation/dune new file mode 100644 index 00000000000..55207d9c83d --- /dev/null +++ b/src/test/mina_automation/dune @@ -0,0 +1,31 @@ +(library + (name mina_automation) + (public_name mina_automation) + (libraries + ;; opam libraries + async_kernel + core_kernel + ppx_inline_test.config + async + core + async_unix + stdio + alcotest + yojson + result + uri + ;; mina libraries + init + logger + currency + integration_test_lib + mina_runtime_config + mina_caqti + mina_ledger + mina_base + mina_block + cmdliner + ) + (instrumentation (backend bisect_ppx)) + (preprocess (pps ppx_version ppx_mina ppx_jane ppx_deriving_yojson ppx_compare)) +) diff --git a/src/test/mina_automation/executor.ml b/src/test/mina_automation/executor.ml new file mode 100644 index 00000000000..2d52f940955 --- /dev/null +++ b/src/test/mina_automation/executor.ml @@ -0,0 +1,94 @@ +(** +Core module to run any defined app on various contexts +*) + +open Integration_test_lib +open Core_kernel +open Async + +module DockerContext = struct + type t = + { image : string; workdir : string; volume : string; network : string } +end + +type context = + | Dune (* application ran from dune exec command *) + | Local (* application ran from _build/default folder*) + | Debian (* application installed from mina debian package *) + | Docker of DockerContext.t + | AutoDetect +(* application ran inside docker container *) + +module Executor = struct + type t = { official_name : string; dune_name : string; context : context } + + let of_context ~context ~dune_name ~official_name = + { context; dune_name; official_name } + + let run_from_debian t ~(args : string list) ?env () = + Util.run_cmd_exn ?env "." t.official_name args + + let run_from_dune t ~(args : string list) ?env () = + Util.run_cmd_exn ?env "." "dune" ([ "exec"; t.dune_name; "--" ] @ args) + + let run_from_local t ~(args : string list) ?env () = + Util.run_cmd_exn ?env "." + (Printf.sprintf "_build/default/%s" t.dune_name) + args + + let built_name t = Printf.sprintf "_build/default/%s" t.dune_name + + let path t = + match%bind Sys.file_exists (built_name t) with + | `Yes -> + Deferred.return (built_name t) + | _ -> ( + match%bind Sys.file_exists t.official_name with + | `Yes -> + Deferred.return t.official_name + | _ -> + Deferred.return t.dune_name ) + + let run t ~(args : string list) ?env () = + let open Deferred.Let_syntax in + let logger = Logger.create () in + match t.context with + | AutoDetect -> ( + match%bind Sys.file_exists (built_name t) with + | `Yes -> + [%log debug] "running from _build/default folder" + ~metadata:[ ("app", `String (built_name t)) ] ; + run_from_local t ~args ?env () + | _ -> ( + let paths = + Option.value_map ~f:(String.split ~on:':') ~default:[] + (Sys.getenv "PATH") + in + let exists_at_path prefix = + match%bind Sys.file_exists (prefix ^ "/" ^ t.official_name) with + | `Yes -> + Deferred.return (Some prefix) + | _ -> + Deferred.return None + in + match%bind Deferred.List.find_map ~f:exists_at_path paths with + | Some prefix -> + [%log debug] "running from %s" prefix + ~metadata:[ ("app", `String t.official_name) ] ; + run_from_debian t ~args ?env () + | _ -> + [%log debug] "running from src/.. folder" + ~metadata:[ ("app", `String t.dune_name) ] ; + run_from_dune t ~args ?env () ) ) + | Dune -> + run_from_dune t ~args ?env () + | Debian -> + run_from_debian t ~args ?env () + | Local -> + run_from_local t ~args ?env () + | Docker ctx -> + let docker = Docker.Client.default in + let cmd = [ t.official_name ] @ args in + Docker.Client.run_cmd_in_image docker ~image:ctx.image ~cmd + ~workdir:ctx.workdir ~volume:ctx.volume ~network:ctx.network +end diff --git a/src/test/mina_automation/extract_blocks.ml b/src/test/mina_automation/extract_blocks.ml new file mode 100644 index 00000000000..7b05e9b00cb --- /dev/null +++ b/src/test/mina_automation/extract_blocks.ml @@ -0,0 +1,60 @@ +(** +Module to run extract_blocks utility for given archive PostgreSQL database. +*) + +open Executor +open Core +include Executor + +module Config = struct + type range = AllBlocks | Range of (String.t * String.t) + + type t = + { archive_uri : String.t + ; range : range + ; output_folder : String.t option + ; network : String.t option + ; include_block_height_in_name : bool + } + + let to_args t = + let blocks = + match t.range with + | AllBlocks -> + [ "--all-blocks" ] + | Range (start_hash, end_hash) -> + [ "--start-hash"; start_hash; "--end-hash"; end_hash ] + in + let maybe_output_folder = + match t.output_folder with + | Some folder -> + [ "--output-folder"; folder ] + | None -> + [] + in + let maybe_network = + match t.network with + | Some network -> + [ "--network"; network ] + | None -> + [] + in + let maybe_include_block_height_in_name = + match t.include_block_height_in_name with + | true -> + [ "--include-block-height-in-name" ] + | false -> + [] + in + + [ "--archive-uri"; t.archive_uri ] + @ maybe_output_folder @ maybe_network @ maybe_include_block_height_in_name + @ blocks +end + +let of_context context = + Executor.of_context ~context + ~dune_name:"src/app/extract_blocks/extract_blocks.exe" + ~official_name:"/usr/local/bin/mina-extract-blocks" + +let run t ~config = run t ~args:(Config.to_args config) () diff --git a/src/test/mina_automation/missing_blocks_auditor.ml b/src/test/mina_automation/missing_blocks_auditor.ml new file mode 100644 index 00000000000..f28983711bb --- /dev/null +++ b/src/test/mina_automation/missing_blocks_auditor.ml @@ -0,0 +1,11 @@ +(** +Module to run missing_block_auditor scripts which finds gaps in given Postgresql database +*) + +open Executor +include Executor + +let of_context context = + Executor.of_context ~context + ~dune_name:"src/app/missing_blocks_auditor/missing_blocks_auditor.exe" + ~official_name:"/usr/local/bin/mina-missing-blocks-auditor" diff --git a/src/test/mina_automation/missing_blocks_guardian.ml b/src/test/mina_automation/missing_blocks_guardian.ml new file mode 100644 index 00000000000..42bbf0ec844 --- /dev/null +++ b/src/test/mina_automation/missing_blocks_guardian.ml @@ -0,0 +1,51 @@ +(** +Module to run missing_block_guardian app which should fill any gaps in given archive database +*) + +open Executor +open Core +include Executor + +module Config = struct + type mode = Audit | Run + + type t = + { archive_uri : Uri.t + ; precomputed_blocks : Uri.t + ; network : string + ; run_mode : mode + ; missing_blocks_auditor : string + ; archive_blocks : string + ; block_format : Archive_blocks.format + } + + let to_args t = + match t.run_mode with Audit -> [ "audit" ] | Run -> [ "single-run" ] + + let to_envs t = + let path = Uri.path t.archive_uri in + let path_no_leading_slash = + String.sub path ~pos:1 ~len:(String.length path - 1) + in + + `Extend + [ ("MINA_NETWORK", t.network) + ; ("PRECOMPUTED_BLOCKS_URL", Uri.to_string t.precomputed_blocks) + ; ("DB_USERNAME", Option.value_exn (Uri.user t.archive_uri)) + ; ("DB_HOST", Uri.host_with_default ~default:"localhost" t.archive_uri) + ; ("DB_PORT", Int.to_string (Option.value_exn (Uri.port t.archive_uri))) + ; ("DB_NAME", path_no_leading_slash) + ; ("PGPASSWORD", Option.value_exn (Uri.password t.archive_uri)) + ; ("BLOCKS_FORMAT", Archive_blocks.format_to_string t.block_format) + ; ("MISSING_BLOCKS_AUDITOR", t.missing_blocks_auditor) + ; ("ARCHIVE_BLOCKS", t.archive_blocks) + ] +end + +let of_context context = + Executor.of_context ~context + ~dune_name:"scripts/archive/missing-blocks-guardian.sh" + ~official_name:"/etc/mina/archive/missing-blocks-guardian.sh" + +let run t ~config = + run t ~args:(Config.to_args config) ~env:(Config.to_envs config) () diff --git a/src/test/mina_automation/psql.ml b/src/test/mina_automation/psql.ml new file mode 100644 index 00000000000..d3bdd942d74 --- /dev/null +++ b/src/test/mina_automation/psql.ml @@ -0,0 +1,95 @@ +(** +Module for psql tool automation. One can use it to create database schema +*) + +open Integration_test_lib +open Core +open Async + +module Credentials = struct + type t = + { user : string option + ; password : string + ; host : string option + ; port : int option + ; db : string option + } +end + +let create_db_script () = + match%bind Sys.file_exists "src/app/archive/create_schema.sql" with + | `Yes -> + Deferred.return "src/app/archive/create_schema.sql" + | _ -> ( + match%bind + Sys.file_exists "_build/default/src/archive/create_schema.sql" + with + | `Yes -> + Deferred.return "_build/default/src/archive/create_schema.sql" + | _ -> ( + match%bind Sys.file_exists "/etc/mina/archive/create_schema.sql" with + | `Yes -> + Deferred.return "/etc/mina/archive/create_schema.sql" + | _ -> + failwith "cannot find create db script" ) ) + +type connection = Conn_str of string | Credentials of Credentials.t + +let psql = "psql" + +let create_credential_arg ~connection = + let value_or_empty arg item = + match item with Some item -> [ arg; item ] | None -> [] + in + + let credentials = + match connection with + | Conn_str conn_str -> + let uri = conn_str |> Uri.of_string in + let password = uri |> Uri.password |> Option.value_exn in + let user = uri |> Uri.user in + let host = uri |> Uri.host in + let port = uri |> Uri.port in + let db = uri |> Uri.path in + let db = if String.is_empty db then None else Some db in + { Credentials.password; user; host; db; port } + | Credentials credentials -> + credentials + in + + Unix.putenv ~key:"PGPASSWORD" ~data:credentials.password ; + value_or_empty "-U" credentials.user + @ value_or_empty "-p" (Option.map ~f:string_of_int credentials.port) + @ value_or_empty "-h" credentials.host + @ value_or_empty "-U" credentials.user + @ value_or_empty "-d" credentials.db + +let run_command ~connection command = + let creds = create_credential_arg ~connection in + Util.run_cmd_exn "." psql (creds @ [ "-c"; command ]) + +let run_script ~connection ~db script = + let creds = create_credential_arg ~connection in + Util.run_cmd_exn "." psql (creds @ [ "-d"; db; "-a"; "-f"; script ]) + +let create_empty_db ~connection ~db = + run_command ~connection (sprintf "CREATE DATABASE %s;" db) + +let create_empty_random_db ~connection ~prefix = + let open Deferred.Let_syntax in + let db = sprintf "%s_%d" prefix (Random.int 10000 + 1000) in + let%bind _ = create_empty_db ~connection ~db in + Deferred.return db + +let create_mina_db ~connection ~db = + let open Deferred.Let_syntax in + let%bind _ = create_empty_db ~connection ~db in + let%bind create_script = create_db_script () in + run_script ~connection ~db create_script >>| ignore + +let create_random_mina_db ~connection ~prefix = + let open Deferred.Let_syntax in + let%bind db = create_empty_random_db ~connection ~prefix in + let%bind create_script = create_db_script () in + let%bind _ = run_script ~connection ~db create_script in + Deferred.return db diff --git a/src/test/mina_automation/replayer.ml b/src/test/mina_automation/replayer.ml new file mode 100644 index 00000000000..049f8071d95 --- /dev/null +++ b/src/test/mina_automation/replayer.ml @@ -0,0 +1,102 @@ +(** +Module for running replayer which checks datbase integrity of given database +*) + +open Executor +open Core + +module Output = struct + type t = + { target_epoch_ledgers_state_hash : string + ; target_fork_state_hash : string + ; target_genesis_ledger : Runtime_config.Ledger.t option + ; target_epoch_data : Runtime_config.Epoch_data.t option + } + [@@deriving yojson] + + let of_json_file_exn file = + Yojson.Safe.from_file file |> of_yojson |> Result.ok_or_failwith +end + +module InputConfig = struct + type t = + { target_epoch_ledgers_state_hash : string option [@default None] + ; start_slot_since_genesis : int64 [@default 0L] + ; genesis_ledger : Runtime_config.Ledger.t + ; first_pass_ledger_hashes : Mina_base.Ledger_hash.t list [@default []] + ; last_snarked_ledger_hash : Mina_base.Ledger_hash.t option [@default None] + } + [@@deriving yojson] + + let of_runtime_config_file_exn config target_epoch_ledgers_state_hash = + let runtime_config = + Yojson.Safe.from_file config + |> Runtime_config.of_yojson |> Result.ok_or_failwith + in + { target_epoch_ledgers_state_hash + ; start_slot_since_genesis = 0L + ; genesis_ledger = Option.value_exn runtime_config.ledger + ; first_pass_ledger_hashes = [] + ; last_snarked_ledger_hash = None + } + + let to_yojson_file t output = Yojson.Safe.to_file output (to_yojson t) + + let of_ledger_file_exn ledger_file ~target_epoch_ledgers_state_hash = + let genesis_ledger = + Yojson.Safe.from_file ledger_file + |> Runtime_config.Ledger.of_yojson |> Result.ok_or_failwith + in + { target_epoch_ledgers_state_hash + ; start_slot_since_genesis = 0L + ; genesis_ledger + ; first_pass_ledger_hashes = [] + ; last_snarked_ledger_hash = None + } + + let of_checkpoint_file file target_epoch_ledgers_state_hash = + let t = Yojson.Safe.from_file file |> of_yojson |> Result.ok_or_failwith in + { target_epoch_ledgers_state_hash + ; start_slot_since_genesis = t.start_slot_since_genesis + ; genesis_ledger = t.genesis_ledger + ; first_pass_ledger_hashes = t.first_pass_ledger_hashes + ; last_snarked_ledger_hash = t.last_snarked_ledger_hash + } +end + +include Executor + +let of_context context = + Executor.of_context ~context ~dune_name:"src/app/replayer/replayer.exe" + ~official_name:"/usr/local/bin/mina-replayer" + +let run t ~archive_uri ~input_config ~interval_checkpoint + ?checkpoint_output_folder ?checkpoint_file_prefix ~output_ledger = + let checkpoint_output_folder = + match checkpoint_output_folder with + | Some checkpoint_output_folder -> + [ "--checkpoint-output-folder"; checkpoint_output_folder ] + | None -> + [] + in + let checkpoint_file_prefix = + match checkpoint_file_prefix with + | Some checkpoint_file_prefix -> + [ "--checkpoint-file-prefix"; checkpoint_file_prefix ] + | None -> + [] + in + let args = + [ "--archive-uri" + ; archive_uri + ; "--input-file" + ; input_config + ; "--checkpoint-interval" + ; string_of_int interval_checkpoint + ; "--output-file" + ; output_ledger + ] + @ checkpoint_output_folder @ checkpoint_file_prefix + in + + run t ~args diff --git a/src/test/mina_automation/utils.ml b/src/test/mina_automation/utils.ml new file mode 100644 index 00000000000..d42e6fd8ef1 --- /dev/null +++ b/src/test/mina_automation/utils.ml @@ -0,0 +1,10 @@ +open Integration_test_lib + +let wget ~url ~target = Util.run_cmd_exn "." "wget" [ "-c"; url; "-O"; target ] + +let sed ~search ~replacement ~input = + Util.run_cmd_exn "." "sed" + [ "-i"; "-e"; Printf.sprintf "s/%s/%s/g" search replacement; input ] + +let untar ~archive ~output = + Util.run_cmd_exn "." "tar" [ "-xf"; archive; "-C"; output ]