diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index a81dd8462e5..9d828f9c950 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -19,8 +19,6 @@ jobs: version-bump: if: github.repository_owner == 'anza-xyz' runs-on: ubuntu-24.04 - permissions: - pull-requests: write environment: "Version Bump" steps: - name: Create github app token @@ -78,7 +76,7 @@ jobs: NEW_VERSION: ${{ steps.process.outputs.new_version }} TARGET_BRANCH: ${{ steps.process.outputs.target_branch }} with: - github-token: ${{ secrets.GITHUB_TOKEN }} + github-token: ${{ steps.app-token.outputs.token }} script: | const pr = await github.rest.pulls.create({ owner: context.repo.owner, diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml new file mode 100644 index 00000000000..b38a0d5541a --- /dev/null +++ b/.github/workflows/dependabot.yml @@ -0,0 +1,18 @@ +name: "Dependency Review" +on: + pull_request: + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + if: ${{ github.actor != 'dependabot[bot]' }} + steps: + - name: "Checkout Repository" + uses: actions/checkout@v4 + - name: "Dependency Review" + uses: actions/dependency-review-action@v4 + with: + fail-on-severity: high # Fail on high, critical diff --git a/.github/workflows/secret-scanning.yml b/.github/workflows/secret-scanning.yml new file mode 100644 index 00000000000..0b0736c0e3a --- /dev/null +++ b/.github/workflows/secret-scanning.yml @@ -0,0 +1,15 @@ +name: Secret Scanning Check +on: + pull_request: + +jobs: + check-secrets: + runs-on: ubuntu-latest + steps: + - name: Run Secret Scanning Review + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' }} + uses: advanced-security/secret-scanning-review-action@v2.2.4 + with: + token: ${{ secrets.SECRETS_ALERTS }} + fail-on-alert: true # This turns it into a hard status check + runtime: python diff --git a/.github/workflows/trigger-buildkite-pipeline.yml b/.github/workflows/trigger-buildkite-pipeline.yml index 0b3e2c4c0b7..8c9d6b4a3c8 100644 --- a/.github/workflows/trigger-buildkite-pipeline.yml +++ b/.github/workflows/trigger-buildkite-pipeline.yml @@ -33,11 +33,22 @@ jobs: REPO: ${{ github.repository }} USERNAME: ${{ github.event.sender.login }} run: | + TRUSTED_CI_USERS=( + "mergify[bot]" + ) + for trusted_ci_user in "${TRUSTED_CI_USERS[@]}"; do + if [[ "$USERNAME" == "$trusted_ci_user" ]]; then + echo "should_trigger=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + done + + ENCODED_USERNAME=$(jq -rn --arg username "$USERNAME" '$username | @uri') ROLE_NAME=$(curl -sS -L \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer $GH_TOKEN" \ -H "X-GitHub-Api-Version: 2026-03-10" \ - https://api.github.com/repos/$REPO/collaborators/$USERNAME/permission | jq -r ".role_name") + "https://api.github.com/repos/$REPO/collaborators/$ENCODED_USERNAME/permission" | jq -r ".role_name") case "$ROLE_NAME" in admin|maintain|write|triage) diff --git a/CHANGELOG.sf.md b/CHANGELOG.sf.md index 6f484be553d..c21b7a9cb44 100644 --- a/CHANGELOG.sf.md +++ b/CHANGELOG.sf.md @@ -4,6 +4,53 @@ This file tracks StreamingFast-specific changes to this fork of [anza-xyz/agave](https://github.com/anza-xyz/agave). Upstream changes are documented in [CHANGELOG.md](CHANGELOG.md). +## v4.4.0-beta.1-fh3.0 + +### Changed + +- Merged upstream `v4.4.0-beta.1` (previously `v4.4.0-beta.0`), which brings in 15 + upstream commits. The merge was clean: no conflicts. The tree differs from upstream only by + `Dockerfile`, `.github/workflows/docker-publish.yml`, `CHANGELOG.sf.md`, the novote guard + in `geyser-plugin-manager/src/accounts_update_notifier.rs`, and the two workflows below. + + Released as image `ghcr.io/streamingfast/solana:v4.4.0-beta.1-fh3.0`. + +- Added the StreamingFast pull request checks that `release/4.x` requires before merging: + `.github/workflows/dependabot.yml` (`dependency-review`) and + `.github/workflows/secret-scanning.yml` (`check-secrets`). + +- The Geyser plugin interface is unchanged: Agave still pins + `agave-geyser-plugin-interface = "=5.0.0"`, and `transaction-status`, + `transaction-context` and the `rpc-client` crates are byte-for-byte identical to + `v4.4.0-beta.0`. Consumers only need to re-pin versions. + +- Rust toolchain stays at `1.98.1`. + +### Feature activations + +- `block_revenue_sharing` (SIMD-0123) is rekeyed from + `7MYx95UBiJufqnumyN7HfskJ9vKdcGMmhreVguqrE97K` to + `Crbnc267wkJvFhYakqwWWX57sx5bkrftJLekzy6yWKLT` (#15795), because its behavior changed. + The new ID is not activated on mainnet or testnet (checked 2026-10-14). The effect on the + Firehose block is the same as before: block fees can be split into two `Fee` rewards, one + of them to an address other than the leader. + +### Upstream changes worth knowing about + +- The vote program's `DepositDelegatorRewards` instruction always returns an error + (#15795). +- `clone_and_filter_for_vat` only counts `pending_delegator_rewards` when SIMD-0123 is + active (#15529). +- Banking stage buffers transactions using Alpenglow slot timing (#15589, #15886). +- Bigtable upload stops at the blockstore's max root (#15804). +- `quinn` and `quinn-proto` are replaced by vendored `anza-quinn 0.11.12` and + `anza-quinn-proto 0.11.18` (#15954). +- The program cache extracts entries using the rooted access slot (#15811), and the + epoch-boundary program cache preparation restarts less often (#15766). +- Loader-v1/v2 programs have their ELF header checked earlier (#15544). +- `agave-validator wait-for-restart-window` ignores identity-not-found errors while + waiting (#15617). + ## v4.4.0-beta.0-fh3.0 ### Changed diff --git a/Cargo.lock b/Cargo.lock index 6c35c567ced..6dbf17df023 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -62,7 +62,7 @@ dependencies = [ [[package]] name = "agave-banking-stage-ingress-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "solana-perf", @@ -71,7 +71,7 @@ dependencies = [ [[package]] name = "agave-bls-cert-verify" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-cert-verify", "agave-votor-messages", @@ -89,7 +89,7 @@ dependencies = [ [[package]] name = "agave-bls-sigverify" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-cert-verify", "agave-bls-sigverify", @@ -132,14 +132,14 @@ dependencies = [ [[package]] name = "agave-cpu-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "libc", ] [[package]] name = "agave-feature-set" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "ahash 0.8.12", "solana-epoch-schedule", @@ -152,7 +152,7 @@ dependencies = [ [[package]] name = "agave-fs" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-io-uring", "io-uring", @@ -187,7 +187,7 @@ dependencies = [ [[package]] name = "agave-install" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "bzip2", @@ -215,7 +215,7 @@ dependencies = [ [[package]] name = "agave-io-uring" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "io-uring", "libc", @@ -226,7 +226,7 @@ dependencies = [ [[package]] name = "agave-logger" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "env_logger", "libc", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "agave-math-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-math-utils", "num-traits", @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "agave-precompiles" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -272,7 +272,7 @@ dependencies = [ [[package]] name = "agave-random" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "rand 0.9.4", @@ -284,7 +284,7 @@ dependencies = [ [[package]] name = "agave-reserved-account-keys" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "solana-message", @@ -315,7 +315,7 @@ dependencies = [ [[package]] name = "agave-scheduling-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-scheduler-bindings", @@ -333,7 +333,7 @@ dependencies = [ [[package]] name = "agave-snapshots" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-fs", "agave-logger", @@ -365,7 +365,7 @@ dependencies = [ [[package]] name = "agave-store-histogram" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "clap 2.33.3", "solana-version", @@ -391,7 +391,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-cpu-utils", "agave-feature-set", @@ -487,7 +487,7 @@ dependencies = [ [[package]] name = "agave-votor" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-sigverify", "agave-logger", @@ -540,7 +540,7 @@ dependencies = [ [[package]] name = "agave-votor-messages" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "bitvec", @@ -565,15 +565,15 @@ dependencies = [ [[package]] name = "agave-votor-transport" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", + "anza-quinn-proto", "arrayvec", "bytes", "crossbeam-channel", "log", "qualifier_attr", - "quinn", - "quinn-proto", "solana-keypair", "solana-metrics", "solana-net-utils", @@ -586,7 +586,7 @@ dependencies = [ [[package]] name = "agave-watchtower" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -609,7 +609,7 @@ dependencies = [ [[package]] name = "agave-xdp" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-cpu-utils", "agave-xdp", @@ -629,7 +629,7 @@ dependencies = [ [[package]] name = "agave-xdp-ebpf" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "aya-ebpf", ] @@ -800,6 +800,50 @@ version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" +[[package]] +name = "anza-quinn" +version = "0.11.12-issue2860.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd524576ab56786d8241905b12498e8ec6b9a09a58bfe8ef9e9dfcf511aeecf4" +dependencies = [ + "anza-quinn-proto", + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.6.5", + "thiserror 2.0.20", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "anza-quinn-proto" +version = "0.11.18-issue2860.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9dfece0ce5ffc483085c0112b8499dabab137e2eb028f1ff3a28d5b24d6d477" +dependencies = [ + "bytes", + "fastbloom", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg 0.10.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "slab", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "web-time", +] + [[package]] name = "arbitrary" version = "1.4.2" @@ -3087,7 +3131,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "regex", ] @@ -5500,7 +5544,7 @@ dependencies = [ [[package]] name = "proto" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "protobuf-src", "tonic-prost-build", @@ -5617,7 +5661,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc" dependencies = [ "bytes", - "fastbloom", "getrandom 0.4.3", "lru-slab", "rand 0.10.2", @@ -5626,7 +5669,6 @@ dependencies = [ "rustc-hash", "rustls", "rustls-pki-types", - "rustls-platform-verifier", "slab", "thiserror 2.0.20", "tinyvec", @@ -5867,7 +5909,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "redox_syscall" @@ -6845,7 +6887,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "Inflector", "assert_matches", @@ -6891,7 +6933,7 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bs58", @@ -6917,7 +6959,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "clap 2.33.3", @@ -6961,7 +7003,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-fs", "agave-logger", @@ -7102,7 +7144,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "borsh", "futures 0.3.34", @@ -7133,7 +7175,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "serde", "solana-account", @@ -7151,7 +7193,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "crossbeam-channel", @@ -7207,7 +7249,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bencher", "bv", @@ -7293,7 +7335,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "bincode", @@ -7335,7 +7377,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "assert_matches", @@ -7359,7 +7401,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "ahash 0.8.12", "bv", @@ -7379,7 +7421,7 @@ dependencies = [ [[package]] name = "solana-builtins" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "solana-bpf-loader-program", @@ -7396,7 +7438,7 @@ dependencies = [ [[package]] name = "solana-builtins-default-costs" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "ahash 0.8.12", @@ -7408,7 +7450,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "bip39", @@ -7441,7 +7483,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "bip39", @@ -7476,7 +7518,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -7568,7 +7610,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "anyhow", "dirs-next", @@ -7580,7 +7622,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "Inflector", "agave-reserved-account-keys", @@ -7629,7 +7671,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "async-trait", "bincode", @@ -7666,7 +7708,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "async-trait", @@ -7760,7 +7802,7 @@ dependencies = [ [[package]] name = "solana-compute-budget" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-fee-structure", "solana-program-runtime", @@ -7768,7 +7810,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-instruction" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "bincode", @@ -7806,14 +7848,14 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program-runtime", ] [[package]] name = "solana-compute-budget-program-bench" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "criterion", @@ -7843,7 +7885,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "async-trait", @@ -7863,7 +7905,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-banking-stage-ingress-types", "agave-bls-cert-verify", @@ -8021,7 +8063,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -8109,7 +8151,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-snapshots", "log", @@ -8153,7 +8195,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "rand 0.9.4", @@ -8170,7 +8212,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "agave-reserved-account-keys", @@ -8295,7 +8337,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "log", @@ -8321,7 +8363,7 @@ dependencies = [ [[package]] name = "solana-faucet-cli" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "clap 2.33.3", @@ -8355,7 +8397,7 @@ dependencies = [ [[package]] name = "solana-fee" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-fee-structure", "solana-svm-transaction", @@ -8437,7 +8479,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -8518,7 +8560,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-snapshots", "log", @@ -8542,7 +8584,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-geyser-plugin-interface", "agave-votor-messages", @@ -8582,7 +8624,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "agave-random", @@ -8652,7 +8694,7 @@ dependencies = [ [[package]] name = "solana-gossip-cli" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "clap 2.33.3", @@ -8813,7 +8855,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-votor-messages", "bip39", @@ -8873,7 +8915,7 @@ dependencies = [ [[package]] name = "solana-lattice-hash" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "blake3", @@ -8887,7 +8929,7 @@ dependencies = [ [[package]] name = "solana-leader-schedule" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-random", "itertools 0.15.0", @@ -8902,7 +8944,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -9056,7 +9098,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -9137,11 +9179,11 @@ dependencies = [ [[package]] name = "solana-measure" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-merkle-tree" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "hex", "solana-hash", @@ -9171,7 +9213,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bencher", "crossbeam-channel", @@ -9205,11 +9247,12 @@ checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" [[package]] name = "solana-net-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "agave-xdp", "anyhow", + "anza-quinn", "bincode", "bytes", "cfg-if 1.0.4", @@ -9219,7 +9262,6 @@ dependencies = [ "log", "nix", "pcap-file", - "quinn", "rand 0.9.4", "serde", "shuttle", @@ -9267,7 +9309,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "log", "reqwest 0.12.28", @@ -9321,7 +9363,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "agave-random", @@ -9370,7 +9412,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-cpu-utils", "agave-logger", @@ -9407,7 +9449,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "clap 3.2.23", @@ -9508,7 +9550,7 @@ dependencies = [ [[package]] name = "solana-program-binaries" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "solana-account", @@ -9568,7 +9610,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "base64 0.23.1", @@ -9627,7 +9669,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -9714,7 +9756,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "anyhow", "crossbeam-channel", @@ -9738,15 +9780,15 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", + "anza-quinn", "async-lock", "async-trait", "crossbeam-channel", "futures 0.3.34", "log", - "quinn", "solana-connection-cache", "solana-keypair", "solana-measure", @@ -9768,7 +9810,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "log", "num_cpus", @@ -9777,7 +9819,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "console 0.16.4", @@ -9834,7 +9876,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-reserved-account-keys", @@ -9943,7 +9985,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-votor-messages", "assert_matches", @@ -9994,7 +10036,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "anyhow", "jsonrpc-core", @@ -10013,7 +10055,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "anyhow", "clap 2.33.3", @@ -10043,7 +10085,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bs58", @@ -10069,7 +10111,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "bincode", @@ -10103,7 +10145,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-cert-verify", "agave-feature-set", @@ -10245,7 +10287,7 @@ dependencies = [ [[package]] name = "solana-runtime-transaction" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-reserved-account-keys", @@ -10383,7 +10425,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "crossbeam-channel", @@ -10589,7 +10631,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "clap 2.33.3", "solana-account", @@ -10662,7 +10704,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-reserved-account-keys", "base64 0.23.1", @@ -10706,7 +10748,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bs58", "enum-iterator", @@ -10733,10 +10775,11 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "anyhow", + "anza-quinn", "assert_matches", "bytes", "chrono", @@ -10750,7 +10793,6 @@ dependencies = [ "nix", "num_cpus", "pem", - "quinn", "rand 0.9.4", "rustls", "smallvec", @@ -10774,7 +10816,7 @@ dependencies = [ [[package]] name = "solana-svm" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-precompiles", @@ -10854,7 +10896,7 @@ dependencies = [ [[package]] name = "solana-svm-callback" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account", "solana-clock", @@ -10864,22 +10906,22 @@ dependencies = [ [[package]] name = "solana-svm-feature-set" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-svm-log-collector" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "log", ] [[package]] name = "solana-svm-measure" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-svm-timings" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "eager", "enum-iterator", @@ -10902,7 +10944,7 @@ dependencies = [ [[package]] name = "solana-svm-type-overrides" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "futures 0.3.34", "rand 0.9.4", @@ -10911,7 +10953,7 @@ dependencies = [ [[package]] name = "solana-syscalls" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "bincode", @@ -10979,7 +11021,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "bincode", @@ -11074,7 +11116,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-snapshots", @@ -11137,9 +11179,9 @@ checksum = "0ced92c60aa76ec4780a9d93f3bd64dfa916e1b998eacc6f1c110f3f444f02c9" [[package]] name = "solana-tls-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ - "quinn", + "anza-quinn", "rustls", "rustls-webpki", "solana-keypair", @@ -11149,7 +11191,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "assert_matches", @@ -11200,7 +11242,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "futures-util", "indicatif", @@ -11228,8 +11270,9 @@ dependencies = [ [[package]] name = "solana-tpu-client-next" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", "async-trait", "bytes", "crossbeam-channel", @@ -11238,7 +11281,6 @@ dependencies = [ "itertools 0.15.0", "log", "lru 0.18.4", - "quinn", "rustls", "serde_json", "solana-clock", @@ -11291,7 +11333,7 @@ dependencies = [ [[package]] name = "solana-transaction-context" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "qualifier_attr", @@ -11330,7 +11372,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "Inflector", "agave-reserved-account-keys", @@ -11377,7 +11419,7 @@ dependencies = [ [[package]] name = "solana-transaction-status-client-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bincode", @@ -11401,7 +11443,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -11455,7 +11497,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "async-trait", "solana-connection-cache", @@ -11468,7 +11510,7 @@ dependencies = [ [[package]] name = "solana-unified-scheduler-logic" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-transaction-view", "assert_matches", @@ -11489,7 +11531,7 @@ dependencies = [ [[package]] name = "solana-unified-scheduler-pool" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-banking-stage-ingress-types", "agave-logger", @@ -11528,7 +11570,7 @@ checksum = "c5d2face763df5afeaa9509b9019968860e69cc1531ec8b4a2e6c7b702204d5a" [[package]] name = "solana-version" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "bincode", @@ -11545,7 +11587,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "arbitrary", "bencher", @@ -11613,7 +11655,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -11705,7 +11747,7 @@ dependencies = [ [[package]] name = "solana-zk-elgamal-proof-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bytemuck", "criterion", @@ -11720,7 +11762,7 @@ dependencies = [ [[package]] name = "solana-zk-elgamal-proof-program-tests" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bytemuck", "solana-account", @@ -11788,7 +11830,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program-runtime", ] diff --git a/Cargo.toml b/Cargo.toml index 6785b0f7c9d..05b9459c601 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -136,7 +136,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" authors = ["Anza Maintainers "] description = "Blockchain, Rebuilt for Scale" repository = "https://github.com/anza-xyz/agave" @@ -167,29 +167,29 @@ new_without_default = "allow" [workspace.dependencies] Inflector = "0.11.4" -agave-banking-stage-ingress-types = { path = "banking-stage-ingress-types", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-bls-cert-verify = { path = "bls-cert-verify", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-bls-sigverify = { path = "bls-sigverify", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-cpu-utils = { path = "cpu-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-feature-set = { path = "feature-set", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-fs = { path = "fs", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +agave-banking-stage-ingress-types = { path = "banking-stage-ingress-types", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-bls-cert-verify = { path = "bls-cert-verify", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-bls-sigverify = { path = "bls-sigverify", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-cpu-utils = { path = "cpu-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-feature-set = { path = "feature-set", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-fs = { path = "fs", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } agave-geyser-plugin-interface = "=5.0.0" -agave-io-uring = { path = "io-uring", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-logger = { path = "logger", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-math-utils = { path = "math-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-precompiles = { path = "precompiles", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-random = { path = "random", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-reserved-account-keys = { path = "reserved-account-keys", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +agave-io-uring = { path = "io-uring", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-logger = { path = "logger", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-math-utils = { path = "math-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-precompiles = { path = "precompiles", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-random = { path = "random", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-reserved-account-keys = { path = "reserved-account-keys", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } agave-scheduler-bindings = "6.0.0" agave-scheduler-handshake = "7.0.0" -agave-scheduling-utils = { path = "scheduling-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-snapshots = { path = "snapshots", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +agave-scheduling-utils = { path = "scheduling-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-snapshots = { path = "snapshots", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } agave-transaction-view = "7.0.0" -agave-votor = { path = "votor", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-votor-messages = { path = "votor-messages", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-votor-transport = { path = "votor-transport", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-xdp = { path = "xdp", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-xdp-ebpf = { path = "xdp-ebpf", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +agave-votor = { path = "votor", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-votor-messages = { path = "votor-messages", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-votor-transport = { path = "votor-transport", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-xdp = { path = "xdp", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-xdp-ebpf = { path = "xdp-ebpf", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } ahash = "0.8.12" anyhow = "1.0.104" arbitrary = "1.4.2" @@ -300,8 +300,8 @@ prost-types = "0.14.4" protobuf-src = "1.1.0" protosol = "=15.0.0" qualifier_attr = { version = "0.2.2", default-features = false } -quinn = "0.11.12" -quinn-proto = "0.11.18" +quinn = { package = "anza-quinn", version = "=0.11.12-issue2860.1" } +quinn-proto = { package = "anza-quinn-proto", version = "=0.11.18-issue2860.1" } rand = "0.9.4" rand_chacha = "0.9.0" rayon = "1.12.0" @@ -334,68 +334,68 @@ smpl_jwt = "0.9.0" socket2 = "0.6.5" soketto = "0.8" solana-account = "5.0.0" -solana-account-decoder = { path = "account-decoder", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-account-decoder-client-types = { path = "account-decoder-client-types", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-account-decoder = { path = "account-decoder", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-account-decoder-client-types = { path = "account-decoder-client-types", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-account-info = "3.1.1" -solana-accounts-db = { path = "accounts-db", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-accounts-db = { path = "accounts-db", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-address = "2.7.0" solana-address-lookup-table-interface = "4.0.0" -solana-banks-client = { path = "banks-client", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-banks-interface = { path = "banks-interface", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-banks-server = { path = "banks-server", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-banks-client = { path = "banks-client", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-banks-interface = { path = "banks-interface", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-banks-server = { path = "banks-server", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-big-mod-exp = "4.0.0" solana-bincode = "4.0.0" solana-blake3-hasher = "3.1.0" -solana-bloom = { path = "bloom", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-bloom = { path = "bloom", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-bls-signatures = { version = "4.0.0", features = ["serde"] } solana-bls12-381-syscall = "0.1.1" solana-bn254 = "3.2.1" solana-borsh = "3.0.2" -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=4.4.0-beta.0", default-features = false, features = ["agave-unstable-api"] } -solana-bucket-map = { path = "bucket_map", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-builtins = { path = "builtins", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-builtins-default-costs = { path = "builtins-default-costs", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-clap-utils = { path = "clap-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-cli-config = { path = "cli-config", version = "=4.4.0-beta.0" } -solana-cli-output = { path = "cli-output", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-client = { path = "client", version = "=4.4.0-beta.0" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=4.4.0-beta.1", default-features = false, features = ["agave-unstable-api"] } +solana-bucket-map = { path = "bucket_map", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-builtins = { path = "builtins", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-builtins-default-costs = { path = "builtins-default-costs", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-clap-utils = { path = "clap-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-cli-config = { path = "cli-config", version = "=4.4.0-beta.1" } +solana-cli-output = { path = "cli-output", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-client = { path = "client", version = "=4.4.0-beta.1" } solana-client-traits = "5.0.0" solana-clock = "4.0.0" solana-cluster-type = "3.2.0" solana-commitment-config = "3.1.1" -solana-compute-budget = { path = "compute-budget", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-compute-budget-instruction = { path = "compute-budget-instruction", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-compute-budget = { path = "compute-budget", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-compute-budget-instruction = { path = "compute-budget-instruction", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-compute-budget-interface = "3.1.0" -solana-compute-budget-program = { path = "programs/compute-budget", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-config-interface = "2.0.1" -solana-connection-cache = { path = "connection-cache", version = "=4.4.0-beta.0", default-features = false, features = ["agave-unstable-api"] } -solana-core = { path = "core", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-cost-model = { path = "cost-model", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-connection-cache = { path = "connection-cache", version = "=4.4.0-beta.1", default-features = false, features = ["agave-unstable-api"] } +solana-core = { path = "core", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-cost-model = { path = "cost-model", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-cpi = "3.1.0" solana-curve25519 = "4.0.1" solana-define-syscall = "5.2.0" solana-derivation-path = "3.0.0" -solana-download-utils = { path = "download-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-download-utils = { path = "download-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-ed25519-program = "3.0.0" -solana-entry = { path = "entry", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-entry = { path = "entry", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-epoch-info = "3.1.0" solana-epoch-rewards = "3.2.0" solana-epoch-rewards-hasher = "3.1.0" solana-epoch-schedule = "3.3.0" -solana-faucet = { path = "faucet", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-faucet = { path = "faucet", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-feature-gate-interface = "5.0.0" -solana-fee = { path = "fee", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-fee = { path = "fee", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-fee-calculator = "3.3.0" solana-fee-structure = "4.1.0" solana-file-download = "3.1.4" solana-frozen-abi = "3.8.0" solana-frozen-abi-macro = "3.6.0" -solana-genesis = { path = "genesis", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-genesis = { path = "genesis", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-genesis-config = "5.0.0" -solana-genesis-utils = { path = "genesis-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-gossip = { path = "gossip", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-genesis-utils = { path = "genesis-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-gossip = { path = "gossip", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-hard-forks = "3.2.0" solana-hash = "4.6.0" solana-hash-512 = "1.2.0" @@ -406,54 +406,54 @@ solana-instructions-sysvar = "5.0.0" solana-keccak-hasher = "3.1.0" solana-keypair = "4.0.0" solana-last-restart-slot = "3.2.0" -solana-lattice-hash = { path = "lattice-hash", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-leader-schedule = { path = "leader-schedule", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-ledger = { path = "ledger", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-lattice-hash = { path = "lattice-hash", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-leader-schedule = { path = "leader-schedule", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-ledger = { path = "ledger", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-loader-v2-interface = "3.0.0" solana-loader-v3-interface = "9.0.0" solana-loader-v4-interface = "3.1.0" -solana-local-cluster = { path = "local-cluster", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-measure = { path = "measure", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-merkle-tree = { path = "merkle-tree", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-local-cluster = { path = "local-cluster", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-measure = { path = "measure", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-merkle-tree = { path = "merkle-tree", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-message = "5.0.0" -solana-metrics = { path = "metrics", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-metrics = { path = "metrics", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-msg = "3.1.0" solana-native-token = "3.0.0" -solana-net-utils = { path = "net-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-net-utils = { path = "net-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-nohash-hasher = "0.2.1" solana-nonce = "3.3.0" solana-nonce-account = { version = "5.0.0", default-features = false } -solana-notifier = { path = "notifier", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-notifier = { path = "notifier", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-offchain-message = "4.0.0" solana-packet = "4.3.0" -solana-perf = { path = "perf", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-poh = { path = "poh", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-perf = { path = "perf", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-poh = { path = "poh", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-poh-config = "3.1.0" solana-poseidon = "5.0.0" solana-precompile-error = "3.0.0" solana-presigner = "4.0.0" solana-program = { version = "5.0.0", default-features = false } -solana-program-binaries = { path = "program-binaries", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-program-binaries = { path = "program-binaries", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-program-entrypoint = "3.1.1" solana-program-error = "3.0.1" solana-program-option = "3.1.0" solana-program-pack = "3.1.0" -solana-program-runtime = { path = "program-runtime", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-program-test = { path = "program-test", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-program-runtime = { path = "program-runtime", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-program-test = { path = "program-test", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-pubkey = { version = "4.3.0", default-features = false } -solana-pubsub-client = { path = "pubsub-client", version = "=4.4.0-beta.0" } -solana-quic-client = { path = "quic-client", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-remote-wallet = { path = "remote-wallet", version = "=4.4.0-beta.0", default-features = false, features = ["agave-unstable-api"] } +solana-pubsub-client = { path = "pubsub-client", version = "=4.4.0-beta.1" } +solana-quic-client = { path = "quic-client", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-remote-wallet = { path = "remote-wallet", version = "=4.4.0-beta.1", default-features = false, features = ["agave-unstable-api"] } solana-rent = "4.4.0" solana-reward-info = "7.0.0" -solana-rpc = { path = "rpc", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-rpc-client = { path = "rpc-client", version = "=4.4.0-beta.0", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=4.4.0-beta.0" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=4.4.0-beta.0" } -solana-rpc-client-types = { path = "rpc-client-types", version = "=4.4.0-beta.0" } -solana-runtime = { path = "runtime", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-runtime-transaction = { path = "runtime-transaction", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-rpc = { path = "rpc", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-rpc-client = { path = "rpc-client", version = "=4.4.0-beta.1", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=4.4.0-beta.1" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=4.4.0-beta.1" } +solana-rpc-client-types = { path = "rpc-client-types", version = "=4.4.0-beta.1" } +solana-runtime = { path = "runtime", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-runtime-transaction = { path = "runtime-transaction", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-sanitize = "3.0.1" solana-sbpf = { version = "=0.24.0", default-features = false } solana-sdk-ids = "3.1.0" @@ -462,7 +462,7 @@ solana-secp256k1-recover = "3.3.0" solana-secp256r1-program = "3.0.0" solana-seed-derivable = "3.0.0" solana-seed-phrase = "3.0.0" -solana-send-transaction-service = { path = "send-transaction-service", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-send-transaction-service = { path = "send-transaction-service", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-serde = "3.0.0" solana-serde-varint = "3.0.1" solana-serialize-utils = "4.0.0" @@ -478,48 +478,48 @@ solana-slot-history = "3.2.0" solana-stable-layout = "4.0.0" solana-stake-history = "2.0.0" solana-stake-interface = "5.0.0" -solana-storage-bigtable = { path = "storage-bigtable", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-storage-proto = { path = "storage-proto", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-streamer = { path = "streamer", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm = { path = "svm", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm-callback = { path = "svm-callback", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm-feature-set = { path = "svm-feature-set", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm-log-collector = { path = "svm-log-collector", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm-measure = { path = "svm-measure", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm-timings = { path = "svm-timings", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-storage-bigtable = { path = "storage-bigtable", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-storage-proto = { path = "storage-proto", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-streamer = { path = "streamer", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm = { path = "svm", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm-callback = { path = "svm-callback", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm-feature-set = { path = "svm-feature-set", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm-log-collector = { path = "svm-log-collector", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm-measure = { path = "svm-measure", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm-timings = { path = "svm-timings", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-svm-transaction = "6.0.0" -solana-svm-type-overrides = { path = "svm-type-overrides", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-syscalls = { path = "syscalls", version = "=4.4.0-beta.0", default-features = false, features = ["agave-unstable-api"] } +solana-svm-type-overrides = { path = "svm-type-overrides", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-syscalls = { path = "syscalls", version = "=4.4.0-beta.1", default-features = false, features = ["agave-unstable-api"] } solana-system-interface = { version = "3.3.0", features = ["alloc", "bincode", "serde", "wincode"] } -solana-system-program = { path = "programs/system", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-system-program = { path = "programs/system", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-system-transaction = "5.0.0" solana-sysvar = "5.0.0" solana-sysvar-id = "3.1.0" -solana-test-validator = { path = "test-validator", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-test-validator = { path = "test-validator", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-time-utils = "3.0.0" -solana-tls-utils = { path = "tls-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-tpu-client = { path = "tpu-client", version = "=4.4.0-beta.0", default-features = false, features = ["agave-unstable-api"] } -solana-tpu-client-next = { path = "tpu-client-next", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-tls-utils = { path = "tls-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-tpu-client = { path = "tpu-client", version = "=4.4.0-beta.1", default-features = false, features = ["agave-unstable-api"] } +solana-tpu-client-next = { path = "tpu-client-next", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-transaction = "5.0.0" -solana-transaction-context = { path = "transaction-context", version = "=4.4.0-beta.0", features = ["agave-unstable-api", "bincode"] } +solana-transaction-context = { path = "transaction-context", version = "=4.4.0-beta.1", features = ["agave-unstable-api", "bincode"] } solana-transaction-error = "4.0.0" -solana-transaction-status = { path = "transaction-status", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-transaction-status-client-types = { path = "transaction-status-client-types", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-turbine = { path = "turbine", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-udp-client = { path = "udp-client", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-unified-scheduler-logic = { path = "unified-scheduler-logic", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-unified-scheduler-pool = { path = "unified-scheduler-pool", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-transaction-status = { path = "transaction-status", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-transaction-status-client-types = { path = "transaction-status-client-types", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-turbine = { path = "turbine", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-udp-client = { path = "udp-client", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-unified-scheduler-logic = { path = "unified-scheduler-logic", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-unified-scheduler-pool = { path = "unified-scheduler-pool", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-validator-exit = "3.0.0" -solana-version = { path = "version", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-vote = { path = "vote", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-version = { path = "version", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-vote = { path = "vote", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-vote-interface = "7.0.0" -solana-vote-program = { path = "programs/vote", version = "=4.4.0-beta.0", default-features = false, features = ["agave-unstable-api"] } +solana-vote-program = { path = "programs/vote", version = "=4.4.0-beta.1", default-features = false, features = ["agave-unstable-api"] } solana-wincode-varint = "1.1.0" solana-zk-elgamal-proof-interface = "1.0.0" -solana-zk-elgamal-proof-program = { path = "programs/zk-elgamal-proof", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-zk-elgamal-proof-program = { path = "programs/zk-elgamal-proof", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-zk-sdk = "8.0.1" solana-zk-sdk-pod = "0.1.2" -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } spl-associated-token-account-interface = "2.0.0" spl-generic-token = "2.0.0" spl-memo-interface = "2.1.0" diff --git a/core/src/banking_stage.rs b/core/src/banking_stage.rs index d32da7589ef..6a49cd2d141 100644 --- a/core/src/banking_stage.rs +++ b/core/src/banking_stage.rs @@ -59,6 +59,7 @@ use { pub mod transaction_scheduler; +mod alpenglow_timing; mod committer; mod consume_worker; mod consumer; @@ -549,7 +550,12 @@ impl BankingStage { bounded(num_workers.saturating_mul(CHANNEL_CAPACITY)); // Spawn the worker threads - let decision_maker = DecisionMaker::from(self.poh_recorder.read().unwrap().deref()); + let migration_status = self.bank_forks.read().unwrap().migration_status(); + let decision_maker = DecisionMaker::new( + self.poh_recorder.read().unwrap().shared_leader_state(), + migration_status, + self.alpenglow_slot_clock.clone(), + ); let mut worker_metrics = Vec::with_capacity(num_workers); for (index, work_receiver) in work_receivers.into_iter().enumerate() { let id = index as u32; @@ -636,7 +642,12 @@ impl BankingStage { self.transaction_recorder.clone(), self.log_messages_bytes_limit, ); - let decision_maker = DecisionMaker::from(self.poh_recorder.read().unwrap().deref()); + let migration_status = self.bank_forks.read().unwrap().migration_status(); + let decision_maker = DecisionMaker::new( + self.poh_recorder.read().unwrap().shared_leader_state(), + migration_status, + self.alpenglow_slot_clock.clone(), + ); let worker_exit_signal = self.worker_exit_signal.clone(); let shutdown_signal = self.banking_shutdown_signal.clone(); diff --git a/core/src/banking_stage/alpenglow_timing.rs b/core/src/banking_stage/alpenglow_timing.rs new file mode 100644 index 00000000000..5d1d315c957 --- /dev/null +++ b/core/src/banking_stage/alpenglow_timing.rs @@ -0,0 +1,113 @@ +//! Shared slot timing calculations for Alpenglow. + +use { + solana_clock::Slot, solana_runtime::leader_schedule_utils::last_of_consecutive_leader_slots, + std::time::Duration, +}; + +pub(super) const ALPENGLOW_PROGRESS_STEP: u8 = 5; + +fn alpenglow_progress(elapsed: Duration, slot_duration: Duration) -> u8 { + if slot_duration.is_zero() { + return 100; + } + + let percentage = elapsed + .as_nanos() + .saturating_mul(100) + .saturating_div(slot_duration.as_nanos()) + .min(100) as u8; + (percentage / ALPENGLOW_PROGRESS_STEP) * ALPENGLOW_PROGRESS_STEP +} + +pub(super) fn alpenglow_slot_progress( + window_start_slot: Slot, + elapsed: Duration, + slot_duration: Duration, +) -> (Slot, u8) { + let window_end_slot = last_of_consecutive_leader_slots(window_start_slot); + if slot_duration.is_zero() { + return (window_end_slot, 100); + } + + let elapsed_nanos = elapsed.as_nanos(); + let slot_duration_nanos = slot_duration.as_nanos(); + let elapsed_slots = elapsed_nanos / slot_duration_nanos; + let window_slot_offset = u128::from(window_end_slot - window_start_slot); + if elapsed_slots > window_slot_offset { + return (window_end_slot, 100); + } + + let current_slot = window_start_slot + elapsed_slots as Slot; + let elapsed_in_slot = Duration::from_nanos_u128(elapsed_nanos % slot_duration_nanos); + ( + current_slot, + alpenglow_progress(elapsed_in_slot, slot_duration), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_alpenglow_progress() { + let slot_duration = Duration::from_millis(400); + assert_eq!(alpenglow_progress(Duration::ZERO, slot_duration), 0); + assert_eq!( + alpenglow_progress(Duration::from_millis(19), slot_duration), + 0 + ); + assert_eq!( + alpenglow_progress(Duration::from_millis(20), slot_duration), + 5 + ); + assert_eq!( + alpenglow_progress(Duration::from_millis(399), slot_duration), + 95 + ); + assert_eq!(alpenglow_progress(slot_duration, slot_duration), 100); + assert_eq!( + alpenglow_progress(Duration::from_millis(800), slot_duration), + 100 + ); + assert_eq!(alpenglow_progress(Duration::ZERO, Duration::ZERO), 100); + } + + #[test] + fn test_alpenglow_slot_progress() { + let slot_duration = Duration::from_millis(400); + assert_eq!( + alpenglow_slot_progress(4, Duration::ZERO, slot_duration), + (4, 0) + ); + assert_eq!( + alpenglow_slot_progress(4, Duration::from_millis(399), slot_duration), + (4, 95) + ); + assert_eq!( + alpenglow_slot_progress(4, slot_duration, slot_duration), + (5, 0) + ); + assert_eq!( + alpenglow_slot_progress(4, Duration::from_millis(800), slot_duration), + (6, 0) + ); + assert_eq!( + alpenglow_slot_progress(4, Duration::from_millis(1_599), slot_duration), + (7, 95) + ); + assert_eq!( + alpenglow_slot_progress(4, Duration::from_millis(1_600), slot_duration), + (7, 100) + ); + assert_eq!( + alpenglow_slot_progress(4, Duration::from_millis(200), Duration::from_millis(200)), + (5, 0) + ); + assert_eq!( + alpenglow_slot_progress(4, Duration::ZERO, Duration::ZERO), + (7, 100) + ); + } +} diff --git a/core/src/banking_stage/decision_maker.rs b/core/src/banking_stage/decision_maker.rs index e6fd79fd45e..e9400f89112 100644 --- a/core/src/banking_stage/decision_maker.rs +++ b/core/src/banking_stage/decision_maker.rs @@ -1,11 +1,14 @@ use { + super::alpenglow_timing::alpenglow_slot_progress, + agave_votor::slot_clock::SharedAlpenglowSlotClock, + agave_votor_messages::migration::MigrationStatus, solana_clock::{ DEFAULT_TICKS_PER_SLOT, FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET, HOLD_TRANSACTIONS_SLOT_OFFSET, }, - solana_poh::poh_recorder::{PohRecorder, SharedLeaderState}, + solana_poh::poh_recorder::{LeaderState, SharedLeaderState}, solana_runtime::bank::Bank, - std::sync::Arc, + std::{sync::Arc, time::Instant}, }; #[derive(Debug, Clone)] @@ -29,6 +32,8 @@ impl BufferedPacketsDecision { #[derive(Clone)] pub struct DecisionMaker { shared_leader_state: SharedLeaderState, + migration_status: Arc, + alpenglow_slot_clock: SharedAlpenglowSlotClock, } impl std::fmt::Debug for DecisionMaker { @@ -38,18 +43,66 @@ impl std::fmt::Debug for DecisionMaker { } impl DecisionMaker { - pub fn new(shared_leader_state: SharedLeaderState) -> Self { + pub fn new( + shared_leader_state: SharedLeaderState, + migration_status: Arc, + alpenglow_slot_clock: SharedAlpenglowSlotClock, + ) -> Self { Self { shared_leader_state, + migration_status, + alpenglow_slot_clock, } } pub(crate) fn make_consume_or_forward_decision(&self) -> BufferedPacketsDecision { + self.make_consume_or_forward_decision_at(Instant::now()) + } + + fn make_consume_or_forward_decision_at(&self, now: Instant) -> BufferedPacketsDecision { let state = self.shared_leader_state.load(); if let Some(working_bank) = state.working_bank() { BufferedPacketsDecision::Consume(working_bank.clone()) - } else if let Some(leader_first_tick_height) = state.leader_first_tick_height() { + } else if self.migration_status.is_alpenglow_enabled() { + self.make_decision_alpenglow(&state, now) + } else { + Self::make_decision_poh(&state) + } + } + + fn make_decision_alpenglow( + &self, + state: &LeaderState, + now: Instant, + ) -> BufferedPacketsDecision { + let Some((leader_slot, last_leader_slot)) = state.next_leader_slot_range() else { + return BufferedPacketsDecision::Forward; + }; + let Some(slot_info) = self.alpenglow_slot_clock.load() else { + return BufferedPacketsDecision::Forward; + }; + // PoH tick height no longer advances after Alpenglow activation. + let (current_slot, _) = alpenglow_slot_progress( + slot_info.slot, + now.saturating_duration_since(slot_info.started_at), + slot_info.slot_duration, + ); + if current_slot > last_leader_slot { + return BufferedPacketsDecision::Forward; + } + let slots_until_leader = leader_slot.saturating_sub(current_slot); + if slots_until_leader < FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET { + BufferedPacketsDecision::Hold + } else if slots_until_leader < HOLD_TRANSACTIONS_SLOT_OFFSET { + BufferedPacketsDecision::ForwardAndHold + } else { + BufferedPacketsDecision::Forward + } + } + + fn make_decision_poh(state: &LeaderState) -> BufferedPacketsDecision { + if let Some(leader_first_tick_height) = state.leader_first_tick_height() { let current_tick_height = state.tick_height(); let ticks_until_leader = leader_first_tick_height.saturating_sub(current_tick_height); if ticks_until_leader @@ -67,17 +120,10 @@ impl DecisionMaker { } } -impl From<&PohRecorder> for DecisionMaker { - fn from(poh_recorder: &PohRecorder) -> Self { - Self::new(poh_recorder.shared_leader_state()) - } -} - #[cfg(test)] mod tests { use { - super::*, solana_ledger::genesis_utils::create_genesis_config, - solana_poh::poh_recorder::LeaderState, solana_runtime::bank::Bank, + super::*, solana_ledger::genesis_utils::create_genesis_config, solana_runtime::bank::Bank, }; #[test] @@ -89,6 +135,97 @@ mod tests { assert!(BufferedPacketsDecision::Hold.bank().is_none()); } + #[test] + fn test_alpenglow_decision_with_stopped_ticks() { + use std::time::Duration; + + let mut shared_leader_state = SharedLeaderState::new(0, None, Some((24, 27))); + let clock = SharedAlpenglowSlotClock::default(); + let decision_maker = DecisionMaker::new( + shared_leader_state.clone(), + Arc::new(MigrationStatus::post_migration_status()), + clock.clone(), + ); + let started_at = Instant::now(); + let slot_duration = Duration::from_millis(200); + + // No clock observation yet. + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at), + BufferedPacketsDecision::Forward + ); + + clock.update(4, started_at, slot_duration); + // Exactly twenty slots away: do not buffer yet. + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at), + BufferedPacketsDecision::Forward + ); + // Progress within the slot does not change the buffering decision. + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at + slot_duration / 2), + BufferedPacketsDecision::Forward + ); + // Time advances while tick height stays at zero. + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at + slot_duration), + BufferedPacketsDecision::ForwardAndHold + ); + // A stale observation cannot advance past its leader window. + assert_matches!( + decision_maker + .make_consume_or_forward_decision_at(started_at + Duration::from_secs(60)), + BufferedPacketsDecision::ForwardAndHold + ); + + clock.update(20, started_at, slot_duration); + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at + slot_duration * 2), + BufferedPacketsDecision::ForwardAndHold + ); + // Exactly one slot away. + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at + slot_duration * 3), + BufferedPacketsDecision::Hold + ); + // The leader window has begun but no working bank is available. + clock.update(24, started_at, slot_duration); + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at), + BufferedPacketsDecision::Hold + ); + + // Keep buffering through the final slot of our leader window. + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at + slot_duration * 3), + BufferedPacketsDecision::Hold + ); + // A newer observation beyond our window must stop buffering. + clock.update(28, started_at, slot_duration); + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at), + BufferedPacketsDecision::Forward + ); + + shared_leader_state.store(Arc::new(LeaderState::new(None, 0, None, None))); + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at), + BufferedPacketsDecision::Forward + ); + + // A working bank takes precedence over timing and schedule information. + shared_leader_state.store(Arc::new(LeaderState::new( + Some(Arc::new(Bank::default_for_tests())), + 0, + None, + None, + ))); + assert_matches!( + decision_maker.make_consume_or_forward_decision_at(started_at), + BufferedPacketsDecision::Consume(_) + ); + } + #[test] fn test_make_consume_or_forward_decision() { let genesis_config = create_genesis_config(2).genesis_config; @@ -96,7 +233,10 @@ mod tests { let mut shared_leader_state = SharedLeaderState::new(0, None, None); - let decision_maker = DecisionMaker::new(shared_leader_state.clone()); + // Before migration, decisions must use ticks even if a clock is populated. + let clock = SharedAlpenglowSlotClock::default(); + clock.update(100, Instant::now(), std::time::Duration::from_millis(200)); + let decision_maker = DecisionMaker::new(shared_leader_state.clone(), Arc::default(), clock); // No active bank, no leader first tick height. assert_matches!( diff --git a/core/src/banking_stage/progress_tracker.rs b/core/src/banking_stage/progress_tracker.rs index 92e8ff3a3cc..712916c6236 100644 --- a/core/src/banking_stage/progress_tracker.rs +++ b/core/src/banking_stage/progress_tracker.rs @@ -2,6 +2,7 @@ //! use { + super::alpenglow_timing::{ALPENGLOW_PROGRESS_STEP, alpenglow_slot_progress}, crate::banking_stage::consume_worker::ConsumeWorkerMetrics, agave_scheduler_bindings::ProgressMessage, agave_votor::slot_clock::SharedAlpenglowSlotClock, @@ -9,7 +10,6 @@ use { solana_clock::{BankId, Slot}, solana_cost_model::cost_tracker::{SharedAllocatedAccountsDataSize, SharedBlockCost}, solana_poh::poh_recorder::SharedLeaderState, - solana_runtime::leader_schedule_utils::last_of_consecutive_leader_slots, std::{ sync::{ Arc, @@ -20,7 +20,6 @@ use { }, }; -const ALPENGLOW_PROGRESS_STEP: u8 = 5; const ALPENGLOW_PROGRESS_SPIN_DURATION: Duration = Duration::from_millis(1); /// Spawns a thread to track and send progress updates. @@ -271,19 +270,6 @@ fn target_bank_time_ms(ns_per_slot: u128) -> u16 { u16::try_from(milliseconds).unwrap_or(u16::MAX) } -fn alpenglow_progress(elapsed: Duration, slot_duration: Duration) -> u8 { - if slot_duration.is_zero() { - return 100; - } - - let percentage = elapsed - .as_nanos() - .saturating_mul(100) - .saturating_div(slot_duration.as_nanos()) - .min(100) as u8; - (percentage / ALPENGLOW_PROGRESS_STEP) * ALPENGLOW_PROGRESS_STEP -} - fn next_alpenglow_progress_deadline( started_at: Instant, slot_duration: Duration, @@ -304,32 +290,6 @@ fn next_alpenglow_progress_deadline( started_at.checked_add(Duration::from_nanos_u128(next_boundary_nanos)) } -fn alpenglow_slot_progress( - window_start_slot: Slot, - elapsed: Duration, - slot_duration: Duration, -) -> (Slot, u8) { - let window_end_slot = last_of_consecutive_leader_slots(window_start_slot); - if slot_duration.is_zero() { - return (window_end_slot, 100); - } - - let elapsed_nanos = elapsed.as_nanos(); - let slot_duration_nanos = slot_duration.as_nanos(); - let elapsed_slots = elapsed_nanos / slot_duration_nanos; - let window_slot_offset = u128::from(window_end_slot - window_start_slot); - if elapsed_slots > window_slot_offset { - return (window_end_slot, 100); - } - - let current_slot = window_start_slot + elapsed_slots as Slot; - let elapsed_in_slot = Duration::from_nanos_u128(elapsed_nanos % slot_duration_nanos); - ( - current_slot, - alpenglow_progress(elapsed_in_slot, slot_duration), - ) -} - fn alpenglow_bank_progress( bank_slot: Slot, window_start_slot: Slot, @@ -554,30 +514,6 @@ mod tests { ); } - #[test] - fn test_alpenglow_progress() { - let slot_duration = Duration::from_millis(400); - assert_eq!(alpenglow_progress(Duration::ZERO, slot_duration), 0); - assert_eq!( - alpenglow_progress(Duration::from_millis(19), slot_duration), - 0 - ); - assert_eq!( - alpenglow_progress(Duration::from_millis(20), slot_duration), - 5 - ); - assert_eq!( - alpenglow_progress(Duration::from_millis(399), slot_duration), - 95 - ); - assert_eq!(alpenglow_progress(slot_duration, slot_duration), 100); - assert_eq!( - alpenglow_progress(Duration::from_millis(800), slot_duration), - 100 - ); - assert_eq!(alpenglow_progress(Duration::ZERO, Duration::ZERO), 100); - } - #[test] fn test_next_alpenglow_progress_deadline() { let started_at = Instant::now(); @@ -616,43 +552,6 @@ mod tests { ); } - #[test] - fn test_alpenglow_slot_progress() { - let slot_duration = Duration::from_millis(400); - assert_eq!( - alpenglow_slot_progress(4, Duration::ZERO, slot_duration), - (4, 0) - ); - assert_eq!( - alpenglow_slot_progress(4, Duration::from_millis(399), slot_duration), - (4, 95) - ); - assert_eq!( - alpenglow_slot_progress(4, slot_duration, slot_duration), - (5, 0) - ); - assert_eq!( - alpenglow_slot_progress(4, Duration::from_millis(800), slot_duration), - (6, 0) - ); - assert_eq!( - alpenglow_slot_progress(4, Duration::from_millis(1_599), slot_duration), - (7, 95) - ); - assert_eq!( - alpenglow_slot_progress(4, Duration::from_millis(1_600), slot_duration), - (7, 100) - ); - assert_eq!( - alpenglow_slot_progress(4, Duration::from_millis(200), Duration::from_millis(200)), - (5, 0) - ); - assert_eq!( - alpenglow_slot_progress(4, Duration::ZERO, Duration::ZERO), - (7, 100) - ); - } - #[test] fn test_alpenglow_bank_progress() { let slot_duration = Duration::from_millis(400); diff --git a/core/src/banking_stage/transaction_scheduler/scheduler_controller.rs b/core/src/banking_stage/transaction_scheduler/scheduler_controller.rs index 08efc0bab0d..1ad223dd929 100644 --- a/core/src/banking_stage/transaction_scheduler/scheduler_controller.rs +++ b/core/src/banking_stage/transaction_scheduler/scheduler_controller.rs @@ -617,6 +617,7 @@ mod tests { agave_banking_stage_ingress_types::{ BankingPacketBatch, BankingPacketReceiver, to_banking_packet_batch, }, + agave_votor::slot_clock::SharedAlpenglowSlotClock, crossbeam_channel::{Receiver, Sender, bounded}, itertools::Itertools, solana_account::{AccountSharedData, state_traits::StateMutWincode as _}, @@ -723,7 +724,11 @@ mod tests { let shared_leader_state = SharedLeaderState::new(0, None, None); - let decision_maker = DecisionMaker::new(shared_leader_state.clone()); + let decision_maker = DecisionMaker::new( + shared_leader_state.clone(), + bank_forks.read().unwrap().migration_status(), + SharedAlpenglowSlotClock::default(), + ); let (banking_packet_sender, banking_packet_receiver) = bounded(1024); let receive_and_buffer = diff --git a/dev-bins/Cargo.lock b/dev-bins/Cargo.lock index cc46d819639..01131ff8223 100644 --- a/dev-bins/Cargo.lock +++ b/dev-bins/Cargo.lock @@ -56,7 +56,7 @@ dependencies = [ [[package]] name = "agave-banking-stage-ingress-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "solana-perf", @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-bls-cert-verify" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-votor-messages", "bitvec", @@ -79,7 +79,7 @@ dependencies = [ [[package]] name = "agave-bls-sigverify" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-cert-verify", "agave-math-utils", @@ -111,7 +111,7 @@ dependencies = [ [[package]] name = "agave-conformance" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-transaction-view", @@ -173,14 +173,14 @@ dependencies = [ [[package]] name = "agave-cpu-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "libc", ] [[package]] name = "agave-feature-set" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "ahash 0.8.12", "solana-epoch-schedule", @@ -193,7 +193,7 @@ dependencies = [ [[package]] name = "agave-fs" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-io-uring", "io-uring", @@ -226,7 +226,7 @@ dependencies = [ [[package]] name = "agave-io-uring" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "io-uring", "libc", @@ -237,7 +237,7 @@ dependencies = [ [[package]] name = "agave-ledger-tool" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -321,7 +321,7 @@ dependencies = [ [[package]] name = "agave-logger" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "env_logger", "libc", @@ -331,14 +331,14 @@ dependencies = [ [[package]] name = "agave-math-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "num-traits", ] [[package]] name = "agave-precompiles" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "bincode", @@ -357,14 +357,14 @@ dependencies = [ [[package]] name = "agave-random" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "rand 0.9.4", ] [[package]] name = "agave-reserved-account-keys" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "solana-pubkey 4.3.0", @@ -393,7 +393,7 @@ dependencies = [ [[package]] name = "agave-scheduling-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-scheduler-bindings", @@ -409,7 +409,7 @@ dependencies = [ [[package]] name = "agave-snapshots" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-fs", "bincode", @@ -438,7 +438,7 @@ dependencies = [ [[package]] name = "agave-store-tool" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "ahash 0.8.12", "clap 2.34.0", @@ -470,7 +470,7 @@ dependencies = [ [[package]] name = "agave-votor" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-sigverify", "agave-logger", @@ -514,7 +514,7 @@ dependencies = [ [[package]] name = "agave-votor-messages" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "bitvec", @@ -537,14 +537,14 @@ dependencies = [ [[package]] name = "agave-votor-transport" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", "arrayvec", "bytes", "crossbeam-channel", "log", "qualifier_attr", - "quinn", "solana-keypair", "solana-metrics", "solana-net-utils", @@ -557,7 +557,7 @@ dependencies = [ [[package]] name = "agave-xdp" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-cpu-utils", "agave-xdp-ebpf", @@ -575,7 +575,7 @@ dependencies = [ [[package]] name = "agave-xdp-ebpf" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "aya-ebpf", ] @@ -699,6 +699,50 @@ version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" +[[package]] +name = "anza-quinn" +version = "0.11.12-issue2860.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd524576ab56786d8241905b12498e8ec6b9a09a58bfe8ef9e9dfcf511aeecf4" +dependencies = [ + "anza-quinn-proto", + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.5.10", + "thiserror 2.0.20", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "anza-quinn-proto" +version = "0.11.18-issue2860.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9dfece0ce5ffc483085c0112b8499dabab137e2eb028f1ff3a28d5b24d6d477" +dependencies = [ + "bytes", + "fastbloom", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "slab", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "web-time", +] + [[package]] name = "arc-swap" version = "1.9.2" @@ -4661,7 +4705,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc" dependencies = [ "bytes", - "fastbloom", "getrandom 0.4.3", "lru-slab", "rand 0.10.2", @@ -4670,7 +4713,6 @@ dependencies = [ "rustc-hash", "rustls", "rustls-pki-types", - "rustls-platform-verifier", "slab", "thiserror 2.0.20", "tinyvec", @@ -5720,7 +5762,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "Inflector", "base64 0.23.1", @@ -5764,7 +5806,7 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bs58", @@ -5788,7 +5830,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-fs", "ahash 0.8.12", @@ -5937,7 +5979,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bv", "fnv", @@ -6013,7 +6055,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "qualifier_attr", @@ -6039,7 +6081,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "ahash 0.8.12", "bv", @@ -6057,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-builtins" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "solana-bpf-loader-program", @@ -6074,7 +6116,7 @@ dependencies = [ [[package]] name = "solana-builtins-default-costs" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "ahash 0.8.12", @@ -6084,7 +6126,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bip39", "bs58", @@ -6114,7 +6156,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "dirs-next", "serde", @@ -6125,7 +6167,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "Inflector", "agave-reserved-account-keys", @@ -6170,7 +6212,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "async-trait", "bincode", @@ -6272,7 +6314,7 @@ dependencies = [ [[package]] name = "solana-compute-budget" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-fee-structure", "solana-program-runtime", @@ -6280,7 +6322,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-instruction" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "solana-borsh", @@ -6308,7 +6350,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program-runtime", ] @@ -6331,7 +6373,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "async-trait", "crossbeam-channel", @@ -6349,7 +6391,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-banking-stage-ingress-types", "agave-bls-cert-verify", @@ -6489,7 +6531,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "ahash 0.8.12", @@ -6559,7 +6601,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-snapshots", "log", @@ -6603,7 +6645,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-transaction-view", "agave-votor-messages", @@ -6686,7 +6728,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "log", @@ -6729,7 +6771,7 @@ dependencies = [ [[package]] name = "solana-fee" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-fee-structure", "solana-svm-transaction", @@ -6800,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-snapshots", "log", @@ -6824,7 +6866,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-geyser-plugin-interface", "arc-swap", @@ -6860,7 +6902,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "agave-random", @@ -7086,7 +7128,7 @@ dependencies = [ [[package]] name = "solana-lattice-hash" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "blake3", @@ -7096,7 +7138,7 @@ dependencies = [ [[package]] name = "solana-leader-schedule" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-random", "itertools 0.15.0", @@ -7108,7 +7150,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-reserved-account-keys", @@ -7247,11 +7289,11 @@ dependencies = [ [[package]] name = "solana-measure" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-merkle-tree" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-hash", "solana-sha256-hasher", @@ -7278,7 +7320,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "gethostname", @@ -7307,9 +7349,10 @@ checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" [[package]] name = "solana-net-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-xdp", + "anza-quinn", "bincode", "bytes", "cfg-if 1.0.4", @@ -7317,7 +7360,6 @@ dependencies = [ "itertools 0.15.0", "log", "nix", - "quinn", "rand 0.9.4", "serde", "socket2 0.6.5", @@ -7403,7 +7445,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-transaction-view", "ahash 0.8.12", @@ -7442,7 +7484,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-cpu-utils", "agave-votor-messages", @@ -7508,7 +7550,7 @@ dependencies = [ [[package]] name = "solana-program-binaries" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "solana-account", @@ -7566,7 +7608,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bincode", @@ -7632,7 +7674,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "futures-util", @@ -7654,13 +7696,13 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", "async-lock", "async-trait", "futures 0.3.34", "log", - "quinn", "solana-connection-cache", "solana-keypair", "solana-measure", @@ -7678,7 +7720,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "log", "num_cpus", @@ -7686,7 +7728,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "console 0.16.4", "dialoguer", @@ -7733,7 +7775,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-snapshots", @@ -7817,7 +7859,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-votor-messages", "async-trait", @@ -7859,7 +7901,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "anyhow", "jsonrpc-core", @@ -7877,7 +7919,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account", "solana-commitment-config", @@ -7893,7 +7935,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bs58", @@ -7916,7 +7958,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-cert-verify", "agave-feature-set", @@ -8048,7 +8090,7 @@ dependencies = [ [[package]] name = "solana-runtime-transaction" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-transaction-view", @@ -8172,7 +8214,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "itertools 0.15.0", @@ -8399,7 +8441,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-reserved-account-keys", "base64 0.23.1", @@ -8437,7 +8479,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bs58", "prost", @@ -8462,8 +8504,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", "bytes", "crossbeam-channel", "futures 0.3.34", @@ -8474,7 +8517,6 @@ dependencies = [ "nix", "num_cpus", "pem", - "quinn", "rand 0.9.4", "rustls", "smallvec", @@ -8496,7 +8538,7 @@ dependencies = [ [[package]] name = "solana-svm" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-precompiles", @@ -8531,6 +8573,7 @@ dependencies = [ "solana-program-runtime", "solana-pubkey 4.3.0", "solana-rent", + "solana-sbpf", "solana-sdk-ids", "solana-signature", "solana-slot-hashes", @@ -8558,7 +8601,7 @@ dependencies = [ [[package]] name = "solana-svm-callback" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account", "solana-clock 4.0.0", @@ -8568,7 +8611,7 @@ dependencies = [ [[package]] name = "solana-svm-conformance" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-precompiles", @@ -8592,22 +8635,22 @@ dependencies = [ [[package]] name = "solana-svm-feature-set" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-svm-log-collector" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "log", ] [[package]] name = "solana-svm-measure" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-svm-timings" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "eager", "enum-iterator", @@ -8630,14 +8673,14 @@ dependencies = [ [[package]] name = "solana-svm-type-overrides" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "rand 0.9.4", ] [[package]] name = "solana-syscalls" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "libsecp256k1", @@ -8695,7 +8738,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "log", @@ -8784,9 +8827,9 @@ checksum = "0ced92c60aa76ec4780a9d93f3bd64dfa916e1b998eacc6f1c110f3f444f02c9" [[package]] name = "solana-tls-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ - "quinn", + "anza-quinn", "rustls", "rustls-webpki", "solana-keypair", @@ -8796,7 +8839,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "futures-util", "indicatif", @@ -8824,8 +8867,9 @@ dependencies = [ [[package]] name = "solana-tpu-client-next" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", "async-trait", "bytes", "futures 0.3.34", @@ -8833,7 +8877,6 @@ dependencies = [ "itertools 0.15.0", "log", "lru 0.18.4", - "quinn", "rustls", "solana-clock 4.0.0", "solana-commitment-config", @@ -8877,7 +8920,7 @@ dependencies = [ [[package]] name = "solana-transaction-context" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "serde", @@ -8907,7 +8950,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "Inflector", "agave-reserved-account-keys", @@ -8950,7 +8993,7 @@ dependencies = [ [[package]] name = "solana-transaction-status-client-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bincode", @@ -8973,7 +9016,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-votor", @@ -9019,7 +9062,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "async-trait", "solana-connection-cache", @@ -9031,7 +9074,7 @@ dependencies = [ [[package]] name = "solana-unified-scheduler-logic" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "solana-clock 4.0.0", @@ -9044,7 +9087,7 @@ dependencies = [ [[package]] name = "solana-unified-scheduler-pool" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-banking-stage-ingress-types", "assert_matches", @@ -9076,7 +9119,7 @@ checksum = "c5d2face763df5afeaa9509b9019968860e69cc1531ec8b4a2e6c7b702204d5a" [[package]] name = "solana-version" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "rand 0.9.4", @@ -9090,7 +9133,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "log", @@ -9147,7 +9190,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "bincode", @@ -9225,7 +9268,7 @@ dependencies = [ [[package]] name = "solana-zk-elgamal-proof-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bytemuck", "solana-instruction 4.0.0", @@ -9286,7 +9329,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program-runtime", ] diff --git a/dev-bins/Cargo.toml b/dev-bins/Cargo.toml index dd640688eef..39bd7c17465 100644 --- a/dev-bins/Cargo.toml +++ b/dev-bins/Cargo.toml @@ -9,7 +9,7 @@ members = [ resolver = "2" [workspace.package] -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" authors = ["Anza Maintainers "] description = "Blockchain, Rebuilt for Scale" repository = "https://github.com/anza-xyz/agave" @@ -37,14 +37,14 @@ used_underscore_binding = "deny" new_without_default = "allow" [workspace.dependencies] -agave-feature-set = { path = "../feature-set", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-logger = { path = "../logger", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-precompiles = { path = "../precompiles", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-reserved-account-keys = { path = "../reserved-account-keys", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-snapshots = { path = "../snapshots", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +agave-feature-set = { path = "../feature-set", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-logger = { path = "../logger", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-precompiles = { path = "../precompiles", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-reserved-account-keys = { path = "../reserved-account-keys", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-snapshots = { path = "../snapshots", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } agave-transaction-view = "7.0.0" -agave-votor = { path = "../votor", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -agave-votor-messages = { path = "../votor-messages", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +agave-votor = { path = "../votor", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +agave-votor-messages = { path = "../votor-messages", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } ahash = "0.8.11" assert_cmd = "2.2.2" bincode = "1.3.3" @@ -76,64 +76,64 @@ serde_yaml = "0.9.34" serial_test = "3.2.0" signal-hook = "0.4.4" solana-account = "5.0.0" -solana-account-decoder = { path = "../account-decoder", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-accounts-db = { path = "../accounts-db", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-account-decoder = { path = "../account-decoder", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-accounts-db = { path = "../accounts-db", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-address-lookup-table-interface = "4.0.0" -solana-bloom = { path = "../bloom", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-bloom = { path = "../bloom", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-bls-signatures = { version = "4.0.0", features = ["serde"] } -solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-builtins = { path = "../builtins", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-clap-utils = { path = "../clap-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-cli-config = { path = "../cli-config", version = "=4.4.0-beta.0" } -solana-cli-output = { path = "../cli-output", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-client = { path = "../client", version = "=4.4.0-beta.0" } +solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-builtins = { path = "../builtins", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-clap-utils = { path = "../clap-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-cli-config = { path = "../cli-config", version = "=4.4.0-beta.1" } +solana-cli-output = { path = "../cli-output", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-client = { path = "../client", version = "=4.4.0-beta.1" } solana-clock = "3.2.0" solana-cluster-type = "3.2.0" solana-commitment-config = "3.0.0" -solana-compute-budget = { path = "../compute-budget", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-compute-budget = { path = "../compute-budget", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-compute-budget-interface = "3.1.0" -solana-compute-budget-program = { path = "../programs/compute-budget", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-connection-cache = { path = "../connection-cache", version = "=4.4.0-beta.0", default-features = false, features = ["agave-unstable-api"] } -solana-core = { path = "../core", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-cost-model = { path = "../cost-model", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-entry = { path = "../entry", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-compute-budget-program = { path = "../programs/compute-budget", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-connection-cache = { path = "../connection-cache", version = "=4.4.0-beta.1", default-features = false, features = ["agave-unstable-api"] } +solana-core = { path = "../core", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-cost-model = { path = "../cost-model", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-entry = { path = "../entry", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-epoch-schedule = "3.2.0" -solana-faucet = { path = "../faucet", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-faucet = { path = "../faucet", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-feature-gate-interface = "5.0.0" solana-fee-calculator = "3.2.2" -solana-genesis = { path = "../genesis", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-genesis = { path = "../genesis", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-genesis-config = "5.0.0" -solana-genesis-utils = { path = "../genesis-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-geyser-plugin-manager = { path = "../geyser-plugin-manager", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-gossip = { path = "../gossip", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-genesis-utils = { path = "../genesis-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-geyser-plugin-manager = { path = "../geyser-plugin-manager", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-gossip = { path = "../gossip", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-hash = "4.5.0" solana-inflation = "3.1.1" solana-instruction = "4.0.0" solana-instruction-error = "3.0.0" solana-keypair = "4.0.0" -solana-lattice-hash = { path = "../lattice-hash", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-leader-schedule = { path = "../leader-schedule", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-ledger = { path = "../ledger", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-lattice-hash = { path = "../lattice-hash", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-leader-schedule = { path = "../leader-schedule", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-ledger = { path = "../ledger", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-loader-v3-interface = "9.0.0" solana-loader-v4-interface = "3.1.0" -solana-local-cluster = { path = "../local-cluster", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-measure = { path = "../measure", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-local-cluster = { path = "../local-cluster", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-measure = { path = "../measure", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-message = "5.0.0" -solana-metrics = { path = "../metrics", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-metrics = { path = "../metrics", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-native-token = "3.0.0" -solana-net-utils = { path = "../net-utils", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-net-utils = { path = "../net-utils", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-nonce = "3.2.1" solana-packet = "4.2.0" solana-precompile-error = "3.0.0" -solana-program-runtime = { path = "../program-runtime", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-program-runtime = { path = "../program-runtime", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-pubkey = { version = "4.2.0", default-features = false } -solana-quic-client = { path = "../quic-client", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-quic-client = { path = "../quic-client", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-rent = "4.2.1" -solana-rpc = { path = "../rpc", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-rpc-client = { path = "../rpc-client", version = "=4.4.0-beta.0", default-features = false } -solana-rpc-client-api = { path = "../rpc-client-api", version = "=4.4.0-beta.0" } -solana-runtime = { path = "../runtime", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-runtime-transaction = { path = "../runtime-transaction", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-rpc = { path = "../rpc", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-rpc-client = { path = "../rpc-client", version = "=4.4.0-beta.1", default-features = false } +solana-rpc-client-api = { path = "../rpc-client-api", version = "=4.4.0-beta.1" } +solana-runtime = { path = "../runtime", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-runtime-transaction = { path = "../runtime-transaction", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-sanitize = "3.0.1" solana-sbpf = { version = "=0.24.0", default-features = false } solana-sdk-ids = "3.1.0" @@ -145,32 +145,32 @@ solana-slot-hashes = "4.0.0" solana-slot-history = "3.2.0" solana-stake-history = "2.0.0" solana-stake-interface = "5.0.0" -solana-storage-bigtable = { path = "../storage-bigtable", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-streamer = { path = "../streamer", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm = { path = "../svm", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm-callback = { path = "../svm-callback", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm-feature-set = { path = "../svm-feature-set", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm-log-collector = { path = "../svm-log-collector", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-svm-timings = { path = "../svm-timings", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-storage-bigtable = { path = "../storage-bigtable", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-streamer = { path = "../streamer", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm = { path = "../svm", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm-callback = { path = "../svm-callback", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm-feature-set = { path = "../svm-feature-set", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm-log-collector = { path = "../svm-log-collector", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-svm-timings = { path = "../svm-timings", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-svm-transaction = "6.0.0" -solana-syscalls = { path = "../syscalls", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-syscalls = { path = "../syscalls", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-system-interface = "3.2" -solana-system-program = { path = "../programs/system", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-system-program = { path = "../programs/system", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-system-transaction = "5.0.0" solana-sysvar = "5.0.0" solana-sysvar-id = "3.1.0" -solana-test-validator = { path = "../test-validator", version = "=4.4.0-beta.0" } +solana-test-validator = { path = "../test-validator", version = "=4.4.0-beta.1" } solana-time-utils = "3.0.0" -solana-tpu-client = { path = "../tpu-client", version = "=4.4.0-beta.0", default-features = false, features = ["agave-unstable-api"] } +solana-tpu-client = { path = "../tpu-client", version = "=4.4.0-beta.1", default-features = false, features = ["agave-unstable-api"] } solana-transaction = "5.0.0" -solana-transaction-context = { path = "../transaction-context", version = "=4.4.0-beta.0", features = ["agave-unstable-api", "bincode"] } +solana-transaction-context = { path = "../transaction-context", version = "=4.4.0-beta.1", features = ["agave-unstable-api", "bincode"] } solana-transaction-error = "4.0.0" -solana-transaction-status = { path = "../transaction-status", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-unified-scheduler-pool = { path = "../unified-scheduler-pool", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-version = { path = "../version", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } -solana-vote = { path = "../vote", version = "=4.4.0-beta.0", features = ["agave-unstable-api"] } +solana-transaction-status = { path = "../transaction-status", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-unified-scheduler-pool = { path = "../unified-scheduler-pool", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-version = { path = "../version", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } +solana-vote = { path = "../vote", version = "=4.4.0-beta.1", features = ["agave-unstable-api"] } solana-vote-interface = "7.0.0" -solana-vote-program = { path = "../programs/vote", version = "=4.4.0-beta.0", default-features = false, features = ["agave-unstable-api"] } +solana-vote-program = { path = "../programs/vote", version = "=4.4.0-beta.1", default-features = false, features = ["agave-unstable-api"] } tempfile = "3.23.0" thiserror = "2.0.17" tokio = "1.48.0" diff --git a/feature-set/src/lib.rs b/feature-set/src/lib.rs index 6160068e701..055011810aa 100644 --- a/feature-set/src/lib.rs +++ b/feature-set/src/lib.rs @@ -1442,7 +1442,7 @@ pub mod limit_instruction_accounts { } pub mod block_revenue_sharing { - solana_pubkey::declare_id!("7MYx95UBiJufqnumyN7HfskJ9vKdcGMmhreVguqrE97K"); + solana_pubkey::declare_id!("Crbnc267wkJvFhYakqwWWX57sx5bkrftJLekzy6yWKLT"); } pub mod vote_account_initialize_v2 { diff --git a/gossip/src/cluster_info.rs b/gossip/src/cluster_info.rs index e20d8ff4b5a..89b84338d75 100644 --- a/gossip/src/cluster_info.rs +++ b/gossip/src/cluster_info.rs @@ -101,24 +101,36 @@ pub const GOSSIP_SLEEP_MILLIS: u64 = 100; /// Interval between pull requests (in gossip rounds) const PULL_REQUEST_PERIOD: usize = 5; -/// Capacity for the [`ClusterInfo::run_socket_consume`] and [`ClusterInfo::run_listen`] -/// intermediate packet batch buffers. +/// Max number of packet batches sigverified in one [`ClusterInfo::run_socket_consume`] iteration. /// -/// To avoid the overhead of dropping large sets of packet batches in each processing loop, -/// we limit the number of packet batches that are pulled from the corresponding channel on each iteration. -/// This ensures that the number of `madvise` system calls is minimized and, as such, that large interruptions -/// to the processing loop are avoided. -const CHANNEL_CONSUME_CAPACITY: usize = 1024; -/// Channel capacity for gossip channels. +/// Bounds sigverify latency per iteration: +/// 64 batches * 64 packets * ~150us per packet / 8 threads = 80ms. +/// Here 150us is rough estimate of time to sigverify 1 Protocol instance. +const SIGVERIFY_BATCH_CAPACITY: usize = 64; + +/// Channel capacity for the gossip sigverify -> listen channel, and max number of +/// sigverified message sets processed per [`ClusterInfo::run_listen`] iteration. +/// +/// Each message set is the output of one [`ClusterInfo::run_socket_consume`] iteration, +/// i.e. up to [`SIGVERIFY_BATCH_CAPACITY`] packet batches. [`ClusterInfo::run_listen`] +/// drains the whole channel in one iteration. /// -/// A hard limit on incoming gossip messages. +/// Value chosen empirically to allow slack to absorb small sets without evicting sigverified +/// packets, while under max load keeping listen queue latency to ~200ms. +pub(crate) const CHANNEL_CONSUME_CAPACITY: usize = 4; + +/// Channel capacity for the gossip socket -> sigverify channel. /// -/// 262,144 packets with saturated packet batches (64 packets). +/// Holds enough packet batches for 2 sigverify iterations, bounding queueing +/// latency ahead of sigverify to ~200ms (2 rounds of 80-100ms). +pub(crate) const GOSSIP_INGRESS_CHANNEL_CAPACITY: usize = 2 * SIGVERIFY_BATCH_CAPACITY; + +/// Channel capacity for the gossip egress channel. /// -/// 114,688 packets with observed average packet batch size (28 packets), -/// putting this within reasonable range of previous hard limit -/// of `MAX_GOSSIP_TRAFFIC` (103,896). -pub(crate) const GOSSIP_CHANNEL_CAPACITY: usize = 4096; // 2^12 +/// Each element is the entire output of one producer iteration, but we do not +/// want to ever drop anything here, so this is deliberately overprovisioned. +pub(crate) const GOSSIP_CHANNEL_CAPACITY: usize = 4096; + const GOSSIP_PING_CACHE_CAPACITY: usize = 126976; pub(crate) const GOSSIP_PING_CACHE_TTL: Duration = Duration::from_secs(1280); /// Per-entry Pong wait timeout is drawn uniformly from this range (in milliseconds). @@ -2169,7 +2181,7 @@ impl ClusterInfo { { num_packets += packet_batch.len(); packet_buf.push(packet_batch); - if packet_buf.len() == CHANNEL_CONSUME_CAPACITY { + if packet_buf.len() == SIGVERIFY_BATCH_CAPACITY { break; } } @@ -2246,7 +2258,9 @@ impl ClusterInfo { } }) }; - if let Err(TrySendError::Full(_)) = sender.try_send(packets_verified) { + if !packets_verified.is_empty() + && let Err(TrySendError::Full(_)) = sender.try_send(packets_verified) + { self.stats.gossip_packets_dropped_count.add_relaxed( packet_buf .iter() @@ -2310,7 +2324,7 @@ impl ClusterInfo { .thread_name(|i| format!("solGossipCons{i:02}")) .build() .unwrap(); - let mut packet_buf = Vec::with_capacity(CHANNEL_CONSUME_CAPACITY); + let mut packet_buf = Vec::with_capacity(SIGVERIFY_BATCH_CAPACITY); let run_consume = move || { while !exit.load(Ordering::Relaxed) { let result = self.run_socket_consume( diff --git a/gossip/src/gossip_service.rs b/gossip/src/gossip_service.rs index 6bbc6a1d2fa..6dc8276914c 100644 --- a/gossip/src/gossip_service.rs +++ b/gossip/src/gossip_service.rs @@ -2,7 +2,10 @@ use { crate::{ - cluster_info::{ClusterInfo, GOSSIP_CHANNEL_CAPACITY}, + cluster_info::{ + CHANNEL_CONSUME_CAPACITY, ClusterInfo, GOSSIP_CHANNEL_CAPACITY, + GOSSIP_INGRESS_CHANNEL_CAPACITY, + }, cluster_info_metrics::submit_gossip_stats, contact_info::ContactInfo, epoch_specs::EpochSpecs, @@ -56,7 +59,7 @@ impl GossipService { exit: Arc, ) -> Self { let (request_sender, request_receiver) = - EvictingSender::new_bounded(GOSSIP_CHANNEL_CAPACITY); + EvictingSender::new_bounded(GOSSIP_INGRESS_CHANNEL_CAPACITY); trace!( "GossipService: id: {}, listening on primary interface: {:?}, all available \ interfaces: {:?}", @@ -77,7 +80,7 @@ impl GossipService { false, ); let (consume_sender, listen_receiver) = - EvictingSender::new_bounded(GOSSIP_CHANNEL_CAPACITY); + EvictingSender::new_bounded(CHANNEL_CONSUME_CAPACITY); let t_socket_consume = cluster_info.clone().start_socket_consume_thread( epoch_specs.as_ref().map(|es| es.clone_box()), request_receiver, diff --git a/ledger/src/bigtable_upload_service.rs b/ledger/src/bigtable_upload_service.rs index 84db803f151..979cbf68b47 100644 --- a/ledger/src/bigtable_upload_service.rs +++ b/ledger/src/bigtable_upload_service.rs @@ -3,11 +3,11 @@ use { bigtable_upload::{self, ConfirmedBlockUploadConfig}, blockstore::Blockstore, }, - solana_runtime::commitment::BlockCommitmentCache, + solana_clock::Slot, std::{ cmp::min, sync::{ - Arc, RwLock, + Arc, atomic::{AtomicBool, AtomicU64, Ordering}, }, thread::{self, Builder, JoinHandle}, @@ -24,7 +24,6 @@ impl BigTableUploadService { runtime: Arc, bigtable_ledger_storage: solana_storage_bigtable::LedgerStorage, blockstore: Arc, - block_commitment_cache: Arc>, max_complete_transaction_status_slot: Arc, exit: Arc, ) -> Self { @@ -32,7 +31,6 @@ impl BigTableUploadService { runtime, bigtable_ledger_storage, blockstore, - block_commitment_cache, max_complete_transaction_status_slot, ConfirmedBlockUploadConfig::default(), exit, @@ -43,7 +41,6 @@ impl BigTableUploadService { runtime: Arc, bigtable_ledger_storage: solana_storage_bigtable::LedgerStorage, blockstore: Arc, - block_commitment_cache: Arc>, max_complete_transaction_status_slot: Arc, config: ConfirmedBlockUploadConfig, exit: Arc, @@ -56,7 +53,6 @@ impl BigTableUploadService { runtime, bigtable_ledger_storage, blockstore, - block_commitment_cache, max_complete_transaction_status_slot, config, exit, @@ -71,7 +67,6 @@ impl BigTableUploadService { runtime: Arc, bigtable_ledger_storage: solana_storage_bigtable::LedgerStorage, blockstore: Arc, - block_commitment_cache: Arc>, max_complete_transaction_status_slot: Arc, config: ConfirmedBlockUploadConfig, exit: Arc, @@ -82,21 +77,15 @@ impl BigTableUploadService { break; } - // The highest slot eligible for upload is the highest root that - // has complete block metadata - let highest_complete_root = std::cmp::min( - max_complete_transaction_status_slot.load(Ordering::SeqCst), - block_commitment_cache.read().unwrap().root(), - ); - let end_slot = min( - highest_complete_root, - start_slot.saturating_add(config.max_num_slots_to_check as u64 * 2), - ); - - if end_slot <= start_slot { + let Some(end_slot) = next_upload_end_slot( + start_slot, + &max_complete_transaction_status_slot, + &blockstore, + &config, + ) else { std::thread::sleep(std::time::Duration::from_secs(1)); continue; - } + }; let result = runtime.block_on(bigtable_upload::upload_confirmed_blocks( blockstore.clone(), @@ -124,3 +113,92 @@ impl BigTableUploadService { self.thread.join() } } + +/// Returns the last slot of the next upload pass starting at `start_slot`, or +/// `None` if there is nothing new to upload yet. +/// +/// The pass never extends past `blockstore.max_root()`, because +/// `upload_confirmed_blocks` treats a range with no rooted slots as done. +fn next_upload_end_slot( + start_slot: Slot, + max_complete_transaction_status_slot: &AtomicU64, + blockstore: &Blockstore, + config: &ConfirmedBlockUploadConfig, +) -> Option { + let highest_complete_root = min( + max_complete_transaction_status_slot.load(Ordering::SeqCst), + blockstore.max_root(), + ); + let end_slot = min( + highest_complete_root, + start_slot.saturating_add(config.max_num_slots_to_check as u64 * 2), + ); + (end_slot > start_slot).then_some(end_slot) +} + +#[cfg(test)] +mod tests { + use {super::*, crate::get_tmp_ledger_path_auto_delete}; + + #[test] + fn test_block_after_skipped_window_waits_for_root_marker() { + let ledger_path = get_tmp_ledger_path_auto_delete!(); + let blockstore = Blockstore::open(ledger_path.path()).unwrap(); + let config = ConfirmedBlockUploadConfig { + max_num_slots_to_check: 16, + ..ConfirmedBlockUploadConfig::default() + }; + + // Everything up to root 150 is uploaded. Slots 151..=155 were skipped, + // and block 156 is the new root. Its transaction statuses are written, + // but its root marker isn't yet. + blockstore.set_roots([0, 150].iter()).unwrap(); + let max_complete_transaction_status_slot = AtomicU64::new(156); + + // The pass must not run past the unwritten root. + let start_slot = 151; + assert_eq!( + next_upload_end_slot( + start_slot, + &max_complete_transaction_status_slot, + &blockstore, + &config, + ), + None, + "pass would skip slot 156", + ); + + // A pass starting before the highest written root runs up to it... + assert_eq!( + next_upload_end_slot( + 149, + &max_complete_transaction_status_slot, + &blockstore, + &config + ), + Some(150), + ); + // ...but not when it starts at the root; that waits for the next root. + assert_eq!( + next_upload_end_slot( + 150, + &max_complete_transaction_status_slot, + &blockstore, + &config + ), + None, + ); + + // Once the marker is written, the pass from 151 includes 156. + blockstore.set_roots([156].iter()).unwrap(); + assert_eq!( + next_upload_end_slot( + start_slot, + &max_complete_transaction_status_slot, + &blockstore, + &config, + ), + Some(156), + ); + } +} diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 0e09873463d..bce3df759a4 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -692,7 +692,9 @@ impl ProgramCache { } else { continue; }; - entry.update_access_slot(loaded_programs_for_tx_batch.slot); + entry.update_access_slot( + loaded_programs_for_tx_batch.slot.min(self.latest_root_slot), + ); if increment_usage_counter { entry_to_return.stats.uses.fetch_add(1, Ordering::Relaxed); } @@ -3423,6 +3425,7 @@ pub(crate) mod tests { new_program(env.clone()), ); cache.assign_program(&env, program_id, 100, Arc::clone(&entry)); + cache.latest_root_slot = batch_slot; let slot_versions = cache.get_slot_versions_for_tests(&program_id); assert_eq!(slot_versions.len(), 1); @@ -3702,6 +3705,7 @@ pub(crate) mod tests { new_loaded_entry(env.clone()), ); cache.assign_program(&env, program_id, 100, Arc::clone(&entry)); + cache.latest_root_slot = 200; let mut search_for = vec![ProgramToLoad { program_id: &program_id, @@ -3736,6 +3740,7 @@ pub(crate) mod tests { new_loaded_entry(env.clone()), ); cache.assign_program(&env, program_id, 100, Arc::clone(&entry)); + cache.latest_root_slot = 100; // Extract at the deployment slot itself, which is inside the delay // visibility window, so a `DelayVisibility` tombstone stands in for @@ -4284,6 +4289,35 @@ pub(crate) mod tests { )); } + #[test] + fn test_extract_access_slot_clamped_to_root() { + let (mut cache, _fork_graph) = new_test_cache_with_fork_graph(BlockRelation::Ancestor); + let env = get_mock_program_runtime_environment(); + let program_id = Pubkey::new_unique(); + let entry = new_test_entry_with_owner( + 100, + ProgramCacheEntryOwner::LoaderV3, + new_loaded_entry(env.clone()), + ); + cache.assign_program(&env, program_id, 100, Arc::clone(&entry)); + + let batch_slot = 200; + for root_slot in [0, 150, batch_slot] { + cache.latest_root_slot = root_slot; + + let mut search_for = vec![ProgramToLoad { + program_id: &program_id, + loader: ProgramCacheEntryOwner::LoaderV3, + deployment_slot: 100, + }]; + let mut extracted = ProgramCacheForTxBatch::new(batch_slot); + cache.extract(&mut search_for, &mut extracted, &env, true, true); + + assert!(search_for.is_empty()); + assert_eq!(entry.latest_access_slot.load(Ordering::Relaxed), root_slot); + } + } + #[test] fn test_unloaded() { let mut cache = ProgramCache::::new(0); diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 97979db3449..5d17816b16c 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -56,7 +56,7 @@ dependencies = [ [[package]] name = "agave-banking-stage-ingress-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "solana-perf", @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-bls-cert-verify" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-votor-messages", "bitvec", @@ -79,7 +79,7 @@ dependencies = [ [[package]] name = "agave-bls-sigverify" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-cert-verify", "agave-math-utils", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "agave-cpu-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "libc", ] [[package]] name = "agave-feature-set" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "ahash 0.8.12", "solana-epoch-schedule", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "agave-fs" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-io-uring", "io-uring", @@ -164,7 +164,7 @@ dependencies = [ [[package]] name = "agave-io-uring" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "io-uring", "libc", @@ -175,7 +175,7 @@ dependencies = [ [[package]] name = "agave-logger" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "env_logger", "libc", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "agave-math-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "num-traits", ] [[package]] name = "agave-precompiles" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "bincode", @@ -211,14 +211,14 @@ dependencies = [ [[package]] name = "agave-random" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "rand 0.9.4", ] [[package]] name = "agave-reserved-account-keys" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "solana-pubkey 4.3.0", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "agave-scheduling-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-scheduler-bindings", @@ -263,7 +263,7 @@ dependencies = [ [[package]] name = "agave-snapshots" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-fs", "bincode", @@ -310,7 +310,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-cpu-utils", "agave-feature-set", @@ -395,7 +395,7 @@ dependencies = [ [[package]] name = "agave-votor" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-sigverify", "agave-logger", @@ -439,7 +439,7 @@ dependencies = [ [[package]] name = "agave-votor-messages" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "bitvec", @@ -462,14 +462,14 @@ dependencies = [ [[package]] name = "agave-votor-transport" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", "arrayvec", "bytes", "crossbeam-channel", "log", "qualifier_attr", - "quinn", "solana-keypair", "solana-metrics", "solana-net-utils", @@ -482,7 +482,7 @@ dependencies = [ [[package]] name = "agave-xdp" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-cpu-utils", "agave-xdp-ebpf", @@ -500,7 +500,7 @@ dependencies = [ [[package]] name = "agave-xdp-ebpf" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "aya-ebpf", ] @@ -633,6 +633,50 @@ version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" +[[package]] +name = "anza-quinn" +version = "0.11.12-issue2860.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd524576ab56786d8241905b12498e8ec6b9a09a58bfe8ef9e9dfcf511aeecf4" +dependencies = [ + "anza-quinn-proto", + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.6.5", + "thiserror 2.0.20", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "anza-quinn-proto" +version = "0.11.18-issue2860.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9dfece0ce5ffc483085c0112b8499dabab137e2eb028f1ff3a28d5b24d6d477" +dependencies = [ + "bytes", + "fastbloom", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "slab", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "web-time", +] + [[package]] name = "arc-swap" version = "1.9.2" @@ -4579,7 +4623,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc" dependencies = [ "bytes", - "fastbloom", "getrandom 0.4.3", "lru-slab", "rand 0.10.2", @@ -4588,7 +4631,6 @@ dependencies = [ "rustc-hash", "rustls", "rustls-pki-types", - "rustls-platform-verifier", "slab", "thiserror 2.0.20", "tinyvec", @@ -5661,7 +5703,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "Inflector", "base64 0.23.1", @@ -5705,7 +5747,7 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bs58", @@ -5741,7 +5783,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-fs", "ahash 0.8.12", @@ -5858,7 +5900,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "borsh", "futures 0.3.34", @@ -5885,7 +5927,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "serde", "solana-account", @@ -5903,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "crossbeam-channel", @@ -5959,7 +6001,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bv", "fnv", @@ -6035,7 +6077,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "qualifier_attr", @@ -6061,7 +6103,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "ahash 0.8.12", "bv", @@ -6079,7 +6121,7 @@ dependencies = [ [[package]] name = "solana-builtins" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "solana-bpf-loader-program", @@ -6096,7 +6138,7 @@ dependencies = [ [[package]] name = "solana-builtins-default-costs" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "ahash 0.8.12", @@ -6106,7 +6148,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bip39", "bs58", @@ -6136,7 +6178,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "dirs-next", "serde", @@ -6147,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "Inflector", "agave-reserved-account-keys", @@ -6192,7 +6234,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "async-trait", "bincode", @@ -6294,7 +6336,7 @@ dependencies = [ [[package]] name = "solana-compute-budget" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-fee-structure", "solana-program-runtime", @@ -6302,7 +6344,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-instruction" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "solana-borsh", @@ -6330,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program-runtime", ] @@ -6353,7 +6395,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "async-trait", "crossbeam-channel", @@ -6371,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-banking-stage-ingress-types", "agave-bls-cert-verify", @@ -6511,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "ahash 0.8.12", @@ -6587,7 +6629,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-snapshots", "log", @@ -6631,7 +6673,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-transaction-view", "agave-votor-messages", @@ -6741,7 +6783,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "log", @@ -6784,7 +6826,7 @@ dependencies = [ [[package]] name = "solana-fee" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-fee-structure", "solana-svm-transaction", @@ -6855,7 +6897,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-snapshots", "log", @@ -6879,7 +6921,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-geyser-plugin-interface", "arc-swap", @@ -6915,7 +6957,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-logger", "agave-random", @@ -7159,7 +7201,7 @@ dependencies = [ [[package]] name = "solana-lattice-hash" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "blake3", @@ -7169,7 +7211,7 @@ dependencies = [ [[package]] name = "solana-leader-schedule" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-random", "itertools 0.15.0", @@ -7181,7 +7223,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-reserved-account-keys", @@ -7320,11 +7362,11 @@ dependencies = [ [[package]] name = "solana-measure" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-merkle-tree" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-hash", "solana-sha256-hasher", @@ -7351,7 +7393,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "gethostname", @@ -7380,9 +7422,10 @@ checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" [[package]] name = "solana-net-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-xdp", + "anza-quinn", "bincode", "bytes", "cfg-if 1.0.4", @@ -7390,7 +7433,6 @@ dependencies = [ "itertools 0.15.0", "log", "nix", - "quinn", "rand 0.9.4", "serde", "socket2 0.6.5", @@ -7476,7 +7518,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-transaction-view", "ahash 0.8.12", @@ -7515,7 +7557,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-cpu-utils", "agave-votor-messages", @@ -7627,7 +7669,7 @@ dependencies = [ [[package]] name = "solana-program-binaries" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "solana-account", @@ -7687,7 +7729,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bincode", @@ -7734,7 +7776,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -7817,7 +7859,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "futures-util", @@ -7839,13 +7881,13 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", "async-lock", "async-trait", "futures 0.3.34", "log", - "quinn", "solana-connection-cache", "solana-keypair", "solana-measure", @@ -7863,7 +7905,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "log", "num_cpus", @@ -7871,7 +7913,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "console 0.16.4", "dialoguer", @@ -7918,7 +7960,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-snapshots", @@ -8001,7 +8043,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-votor-messages", "async-trait", @@ -8043,7 +8085,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "anyhow", "jsonrpc-core", @@ -8061,7 +8103,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account", "solana-commitment-config", @@ -8077,7 +8119,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bs58", @@ -8100,7 +8142,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-bls-cert-verify", "agave-feature-set", @@ -8232,7 +8274,7 @@ dependencies = [ [[package]] name = "solana-runtime-transaction" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-transaction-view", @@ -8260,7 +8302,7 @@ checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" [[package]] name = "solana-sbf-programs" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-logger", @@ -8315,7 +8357,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program-entrypoint", "solana-sbf-rust-128bit-dep", @@ -8323,11 +8365,11 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-sbf-rust-account-mem" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-program-entrypoint", @@ -8338,7 +8380,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-account-mem-deprecated" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-program", @@ -8349,7 +8391,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alloc" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-msg", "solana-program", @@ -8358,7 +8400,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-bn254", "solana-msg", @@ -8367,7 +8409,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-bn254", "solana-msg", @@ -8376,7 +8418,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-big-mod-exp" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "array-bytes", "solana-big-mod-exp", @@ -8386,7 +8428,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-args" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "borsh", "solana-account-info", @@ -8398,7 +8440,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-msg", "solana-program", @@ -8407,7 +8449,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-caller-access" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8420,7 +8462,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-curve25519" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-curve25519", "solana-msg", @@ -8429,7 +8471,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8440,7 +8482,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-dep-crate" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "byteorder", "solana-program-entrypoint", @@ -8448,7 +8490,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8463,7 +8505,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-direct-account-pointers" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-account-view", @@ -8475,7 +8517,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-divide-by-zero" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-program-entrypoint", @@ -8485,7 +8527,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-dup-accounts" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8498,7 +8540,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-error-handling" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "num-derive 0.5.1", "num-traits", @@ -8512,7 +8554,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-program-entrypoint", @@ -8522,7 +8564,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8535,7 +8577,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8549,7 +8591,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8568,7 +8610,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8580,7 +8622,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8592,7 +8634,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8604,11 +8646,11 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-dep" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-sbf-rust-invoked" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8623,7 +8665,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoked-dep" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-instruction 4.0.0", "solana-pubkey 4.3.0", @@ -8631,7 +8673,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-iter" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program", "solana-program-entrypoint", @@ -8639,7 +8681,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-log-data" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-program", @@ -8650,7 +8692,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-msg", "solana-program", @@ -8660,7 +8702,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-msg", "solana-program", @@ -8668,7 +8710,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-mem" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-program-entrypoint", @@ -8680,11 +8722,11 @@ dependencies = [ [[package]] name = "solana-sbf-rust-mem-dep" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-sbf-rust-membuiltins" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program-entrypoint", "solana-sbf-rust-mem-dep", @@ -8692,7 +8734,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-program-entrypoint", @@ -8702,7 +8744,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-panic" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8713,7 +8755,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program", "solana-program-entrypoint", @@ -8722,11 +8764,11 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-sbf-rust-poseidon" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-msg", "solana-poseidon", @@ -8735,7 +8777,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-r2-instruction-data-pointer" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-cpi", "solana-program-entrypoint", @@ -8743,7 +8785,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8754,7 +8796,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8768,7 +8810,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc-dep" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-instruction 4.0.0", "solana-pubkey 4.3.0", @@ -8776,7 +8818,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8792,11 +8834,11 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc-invoke-dep" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8808,7 +8850,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8821,7 +8863,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-modify" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8834,7 +8876,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sanity" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8847,7 +8889,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "libsecp256k1", "solana-hash", @@ -8859,7 +8901,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "blake3", "solana-blake3-hasher", @@ -8872,7 +8914,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-inner-instructions" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8884,7 +8926,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8897,7 +8939,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-simulation" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-clock 3.2.1", @@ -8911,7 +8953,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-instruction 4.0.0", @@ -8925,7 +8967,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1-system" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-program-entrypoint", @@ -8935,7 +8977,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sysvar" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-define-syscall 3.0.0", @@ -8954,7 +8996,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8966,7 +9008,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgraded" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -8978,7 +9020,7 @@ dependencies = [ [[package]] name = "solana-sbf-syscall-get-epoch-stake" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account-info", "solana-msg", @@ -9085,7 +9127,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "crossbeam-channel", "itertools 0.15.0", @@ -9342,7 +9384,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-reserved-account-keys", "base64 0.23.1", @@ -9380,7 +9422,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bs58", "prost", @@ -9405,8 +9447,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", "bytes", "crossbeam-channel", "futures 0.3.34", @@ -9417,7 +9460,6 @@ dependencies = [ "nix", "num_cpus", "pem", - "quinn", "rand 0.9.4", "rustls", "smallvec", @@ -9439,7 +9481,7 @@ dependencies = [ [[package]] name = "solana-svm" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "ahash 0.8.12", @@ -9470,6 +9512,7 @@ dependencies = [ "solana-program-runtime", "solana-pubkey 4.3.0", "solana-rent", + "solana-sbpf", "solana-sdk-ids", "solana-slot-hashes 4.0.0", "solana-svm-callback", @@ -9492,7 +9535,7 @@ dependencies = [ [[package]] name = "solana-svm-callback" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-account", "solana-clock 4.0.0", @@ -9502,22 +9545,22 @@ dependencies = [ [[package]] name = "solana-svm-feature-set" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-svm-log-collector" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "log", ] [[package]] name = "solana-svm-measure" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" [[package]] name = "solana-svm-timings" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "eager", "enum-iterator", @@ -9540,14 +9583,14 @@ dependencies = [ [[package]] name = "solana-svm-type-overrides" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "rand 0.9.4", ] [[package]] name = "solana-syscalls" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "libsecp256k1", @@ -9605,7 +9648,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "log", @@ -9725,7 +9768,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-snapshots", @@ -9787,9 +9830,9 @@ checksum = "0ced92c60aa76ec4780a9d93f3bd64dfa916e1b998eacc6f1c110f3f444f02c9" [[package]] name = "solana-tls-utils" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ - "quinn", + "anza-quinn", "rustls", "rustls-webpki", "solana-keypair", @@ -9799,7 +9842,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "futures-util", "indicatif", @@ -9827,8 +9870,9 @@ dependencies = [ [[package]] name = "solana-tpu-client-next" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ + "anza-quinn", "async-trait", "bytes", "futures 0.3.34", @@ -9836,7 +9880,6 @@ dependencies = [ "itertools 0.15.0", "log", "lru 0.18.4", - "quinn", "rustls", "solana-clock 4.0.0", "solana-commitment-config", @@ -9880,7 +9923,7 @@ dependencies = [ [[package]] name = "solana-transaction-context" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "serde", @@ -9910,7 +9953,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "Inflector", "agave-reserved-account-keys", @@ -9953,7 +9996,7 @@ dependencies = [ [[package]] name = "solana-transaction-status-client-types" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "base64 0.23.1", "bincode", @@ -9976,7 +10019,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "agave-votor", @@ -10022,7 +10065,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "async-trait", "solana-connection-cache", @@ -10034,7 +10077,7 @@ dependencies = [ [[package]] name = "solana-unified-scheduler-logic" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "assert_matches", "solana-clock 4.0.0", @@ -10047,7 +10090,7 @@ dependencies = [ [[package]] name = "solana-unified-scheduler-pool" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-banking-stage-ingress-types", "assert_matches", @@ -10079,7 +10122,7 @@ checksum = "c5d2face763df5afeaa9509b9019968860e69cc1531ec8b4a2e6c7b702204d5a" [[package]] name = "solana-version" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "rand 0.9.4", @@ -10093,7 +10136,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bincode", "log", @@ -10168,7 +10211,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "agave-feature-set", "bincode", @@ -10246,7 +10289,7 @@ dependencies = [ [[package]] name = "solana-zk-elgamal-proof-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "bytemuck", "solana-instruction 4.0.0", @@ -10307,7 +10350,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" dependencies = [ "solana-program-runtime", ] diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 131f04e2409..da8ddadaae7 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -74,7 +74,7 @@ members = [ ] [workspace.package] -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" description = "Solana SBF test program written in Rust" authors = ["Anza Maintainers "] repository = "https://github.com/anza-xyz/agave" @@ -103,10 +103,10 @@ used_underscore_binding = "deny" new_without_default = "allow" [workspace.dependencies] -agave-feature-set = { path = "../../feature-set", version = "=4.4.0-beta.0" } -agave-logger = { path = "../../logger", version = "=4.4.0-beta.0" } -agave-reserved-account-keys = { path = "../../reserved-account-keys", version = "=4.4.0-beta.0" } -agave-validator = { path = "../../validator", version = "=4.4.0-beta.0" } +agave-feature-set = { path = "../../feature-set", version = "=4.4.0-beta.1" } +agave-logger = { path = "../../logger", version = "=4.4.0-beta.1" } +agave-reserved-account-keys = { path = "../../reserved-account-keys", version = "=4.4.0-beta.1" } +agave-validator = { path = "../../validator", version = "=4.4.0-beta.1" } array-bytes = "9.3.0" bincode = { version = "1.1.4", default-features = false } blake3 = "1.0.0" @@ -124,12 +124,12 @@ solana-big-mod-exp = "4.0.0" solana-blake3-hasher = { version = "=3.1.0", features = ["blake3"] } solana-bn254 = "=3.2.1" solana-clock = { version = "=3.2.1", features = ["serde", "sysvar"] } -solana-compute-budget = { path = "../../compute-budget", version = "=4.4.0-beta.0" } -solana-compute-budget-instruction = { path = "../../compute-budget-instruction", version = "=4.4.0-beta.0" } +solana-compute-budget = { path = "../../compute-budget", version = "=4.4.0-beta.1" } +solana-compute-budget-instruction = { path = "../../compute-budget-instruction", version = "=4.4.0-beta.1" } solana-cpi = "=3.1.0" solana-curve25519 = "=4.0.1" solana-define-syscall = "=3.0.0" -solana-fee = { path = "../../fee", version = "=4.4.0-beta.0" } +solana-fee = { path = "../../fee", version = "=4.4.0-beta.1" } solana-hash = { version = "=4.6.0", features = ["bytemuck", "serde", "std"] } solana-instruction = "4.0.0" solana-instructions-sysvar = "=4.0.0" @@ -137,38 +137,38 @@ solana-keccak-hasher = { version = "=3.1.0", features = ["sha3"] } solana-msg = "=3.1.0" solana-poseidon = "=5.0.0" solana-program = "=4.1.0" -solana-program-binaries = { path = "../../program-binaries", version = "=4.4.0-beta.0" } +solana-program-binaries = { path = "../../program-binaries", version = "=4.4.0-beta.1" } solana-program-entrypoint = "=3.1.1" solana-program-error = "=3.0.1" solana-program-memory = "=3.1.0" -solana-program-runtime = { path = "../../program-runtime", version = "=4.4.0-beta.0" } +solana-program-runtime = { path = "../../program-runtime", version = "=4.4.0-beta.1" } solana-pubkey = { version = "=4.3.0", default-features = false } -solana-runtime = { path = "../../runtime", version = "=4.4.0-beta.0" } -solana-runtime-transaction = { path = "../../runtime-transaction", version = "=4.4.0-beta.0" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=4.4.0-beta.0" } -solana-sbf-rust-invoke-dep = { path = "rust/invoke_dep", version = "=4.4.0-beta.0" } -solana-sbf-rust-invoked-dep = { path = "rust/invoked_dep", version = "=4.4.0-beta.0" } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=4.4.0-beta.0" } -solana-sbf-rust-mem-dep = { path = "rust/mem_dep", version = "=4.4.0-beta.0" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=4.4.0-beta.0" } -solana-sbf-rust-realloc-dep = { path = "rust/realloc_dep", version = "=4.4.0-beta.0" } -solana-sbf-rust-realloc-invoke-dep = { path = "rust/realloc_invoke_dep", version = "=4.4.0-beta.0" } +solana-runtime = { path = "../../runtime", version = "=4.4.0-beta.1" } +solana-runtime-transaction = { path = "../../runtime-transaction", version = "=4.4.0-beta.1" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=4.4.0-beta.1" } +solana-sbf-rust-invoke-dep = { path = "rust/invoke_dep", version = "=4.4.0-beta.1" } +solana-sbf-rust-invoked-dep = { path = "rust/invoked_dep", version = "=4.4.0-beta.1" } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=4.4.0-beta.1" } +solana-sbf-rust-mem-dep = { path = "rust/mem_dep", version = "=4.4.0-beta.1" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=4.4.0-beta.1" } +solana-sbf-rust-realloc-dep = { path = "rust/realloc_dep", version = "=4.4.0-beta.1" } +solana-sbf-rust-realloc-invoke-dep = { path = "rust/realloc_invoke_dep", version = "=4.4.0-beta.1" } solana-sdk-ids = "=3.1.0" solana-secp256k1-recover = "=3.3.0" solana-sha256-hasher = { version = "=3.1.0", features = ["sha2"] } solana-stake-history = { version = "2.0.0", features = ["serde", "sysvar", "wincode"] } -solana-svm = { path = "../../svm", version = "=4.4.0-beta.0" } -solana-svm-feature-set = { path = "../../svm-feature-set", version = "=4.4.0-beta.0" } -solana-svm-timings = { path = "../../svm-timings", version = "=4.4.0-beta.0" } +solana-svm = { path = "../../svm", version = "=4.4.0-beta.1" } +solana-svm-feature-set = { path = "../../svm-feature-set", version = "=4.4.0-beta.1" } +solana-svm-timings = { path = "../../svm-timings", version = "=4.4.0-beta.1" } solana-svm-transaction = "6.0.0" -solana-svm-type-overrides = { path = "../../svm-type-overrides", version = "=4.4.0-beta.0" } +solana-svm-type-overrides = { path = "../../svm-type-overrides", version = "=4.4.0-beta.1" } solana-system-interface = { version = "=3.3.0", features = ["bincode"] } solana-sysvar = "=4.3.0" solana-sysvar-id = "=3.1.0" -solana-test-validator = { path = "../../test-validator", version = "=4.4.0-beta.0" } -solana-vote = { path = "../../vote", version = "=4.4.0-beta.0" } +solana-test-validator = { path = "../../test-validator", version = "=4.4.0-beta.1" } +solana-vote = { path = "../../vote", version = "=4.4.0-beta.1" } solana-vote-interface = "6.1.0" -solana-vote-program = { path = "../../programs/vote", version = "=4.4.0-beta.0" } +solana-vote-program = { path = "../../programs/vote", version = "=4.4.0-beta.1" } test-case = "3.3.1" thiserror = "2.0" wincode = { version = "0.6.1", default-features = false } diff --git a/programs/vote/src/vote_processor.rs b/programs/vote/src/vote_processor.rs index cb642f6afa0..b2e180c8ebb 100644 --- a/programs/vote/src/vote_processor.rs +++ b/programs/vote/src/vote_processor.rs @@ -388,23 +388,8 @@ declare_process_instruction!(Entrypoint, DEFAULT_COMPUTE_UNITS, |invoke_context| &rent, ) } - VoteInstruction::DepositDelegatorRewards { deposit } => { - // SIMD-0123: Deposit delegator rewards. - // Requires: - // * SIMD-0185: Vote State V4 - // * SIMD-0291: Commission in Basis Points - // * SIMD-0232: Custom Commission Collector - let feature_set = invoke_context.get_feature_set(); - if !feature_set.commission_rate_in_basis_points - || !feature_set.custom_commission_collector - || !feature_set.block_revenue_sharing - { - return Err(InstructionError::InvalidInstructionData); - } - - instruction_context.check_number_of_instruction_accounts(2)?; - drop(me); - vote_state::deposit_delegator_rewards(invoke_context, 0, 1, deposit, &signers) + VoteInstruction::DepositDelegatorRewards { .. } => { + return Err(InstructionError::InvalidInstructionData); } } }); @@ -4854,7 +4839,62 @@ mod tests { } } + #[test] + fn test_deposit_delegator_rewards_fails() { + let (vote_pubkey, _authorized_voter, _authorized_withdrawer, vote_account_v4) = + create_test_account_with_authorized(); + + // Create source account with enough lamports to transfer. + let source_pubkey = Pubkey::new_unique(); + let source_lamports = 1_000_000; + let source_account = + AccountSharedData::new(source_lamports, 0, &solana_sdk_ids::system_program::id()); + + let deposit_amount = 100_000; + + let instruction_data = serialize(&VoteInstruction::DepositDelegatorRewards { + deposit: deposit_amount, + }) + .unwrap(); + + let instruction_accounts = vec![ + AccountMeta { + pubkey: vote_pubkey, + is_signer: false, + is_writable: true, + }, + AccountMeta { + pubkey: source_pubkey, + is_signer: true, + is_writable: true, + }, + AccountMeta { + pubkey: solana_sdk_ids::system_program::id(), + is_signer: false, + is_writable: false, + }, + ]; + + let transaction_accounts = vec![ + (vote_pubkey, vote_account_v4.clone()), + (source_pubkey, source_account.clone()), + ( + solana_sdk_ids::system_program::id(), + AccountSharedData::new(0, 0, &solana_sdk_ids::native_loader::id()), + ), + ]; + + process_instruction( + VoteProgramFeatures::all_enabled(), + &instruction_data, + transaction_accounts.clone(), + instruction_accounts.clone(), + Err(InstructionError::InvalidInstructionData), + ); + } + // Test DepositDelegatorRewards instruction (SIMD-0123). + #[ignore] #[test] fn test_deposit_delegator_rewards() { const DEPOSIT_DELEGATOR_REWARDS_COMPUTE_UNITS: u64 = diff --git a/rpc/src/rpc_service.rs b/rpc/src/rpc_service.rs index 7a1a1a79e10..7544f777262 100644 --- a/rpc/src/rpc_service.rs +++ b/rpc/src/rpc_service.rs @@ -649,7 +649,6 @@ impl JsonRpcService { runtime.clone(), bigtable_ledger_storage.clone(), blockstore.clone(), - block_commitment_cache.clone(), max_complete_transaction_status_slot.clone(), ConfirmedBlockUploadConfig::default(), exit_bigtable_ledger_upload_service.clone(), diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 599b8d88a30..7c186a8fc93 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -1713,12 +1713,7 @@ impl Bank { .write() .unwrap(); - if *current_env != *upcoming_env - && ebpp - .upcoming_environment - .as_ref() - .is_none_or(|e| **e != *upcoming_env) - { + if *current_env != *upcoming_env && ebpp.upcoming_environment.as_ref().is_none() { // A different environment is upcoming and we are not preparing for // it yet. Initiate or restart EBPP. let pc = self @@ -1885,6 +1880,7 @@ impl Bank { .clone_and_filter_for_vat( MAX_ALPENGLOW_VOTE_ACCOUNTS, self.minimum_vote_account_balance_for_vat(), + self.feature_set.snapshot().block_revenue_sharing, ); if AlpenglowEpochType::is_alpenglow_or_migration_epoch(self, rewarded_epoch) { reward_epoch_delegated_stakes.set(self, &filtered_distribution_vote_accounts); @@ -6878,6 +6874,7 @@ impl Bank { self.stakes_cache.stakes().clone_and_filter_for_vat( MAX_ALPENGLOW_VOTE_ACCOUNTS, self.minimum_vote_account_balance_for_vat(), + self.feature_set.snapshot().block_revenue_sharing, ) } diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index ed8fc245a7e..d7d6fee1f98 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -5826,7 +5826,7 @@ fn test_bank_hash_deterministic_with_stakes_cache() { assert_eq!( bank2.hash().to_string(), - "F1RGWPgPj4ACW2q9FhmN36YGcMZ4ReSBp1kjHGGXwNAP", + "7a8DqBCzW6im48e6PTUL1qmFh1X3FdNa3eRncz98CqQ8", ); } diff --git a/runtime/src/stakes.rs b/runtime/src/stakes.rs index 2df437b8821..67fff1e3bbb 100644 --- a/runtime/src/stakes.rs +++ b/runtime/src/stakes.rs @@ -261,10 +261,14 @@ impl Stakes { &self, max_vote_accounts: usize, minimum_vote_account_balance: u64, + block_revenue_sharing: bool, ) -> Stakes { Self::new( - self.vote_accounts - .clone_and_filter_for_vat(max_vote_accounts, minimum_vote_account_balance), + self.vote_accounts.clone_and_filter_for_vat( + max_vote_accounts, + minimum_vote_account_balance, + block_revenue_sharing, + ), self.epoch, ) } diff --git a/runtime/tests/vote_account.rs b/runtime/tests/vote_account.rs index c922c968e3b..89efaf6e940 100644 --- a/runtime/tests/vote_account.rs +++ b/runtime/tests/vote_account.rs @@ -327,6 +327,7 @@ fn test_vote_accounts_cow() { fn test_clone_and_filter_for_vat_truncates() { let mut rng = rand::rng(); let current_limit = 3000; + let block_revenue_sharing = true; let vote_accounts = new_staked_vote_accounts( &mut rng, current_limit, @@ -338,14 +339,20 @@ fn test_clone_and_filter_for_vat_truncates() { |_| |_| 0, ); // All vote accounts should be returned if the limit is high enough. - let filtered = - vote_accounts.clone_and_filter_for_vat(current_limit + 500, MIN_STAKE_FOR_STAKED_ACCOUNT); + let filtered = vote_accounts.clone_and_filter_for_vat( + current_limit + 500, + MIN_STAKE_FOR_STAKED_ACCOUNT, + block_revenue_sharing, + ); assert_eq!(filtered.len(), vote_accounts.len()); // If the limit is smaller than number of accounts, truncate it. let lower_limit = current_limit - 1000; - let filtered = - vote_accounts.clone_and_filter_for_vat(lower_limit, MIN_STAKE_FOR_STAKED_ACCOUNT); + let filtered = vote_accounts.clone_and_filter_for_vat( + lower_limit, + MIN_STAKE_FOR_STAKED_ACCOUNT, + block_revenue_sharing, + ); assert!(filtered.len() <= lower_limit); // Check that the filtered accounts are the same as the original accounts. for (pubkey, (_, vote_account)) in filtered.as_ref().iter() { @@ -371,6 +378,7 @@ fn test_clone_and_filter_for_vat_filters_non_alpenglow() { // Check that non-alpenglow accounts are kicked out, 2000 accounts with bls pubkey, 1000 // accounts without. let num_nodes = MAX_ALPENGLOW_VOTE_ACCOUNTS + 1000; + let block_revenue_sharing = true; let vote_accounts = new_staked_vote_accounts( &mut rng, num_nodes, @@ -382,7 +390,11 @@ fn test_clone_and_filter_for_vat_filters_non_alpenglow() { |_| |_| 0, ); let new_limit = MAX_ALPENGLOW_VOTE_ACCOUNTS + 500; - let filtered = vote_accounts.clone_and_filter_for_vat(new_limit, MIN_STAKE_FOR_STAKED_ACCOUNT); + let filtered = vote_accounts.clone_and_filter_for_vat( + new_limit, + MIN_STAKE_FOR_STAKED_ACCOUNT, + block_revenue_sharing, + ); assert_eq!(filtered.len(), MAX_ALPENGLOW_VOTE_ACCOUNTS); // Check that all filtered accounts have bls pubkey. for (_stake, vote_account) in filtered.as_ref().values() { @@ -395,7 +407,11 @@ fn test_clone_and_filter_for_vat_filters_non_alpenglow() { } // Now get only 1500 accounts, even some alpenglow accounts are kicked out. let new_limit = MAX_ALPENGLOW_VOTE_ACCOUNTS - 500; - let filtered = vote_accounts.clone_and_filter_for_vat(new_limit, MIN_STAKE_FOR_STAKED_ACCOUNT); + let filtered = vote_accounts.clone_and_filter_for_vat( + new_limit, + MIN_STAKE_FOR_STAKED_ACCOUNT, + block_revenue_sharing, + ); assert!(filtered.len() <= new_limit); for (_stake, vote_account) in filtered.as_ref().values() { assert!( @@ -412,6 +428,7 @@ fn test_clone_and_filter_for_vat_same_stake_at_border() { let mut rng = rand::rng(); // Create exactly 2 accounts more than maximum to test border truncation let num_accounts = MAX_ALPENGLOW_VOTE_ACCOUNTS + 2; + let block_revenue_sharing = true; let accounts = (0..num_accounts).map(|index| { let mut account = new_rand_vote_account(rng.random(), None, true, |_| 0); account.set_lamports(10_000_000_000); @@ -427,17 +444,24 @@ fn test_clone_and_filter_for_vat_same_stake_at_border() { for (pubkey, (stake, vote_account)) in accounts { vote_accounts.insert(pubkey, vote_account, || stake); } - let filtered = - vote_accounts.clone_and_filter_for_vat(num_accounts, MIN_STAKE_FOR_STAKED_ACCOUNT); + let filtered = vote_accounts.clone_and_filter_for_vat( + num_accounts, + MIN_STAKE_FOR_STAKED_ACCOUNT, + block_revenue_sharing, + ); assert_eq!(filtered.len(), num_accounts); - let filtered = vote_accounts - .clone_and_filter_for_vat(MAX_ALPENGLOW_VOTE_ACCOUNTS, MIN_STAKE_FOR_STAKED_ACCOUNT); + let filtered = vote_accounts.clone_and_filter_for_vat( + MAX_ALPENGLOW_VOTE_ACCOUNTS, + MIN_STAKE_FOR_STAKED_ACCOUNT, + block_revenue_sharing, + ); assert_eq!(filtered.len(), MAX_ALPENGLOW_VOTE_ACCOUNTS - 10); } #[test] fn test_clone_and_filter_for_vat_not_enough_lamports() { let mut rng = rand::rng(); + let block_revenue_sharing = true; // For 10% of vote accounts, set the balance below the minimum. let entries_to_modify = MAX_ALPENGLOW_VOTE_ACCOUNTS / 10; let vote_accounts = new_staked_vote_accounts( @@ -461,14 +485,18 @@ fn test_clone_and_filter_for_vat_not_enough_lamports() { } }, ); - let filtered = vote_accounts - .clone_and_filter_for_vat(MAX_ALPENGLOW_VOTE_ACCOUNTS, DEFAULT_VAT_TO_BURN_PER_EPOCH); + let filtered = vote_accounts.clone_and_filter_for_vat( + MAX_ALPENGLOW_VOTE_ACCOUNTS, + DEFAULT_VAT_TO_BURN_PER_EPOCH, + block_revenue_sharing, + ); assert!(filtered.len() <= MAX_ALPENGLOW_VOTE_ACCOUNTS - entries_to_modify); } #[test] fn test_clone_and_filter_for_vat_not_enough_lamports_with_pending_delegator_rewards() { let mut rng = rand::rng(); + let block_revenue_sharing = true; // For 10% of vote accounts, set the balance below the minimum. let entries_to_modify = MAX_ALPENGLOW_VOTE_ACCOUNTS / 10; let vote_accounts = new_staked_vote_accounts( @@ -495,14 +523,18 @@ fn test_clone_and_filter_for_vat_not_enough_lamports_with_pending_delegator_rewa } }, ); - let filtered = vote_accounts - .clone_and_filter_for_vat(MAX_ALPENGLOW_VOTE_ACCOUNTS, DEFAULT_VAT_TO_BURN_PER_EPOCH); + let filtered = vote_accounts.clone_and_filter_for_vat( + MAX_ALPENGLOW_VOTE_ACCOUNTS, + DEFAULT_VAT_TO_BURN_PER_EPOCH, + block_revenue_sharing, + ); assert!(filtered.len() <= MAX_ALPENGLOW_VOTE_ACCOUNTS - entries_to_modify); } #[test] fn test_clone_and_filter_for_vat_empty_accounts() { let mut rng = rand::rng(); + let block_revenue_sharing = true; let current_limit = 3000; let vote_accounts = new_staked_vote_accounts( &mut rng, @@ -516,8 +548,11 @@ fn test_clone_and_filter_for_vat_empty_accounts() { ); // Since everyone has the same stake and the limit is 500 less than number of accounts, // all border stake peers are removed and we end up with no valid accounts. - let filtered = - vote_accounts.clone_and_filter_for_vat(current_limit - 500, MIN_STAKE_FOR_STAKED_ACCOUNT); + let filtered = vote_accounts.clone_and_filter_for_vat( + current_limit - 500, + MIN_STAKE_FOR_STAKED_ACCOUNT, + block_revenue_sharing, + ); assert_eq!(filtered.len(), 0); } diff --git a/svm/Cargo.toml b/svm/Cargo.toml index 7743237b8c7..787c7641b47 100644 --- a/svm/Cargo.toml +++ b/svm/Cargo.toml @@ -99,6 +99,7 @@ solana-program-pack = { workspace = true } solana-program-runtime = { workspace = true } solana-pubkey = { workspace = true } solana-rent = { workspace = true } +solana-sbpf = { workspace = true } solana-sdk-ids = { workspace = true } solana-signature = { workspace = true, optional = true } solana-slot-hashes = { workspace = true, optional = true, features = ["wincode"] } diff --git a/svm/src/program_loader.rs b/svm/src/program_loader.rs index 772be7a21fc..fa81910f6fb 100644 --- a/svm/src/program_loader.rs +++ b/svm/src/program_loader.rs @@ -13,6 +13,7 @@ use { program_cache_entry::{ProgramCacheEntry, ProgramCacheEntryOwner}, }, solana_pubkey::Pubkey, + solana_sbpf::elf_parser::consts::ELFMAG, solana_sdk_ids::{bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable, loader_v4}, solana_svm_callback::TransactionProcessingCallback, solana_svm_timings::ExecuteTimings, @@ -196,10 +197,10 @@ fn get_program_deployment_slot( ProgramCacheEntryOwner::LoaderV1 | ProgramCacheEntryOwner::LoaderV2 => { // V1 & V2 programs are immutable and hold no deployment metadata. // As long as there is *some* kind of ELF present, return slot 0. - if program.data().is_empty() { - Err(TransactionError::ProgramAccountNotFound) - } else { + if program.data().starts_with(&ELFMAG) { Ok(0) + } else { + Err(TransactionError::ProgramAccountNotFound) } } ProgramCacheEntryOwner::LoaderV3 => { @@ -577,7 +578,7 @@ mod tests { // Fail: invalid state let mut program_account = AccountSharedData::default(); program_account.set_owner(loader_v4::id()); - program_account.set_data_from_slice(&[0u8; 4]); + program_account.set_data_from_slice(&[0u8; 4]); // `Uninitialized` mock_bank .account_shared_data .borrow_mut() @@ -1059,7 +1060,7 @@ mod tests { ); // Success - account.set_data_from_slice(&[1u8; 4]); + account.set_data_from_slice(&ELFMAG); assert_eq!( get_program_deployment_slot(&mock_bank, &account, loader).unwrap(), 0 // <-- slot is always zero for both loaders @@ -1155,7 +1156,7 @@ mod tests { // Fail: invalid state let mut program_account = AccountSharedData::default(); program_account.set_owner(loader_v4::id()); - program_account.set_data_from_slice(&[0u8; 4]); + program_account.set_data_from_slice(&[0u8; 4]); // `Uninitialized` assert_eq!( get_program_deployment_slot( &mock_bank, @@ -1250,10 +1251,12 @@ mod tests { .account_shared_data .borrow_mut() .insert(loader_ids[i], AccountSharedData::new(1, 1, &program_ids[3])); + let mut program = AccountSharedData::new(1, 1, &loader_ids[i]); + program.set_data_from_slice(&ELFMAG); mock_bank .account_shared_data .borrow_mut() - .insert(program_ids[i], AccountSharedData::new(1, 1, &loader_ids[i])); + .insert(program_ids[i], program); mock_bank.account_shared_data.borrow_mut().insert( account_ids[i], AccountSharedData::new(1, 1, &program_ids[i]), @@ -1402,15 +1405,22 @@ mod tests { .insert(key, empty); assert!(filter_executable_program_accounts(&mock_bank, &batch, keys.iter()).is_empty()); - // Any non-empty data is considered to *maybe* be a program. + // Same goes for non-empty but zero filled data. let mut account = AccountSharedData::default(); account.set_owner(owner); - account.set_data_from_slice(&[1u8; 4]); + account.set_data_from_slice(&[0u8; 4]); // `Uninitialized` mock_bank .account_shared_data .borrow_mut() - .insert(key, account); + .insert(key, account.clone()); + assert!(filter_executable_program_accounts(&mock_bank, &batch, keys.iter()).is_empty()); + // Account must start with ELFMAG to be considered a program. + account.set_data_from_slice(&ELFMAG); + mock_bank + .account_shared_data + .borrow_mut() + .insert(key, account); let result = filter_executable_program_accounts(&mock_bank, &batch, keys.iter()); assert_eq!(result.len(), 1); let program_to_load = result.first().unwrap(); diff --git a/svm/tests/example-programs/clock-sysvar/Cargo.toml b/svm/tests/example-programs/clock-sysvar/Cargo.toml index 07f6fd0d99b..18dae961bbc 100644 --- a/svm/tests/example-programs/clock-sysvar/Cargo.toml +++ b/svm/tests/example-programs/clock-sysvar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clock-sysvar-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" edition = "2021" [dependencies] diff --git a/svm/tests/example-programs/complex-transfer/Cargo.toml b/svm/tests/example-programs/complex-transfer/Cargo.toml index fdee20ced12..9d724bfe444 100644 --- a/svm/tests/example-programs/complex-transfer/Cargo.toml +++ b/svm/tests/example-programs/complex-transfer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "complex-transfer-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" edition = "2021" [dependencies] diff --git a/svm/tests/example-programs/hello-solana/Cargo.toml b/svm/tests/example-programs/hello-solana/Cargo.toml index ab83c9010b7..6445590bed9 100644 --- a/svm/tests/example-programs/hello-solana/Cargo.toml +++ b/svm/tests/example-programs/hello-solana/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hello-solana-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" edition = "2021" [dependencies] diff --git a/svm/tests/example-programs/simple-transfer/Cargo.toml b/svm/tests/example-programs/simple-transfer/Cargo.toml index 3588333fd13..a747c817dbf 100644 --- a/svm/tests/example-programs/simple-transfer/Cargo.toml +++ b/svm/tests/example-programs/simple-transfer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-transfer-program" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" edition = "2021" [dependencies] diff --git a/svm/tests/example-programs/transfer-from-account/Cargo.toml b/svm/tests/example-programs/transfer-from-account/Cargo.toml index 5e96489dd9c..961cc33569c 100644 --- a/svm/tests/example-programs/transfer-from-account/Cargo.toml +++ b/svm/tests/example-programs/transfer-from-account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "transfer-from-account" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" edition = "2021" [dependencies] diff --git a/svm/tests/example-programs/write-to-account/Cargo.toml b/svm/tests/example-programs/write-to-account/Cargo.toml index 65dd0ecbc18..b41a346f3ea 100644 --- a/svm/tests/example-programs/write-to-account/Cargo.toml +++ b/svm/tests/example-programs/write-to-account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "write-to-account" -version = "4.4.0-beta.0" +version = "4.4.0-beta.1" edition = "2021" [dependencies] diff --git a/validator/src/commands/wait_for_restart_window/mod.rs b/validator/src/commands/wait_for_restart_window/mod.rs index 3908f60bdff..e2164ed9429 100644 --- a/validator/src/commands/wait_for_restart_window/mod.rs +++ b/validator/src/commands/wait_for_restart_window/mod.rs @@ -16,9 +16,13 @@ use { solana_commitment_config::CommitmentConfig, solana_pubkey::Pubkey, solana_rpc_client::rpc_client::RpcClient, - solana_rpc_client_api::config::RpcLeaderScheduleConfig, + solana_rpc_client_api::{ + client_error::ErrorKind, config::RpcLeaderScheduleConfig, + custom_error::JSON_RPC_SERVER_ERROR_LEADER_SCHEDULE_IDENTITY_NOT_FOUND, + request::RpcError as RpcClientError, + }, std::{ - collections::VecDeque, + collections::{HashMap, VecDeque}, path::Path, time::{Duration, SystemTime}, }, @@ -235,14 +239,29 @@ pub fn wait_for_restart_window( epoch_info.epoch )); let first_slot_in_epoch = epoch_info.absolute_slot - epoch_info.slot_index; - leader_schedule = rpc_client - .get_leader_schedule_with_config( - Some(first_slot_in_epoch), - RpcLeaderScheduleConfig { - identity: Some(identity.to_string()), - ..RpcLeaderScheduleConfig::default() - }, - )? + let leader_schedule_response = match rpc_client.get_leader_schedule_with_config( + Some(first_slot_in_epoch), + RpcLeaderScheduleConfig { + identity: Some(identity.to_string()), + ..RpcLeaderScheduleConfig::default() + }, + ) { + // Swallow just the specific leader schedule error from RPC + Err(err) + if matches!( + err.kind(), + ErrorKind::RpcError(RpcClientError::RpcResponseError { + code: JSON_RPC_SERVER_ERROR_LEADER_SCHEDULE_IDENTITY_NOT_FOUND, + .. + }) + ) => + { + Ok(Some(HashMap::new())) + } + response => response, + }?; + + leader_schedule = leader_schedule_response .ok_or_else(|| { format!("Unable to get leader schedule from slot {first_slot_in_epoch}") })? diff --git a/vote/src/vote_account.rs b/vote/src/vote_account.rs index 2adbfd8aed1..43ca0577abd 100644 --- a/vote/src/vote_account.rs +++ b/vote/src/vote_account.rs @@ -213,6 +213,7 @@ impl VoteAccounts { &self, max_vote_accounts: usize, minimum_vote_account_balance: u64, + block_revenue_sharing: bool, ) -> VoteAccounts { assert!(max_vote_accounts > 0, "max_vote_accounts must be > 0"); let capacity = max_vote_accounts.min(self.vote_accounts.len()); @@ -223,10 +224,14 @@ impl VoteAccounts { let has_stake = *stake != 0u64; // Pending delegator rewards are deducted at the start of the epoch, // so this operation reflects the actual expected balance - let has_balance = vote_account - .lamports() - .saturating_sub(vote_state_view.pending_delegator_rewards()) - >= minimum_vote_account_balance; + let available_balance = if block_revenue_sharing { + vote_account + .lamports() + .saturating_sub(vote_state_view.pending_delegator_rewards()) + } else { + vote_account.lamports() + }; + let has_balance = available_balance >= minimum_vote_account_balance; if !has_bls || !has_stake || !has_balance { continue;