From 3a49a00bd43c4e15a94d127218d96cfd38bc9a55 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Tue, 3 Oct 2023 10:20:20 -0500 Subject: [PATCH 001/213] Update version to v1.17.1 (#33489) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c892fd686a6757..5f40166dbab93d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2134,7 +2134,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "regex", @@ -2142,7 +2142,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.0" +version = "1.17.1" dependencies = [ "regex", ] @@ -4061,7 +4061,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.0" +version = "1.17.1" dependencies = [ "protobuf-src", "tonic-build", @@ -4306,7 +4306,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.0" +version = "1.17.1" [[package]] name = "rcgen" @@ -5095,7 +5095,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.0" +version = "1.17.1" dependencies = [ "Inflector", "assert_matches", @@ -5119,7 +5119,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 2.33.3", "log", @@ -5133,7 +5133,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 2.33.3", "log", @@ -5163,7 +5163,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.0" +version = "1.17.1" dependencies = [ "arrayref", "assert_matches", @@ -5227,7 +5227,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "bytemuck", @@ -5246,7 +5246,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -5257,7 +5257,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5281,7 +5281,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5298,7 +5298,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.0" +version = "1.17.1" dependencies = [ "serde", "solana-sdk", @@ -5307,7 +5307,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "crossbeam-channel", @@ -5325,7 +5325,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5377,7 +5377,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bv", "fnv", @@ -5394,7 +5394,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -5414,7 +5414,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -5425,7 +5425,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bv", "bytemuck", @@ -5444,7 +5444,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "solana-logger", @@ -5452,7 +5452,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_cmd", "bzip2", @@ -5473,11 +5473,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.0" +version = "1.17.1" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.0" +version = "1.17.1" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "chrono", @@ -5505,7 +5505,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "chrono", @@ -5523,7 +5523,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -5576,7 +5576,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.0" +version = "1.17.1" dependencies = [ "anyhow", "dirs-next", @@ -5591,7 +5591,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.0" +version = "1.17.1" dependencies = [ "Inflector", "base64 0.21.4", @@ -5617,7 +5617,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-trait", "bincode", @@ -5649,7 +5649,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.0" +version = "1.17.1" dependencies = [ "futures-util", "rand 0.8.5", @@ -5679,7 +5679,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5687,7 +5687,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "chrono", @@ -5700,7 +5700,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-trait", "bincode", @@ -5724,7 +5724,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.0" +version = "1.17.1" dependencies = [ "lazy_static", "log", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "clap 3.2.23", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "console", "indicatif", @@ -5874,7 +5874,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5885,7 +5885,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "byteorder", @@ -5929,7 +5929,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.0" +version = "1.17.1" dependencies = [ "ahash 0.8.3", "blake3", @@ -5958,7 +5958,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.0" +version = "1.17.1" dependencies = [ "proc-macro2", "quote", @@ -5968,7 +5968,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.0" +version = "1.17.1" dependencies = [ "base64 0.21.4", "bincode", @@ -5993,7 +5993,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "solana-accounts-db", @@ -6004,7 +6004,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "solana-sdk", @@ -6014,7 +6014,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bs58", "crossbeam-channel", @@ -6039,7 +6039,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.0" +version = "1.17.1" dependencies = [ "atty", "bincode", @@ -6125,7 +6125,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bs58", "clap 3.2.23", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -6210,7 +6210,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_cmd", "bs58", @@ -6259,7 +6259,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "log", @@ -6271,7 +6271,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6310,7 +6310,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.0" +version = "1.17.1" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6322,7 +6322,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.0" +version = "1.17.1" dependencies = [ "env_logger", "lazy_static", @@ -6331,7 +6331,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "solana-sdk", @@ -6339,11 +6339,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.0" +version = "1.17.1" [[package]] name = "solana-merkle-root-bench" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 2.33.3", "log", @@ -6356,7 +6356,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.0" +version = "1.17.1" dependencies = [ "fast-math", "hex", @@ -6365,7 +6365,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.0" +version = "1.17.1" dependencies = [ "crossbeam-channel", "env_logger", @@ -6381,7 +6381,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6392,7 +6392,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "clap 3.2.23", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "reqwest", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.0" +version = "1.17.1" dependencies = [ "ahash 0.8.3", "assert_matches", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 3.2.23", "log", @@ -6486,7 +6486,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "anyhow", "ark-bn254", @@ -6543,7 +6543,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6572,7 +6572,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "async-trait", @@ -6600,7 +6600,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "anyhow", "crossbeam-channel", @@ -6624,7 +6624,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-mutex", "async-trait", @@ -6652,7 +6652,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.0" +version = "1.17.1" dependencies = [ "lazy_static", "num_cpus", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "console", @@ -6679,7 +6679,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.0" +version = "1.17.1" dependencies = [ "base64 0.21.4", "bincode", @@ -6738,7 +6738,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "async-trait", @@ -6767,7 +6767,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.0" +version = "1.17.1" dependencies = [ "base64 0.21.4", "bs58", @@ -6787,7 +6787,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "anyhow", "clap 2.33.3", @@ -6804,7 +6804,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "bs58", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.0" +version = "1.17.1" dependencies = [ "arrayref", "assert_matches", @@ -6914,7 +6914,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.0" +version = "1.17.1" dependencies = [ "anyhow", "assert_matches", @@ -6972,7 +6972,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bs58", "proc-macro2", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.0" +version = "1.17.1" dependencies = [ "crossbeam-channel", "log", @@ -6998,7 +6998,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7014,7 +7014,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.0" +version = "1.17.1" dependencies = [ "backoff", "bincode", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "bs58", @@ -7079,7 +7079,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 2.33.3", "log", @@ -7091,7 +7091,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "async-channel", @@ -7123,7 +7123,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -7137,7 +7137,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.0" +version = "1.17.1" dependencies = [ "base64 0.21.4", "bincode", @@ -7167,7 +7167,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "log", @@ -7181,7 +7181,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -7214,7 +7214,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-trait", "bincode", @@ -7236,7 +7236,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "clap 2.33.3", @@ -7263,7 +7263,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.0" +version = "1.17.1" dependencies = [ "Inflector", "base64 0.21.4", @@ -7286,7 +7286,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -7323,7 +7323,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-trait", "solana-connection-cache", @@ -7336,7 +7336,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.0" +version = "1.17.1" dependencies = [ "serde_json", "solana-metrics", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.0" +version = "1.17.1" dependencies = [ "chrono", "clap 2.33.3", @@ -7408,7 +7408,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "rustc_version 0.4.0", @@ -7422,7 +7422,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "crossbeam-channel", @@ -7441,7 +7441,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -7464,7 +7464,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 2.33.3", "humantime", @@ -7483,7 +7483,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bs58", "clap 3.2.23", @@ -7502,7 +7502,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bytemuck", "criterion", @@ -7516,7 +7516,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7528,7 +7528,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.0" +version = "1.17.1" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index a93092f2e892c0..791f5494051d7d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.0" +version = "1.17.1" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.7.2" -solana-account-decoder = { path = "account-decoder", version = "=1.17.0" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.0" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.0" } -solana-banks-client = { path = "banks-client", version = "=1.17.0" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.0" } -solana-banks-server = { path = "banks-server", version = "=1.17.0" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.0" } -solana-bloom = { path = "bloom", version = "=1.17.0" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.0" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.0" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.0", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.0" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.0" } -solana-cli = { path = "cli", version = "=1.17.0" } -solana-cli-config = { path = "cli-config", version = "=1.17.0" } -solana-cli-output = { path = "cli-output", version = "=1.17.0" } -solana-client = { path = "client", version = "=1.17.0" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.0" } -solana-config-program = { path = "programs/config", version = "=1.17.0" } -solana-core = { path = "core", version = "=1.17.0" } -solana-cost-model = { path = "cost-model", version = "=1.17.0" } -solana-download-utils = { path = "download-utils", version = "=1.17.0" } -solana-entry = { path = "entry", version = "=1.17.0" } -solana-faucet = { path = "faucet", version = "=1.17.0" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.0" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.0" } -solana-genesis = { path = "genesis", version = "=1.17.0" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.0" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.0" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.0" } -solana-gossip = { path = "gossip", version = "=1.17.0" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.0" } -solana-ledger = { path = "ledger", version = "=1.17.0" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.0" } -solana-logger = { path = "logger", version = "=1.17.0" } -solana-measure = { path = "measure", version = "=1.17.0" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.0" } -solana-metrics = { path = "metrics", version = "=1.17.0" } -solana-net-utils = { path = "net-utils", version = "=1.17.0" } -solana-notifier = { path = "notifier", version = "=1.17.0" } -solana-perf = { path = "perf", version = "=1.17.0" } -solana-poh = { path = "poh", version = "=1.17.0" } -solana-program = { path = "sdk/program", version = "=1.17.0" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.0" } -solana-program-test = { path = "program-test", version = "=1.17.0" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.0" } -solana-quic-client = { path = "quic-client", version = "=1.17.0" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.0" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.0", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.0" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.0", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.0" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.0" } -solana-runtime = { path = "runtime", version = "=1.17.0" } -solana-sdk = { path = "sdk", version = "=1.17.0" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.0" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.0" } -solana-stake-program = { path = "programs/stake", version = "=1.17.0" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.0" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.0" } -solana-streamer = { path = "streamer", version = "=1.17.0" } -solana-system-program = { path = "programs/system", version = "=1.17.0" } -solana-test-validator = { path = "test-validator", version = "=1.17.0" } -solana-thin-client = { path = "thin-client", version = "=1.17.0" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.0", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.0" } -solana-turbine = { path = "turbine", version = "=1.17.0" } -solana-udp-client = { path = "udp-client", version = "=1.17.0" } -solana-version = { path = "version", version = "=1.17.0" } -solana-vote = { path = "vote", version = "=1.17.0" } -solana-vote-program = { path = "programs/vote", version = "=1.17.0" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.0" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.0" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.0" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.1" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.1" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.1" } +solana-banks-client = { path = "banks-client", version = "=1.17.1" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.1" } +solana-banks-server = { path = "banks-server", version = "=1.17.1" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.1" } +solana-bloom = { path = "bloom", version = "=1.17.1" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.1" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.1" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.1", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.1" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.1" } +solana-cli = { path = "cli", version = "=1.17.1" } +solana-cli-config = { path = "cli-config", version = "=1.17.1" } +solana-cli-output = { path = "cli-output", version = "=1.17.1" } +solana-client = { path = "client", version = "=1.17.1" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.1" } +solana-config-program = { path = "programs/config", version = "=1.17.1" } +solana-core = { path = "core", version = "=1.17.1" } +solana-cost-model = { path = "cost-model", version = "=1.17.1" } +solana-download-utils = { path = "download-utils", version = "=1.17.1" } +solana-entry = { path = "entry", version = "=1.17.1" } +solana-faucet = { path = "faucet", version = "=1.17.1" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.1" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.1" } +solana-genesis = { path = "genesis", version = "=1.17.1" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.1" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.1" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.1" } +solana-gossip = { path = "gossip", version = "=1.17.1" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.1" } +solana-ledger = { path = "ledger", version = "=1.17.1" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.1" } +solana-logger = { path = "logger", version = "=1.17.1" } +solana-measure = { path = "measure", version = "=1.17.1" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.1" } +solana-metrics = { path = "metrics", version = "=1.17.1" } +solana-net-utils = { path = "net-utils", version = "=1.17.1" } +solana-notifier = { path = "notifier", version = "=1.17.1" } +solana-perf = { path = "perf", version = "=1.17.1" } +solana-poh = { path = "poh", version = "=1.17.1" } +solana-program = { path = "sdk/program", version = "=1.17.1" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.1" } +solana-program-test = { path = "program-test", version = "=1.17.1" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.1" } +solana-quic-client = { path = "quic-client", version = "=1.17.1" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.1" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.1", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.1" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.1", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.1" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.1" } +solana-runtime = { path = "runtime", version = "=1.17.1" } +solana-sdk = { path = "sdk", version = "=1.17.1" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.1" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.1" } +solana-stake-program = { path = "programs/stake", version = "=1.17.1" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.1" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.1" } +solana-streamer = { path = "streamer", version = "=1.17.1" } +solana-system-program = { path = "programs/system", version = "=1.17.1" } +solana-test-validator = { path = "test-validator", version = "=1.17.1" } +solana-thin-client = { path = "thin-client", version = "=1.17.1" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.1", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.1" } +solana-turbine = { path = "turbine", version = "=1.17.1" } +solana-udp-client = { path = "udp-client", version = "=1.17.1" } +solana-version = { path = "version", version = "=1.17.1" } +solana-vote = { path = "vote", version = "=1.17.1" } +solana-vote-program = { path = "programs/vote", version = "=1.17.1" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.1" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.1" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.1" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 3a113d5336a333..4eccde743b06ea 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.0" +version = "1.17.1" dependencies = [ "Inflector", "base64 0.21.4", @@ -4468,7 +4468,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.0" +version = "1.17.1" dependencies = [ "arrayref", "bincode", @@ -4525,7 +4525,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "bytemuck", @@ -4544,7 +4544,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4559,7 +4559,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.0" +version = "1.17.1" dependencies = [ "serde", "solana-sdk", @@ -4568,7 +4568,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "crossbeam-channel", @@ -4586,7 +4586,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bv", "fnv", @@ -4603,7 +4603,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.0" +version = "1.17.1" dependencies = [ "array-bytes", "serde", @@ -4630,7 +4630,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bv", "bytemuck", @@ -4646,7 +4646,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "chrono", "clap 2.33.3", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.0" +version = "1.17.1" dependencies = [ "dirs-next", "lazy_static", @@ -4675,7 +4675,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.0" +version = "1.17.1" dependencies = [ "Inflector", "base64 0.21.4", @@ -4700,7 +4700,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-trait", "bincode", @@ -4731,7 +4731,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4739,7 +4739,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "chrono", @@ -4751,7 +4751,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-trait", "bincode", @@ -4771,7 +4771,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.0" +version = "1.17.1" dependencies = [ "base64 0.21.4", "bincode", @@ -4843,7 +4843,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.0" +version = "1.17.1" dependencies = [ "lazy_static", "log", @@ -4865,7 +4865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "console", "indicatif", @@ -4877,7 +4877,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "crossbeam-channel", @@ -4897,7 +4897,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.0" +version = "1.17.1" dependencies = [ "ahash 0.8.3", "blake3", @@ -4947,7 +4947,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.0" +version = "1.17.1" dependencies = [ "proc-macro2", "quote", @@ -4957,7 +4957,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "solana-accounts-db", @@ -4968,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "solana-sdk", @@ -4978,7 +4978,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bs58", "crossbeam-channel", @@ -5003,7 +5003,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -5051,7 +5051,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "bincode", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "solana-measure", @@ -5126,7 +5126,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.0" +version = "1.17.1" dependencies = [ "env_logger", "lazy_static", @@ -5135,7 +5135,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "solana-sdk", @@ -5143,7 +5143,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.0" +version = "1.17.1" dependencies = [ "fast-math", "solana-program", @@ -5151,7 +5151,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.0" +version = "1.17.1" dependencies = [ "crossbeam-channel", "gethostname", @@ -5164,7 +5164,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "clap 3.1.6", @@ -5184,7 +5184,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.0" +version = "1.17.1" dependencies = [ "ahash 0.8.3", "bincode", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.0" +version = "1.17.1" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5224,7 +5224,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "ark-bn254", "ark-ec", @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.0" +version = "1.17.1" dependencies = [ "base64 0.21.4", "bincode", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "async-trait", @@ -5329,7 +5329,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "crossbeam-channel", "futures-util", @@ -5352,7 +5352,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-mutex", "async-trait", @@ -5377,7 +5377,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.0" +version = "1.17.1" dependencies = [ "lazy_static", "num_cpus", @@ -5385,7 +5385,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.0" +version = "1.17.1" dependencies = [ "console", "dialoguer", @@ -5402,7 +5402,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.0" +version = "1.17.1" dependencies = [ "base64 0.21.4", "bincode", @@ -5457,7 +5457,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-trait", "base64 0.21.4", @@ -5481,7 +5481,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.0" +version = "1.17.1" dependencies = [ "base64 0.21.4", "bs58", @@ -5501,7 +5501,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.0" +version = "1.17.1" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5512,7 +5512,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.0" +version = "1.17.1" dependencies = [ "arrayref", "base64 0.21.4", @@ -5587,7 +5587,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5616,7 +5616,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5624,21 +5624,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.0" +version = "1.17.1" dependencies = [ "array-bytes", "solana-program", @@ -5646,7 +5646,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.0" +version = "1.17.1" dependencies = [ "array-bytes", "solana-program", @@ -5654,21 +5654,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5676,14 +5676,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.0" +version = "1.17.1" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5691,21 +5691,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.0" +version = "1.17.1" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5715,42 +5715,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.0" +version = "1.17.1" dependencies = [ "rustversion", "solana-program", @@ -5760,49 +5760,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5810,14 +5810,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-program-runtime", @@ -5827,7 +5827,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5835,21 +5835,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5857,14 +5857,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.0" +version = "1.17.1" dependencies = [ "array-bytes", "solana-program", @@ -5872,7 +5872,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.0" +version = "1.17.1" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5881,14 +5881,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-program-runtime", @@ -5906,21 +5906,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-program-runtime", @@ -5930,7 +5930,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.0" +version = "1.17.1" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5938,7 +5938,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.0" +version = "1.17.1" dependencies = [ "blake3", "solana-program", @@ -5946,21 +5946,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-logger", "solana-program", @@ -5971,21 +5971,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", "solana-program-runtime", @@ -5995,21 +5995,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.0" +version = "1.17.1" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.0" +version = "1.17.1" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6061,7 +6061,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bs58", "proc-macro2", @@ -6072,7 +6072,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.0" +version = "1.17.1" dependencies = [ "crossbeam-channel", "log", @@ -6086,7 +6086,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.0" +version = "1.17.1" dependencies = [ "backoff", "bincode", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "bs58", @@ -6146,7 +6146,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-channel", "bytes", @@ -6176,7 +6176,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "log", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.0" +version = "1.17.1" dependencies = [ "base64 0.21.4", "bincode", @@ -6218,7 +6218,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "log", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-trait", "bincode", @@ -6253,7 +6253,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.0" +version = "1.17.1" dependencies = [ "Inflector", "base64 0.21.4", @@ -6276,7 +6276,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "bytes", @@ -6311,7 +6311,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.0" +version = "1.17.1" dependencies = [ "async-trait", "solana-connection-cache", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.0" +version = "1.17.1" dependencies = [ "chrono", "clap 2.33.3", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.0" +version = "1.17.1" dependencies = [ "log", "rustc_version", @@ -6400,7 +6400,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.0" +version = "1.17.1" dependencies = [ "crossbeam-channel", "itertools", @@ -6417,7 +6417,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bincode", "log", @@ -6437,7 +6437,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.0" +version = "1.17.1" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6449,7 +6449,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.0" +version = "1.17.1" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 5e2370576d4b20..add5ba942e9a6b 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.0" +version = "1.17.1" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.7.2" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.0" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.0" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.0" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.0" } -solana-ledger = { path = "../../ledger", version = "=1.17.0" } -solana-logger = { path = "../../logger", version = "=1.17.0" } -solana-measure = { path = "../../measure", version = "=1.17.0" } -solana-program = { path = "../../sdk/program", version = "=1.17.0" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.0" } -solana-program-test = { path = "../../program-test", version = "=1.17.0" } -solana-runtime = { path = "../../runtime", version = "=1.17.0" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.0" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.0" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.0", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.0" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.0" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.0" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.0", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.0" } -solana-sdk = { path = "../../sdk", version = "=1.17.0" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.0" } -solana-validator = { path = "../../validator", version = "=1.17.0" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.0" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.1" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.1" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.1" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.1" } +solana-ledger = { path = "../../ledger", version = "=1.17.1" } +solana-logger = { path = "../../logger", version = "=1.17.1" } +solana-measure = { path = "../../measure", version = "=1.17.1" } +solana-program = { path = "../../sdk/program", version = "=1.17.1" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.1" } +solana-program-test = { path = "../../program-test", version = "=1.17.1" } +solana-runtime = { path = "../../runtime", version = "=1.17.1" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.1" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.1" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.1", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.1" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.1" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.1" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.1", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.1" } +solana-sdk = { path = "../../sdk", version = "=1.17.1" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.1" } +solana-validator = { path = "../../validator", version = "=1.17.1" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.1" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index a5ecf6a3a38d38..ba045404850058 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.0" +version = "1.17.1" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.0" } +solana-program = { path = "../../../../program", version = "=1.17.1" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index a05351e377201a..76f28b6adce03c 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.0" +version = "1.17.1" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.0" } +solana-program = { path = "../../../../program", version = "=1.17.1" } [lib] crate-type = ["cdylib"] From f9c87c9d5747cdf011c06255e9206b3aa0a15601 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 3 Oct 2023 21:01:06 +0200 Subject: [PATCH 002/213] v1.17: Refactor - `LoadedPrograms` (backport of #33482) (#33491) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor - `LoadedPrograms` (#33482) * Adds type ProgramRuntimeEnvironment. * Moves LoadedPrograms::remove_expired_entries() into LoadedPrograms::prune(). * Adds Stats::prunes_environment and renames Stats::prunes_orphan and Stats::prunes_expired. * Adds LoadedPrograms::latest_root_epoch. * Typo fix, authored-by: Dmitri Makarov (cherry picked from commit 8033be333e57d058cc8d5981ee5ca3990270da25) Co-authored-by: Alexander Meißner --- program-runtime/src/loaded_programs.rs | 147 ++++++++++++++----------- runtime/src/bank_forks.rs | 2 +- 2 files changed, 81 insertions(+), 68 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index ed34ca523cd12f..43061f19a0758e 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -13,8 +13,11 @@ use { vm::{BuiltinProgram, Config}, }, solana_sdk::{ - bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable, clock::Slot, loader_v4, - pubkey::Pubkey, saturating_add_assign, + bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable, + clock::{Epoch, Slot}, + loader_v4, + pubkey::Pubkey, + saturating_add_assign, }, std::{ collections::HashMap, @@ -26,7 +29,8 @@ use { }, }; -const MAX_LOADED_ENTRY_COUNT: usize = 256; +pub type ProgramRuntimeEnvironment = Arc>>; +pub const MAX_LOADED_ENTRY_COUNT: usize = 256; pub const DELAY_VISIBILITY_SLOT_OFFSET: Slot = 1; /// Relationship between two fork IDs @@ -62,17 +66,17 @@ pub trait WorkingSlot { #[derive(Default)] pub enum LoadedProgramType { /// Tombstone for undeployed, closed or unloadable programs - FailedVerification(Arc>>), + FailedVerification(ProgramRuntimeEnvironment), #[default] Closed, DelayVisibility, /// Successfully verified but not currently compiled, used to track usage statistics when a compiled program is evicted from memory. - Unloaded(Arc>>), + Unloaded(ProgramRuntimeEnvironment), LegacyV0(Executable>), LegacyV1(Executable>), Typed(Executable>), #[cfg(test)] - TestLoaded(Arc>>), + TestLoaded(ProgramRuntimeEnvironment), Builtin(BuiltinProgram>), } @@ -121,8 +125,9 @@ pub struct Stats { pub insertions: AtomicU64, pub replacements: AtomicU64, pub one_hit_wonders: AtomicU64, - pub prunes: AtomicU64, - pub expired: AtomicU64, + pub prunes_orphan: AtomicU64, + pub prunes_expired: AtomicU64, + pub prunes_environment: AtomicU64, pub empty_entries: AtomicU64, } @@ -135,8 +140,9 @@ impl Stats { let replacements = self.replacements.load(Ordering::Relaxed); let one_hit_wonders = self.one_hit_wonders.load(Ordering::Relaxed); let evictions: u64 = self.evictions.values().sum(); - let prunes = self.prunes.load(Ordering::Relaxed); - let expired = self.expired.load(Ordering::Relaxed); + let prunes_orphan = self.prunes_orphan.load(Ordering::Relaxed); + let prunes_expired = self.prunes_expired.load(Ordering::Relaxed); + let prunes_environment = self.prunes_environment.load(Ordering::Relaxed); let empty_entries = self.empty_entries.load(Ordering::Relaxed); datapoint_info!( "loaded-programs-cache-stats", @@ -147,13 +153,14 @@ impl Stats { ("insertions", insertions, i64), ("replacements", replacements, i64), ("one_hit_wonders", one_hit_wonders, i64), - ("prunes", prunes, i64), - ("evict_expired", expired, i64), - ("evict_empty_entries", empty_entries, i64), + ("prunes_orphan", prunes_orphan, i64), + ("prunes_expired", prunes_expired, i64), + ("prunes_environment", prunes_environment, i64), + ("empty_entries", empty_entries, i64), ); debug!( - "Loaded Programs Cache Stats -- Hits: {}, Misses: {}, Evictions: {}, Insertions: {}, Replacements: {}, One-Hit-Wonders: {}, Prunes: {}, Expired: {}, Empty: {}", - hits, misses, evictions, insertions, replacements, one_hit_wonders, prunes, expired, empty_entries + "Loaded Programs Cache Stats -- Hits: {}, Misses: {}, Evictions: {}, Insertions: {}, Replacements: {}, One-Hit-Wonders: {}, Prunes-Orphan: {}, Prunes-Expired: {}, Prunes-Environment: {}, Empty: {}", + hits, misses, evictions, insertions, replacements, one_hit_wonders, prunes_orphan, prunes_expired, prunes_environment, empty_entries ); if log_enabled!(log::Level::Trace) && !self.evictions.is_empty() { let mut evictions = self.evictions.iter().collect::>(); @@ -221,7 +228,7 @@ impl LoadedProgram { /// Creates a new user program pub fn new( loader_key: &Pubkey, - program_runtime_environment: Arc>>, + program_runtime_environment: ProgramRuntimeEnvironment, deployment_slot: Slot, effective_slot: Slot, maybe_expiration_slot: Option, @@ -407,10 +414,10 @@ impl LoadedProgram { #[derive(Clone, Debug)] pub struct ProgramRuntimeEnvironments { - /// Globally shared RBPF config and syscall registry - pub program_runtime_v1: Arc>>, + /// Globally shared RBPF config and syscall registry for runtime V1 + pub program_runtime_v1: ProgramRuntimeEnvironment, /// Globally shared RBPF config and syscall registry for runtime V2 - pub program_runtime_v2: Arc>>, + pub program_runtime_v2: ProgramRuntimeEnvironment, } impl Default for ProgramRuntimeEnvironments { @@ -432,8 +439,12 @@ pub struct LoadedPrograms { /// /// Pubkey is the address of a program, multiple versions can coexists simultaneously under the same address (in different slots). entries: HashMap>>, + /// The slot of the last rerooting + pub latest_root_slot: Slot, + /// The epoch of the last rerooting + pub latest_root_epoch: Epoch, + /// Environments of the current epoch pub environments: ProgramRuntimeEnvironments, - latest_root: Slot, pub stats: Stats, } @@ -605,7 +616,9 @@ impl LoadedPrograms { _ => false, }; if !retain { - self.stats.prunes.fetch_add(1, Ordering::Relaxed); + self.stats + .prunes_environment + .fetch_add(1, Ordering::Relaxed); } retain }); @@ -625,39 +638,54 @@ impl LoadedPrograms { self.remove_programs_with_no_entries(); } - /// Before rerooting the blockstore this removes all programs of orphan forks - pub fn prune(&mut self, fork_graph: &F, new_root: Slot) { - let previous_root = self.latest_root; - self.entries.retain(|_key, second_level| { + /// Before rerooting the blockstore this removes all superfluous entries + pub fn prune( + &mut self, + fork_graph: &F, + new_root_slot: Slot, + new_root_epoch: Epoch, + ) { + for second_level in self.entries.values_mut() { + // Remove entries un/re/deployed on orphan forks let mut first_ancestor_found = false; *second_level = second_level .iter() .rev() .filter(|entry| { - let relation = fork_graph.relationship(entry.deployment_slot, new_root); - if entry.deployment_slot >= new_root { + let relation = fork_graph.relationship(entry.deployment_slot, new_root_slot); + if entry.deployment_slot >= new_root_slot { matches!(relation, BlockRelation::Equal | BlockRelation::Descendant) } else if !first_ancestor_found && (matches!(relation, BlockRelation::Ancestor) - || entry.deployment_slot <= previous_root) + || entry.deployment_slot <= self.latest_root_slot) { first_ancestor_found = true; first_ancestor_found } else { - self.stats.prunes.fetch_add(1, Ordering::Relaxed); + self.stats.prunes_orphan.fetch_add(1, Ordering::Relaxed); false } }) + .filter(|entry| { + // Remove expired + if let Some(expiration) = entry.maybe_expiration_slot { + if expiration <= new_root_slot { + self.stats.prunes_expired.fetch_add(1, Ordering::Relaxed); + return false; + } + } + true + }) .cloned() .collect(); second_level.reverse(); - !second_level.is_empty() - }); - - self.remove_expired_entries(new_root); + } self.remove_programs_with_no_entries(); - - self.latest_root = std::cmp::max(self.latest_root, new_root); + debug_assert!(self.latest_root_slot <= new_root_slot); + self.latest_root_slot = new_root_slot; + if self.latest_root_epoch < new_root_epoch { + self.latest_root_epoch = new_root_epoch; + } } fn matches_loaded_program_criteria( @@ -706,7 +734,7 @@ impl LoadedPrograms { if let Some(second_level) = self.entries.get(&key) { for entry in second_level.iter().rev() { let current_slot = working_slot.current_slot(); - if entry.deployment_slot <= self.latest_root + if entry.deployment_slot <= self.latest_root_slot || entry.deployment_slot == current_slot || working_slot.is_ancestor(entry.deployment_slot) { @@ -826,24 +854,6 @@ impl LoadedPrograms { } } - fn remove_expired_entries(&mut self, current_slot: Slot) { - for entry in self.entries.values_mut() { - entry.retain(|program| { - program - .maybe_expiration_slot - .map(|expiration| { - if expiration > current_slot { - true - } else { - self.stats.expired.fetch_add(1, Ordering::Relaxed); - false - } - }) - .unwrap_or(true) - }); - } - } - fn unload_program(&mut self, id: &Pubkey) { if let Some(entries) = self.entries.get_mut(id) { entries.iter_mut().for_each(|entry| { @@ -1316,40 +1326,43 @@ mod tests { relation: BlockRelation::Unrelated, }; - cache.prune(&fork_graph, 0); + cache.prune(&fork_graph, 0, 0); assert!(cache.entries.is_empty()); - cache.prune(&fork_graph, 10); + cache.prune(&fork_graph, 10, 0); assert!(cache.entries.is_empty()); + let mut cache = LoadedPrograms::default(); let fork_graph = TestForkGraph { relation: BlockRelation::Ancestor, }; - cache.prune(&fork_graph, 0); + cache.prune(&fork_graph, 0, 0); assert!(cache.entries.is_empty()); - cache.prune(&fork_graph, 10); + cache.prune(&fork_graph, 10, 0); assert!(cache.entries.is_empty()); + let mut cache = LoadedPrograms::default(); let fork_graph = TestForkGraph { relation: BlockRelation::Descendant, }; - cache.prune(&fork_graph, 0); + cache.prune(&fork_graph, 0, 0); assert!(cache.entries.is_empty()); - cache.prune(&fork_graph, 10); + cache.prune(&fork_graph, 10, 0); assert!(cache.entries.is_empty()); + let mut cache = LoadedPrograms::default(); let fork_graph = TestForkGraph { relation: BlockRelation::Unknown, }; - cache.prune(&fork_graph, 0); + cache.prune(&fork_graph, 0, 0); assert!(cache.entries.is_empty()); - cache.prune(&fork_graph, 10); + cache.prune(&fork_graph, 10, 0); assert!(cache.entries.is_empty()); } @@ -1760,7 +1773,7 @@ mod tests { programs.pop(); } - cache.prune(&fork_graph, 5); + cache.prune(&fork_graph, 5, 0); // Fork graph after pruning // 0 @@ -1825,7 +1838,7 @@ mod tests { assert!(match_slot(&found, &program3, 25, 27)); assert!(match_slot(&found, &program4, 5, 27)); - cache.prune(&fork_graph, 15); + cache.prune(&fork_graph, 15, 0); // Fork graph after pruning // 0 @@ -2176,7 +2189,7 @@ mod tests { ); // New root 5 should not evict the expired entry for program1 - cache.prune(&fork_graph, 5); + cache.prune(&fork_graph, 5, 0); assert_eq!( cache .entries @@ -2187,7 +2200,7 @@ mod tests { ); // New root 15 should evict the expired entry for program1 - cache.prune(&fork_graph, 15); + cache.prune(&fork_graph, 15, 0); assert!(cache.entries.get(&program1).is_none()); } @@ -2213,7 +2226,7 @@ mod tests { assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); assert!(!cache.replenish(program1, new_test_loaded_program(5, 6)).0); - cache.prune(&fork_graph, 10); + cache.prune(&fork_graph, 10, 0); let working_slot = TestWorkingSlot::new(20, &[0, 10, 20]); let ExtractedPrograms { diff --git a/runtime/src/bank_forks.rs b/runtime/src/bank_forks.rs index b56f4d774d1c76..ec69df9dded953 100644 --- a/runtime/src/bank_forks.rs +++ b/runtime/src/bank_forks.rs @@ -419,7 +419,7 @@ impl BankForks { .loaded_programs_cache .write() .unwrap() - .prune(self, root); + .prune(self, root, root_bank.epoch()); let set_root_start = Instant::now(); let (removed_banks, set_root_metrics) = self.do_set_root_return_metrics( root, From b90f08f9669db9e384a5fbefadd8cbca1e619d5b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 3 Oct 2023 15:18:42 -0500 Subject: [PATCH 003/213] v1.17: Deprecate bz2/gzip/none/tar snapshot compression types (backport of #33484) (#33492) Deprecate bz2/gzip/none/tar snapshot compression types (#33484) These options are now disallowed on the command line for solana-validator and solana-ledger-tool, which effectively means no more snapshots will be created with this types in normal usecases. However, support for reading the deprecated types is still in place. (cherry picked from commit 73e9e6dd70a60b27586f7ea1d2e6c2f83a99b29d) Co-authored-by: steviez --- runtime/src/snapshot_utils/archive_format.rs | 20 ++++++++------------ scripts/run.sh | 1 - 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/runtime/src/snapshot_utils/archive_format.rs b/runtime/src/snapshot_utils/archive_format.rs index 4ef271cbb5bf3a..d807f4447a2b7b 100644 --- a/runtime/src/snapshot_utils/archive_format.rs +++ b/runtime/src/snapshot_utils/archive_format.rs @@ -3,7 +3,13 @@ use { strum::Display, }; -pub const SUPPORTED_ARCHIVE_COMPRESSION: &[&str] = &["bz2", "gzip", "zstd", "lz4", "tar", "none"]; +// SUPPORTED_ARCHIVE_COMPRESSION lists the compression types that can be +// specified on the command line. "zstd" and "lz4" are valid whereas "gzip", +// "bz2", "tar" and "none" have been deprecated. Thus, all newly created +// snapshots will either use "zstd" or "lz4". By keeping the deprecated types +// in the ArchiveFormat enum, pre-existing snapshot archives with the +// deprecated compression types can still be read. +pub const SUPPORTED_ARCHIVE_COMPRESSION: &[&str] = &["zstd", "lz4"]; pub const DEFAULT_ARCHIVE_COMPRESSION: &str = "zstd"; pub const TAR_BZIP2_EXTENSION: &str = "tar.bz2"; @@ -36,11 +42,8 @@ impl ArchiveFormat { pub fn from_cli_arg(archive_format_str: &str) -> Option { match archive_format_str { - "bz2" => Some(ArchiveFormat::TarBzip2), - "gzip" => Some(ArchiveFormat::TarGzip), "zstd" => Some(ArchiveFormat::TarZstd), "lz4" => Some(ArchiveFormat::TarLz4), - "tar" | "none" => Some(ArchiveFormat::Tar), _ => None, } } @@ -158,14 +161,7 @@ mod tests { #[test] fn test_from_cli_arg() { - let golden = [ - Some(ArchiveFormat::TarBzip2), - Some(ArchiveFormat::TarGzip), - Some(ArchiveFormat::TarZstd), - Some(ArchiveFormat::TarLz4), - Some(ArchiveFormat::Tar), - Some(ArchiveFormat::Tar), - ]; + let golden = [Some(ArchiveFormat::TarZstd), Some(ArchiveFormat::TarLz4)]; for (arg, expected) in zip(SUPPORTED_ARCHIVE_COMPRESSION.iter(), golden.into_iter()) { assert_eq!(ArchiveFormat::from_cli_arg(arg), expected); diff --git a/scripts/run.sh b/scripts/run.sh index a890aa10c17474..699bfce3e253e3 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -110,7 +110,6 @@ args=( --enable-rpc-transaction-history --enable-extended-tx-metadata-storage --init-complete-file "$dataDir"/init-completed - --snapshot-compression none --require-tower --no-wait-for-vote-to-start-leader --no-os-network-limits-test From 184b17f859146f1145bbf6330a8d8f60600792cc Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 05:24:36 +0000 Subject: [PATCH 004/213] v1.17: ci: remove stable-perf from PR and push CI (backport of #33479) (#33500) ci: remove stable-perf from PR and push CI (#33479) ci: move stable-perf to nightly pipeline (cherry picked from commit b87c8d163d5df7ea0b401918035699641bb7d8fa) Co-authored-by: Yihau Chen --- ci/buildkite-pipeline-in-disk.sh | 27 --------------------------- ci/buildkite-pipeline.sh | 27 --------------------------- ci/buildkite-solana-private.sh | 27 --------------------------- 3 files changed, 81 deletions(-) diff --git a/ci/buildkite-pipeline-in-disk.sh b/ci/buildkite-pipeline-in-disk.sh index c9816e30a6df9b..113b009aa4452e 100755 --- a/ci/buildkite-pipeline-in-disk.sh +++ b/ci/buildkite-pipeline-in-disk.sh @@ -196,33 +196,6 @@ EOF "Stable-SBF skipped as no relevant files were modified" fi - # Perf test suite - if affects \ - .rs$ \ - Cargo.lock$ \ - Cargo.toml$ \ - ^ci/rust-version.sh \ - ^ci/test-stable-perf.sh \ - ^ci/test-stable.sh \ - ^ci/test-local-cluster.sh \ - ^core/build.rs \ - ^fetch-perf-libs.sh \ - ^programs/ \ - ^sdk/ \ - ; then - cat >> "$output_file" <<"EOF" - - command: "ci/test-stable-perf.sh" - name: "stable-perf" - timeout_in_minutes: 35 - artifact_paths: "log-*.txt" - agents: - queue: "cuda" -EOF - else - annotate --style info \ - "Stable-perf skipped as no relevant files were modified" - fi - # Downstream backwards compatibility if affects \ .rs$ \ diff --git a/ci/buildkite-pipeline.sh b/ci/buildkite-pipeline.sh index e130c585ad6dde..8535905bfee4d0 100755 --- a/ci/buildkite-pipeline.sh +++ b/ci/buildkite-pipeline.sh @@ -194,33 +194,6 @@ EOF "Stable-SBF skipped as no relevant files were modified" fi - # Perf test suite - if affects \ - .rs$ \ - Cargo.lock$ \ - Cargo.toml$ \ - ^ci/rust-version.sh \ - ^ci/test-stable-perf.sh \ - ^ci/test-stable.sh \ - ^ci/test-local-cluster.sh \ - ^core/build.rs \ - ^fetch-perf-libs.sh \ - ^programs/ \ - ^sdk/ \ - ; then - cat >> "$output_file" <<"EOF" - - command: "ci/test-stable-perf.sh" - name: "stable-perf" - timeout_in_minutes: 35 - artifact_paths: "log-*.txt" - agents: - queue: "cuda" -EOF - else - annotate --style info \ - "Stable-perf skipped as no relevant files were modified" - fi - # Downstream backwards compatibility if affects \ .rs$ \ diff --git a/ci/buildkite-solana-private.sh b/ci/buildkite-solana-private.sh index 57a3d3de3b2049..ede70e6229d5f8 100755 --- a/ci/buildkite-solana-private.sh +++ b/ci/buildkite-solana-private.sh @@ -180,33 +180,6 @@ EOF "Stable-SBF skipped as no relevant files were modified" fi - # Perf test suite - if affects \ - .rs$ \ - Cargo.lock$ \ - Cargo.toml$ \ - ^ci/rust-version.sh \ - ^ci/test-stable-perf.sh \ - ^ci/test-stable.sh \ - ^ci/test-local-cluster.sh \ - ^core/build.rs \ - ^fetch-perf-libs.sh \ - ^programs/ \ - ^sdk/ \ - ; then - cat >> "$output_file" <<"EOF" - - command: "ci/test-stable-perf.sh" - name: "stable-perf" - timeout_in_minutes: 35 - artifact_paths: "log-*.txt" - agents: - queue: "sol-private" -EOF - else - annotate --style info \ - "Stable-perf skipped as no relevant files were modified" - fi - # Downstream backwards compatibility if affects \ .rs$ \ From d75522d7bc5f378c34975bae87cdf59ca8f2a23c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 06:26:18 +0000 Subject: [PATCH 005/213] v1.17: Enable the banking trace by default (backport of #33497) (#33514) Enable the banking trace by default (#33497) (cherry picked from commit eb262aabe36a2c0d9609e2a3431e06c7f1f0e5d7) Co-authored-by: Ryo Onodera --- core/src/validator.rs | 4 ++-- validator/src/cli.rs | 14 +++++++++++--- validator/src/main.rs | 19 ++++++++++--------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/core/src/validator.rs b/core/src/validator.rs index a0c39da764239b..e2b763f202f89b 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -1134,11 +1134,11 @@ impl Validator { .map_err(|err| format!("{} [{:?}]", &err, &err))?; if banking_tracer.is_enabled() { info!( - "Enabled banking tracer (dir_byte_limit: {})", + "Enabled banking trace (dir_byte_limit: {})", config.banking_trace_dir_byte_limit ); } else { - info!("Disabled banking tracer"); + info!("Disabled banking trace"); } let entry_notification_sender = entry_notifier_service diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 1eef34535511ff..403a922c421112 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -1351,9 +1351,17 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { // explicitly given, similar to --limit-ledger-size. // see configure_banking_trace_dir_byte_limit() for this. .default_value(&default_args.banking_trace_dir_byte_limit) - .help("Write trace files for simulate-leader-blocks, retaining \ - up to the default or specified total bytes in the \ - ledger") + .help("Enables the banking trace explicitly, which is enabled by default and \ + writes trace files for simulate-leader-blocks, retaining up to the default \ + or specified total bytes in the ledger. This flag can be used to override \ + its byte limit.") + ) + .arg( + Arg::with_name("disable_banking_trace") + .long("disable-banking-trace") + .conflicts_with("banking_trace_dir_byte_limit") + .takes_value(false) + .help("Disables the banking trace") ) .arg( Arg::with_name("block_verification_method") diff --git a/validator/src/main.rs b/validator/src/main.rs index db9e8396108dea..8d37486d7d8057 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -448,15 +448,16 @@ fn configure_banking_trace_dir_byte_limit( validator_config: &mut ValidatorConfig, matches: &ArgMatches, ) { - validator_config.banking_trace_dir_byte_limit = - if matches.occurrences_of("banking_trace_dir_byte_limit") == 0 { - // disable with no explicit flag; then, this effectively becomes `opt-in` even if we're - // specifying a default value in clap configuration. - DISABLED_BAKING_TRACE_DIR - } else { - // BANKING_TRACE_DIR_DEFAULT_BYTE_LIMIT or user-supplied override value - value_t_or_exit!(matches, "banking_trace_dir_byte_limit", u64) - }; + validator_config.banking_trace_dir_byte_limit = if matches.is_present("disable_banking_trace") { + // disable with an explicit flag; This effectively becomes `opt-out` by reseting to + // DISABLED_BAKING_TRACE_DIR, while allowing us to specify a default sensible limit in clap + // configuration for cli help. + DISABLED_BAKING_TRACE_DIR + } else { + // a default value in clap configuration (BANKING_TRACE_DIR_DEFAULT_BYTE_LIMIT) or + // explicit user-supplied override value + value_t_or_exit!(matches, "banking_trace_dir_byte_limit", u64) + }; } pub fn main() { From 2bfe99c2b74df8dcc16b67f9153e20fd0dfc1a1b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 20:43:48 +0000 Subject: [PATCH 006/213] v1.17: initialize with new VoteState for tests (backport of #33518) (#33531) initialize with new VoteState for tests (#33518) (cherry picked from commit d4941cc420458d869ef87547703051f1f1ec9f2b) Co-authored-by: Ashwin Sekar --- programs/vote/src/vote_state/mod.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/programs/vote/src/vote_state/mod.rs b/programs/vote/src/vote_state/mod.rs index e83171d06e0844..871f4696c1a078 100644 --- a/programs/vote/src/vote_state/mod.rs +++ b/programs/vote/src/vote_state/mod.rs @@ -1095,8 +1095,6 @@ pub fn do_process_vote_state_update( // a. In many tests. // b. In the genesis tool that initializes a cluster to create the bootstrap validator. // c. In the ledger tool when creating bootstrap vote accounts. -// In all cases, initializing with the 1_14_11 version of VoteState is safest, as this version will in-place upgrade -// the first time it is altered by a vote transaction. pub fn create_account_with_authorized( node_pubkey: &Pubkey, authorized_voter: &Pubkey, @@ -1104,7 +1102,7 @@ pub fn create_account_with_authorized( commission: u8, lamports: u64, ) -> AccountSharedData { - let mut vote_account = AccountSharedData::new(lamports, VoteState1_14_11::size_of(), &id()); + let mut vote_account = AccountSharedData::new(lamports, VoteState::size_of(), &id()); let vote_state = VoteState::new( &VoteInit { @@ -1116,8 +1114,11 @@ pub fn create_account_with_authorized( &Clock::default(), ); - let version1_14_11 = VoteStateVersions::V1_14_11(Box::new(VoteState1_14_11::from(vote_state))); - VoteState::serialize(&version1_14_11, vote_account.data_as_mut_slice()).unwrap(); + VoteState::serialize( + &VoteStateVersions::Current(Box::new(vote_state)), + vote_account.data_as_mut_slice(), + ) + .unwrap(); vote_account } From 9318394bb51f7866358f2cf44164d4f93aa68c9d Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 18:28:30 +0200 Subject: [PATCH 007/213] v1.17: Bank: Add function to replace empty account with upgradeable program on feature activation (backport of #32783) (#33527) Bank: Add function to replace empty account with upgradeable program on feature activation (#32783) * replace program account * modify for all cases * remove non-data swap * address tests & conditional feedback * get the rent involved * mix in owner & executable * feature-related cases * stripped back to feature-specific case only * added feature * address initial feedback * added more lamport checks * condense tests * using test_case * add fail cases to tests * more cleanup * add verifiably built program * update program account state * cleaned up serializing logic * use full word capitalization * rename old & new to dst & src * swap src and dst in parameters * add warnings and errors * rename feature to programify * test suite description clarity * remove strings from datapoints * spell out source and destination * more verbose comments in account replace functions * move lamport calculation * swap lamport check for state check * move replace functions to helper module * make replace_account methods fallible * refactor error handling * add test for source program state (cherry picked from commit 25460f76e709a9768b2d68b2f17428209c410c24) Co-authored-by: Joe C --- runtime/src/bank.rs | 56 +-- runtime/src/bank/replace_account.rs | 191 ++++++++++ runtime/src/bank/tests.rs | 417 +++++++++++++++++++-- runtime/src/inline_feature_gate_program.rs | 5 + runtime/src/lib.rs | 1 + sdk/src/feature_set.rs | 5 + 6 files changed, 613 insertions(+), 62 deletions(-) create mode 100644 runtime/src/bank/replace_account.rs create mode 100644 runtime/src/inline_feature_gate_program.rs diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index adc9da3a4b07bb..68e5492186ff9d 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -42,6 +42,7 @@ use { builtins::{BuiltinPrototype, BUILTINS}, epoch_rewards_hasher::hash_rewards_into_partitions, epoch_stakes::{EpochStakes, NodeVoteAccounts}, + inline_feature_gate_program, runtime_config::RuntimeConfig, serde_snapshot::BankIncrementalSnapshotPersistence, snapshot_hash::SnapshotHash, @@ -215,6 +216,7 @@ pub mod bank_hash_details; mod builtin_programs; pub mod epoch_accounts_hash_utils; mod metrics; +mod replace_account; mod serde_snapshot; mod sysvar_cache; #[cfg(test)] @@ -8054,6 +8056,24 @@ impl Bank { if new_feature_activations.contains(&feature_set::update_hashes_per_tick::id()) { self.apply_updated_hashes_per_tick(DEFAULT_HASHES_PER_TICK); } + + if new_feature_activations.contains(&feature_set::programify_feature_gate_program::id()) { + let datapoint_name = "bank-progamify_feature_gate_program"; + if let Err(e) = replace_account::replace_empty_account_with_upgradeable_program( + self, + &feature::id(), + &inline_feature_gate_program::noop_program::id(), + datapoint_name, + ) { + warn!( + "{}: Failed to replace empty account {} with upgradeable program: {}", + datapoint_name, + feature::id(), + e + ); + datapoint_warn!(datapoint_name, ("slot", self.slot(), i64),); + } + } } fn apply_updated_hashes_per_tick(&mut self, hashes_per_tick: u64) { @@ -8196,42 +8216,6 @@ impl Bank { } } - /// Use to replace programs by feature activation - #[allow(dead_code)] - fn replace_program_account( - &mut self, - old_address: &Pubkey, - new_address: &Pubkey, - datapoint_name: &'static str, - ) { - if let Some(old_account) = self.get_account_with_fixed_root(old_address) { - if let Some(new_account) = self.get_account_with_fixed_root(new_address) { - datapoint_info!(datapoint_name, ("slot", self.slot, i64)); - - // Burn lamports in the old account - self.capitalization - .fetch_sub(old_account.lamports(), Relaxed); - - // Transfer new account to old account - self.store_account(old_address, &new_account); - - // Clear new account - self.store_account(new_address, &AccountSharedData::default()); - - // Unload a program from the bank's cache - self.loaded_programs_cache - .write() - .unwrap() - .remove_programs([*old_address].into_iter()); - - self.calculate_and_update_accounts_data_size_delta_off_chain( - old_account.data().len(), - new_account.data().len(), - ); - } - } - } - /// Get all the accounts for this bank and calculate stats pub fn get_total_accounts_stats(&self) -> ScanResult { let accounts = self.get_all_accounts()?; diff --git a/runtime/src/bank/replace_account.rs b/runtime/src/bank/replace_account.rs new file mode 100644 index 00000000000000..8d650aeebe7e87 --- /dev/null +++ b/runtime/src/bank/replace_account.rs @@ -0,0 +1,191 @@ +use { + super::Bank, + log::*, + solana_accounts_db::accounts_index::ZeroLamport, + solana_sdk::{ + account::{Account, AccountSharedData, ReadableAccount}, + bpf_loader_upgradeable::{self, UpgradeableLoaderState}, + pubkey::Pubkey, + }, + std::sync::atomic::Ordering::Relaxed, + thiserror::Error, +}; + +/// Errors returned by `replace_account` methods +#[derive(Debug, Error)] +pub enum ReplaceAccountError { + /// Account not found + #[error("Account not found: {0:?}")] + AccountNotFound(Pubkey), + /// Account exists + #[error("Account exists: {0:?}")] + AccountExists(Pubkey), + #[error("Bincode Error: {0}")] + BincodeError(#[from] bincode::Error), + /// Not an upgradeable program + #[error("Not an upgradeable program")] + NotAnUpgradeableProgram, +} + +/// Moves one account in place of another +/// `source`: the account to replace with +/// `destination`: the account to be replaced +fn move_account( + bank: &Bank, + source_address: &Pubkey, + source_account: &V, + destination_address: &Pubkey, + destination_account: Option<&U>, +) where + U: ReadableAccount + Sync + ZeroLamport, + V: ReadableAccount + Sync + ZeroLamport, +{ + let (destination_lamports, destination_len) = match destination_account { + Some(destination_account) => ( + destination_account.lamports(), + destination_account.data().len(), + ), + None => (0, 0), + }; + + // Burn lamports in the destination account + bank.capitalization.fetch_sub(destination_lamports, Relaxed); + + // Transfer source account to destination account + bank.store_account(destination_address, source_account); + + // Clear source account + bank.store_account(source_address, &AccountSharedData::default()); + + bank.calculate_and_update_accounts_data_size_delta_off_chain( + destination_len, + source_account.data().len(), + ); +} + +/// Use to replace non-upgradeable programs by feature activation +/// `source`: the non-upgradeable program account to replace with +/// `destination`: the non-upgradeable program account to be replaced +#[allow(dead_code)] +pub(crate) fn replace_non_upgradeable_program_account( + bank: &Bank, + source_address: &Pubkey, + destination_address: &Pubkey, + datapoint_name: &'static str, +) -> Result<(), ReplaceAccountError> { + let destination_account = bank + .get_account_with_fixed_root(destination_address) + .ok_or(ReplaceAccountError::AccountNotFound(*destination_address))?; + let source_account = bank + .get_account_with_fixed_root(source_address) + .ok_or(ReplaceAccountError::AccountNotFound(*source_address))?; + + datapoint_info!(datapoint_name, ("slot", bank.slot, i64)); + + move_account( + bank, + source_address, + &source_account, + destination_address, + Some(&destination_account), + ); + + // Unload a program from the bank's cache + bank.loaded_programs_cache + .write() + .unwrap() + .remove_programs([*destination_address].into_iter()); + + Ok(()) +} + +/// Use to replace an empty account with a program by feature activation +/// Note: The upgradeable program should have both: +/// - Program account +/// - Program data account +/// `source`: the upgradeable program account to replace with +/// `destination`: the empty account to be replaced +pub(crate) fn replace_empty_account_with_upgradeable_program( + bank: &Bank, + source_address: &Pubkey, + destination_address: &Pubkey, + datapoint_name: &'static str, +) -> Result<(), ReplaceAccountError> { + // Must be attempting to replace an empty account with a program + // account _and_ data account + let source_account = bank + .get_account_with_fixed_root(source_address) + .ok_or(ReplaceAccountError::AccountNotFound(*source_address))?; + + let (destination_data_address, _) = Pubkey::find_program_address( + &[destination_address.as_ref()], + &bpf_loader_upgradeable::id(), + ); + let (source_data_address, _) = + Pubkey::find_program_address(&[source_address.as_ref()], &bpf_loader_upgradeable::id()); + + // Make sure the data within the source account is the PDA of its + // data account. This also means it has at least the necessary + // lamports for rent. + let source_state = bincode::deserialize::(source_account.data())?; + if !matches!(source_state, UpgradeableLoaderState::Program { .. }) { + return Err(ReplaceAccountError::NotAnUpgradeableProgram); + } + + let source_data_account = bank + .get_account_with_fixed_root(&source_data_address) + .ok_or(ReplaceAccountError::AccountNotFound(source_data_address))?; + + // Make sure the destination account is empty + // We aren't going to check that there isn't a data account at + // the known program-derived address (ie. `destination_data_address`), + // because if it exists, it will be overwritten + if bank + .get_account_with_fixed_root(destination_address) + .is_some() + { + return Err(ReplaceAccountError::AccountExists(*destination_address)); + } + let state = UpgradeableLoaderState::Program { + programdata_address: destination_data_address, + }; + let data = bincode::serialize(&state)?; + let lamports = bank.get_minimum_balance_for_rent_exemption(data.len()); + let created_program_account = Account { + lamports, + data, + owner: bpf_loader_upgradeable::id(), + executable: true, + rent_epoch: source_account.rent_epoch(), + }; + + datapoint_info!(datapoint_name, ("slot", bank.slot, i64)); + let change_in_capitalization = source_account.lamports().saturating_sub(lamports); + + // Replace the destination data account with the source one + // If the destination data account does not exist, it will be created + // If it does exist, it will be overwritten + move_account( + bank, + &source_data_address, + &source_data_account, + &destination_data_address, + bank.get_account_with_fixed_root(&destination_data_address) + .as_ref(), + ); + + // Write the source data account's PDA into the destination program account + move_account( + bank, + source_address, + &created_program_account, + destination_address, + None::<&AccountSharedData>, + ); + + // Any remaining lamports in the source program account are burnt + bank.capitalization + .fetch_sub(change_in_capitalization, Relaxed); + + Ok(()) +} diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 3263eb9c41db7c..58ce790d43d0d4 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -8,6 +8,10 @@ use { }, crate::{ accounts_background_service::{PrunedBanksRequestHandler, SendDroppedBankCallback}, + bank::replace_account::{ + replace_empty_account_with_upgradeable_program, + replace_non_upgradeable_program_account, ReplaceAccountError, + }, bank_client::BankClient, epoch_rewards_hasher::hash_rewards_into_partitions, genesis_utils::{ @@ -8003,42 +8007,403 @@ fn test_compute_active_feature_set() { assert!(feature_set.is_active(&test_feature)); } +fn test_program_replace_set_up_account( + bank: &Bank, + pubkey: &Pubkey, + lamports: u64, + state: &T, + owner: &Pubkey, + executable: bool, +) -> AccountSharedData { + let data_len = bincode::serialized_size(state).unwrap() as usize; + let mut account = AccountSharedData::from(Account { + lamports, + owner: *owner, + executable, + data: vec![0u8; data_len], + ..Account::default() + }); + account.serialize_data(state).unwrap(); + bank.store_account_and_update_capitalization(pubkey, &account); + assert_eq!(bank.get_balance(pubkey), lamports); + account +} + #[test] -fn test_program_replacement() { - let mut bank = create_simple_test_bank(0); +fn test_replace_non_upgradeable_program_account() { + // Non-upgradeable program + // - Destination: [Destination program data] + // - Source: [*Source program data] + // + // Should replace the destination program account with the source program account: + // - Destination: [*Source program data] + let bpf_id = bpf_loader::id(); + let bank = create_simple_test_bank(0); - // Setup original program account - let old_address = Pubkey::new_unique(); - let new_address = Pubkey::new_unique(); - bank.store_account_and_update_capitalization( - &old_address, - &AccountSharedData::from(Account { - lamports: 100, - ..Account::default() - }), + let destination = Pubkey::new_unique(); + let destination_state = vec![0u8; 4]; + let destination_lamports = bank.get_minimum_balance_for_rent_exemption(destination_state.len()); + test_program_replace_set_up_account( + &bank, + &destination, + destination_lamports, + &destination_state, + &bpf_id, + true, ); - assert_eq!(bank.get_balance(&old_address), 100); - // Setup new program account - let new_program_account = AccountSharedData::from(Account { - lamports: 123, - ..Account::default() - }); - bank.store_account_and_update_capitalization(&new_address, &new_program_account); - assert_eq!(bank.get_balance(&new_address), 123); + let source = Pubkey::new_unique(); + let source_state = vec![6; 30]; + let source_lamports = bank.get_minimum_balance_for_rent_exemption(source_state.len()); + let check_source_account = test_program_replace_set_up_account( + &bank, + &source, + source_lamports, + &source_state, + &bpf_id, + true, + ); + let check_data_account_data = check_source_account.data().to_vec(); + + let original_capitalization = bank.capitalization(); + + replace_non_upgradeable_program_account( + &bank, + &source, + &destination, + "bank-apply_program_replacement", + ) + .unwrap(); + + // Destination program account balance is now the source program account's balance + assert_eq!(bank.get_balance(&destination), source_lamports); + + // Source program account is now empty + assert_eq!(bank.get_balance(&source), 0); + + // Destination program account now holds the source program data, ie: + // - Destination: [*Source program data] + let destination_account = bank.get_account(&destination).unwrap(); + assert_eq!(destination_account.data(), &check_data_account_data); + + // Ownership & executable match the source program account + assert_eq!(destination_account.owner(), &bpf_id); + assert!(destination_account.executable()); + + // The destination account's original lamports balance was burnt + assert_eq!( + bank.capitalization(), + original_capitalization - destination_lamports + ); +} + +#[test_case( + Pubkey::new_unique(), + None; + "Empty destination account _without_ corresponding data account" +)] +#[test_case( + Pubkey::new_unique(), + Some(vec![4; 40]); + "Empty destination account _with_ corresponding data account" +)] +#[test_case( + feature::id(), // `Feature11111111` + None; + "Native destination account _without_ corresponding data account" +)] +#[test_case( + feature::id(), // `Feature11111111` + Some(vec![4; 40]); + "Native destination account _with_ corresponding data account" +)] +fn test_replace_empty_account_with_upgradeable_program_success( + destination: Pubkey, + maybe_destination_data_state: Option>, // Inner data of the destination program _data_ account +) { + // Ensures a program account and data account are created when replacing an + // empty account, ie: + // - Destination: PDA(DestinationData) + // - DestinationData: [Destination program data] + // + // If the destination data account exists, it will be overwritten + let bpf_upgradeable_id = bpf_loader_upgradeable::id(); + let bank = create_simple_test_bank(0); + + // Create the test source accounts, one for program and one for data + let source = Pubkey::new_unique(); + let (source_data, _) = Pubkey::find_program_address(&[source.as_ref()], &bpf_upgradeable_id); + let source_state = UpgradeableLoaderState::Program { + programdata_address: source_data, + }; + let source_lamports = + bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()); + let source_data_state = vec![6; 30]; + let source_data_lamports = bank.get_minimum_balance_for_rent_exemption(source_data_state.len()); + test_program_replace_set_up_account( + &bank, + &source, + source_lamports, + &source_state, + &bpf_upgradeable_id, + true, + ); + let check_source_data_account = test_program_replace_set_up_account( + &bank, + &source_data, + source_data_lamports, + &source_data_state, + &bpf_upgradeable_id, + false, + ); + let check_data_account_data = check_source_data_account.data().to_vec(); + + // Derive the well-known PDA address for the destination data account + let (destination_data, _) = + Pubkey::find_program_address(&[destination.as_ref()], &bpf_upgradeable_id); + + // Determine the lamports that will be burnt after the replacement + let burnt_after_rent = if let Some(destination_data_state) = maybe_destination_data_state { + // Create the data account if necessary + let destination_data_lamports = + bank.get_minimum_balance_for_rent_exemption(destination_data_state.len()); + test_program_replace_set_up_account( + &bank, + &destination_data, + destination_data_lamports, + &destination_data_state, + &bpf_upgradeable_id, + false, + ); + destination_data_lamports + source_lamports + - bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()) + } else { + source_lamports + - bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()) + }; + + let original_capitalization = bank.capitalization(); + + // Do the replacement + replace_empty_account_with_upgradeable_program( + &bank, + &source, + &destination, + "bank-apply_empty_account_replacement_for_program", + ) + .unwrap(); + + // Destination program account was created and funded to pay for minimum rent + // for the PDA + assert_eq!( + bank.get_balance(&destination), + bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()), + ); + + // Destination data account was created, now holds the source data account's balance + assert_eq!(bank.get_balance(&destination_data), source_data_lamports); + + // Source program accounts are now empty + assert_eq!(bank.get_balance(&source), 0); + assert_eq!(bank.get_balance(&source_data), 0); + + // Destination program account holds the PDA, ie: + // - Destination: PDA(DestinationData) + let destination_account = bank.get_account(&destination).unwrap(); + assert_eq!( + destination_account.data(), + &bincode::serialize(&UpgradeableLoaderState::Program { + programdata_address: destination_data + }) + .unwrap(), + ); + + // Destination data account holds the source data, ie: + // - DestinationData: [*Source program data] + let destination_data_account = bank.get_account(&destination_data).unwrap(); + assert_eq!(destination_data_account.data(), &check_data_account_data); + + // Ownership & executable match the source program accounts + assert_eq!(destination_account.owner(), &bpf_upgradeable_id); + assert!(destination_account.executable()); + assert_eq!(destination_data_account.owner(), &bpf_upgradeable_id); + assert!(!destination_data_account.executable()); + + // The remaining lamports from both program accounts minus the rent-exempt + // minimum were burnt + assert_eq!( + bank.capitalization(), + original_capitalization - burnt_after_rent + ); +} + +#[test_case( + None; + "Existing destination account _without_ corresponding data account" +)] +#[test_case( + Some(vec![4; 40]); + "Existing destination account _with_ corresponding data account" +)] +fn test_replace_empty_account_with_upgradeable_program_fail_when_account_exists( + maybe_destination_data_state: Option>, // Inner data of the destination program _data_ account +) { + // Should not be allowed to execute replacement + let bpf_upgradeable_id = bpf_loader_upgradeable::id(); + let bank = create_simple_test_bank(0); + + // Create the test destination account with some arbitrary data and lamports balance + let destination = Pubkey::new_unique(); + let destination_state = vec![0, 0, 0, 0]; // Arbitrary bytes, doesn't matter + let destination_lamports = bank.get_minimum_balance_for_rent_exemption(destination_state.len()); + let destination_account = test_program_replace_set_up_account( + &bank, + &destination, + destination_lamports, + &destination_state, + &bpf_upgradeable_id, + true, + ); + + // Create the test source accounts, one for program and one for data + let source = Pubkey::new_unique(); + let (source_data, _) = Pubkey::find_program_address(&[source.as_ref()], &bpf_upgradeable_id); + let source_state = UpgradeableLoaderState::Program { + programdata_address: source_data, + }; + let source_lamports = + bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()); + let source_data_state = vec![6; 30]; + let source_data_lamports = bank.get_minimum_balance_for_rent_exemption(source_data_state.len()); + let source_account = test_program_replace_set_up_account( + &bank, + &source, + source_lamports, + &source_state, + &bpf_upgradeable_id, + true, + ); + let source_data_account = test_program_replace_set_up_account( + &bank, + &source_data, + source_data_lamports, + &source_data_state, + &bpf_upgradeable_id, + false, + ); + + // Derive the well-known PDA address for the destination data account + let (destination_data, _) = + Pubkey::find_program_address(&[destination.as_ref()], &bpf_upgradeable_id); + + // Create the data account if necessary + let destination_data_account = + if let Some(destination_data_state) = maybe_destination_data_state { + let destination_data_lamports = + bank.get_minimum_balance_for_rent_exemption(destination_data_state.len()); + let destination_data_account = test_program_replace_set_up_account( + &bank, + &destination_data, + destination_data_lamports, + &destination_data_state, + &bpf_upgradeable_id, + false, + ); + Some(destination_data_account) + } else { + None + }; let original_capitalization = bank.capitalization(); - bank.replace_program_account(&old_address, &new_address, "bank-apply_program_replacement"); + // Attempt the replacement + assert_matches!( + replace_empty_account_with_upgradeable_program( + &bank, + &source, + &destination, + "bank-apply_empty_account_replacement_for_program", + ) + .unwrap_err(), + ReplaceAccountError::AccountExists(..) + ); + + // Everything should be unchanged + assert_eq!(bank.get_account(&destination).unwrap(), destination_account); + if let Some(destination_data_account) = destination_data_account { + assert_eq!( + bank.get_account(&destination_data).unwrap(), + destination_data_account + ); + } + assert_eq!(bank.get_account(&source).unwrap(), source_account); + assert_eq!(bank.get_account(&source_data).unwrap(), source_data_account); + assert_eq!(bank.capitalization(), original_capitalization); +} + +#[test] +fn test_replace_empty_account_with_upgradeable_program_fail_when_not_upgradeable_program() { + // Should not be allowed to execute replacement + let bpf_upgradeable_id = bpf_loader_upgradeable::id(); + let bank = create_simple_test_bank(0); + + // Create the test destination account with some arbitrary data and lamports balance + let destination = Pubkey::new_unique(); + let destination_state = vec![0, 0, 0, 0]; // Arbitrary bytes, doesn't matter + let destination_lamports = bank.get_minimum_balance_for_rent_exemption(destination_state.len()); + let destination_account = test_program_replace_set_up_account( + &bank, + &destination, + destination_lamports, + &destination_state, + &bpf_upgradeable_id, + true, + ); + + // Create the test source accounts, one for program and one for data + let source = Pubkey::new_unique(); + let (source_data, _) = Pubkey::find_program_address(&[source.as_ref()], &bpf_upgradeable_id); + let source_state = [0, 0, 0, 0]; // Arbitrary bytes, NOT an upgradeable program + let source_lamports = + bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()); + let source_data_state = vec![6; 30]; + let source_data_lamports = bank.get_minimum_balance_for_rent_exemption(source_data_state.len()); + let source_account = test_program_replace_set_up_account( + &bank, + &source, + source_lamports, + &source_state, + &bpf_upgradeable_id, + true, + ); + let source_data_account = test_program_replace_set_up_account( + &bank, + &source_data, + source_data_lamports, + &source_data_state, + &bpf_upgradeable_id, + false, + ); - // New program account is now empty - assert_eq!(bank.get_balance(&new_address), 0); + let original_capitalization = bank.capitalization(); - // Old program account holds the new program account - assert_eq!(bank.get_account(&old_address), Some(new_program_account)); + // Attempt the replacement + assert_matches!( + replace_empty_account_with_upgradeable_program( + &bank, + &source, + &destination, + "bank-apply_empty_account_replacement_for_program", + ) + .unwrap_err(), + ReplaceAccountError::NotAnUpgradeableProgram + ); - // Lamports in the old token account were burnt - assert_eq!(bank.capitalization(), original_capitalization - 100); + // Everything should be unchanged + assert_eq!(bank.get_account(&destination).unwrap(), destination_account); + assert_eq!(bank.get_account(&source).unwrap(), source_account); + assert_eq!(bank.get_account(&source_data).unwrap(), source_data_account); + assert_eq!(bank.capitalization(), original_capitalization); } fn min_rent_exempt_balance_for_sysvars(bank: &Bank, sysvar_ids: &[Pubkey]) -> u64 { diff --git a/runtime/src/inline_feature_gate_program.rs b/runtime/src/inline_feature_gate_program.rs new file mode 100644 index 00000000000000..125dc74df243d6 --- /dev/null +++ b/runtime/src/inline_feature_gate_program.rs @@ -0,0 +1,5 @@ +//! Contains replacement program IDs for the feature gate program + +pub(crate) mod noop_program { + solana_sdk::declare_id!("2rqZsQBbacRbuAuTSuJ7n49UQT9fzes8RLggFcmB9YuN"); +} diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index ff94a68c69fa1e..503d24410e8cdc 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -14,6 +14,7 @@ pub mod commitment; mod epoch_rewards_hasher; pub mod epoch_stakes; pub mod genesis_utils; +pub mod inline_feature_gate_program; pub mod inline_spl_associated_token_account; pub mod loader_utils; pub mod non_circulating_supply; diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index b414a5f6ab4551..9ec56b03e0e3bf 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -700,6 +700,10 @@ pub mod better_error_codes_for_tx_lamport_check { solana_sdk::declare_id!("Ffswd3egL3tccB6Rv3XY6oqfdzn913vUcjCSnpvCKpfx"); } +pub mod programify_feature_gate_program { + solana_sdk::declare_id!("8GdovDzVwWU5edz2G697bbB7GZjrUc6aQZLWyNNAtHdg"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -870,6 +874,7 @@ lazy_static! { (require_rent_exempt_split_destination::id(), "Require stake split destination account to be rent exempt"), (better_error_codes_for_tx_lamport_check::id(), "better error codes for tx lamport check #33353"), (enable_alt_bn128_compression_syscall::id(), "add alt_bn128 compression syscalls"), + (programify_feature_gate_program::id(), "move feature gate activation logic to an on-chain program #32783"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() From 3972d9cb6b7e3cb4ddaa39f42a63edeec6e8fd95 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 18:45:06 +0000 Subject: [PATCH 008/213] v1.17: Fix CLI help text for `solana stake-account` (backport of #33387) (#33543) Fix CLI help text for `solana stake-account` (#33387) Fix help text (cherry picked from commit 83b49daf29bdd7027e972eaa4403aba0d479f12c) Co-authored-by: sakridge --- cli/src/stake.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/stake.rs b/cli/src/stake.rs index 96c1b50b3576e6..337b2843ff2229 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -710,7 +710,7 @@ impl StakeSubCommands for App<'_, '_> { Arg::with_name("csv") .long("csv") .takes_value(false) - .help("Format stake account data in csv") + .help("Format stake rewards data in csv") ) .arg( Arg::with_name("num_rewards_epochs") From 05bbaf3f8e00acf1e29a6368dae2eb945d7aad32 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 17:57:17 -0400 Subject: [PATCH 009/213] v1.17: Removes unnecessary borrow (backport of #33539) (#33541) (cherry picked from commit e0091d6995e0ce659f3201fbb34eba122169ce38) Co-authored-by: Brooks --- runtime/src/snapshot_utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/snapshot_utils.rs b/runtime/src/snapshot_utils.rs index 74c9b2421f4c99..0cf1aab09daea2 100644 --- a/runtime/src/snapshot_utils.rs +++ b/runtime/src/snapshot_utils.rs @@ -1469,7 +1469,7 @@ pub fn build_storage_from_snapshot_dir( let accounts_hardlinks = bank_snapshot_dir.join(SNAPSHOT_ACCOUNTS_HARDLINKS); let account_run_paths: HashSet<_> = HashSet::from_iter(account_paths); - for dir_entry in fs_err::read_dir(&accounts_hardlinks)? { + for dir_entry in fs_err::read_dir(accounts_hardlinks)? { let symlink_path = dir_entry?.path(); // The symlink point to /snapshot/ which contain the account files hardlinks // The corresponding run path should be /run/ From 3cdee9bb83add11e41fb7a12309aa8435a1cb2c2 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:10:21 -0400 Subject: [PATCH 010/213] v1.17: Upgrades Rust to 1.73.0 (backport of #33546) (#33563) (cherry picked from commit 2d1449f71412a9e8bc170895564918604ef2abbb) Co-authored-by: Brooks --- ci/docker-rust-nightly/Dockerfile | 2 +- ci/docker-rust/Dockerfile | 2 +- ci/rust-version.sh | 2 +- rust-toolchain.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ci/docker-rust-nightly/Dockerfile b/ci/docker-rust-nightly/Dockerfile index 23262061e4f2a3..a5d933b2a2d79f 100644 --- a/ci/docker-rust-nightly/Dockerfile +++ b/ci/docker-rust-nightly/Dockerfile @@ -1,4 +1,4 @@ -FROM solanalabs/rust:1.72.1 +FROM solanalabs/rust:1.73.0 ARG date RUN set -x \ diff --git a/ci/docker-rust/Dockerfile b/ci/docker-rust/Dockerfile index e5d80f9e04bfbf..8dfc347d54d697 100644 --- a/ci/docker-rust/Dockerfile +++ b/ci/docker-rust/Dockerfile @@ -1,6 +1,6 @@ # Note: when the rust version is changed also modify # ci/rust-version.sh to pick up the new image tag -FROM rust:1.72.1 +FROM rust:1.73.0 ARG NODE_MAJOR=18 diff --git a/ci/rust-version.sh b/ci/rust-version.sh index 76f929277ba757..a38910accda10b 100644 --- a/ci/rust-version.sh +++ b/ci/rust-version.sh @@ -29,7 +29,7 @@ fi if [[ -n $RUST_NIGHTLY_VERSION ]]; then nightly_version="$RUST_NIGHTLY_VERSION" else - nightly_version=2023-09-20 + nightly_version=2023-10-05 fi diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 7eb23c42c2af84..8142c3012694b1 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.72.1" +channel = "1.73.0" From a330ffc26d31ee36b266162399fcf7be44a5ec78 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:16:00 -0400 Subject: [PATCH 011/213] v1.17: Improves error text when snapshot intervals are incompatible (backport of #33551) (#33562) (cherry picked from commit 35a0295376f112a57b2b2ba2137a2bc87cdb2743) Co-authored-by: Brooks --- validator/src/cli.rs | 3 ++- validator/src/main.rs | 9 +++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 403a922c421112..72e82ca13b56d9 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -468,7 +468,8 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .value_name("NUMBER") .takes_value(true) .default_value(&default_args.full_snapshot_archive_interval_slots) - .help("Number of slots between generating full snapshots") + .help("Number of slots between generating full snapshots. \ + Must be a multiple of the incremental snapshot interval.") ) .arg( Arg::with_name("maximum_full_snapshots_to_retain") diff --git a/validator/src/main.rs b/validator/src/main.rs index 8d37486d7d8057..b97789061c9e3b 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -1588,17 +1588,14 @@ pub fn main() { validator_config.accounts_hash_interval_slots, ) { eprintln!("Invalid snapshot configuration provided: snapshot intervals are incompatible. \ - \n\t- full snapshot interval MUST be a multiple of accounts hash interval (if enabled) \ - \n\t- incremental snapshot interval MUST be a multiple of accounts hash interval (if enabled) \ + \n\t- full snapshot interval MUST be a multiple of incremental snapshot interval (if enabled) \ \n\t- full snapshot interval MUST be larger than incremental snapshot interval (if enabled) \ \nSnapshot configuration values: \ \n\tfull snapshot interval: {} \ - \n\tincremental snapshot interval: {} \ - \n\taccounts hash interval: {}", + \n\tincremental snapshot interval: {}", if full_snapshot_archive_interval_slots == DISABLED_SNAPSHOT_ARCHIVE_INTERVAL { "disabled".to_string() } else { full_snapshot_archive_interval_slots.to_string() }, if incremental_snapshot_archive_interval_slots == DISABLED_SNAPSHOT_ARCHIVE_INTERVAL { "disabled".to_string() } else { incremental_snapshot_archive_interval_slots.to_string() }, - validator_config.accounts_hash_interval_slots); - + ); exit(1); } From 194903c1cfd9410cada24da150a0dae1943a47a7 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 20:13:59 +0000 Subject: [PATCH 012/213] v1.17: Uses stable `u64::next_multiple_of()` (backport of #33549) (#33567) Uses stable `u64::next_multiple_of()` (#33549) (cherry picked from commit c8d545c5019507fc735893d6de36168c73deb792) Co-authored-by: Brooks --- core/tests/epoch_accounts_hash.rs | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/core/tests/epoch_accounts_hash.rs b/core/tests/epoch_accounts_hash.rs index 1f6eb702769d3e..718e62688b8c4c 100755 --- a/core/tests/epoch_accounts_hash.rs +++ b/core/tests/epoch_accounts_hash.rs @@ -529,7 +529,7 @@ fn test_background_services_request_handling_for_epoch_accounts_hash() { // Based on the EAH start and snapshot interval, pick a slot to mass-root all the banks in // this range such that an EAH request will be sent and also a snapshot request. let eah_start_slot = epoch_accounts_hash_utils::calculation_start(&bank); - let set_root_slot = next_multiple_of(eah_start_slot, FULL_SNAPSHOT_INTERVAL); + let set_root_slot = eah_start_slot.next_multiple_of(FULL_SNAPSHOT_INTERVAL); if bank.block_height() == set_root_slot { info!("Calling set_root() on bank {}...", bank.slot()); @@ -661,16 +661,3 @@ fn test_epoch_accounts_hash_and_warping() { .wait_get_epoch_accounts_hash(); info!("Waiting for epoch accounts hash... DONE"); } - -// Copy the impl of `next_multiple_of` since it is nightly-only experimental. -// https://doc.rust-lang.org/std/primitive.u64.html#method.next_multiple_of -// https://github.com/rust-lang/rust/issues/88581 -// https://github.com/rust-lang/rust/pull/88582 -// https://github.com/jhpratt/rust/blob/727a4fc7e3f836938dfeb4a2ab237cfca612222d/library/core/src/num/uint_macros.rs#L1811-L1837 -const fn next_multiple_of(lhs: u64, rhs: u64) -> u64 { - #![allow(clippy::arithmetic_side_effects)] - match lhs % rhs { - 0 => lhs, - r => lhs + (rhs - r), - } -} From c534100799ff4c70e13f83f212711b55e8654397 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:24:55 -0500 Subject: [PATCH 013/213] v1.17: update feature gate no-op program id (backport of #33535) (#33540) update feature gate no-op program id (#33535) (cherry picked from commit 93d8bcca4b32d314e219798bd5b2716eda1f0815) Co-authored-by: Joe C --- runtime/src/inline_feature_gate_program.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/inline_feature_gate_program.rs b/runtime/src/inline_feature_gate_program.rs index 125dc74df243d6..a2c647bbda22a0 100644 --- a/runtime/src/inline_feature_gate_program.rs +++ b/runtime/src/inline_feature_gate_program.rs @@ -1,5 +1,5 @@ //! Contains replacement program IDs for the feature gate program pub(crate) mod noop_program { - solana_sdk::declare_id!("2rqZsQBbacRbuAuTSuJ7n49UQT9fzes8RLggFcmB9YuN"); + solana_sdk::declare_id!("37Yr1mVPdfUuy6oC2yPjWtg8xyyVi33TYYqyNQocsAkT"); } From 542b53e5bb732520b113e24735becb12cc90fac3 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sat, 7 Oct 2023 13:36:55 -0500 Subject: [PATCH 014/213] Update version to v1.17.2 (#33573) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5f40166dbab93d..2ac760f8f1d2cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2134,7 +2134,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "regex", @@ -2142,7 +2142,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.1" +version = "1.17.2" dependencies = [ "regex", ] @@ -4061,7 +4061,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.1" +version = "1.17.2" dependencies = [ "protobuf-src", "tonic-build", @@ -4306,7 +4306,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.1" +version = "1.17.2" [[package]] name = "rcgen" @@ -5095,7 +5095,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.1" +version = "1.17.2" dependencies = [ "Inflector", "assert_matches", @@ -5119,7 +5119,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 2.33.3", "log", @@ -5133,7 +5133,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 2.33.3", "log", @@ -5163,7 +5163,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.1" +version = "1.17.2" dependencies = [ "arrayref", "assert_matches", @@ -5227,7 +5227,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "bytemuck", @@ -5246,7 +5246,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -5257,7 +5257,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5281,7 +5281,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5298,7 +5298,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.1" +version = "1.17.2" dependencies = [ "serde", "solana-sdk", @@ -5307,7 +5307,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "crossbeam-channel", @@ -5325,7 +5325,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5377,7 +5377,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bv", "fnv", @@ -5394,7 +5394,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -5414,7 +5414,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -5425,7 +5425,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bv", "bytemuck", @@ -5444,7 +5444,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "solana-logger", @@ -5452,7 +5452,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_cmd", "bzip2", @@ -5473,11 +5473,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.1" +version = "1.17.2" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.1" +version = "1.17.2" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "chrono", @@ -5505,7 +5505,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "chrono", @@ -5523,7 +5523,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -5576,7 +5576,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.1" +version = "1.17.2" dependencies = [ "anyhow", "dirs-next", @@ -5591,7 +5591,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.1" +version = "1.17.2" dependencies = [ "Inflector", "base64 0.21.4", @@ -5617,7 +5617,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-trait", "bincode", @@ -5649,7 +5649,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.1" +version = "1.17.2" dependencies = [ "futures-util", "rand 0.8.5", @@ -5679,7 +5679,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5687,7 +5687,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "chrono", @@ -5700,7 +5700,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-trait", "bincode", @@ -5724,7 +5724,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.1" +version = "1.17.2" dependencies = [ "lazy_static", "log", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "clap 3.2.23", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "console", "indicatif", @@ -5874,7 +5874,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5885,7 +5885,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "byteorder", @@ -5929,7 +5929,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.1" +version = "1.17.2" dependencies = [ "ahash 0.8.3", "blake3", @@ -5958,7 +5958,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.1" +version = "1.17.2" dependencies = [ "proc-macro2", "quote", @@ -5968,7 +5968,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.1" +version = "1.17.2" dependencies = [ "base64 0.21.4", "bincode", @@ -5993,7 +5993,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "solana-accounts-db", @@ -6004,7 +6004,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "solana-sdk", @@ -6014,7 +6014,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bs58", "crossbeam-channel", @@ -6039,7 +6039,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.1" +version = "1.17.2" dependencies = [ "atty", "bincode", @@ -6125,7 +6125,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bs58", "clap 3.2.23", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -6210,7 +6210,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_cmd", "bs58", @@ -6259,7 +6259,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "log", @@ -6271,7 +6271,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6310,7 +6310,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.1" +version = "1.17.2" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6322,7 +6322,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.1" +version = "1.17.2" dependencies = [ "env_logger", "lazy_static", @@ -6331,7 +6331,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "solana-sdk", @@ -6339,11 +6339,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.1" +version = "1.17.2" [[package]] name = "solana-merkle-root-bench" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 2.33.3", "log", @@ -6356,7 +6356,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.1" +version = "1.17.2" dependencies = [ "fast-math", "hex", @@ -6365,7 +6365,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.1" +version = "1.17.2" dependencies = [ "crossbeam-channel", "env_logger", @@ -6381,7 +6381,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6392,7 +6392,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "clap 3.2.23", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "reqwest", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.1" +version = "1.17.2" dependencies = [ "ahash 0.8.3", "assert_matches", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 3.2.23", "log", @@ -6486,7 +6486,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "anyhow", "ark-bn254", @@ -6543,7 +6543,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6572,7 +6572,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "async-trait", @@ -6600,7 +6600,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "anyhow", "crossbeam-channel", @@ -6624,7 +6624,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-mutex", "async-trait", @@ -6652,7 +6652,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.1" +version = "1.17.2" dependencies = [ "lazy_static", "num_cpus", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "console", @@ -6679,7 +6679,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.1" +version = "1.17.2" dependencies = [ "base64 0.21.4", "bincode", @@ -6738,7 +6738,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "async-trait", @@ -6767,7 +6767,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.1" +version = "1.17.2" dependencies = [ "base64 0.21.4", "bs58", @@ -6787,7 +6787,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "anyhow", "clap 2.33.3", @@ -6804,7 +6804,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "bs58", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.1" +version = "1.17.2" dependencies = [ "arrayref", "assert_matches", @@ -6914,7 +6914,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.1" +version = "1.17.2" dependencies = [ "anyhow", "assert_matches", @@ -6972,7 +6972,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bs58", "proc-macro2", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.1" +version = "1.17.2" dependencies = [ "crossbeam-channel", "log", @@ -6998,7 +6998,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7014,7 +7014,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.1" +version = "1.17.2" dependencies = [ "backoff", "bincode", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "bs58", @@ -7079,7 +7079,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 2.33.3", "log", @@ -7091,7 +7091,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "async-channel", @@ -7123,7 +7123,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -7137,7 +7137,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.1" +version = "1.17.2" dependencies = [ "base64 0.21.4", "bincode", @@ -7167,7 +7167,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "log", @@ -7181,7 +7181,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -7214,7 +7214,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-trait", "bincode", @@ -7236,7 +7236,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "clap 2.33.3", @@ -7263,7 +7263,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.1" +version = "1.17.2" dependencies = [ "Inflector", "base64 0.21.4", @@ -7286,7 +7286,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -7323,7 +7323,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-trait", "solana-connection-cache", @@ -7336,7 +7336,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.1" +version = "1.17.2" dependencies = [ "serde_json", "solana-metrics", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.1" +version = "1.17.2" dependencies = [ "chrono", "clap 2.33.3", @@ -7408,7 +7408,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "rustc_version 0.4.0", @@ -7422,7 +7422,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "crossbeam-channel", @@ -7441,7 +7441,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -7464,7 +7464,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 2.33.3", "humantime", @@ -7483,7 +7483,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bs58", "clap 3.2.23", @@ -7502,7 +7502,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bytemuck", "criterion", @@ -7516,7 +7516,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7528,7 +7528,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.1" +version = "1.17.2" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 791f5494051d7d..e3e12fdffa1daa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.1" +version = "1.17.2" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.7.2" -solana-account-decoder = { path = "account-decoder", version = "=1.17.1" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.1" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.1" } -solana-banks-client = { path = "banks-client", version = "=1.17.1" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.1" } -solana-banks-server = { path = "banks-server", version = "=1.17.1" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.1" } -solana-bloom = { path = "bloom", version = "=1.17.1" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.1" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.1" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.1", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.1" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.1" } -solana-cli = { path = "cli", version = "=1.17.1" } -solana-cli-config = { path = "cli-config", version = "=1.17.1" } -solana-cli-output = { path = "cli-output", version = "=1.17.1" } -solana-client = { path = "client", version = "=1.17.1" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.1" } -solana-config-program = { path = "programs/config", version = "=1.17.1" } -solana-core = { path = "core", version = "=1.17.1" } -solana-cost-model = { path = "cost-model", version = "=1.17.1" } -solana-download-utils = { path = "download-utils", version = "=1.17.1" } -solana-entry = { path = "entry", version = "=1.17.1" } -solana-faucet = { path = "faucet", version = "=1.17.1" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.1" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.1" } -solana-genesis = { path = "genesis", version = "=1.17.1" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.1" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.1" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.1" } -solana-gossip = { path = "gossip", version = "=1.17.1" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.1" } -solana-ledger = { path = "ledger", version = "=1.17.1" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.1" } -solana-logger = { path = "logger", version = "=1.17.1" } -solana-measure = { path = "measure", version = "=1.17.1" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.1" } -solana-metrics = { path = "metrics", version = "=1.17.1" } -solana-net-utils = { path = "net-utils", version = "=1.17.1" } -solana-notifier = { path = "notifier", version = "=1.17.1" } -solana-perf = { path = "perf", version = "=1.17.1" } -solana-poh = { path = "poh", version = "=1.17.1" } -solana-program = { path = "sdk/program", version = "=1.17.1" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.1" } -solana-program-test = { path = "program-test", version = "=1.17.1" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.1" } -solana-quic-client = { path = "quic-client", version = "=1.17.1" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.1" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.1", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.1" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.1", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.1" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.1" } -solana-runtime = { path = "runtime", version = "=1.17.1" } -solana-sdk = { path = "sdk", version = "=1.17.1" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.1" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.1" } -solana-stake-program = { path = "programs/stake", version = "=1.17.1" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.1" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.1" } -solana-streamer = { path = "streamer", version = "=1.17.1" } -solana-system-program = { path = "programs/system", version = "=1.17.1" } -solana-test-validator = { path = "test-validator", version = "=1.17.1" } -solana-thin-client = { path = "thin-client", version = "=1.17.1" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.1", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.1" } -solana-turbine = { path = "turbine", version = "=1.17.1" } -solana-udp-client = { path = "udp-client", version = "=1.17.1" } -solana-version = { path = "version", version = "=1.17.1" } -solana-vote = { path = "vote", version = "=1.17.1" } -solana-vote-program = { path = "programs/vote", version = "=1.17.1" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.1" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.1" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.1" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.2" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.2" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.2" } +solana-banks-client = { path = "banks-client", version = "=1.17.2" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.2" } +solana-banks-server = { path = "banks-server", version = "=1.17.2" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.2" } +solana-bloom = { path = "bloom", version = "=1.17.2" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.2" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.2" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.2", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.2" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.2" } +solana-cli = { path = "cli", version = "=1.17.2" } +solana-cli-config = { path = "cli-config", version = "=1.17.2" } +solana-cli-output = { path = "cli-output", version = "=1.17.2" } +solana-client = { path = "client", version = "=1.17.2" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.2" } +solana-config-program = { path = "programs/config", version = "=1.17.2" } +solana-core = { path = "core", version = "=1.17.2" } +solana-cost-model = { path = "cost-model", version = "=1.17.2" } +solana-download-utils = { path = "download-utils", version = "=1.17.2" } +solana-entry = { path = "entry", version = "=1.17.2" } +solana-faucet = { path = "faucet", version = "=1.17.2" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.2" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.2" } +solana-genesis = { path = "genesis", version = "=1.17.2" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.2" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.2" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.2" } +solana-gossip = { path = "gossip", version = "=1.17.2" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.2" } +solana-ledger = { path = "ledger", version = "=1.17.2" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.2" } +solana-logger = { path = "logger", version = "=1.17.2" } +solana-measure = { path = "measure", version = "=1.17.2" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.2" } +solana-metrics = { path = "metrics", version = "=1.17.2" } +solana-net-utils = { path = "net-utils", version = "=1.17.2" } +solana-notifier = { path = "notifier", version = "=1.17.2" } +solana-perf = { path = "perf", version = "=1.17.2" } +solana-poh = { path = "poh", version = "=1.17.2" } +solana-program = { path = "sdk/program", version = "=1.17.2" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.2" } +solana-program-test = { path = "program-test", version = "=1.17.2" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.2" } +solana-quic-client = { path = "quic-client", version = "=1.17.2" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.2" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.2", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.2" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.2", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.2" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.2" } +solana-runtime = { path = "runtime", version = "=1.17.2" } +solana-sdk = { path = "sdk", version = "=1.17.2" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.2" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.2" } +solana-stake-program = { path = "programs/stake", version = "=1.17.2" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.2" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.2" } +solana-streamer = { path = "streamer", version = "=1.17.2" } +solana-system-program = { path = "programs/system", version = "=1.17.2" } +solana-test-validator = { path = "test-validator", version = "=1.17.2" } +solana-thin-client = { path = "thin-client", version = "=1.17.2" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.2", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.2" } +solana-turbine = { path = "turbine", version = "=1.17.2" } +solana-udp-client = { path = "udp-client", version = "=1.17.2" } +solana-version = { path = "version", version = "=1.17.2" } +solana-vote = { path = "vote", version = "=1.17.2" } +solana-vote-program = { path = "programs/vote", version = "=1.17.2" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.2" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.2" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.2" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 4eccde743b06ea..cd3050a8680a42 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.1" +version = "1.17.2" dependencies = [ "Inflector", "base64 0.21.4", @@ -4468,7 +4468,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.1" +version = "1.17.2" dependencies = [ "arrayref", "bincode", @@ -4525,7 +4525,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "bytemuck", @@ -4544,7 +4544,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4559,7 +4559,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.1" +version = "1.17.2" dependencies = [ "serde", "solana-sdk", @@ -4568,7 +4568,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "crossbeam-channel", @@ -4586,7 +4586,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bv", "fnv", @@ -4603,7 +4603,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.1" +version = "1.17.2" dependencies = [ "array-bytes", "serde", @@ -4630,7 +4630,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bv", "bytemuck", @@ -4646,7 +4646,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "chrono", "clap 2.33.3", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.1" +version = "1.17.2" dependencies = [ "dirs-next", "lazy_static", @@ -4675,7 +4675,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.1" +version = "1.17.2" dependencies = [ "Inflector", "base64 0.21.4", @@ -4700,7 +4700,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-trait", "bincode", @@ -4731,7 +4731,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4739,7 +4739,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "chrono", @@ -4751,7 +4751,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-trait", "bincode", @@ -4771,7 +4771,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.1" +version = "1.17.2" dependencies = [ "base64 0.21.4", "bincode", @@ -4843,7 +4843,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.1" +version = "1.17.2" dependencies = [ "lazy_static", "log", @@ -4865,7 +4865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "console", "indicatif", @@ -4877,7 +4877,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "crossbeam-channel", @@ -4897,7 +4897,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.1" +version = "1.17.2" dependencies = [ "ahash 0.8.3", "blake3", @@ -4947,7 +4947,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.1" +version = "1.17.2" dependencies = [ "proc-macro2", "quote", @@ -4957,7 +4957,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "solana-accounts-db", @@ -4968,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "solana-sdk", @@ -4978,7 +4978,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bs58", "crossbeam-channel", @@ -5003,7 +5003,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -5051,7 +5051,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "bincode", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "solana-measure", @@ -5126,7 +5126,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.1" +version = "1.17.2" dependencies = [ "env_logger", "lazy_static", @@ -5135,7 +5135,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "solana-sdk", @@ -5143,7 +5143,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.1" +version = "1.17.2" dependencies = [ "fast-math", "solana-program", @@ -5151,7 +5151,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.1" +version = "1.17.2" dependencies = [ "crossbeam-channel", "gethostname", @@ -5164,7 +5164,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "clap 3.1.6", @@ -5184,7 +5184,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.1" +version = "1.17.2" dependencies = [ "ahash 0.8.3", "bincode", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.1" +version = "1.17.2" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5224,7 +5224,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "ark-bn254", "ark-ec", @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.1" +version = "1.17.2" dependencies = [ "base64 0.21.4", "bincode", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "async-trait", @@ -5329,7 +5329,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "crossbeam-channel", "futures-util", @@ -5352,7 +5352,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-mutex", "async-trait", @@ -5377,7 +5377,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.1" +version = "1.17.2" dependencies = [ "lazy_static", "num_cpus", @@ -5385,7 +5385,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.1" +version = "1.17.2" dependencies = [ "console", "dialoguer", @@ -5402,7 +5402,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.1" +version = "1.17.2" dependencies = [ "base64 0.21.4", "bincode", @@ -5457,7 +5457,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-trait", "base64 0.21.4", @@ -5481,7 +5481,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.1" +version = "1.17.2" dependencies = [ "base64 0.21.4", "bs58", @@ -5501,7 +5501,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.1" +version = "1.17.2" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5512,7 +5512,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.1" +version = "1.17.2" dependencies = [ "arrayref", "base64 0.21.4", @@ -5587,7 +5587,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5616,7 +5616,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5624,21 +5624,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.1" +version = "1.17.2" dependencies = [ "array-bytes", "solana-program", @@ -5646,7 +5646,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.1" +version = "1.17.2" dependencies = [ "array-bytes", "solana-program", @@ -5654,21 +5654,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5676,14 +5676,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.1" +version = "1.17.2" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5691,21 +5691,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.1" +version = "1.17.2" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5715,42 +5715,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.1" +version = "1.17.2" dependencies = [ "rustversion", "solana-program", @@ -5760,49 +5760,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5810,14 +5810,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-program-runtime", @@ -5827,7 +5827,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5835,21 +5835,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5857,14 +5857,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.1" +version = "1.17.2" dependencies = [ "array-bytes", "solana-program", @@ -5872,7 +5872,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.1" +version = "1.17.2" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5881,14 +5881,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-program-runtime", @@ -5906,21 +5906,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-program-runtime", @@ -5930,7 +5930,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.1" +version = "1.17.2" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5938,7 +5938,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.1" +version = "1.17.2" dependencies = [ "blake3", "solana-program", @@ -5946,21 +5946,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-logger", "solana-program", @@ -5971,21 +5971,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", "solana-program-runtime", @@ -5995,21 +5995,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.1" +version = "1.17.2" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.1" +version = "1.17.2" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6061,7 +6061,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bs58", "proc-macro2", @@ -6072,7 +6072,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.1" +version = "1.17.2" dependencies = [ "crossbeam-channel", "log", @@ -6086,7 +6086,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.1" +version = "1.17.2" dependencies = [ "backoff", "bincode", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "bs58", @@ -6146,7 +6146,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-channel", "bytes", @@ -6176,7 +6176,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "log", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.1" +version = "1.17.2" dependencies = [ "base64 0.21.4", "bincode", @@ -6218,7 +6218,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "log", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-trait", "bincode", @@ -6253,7 +6253,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.1" +version = "1.17.2" dependencies = [ "Inflector", "base64 0.21.4", @@ -6276,7 +6276,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "bytes", @@ -6311,7 +6311,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.1" +version = "1.17.2" dependencies = [ "async-trait", "solana-connection-cache", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.1" +version = "1.17.2" dependencies = [ "chrono", "clap 2.33.3", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.1" +version = "1.17.2" dependencies = [ "log", "rustc_version", @@ -6400,7 +6400,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.1" +version = "1.17.2" dependencies = [ "crossbeam-channel", "itertools", @@ -6417,7 +6417,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bincode", "log", @@ -6437,7 +6437,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.1" +version = "1.17.2" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6449,7 +6449,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.1" +version = "1.17.2" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index add5ba942e9a6b..af1e6029580888 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.1" +version = "1.17.2" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.7.2" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.1" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.1" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.1" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.1" } -solana-ledger = { path = "../../ledger", version = "=1.17.1" } -solana-logger = { path = "../../logger", version = "=1.17.1" } -solana-measure = { path = "../../measure", version = "=1.17.1" } -solana-program = { path = "../../sdk/program", version = "=1.17.1" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.1" } -solana-program-test = { path = "../../program-test", version = "=1.17.1" } -solana-runtime = { path = "../../runtime", version = "=1.17.1" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.1" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.1" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.1", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.1" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.1" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.1" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.1", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.1" } -solana-sdk = { path = "../../sdk", version = "=1.17.1" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.1" } -solana-validator = { path = "../../validator", version = "=1.17.1" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.1" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.2" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.2" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.2" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.2" } +solana-ledger = { path = "../../ledger", version = "=1.17.2" } +solana-logger = { path = "../../logger", version = "=1.17.2" } +solana-measure = { path = "../../measure", version = "=1.17.2" } +solana-program = { path = "../../sdk/program", version = "=1.17.2" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.2" } +solana-program-test = { path = "../../program-test", version = "=1.17.2" } +solana-runtime = { path = "../../runtime", version = "=1.17.2" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.2" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.2" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.2", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.2" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.2" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.2" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.2", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.2" } +solana-sdk = { path = "../../sdk", version = "=1.17.2" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.2" } +solana-validator = { path = "../../validator", version = "=1.17.2" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.2" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index ba045404850058..401e5d311d2120 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.1" +version = "1.17.2" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.1" } +solana-program = { path = "../../../../program", version = "=1.17.2" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 76f28b6adce03c..ff413e406da644 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.1" +version = "1.17.2" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.1" } +solana-program = { path = "../../../../program", version = "=1.17.2" } [lib] crate-type = ["cdylib"] From c45c9dc562f26d5a858afdf9dee70fdbeaa00f4c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 11:52:53 -0400 Subject: [PATCH 015/213] v1.17: Stops pushing legacy snapshot hashes to crds (backport of #33576) (#33581) (cherry picked from commit c588f25eca9b0277aea9f524aacfc35552a01b4b) Co-authored-by: Brooks --- core/src/snapshot_packager_service.rs | 18 ++-------- .../snapshot_gossip_manager.rs | 36 +------------------ 2 files changed, 4 insertions(+), 50 deletions(-) diff --git a/core/src/snapshot_packager_service.rs b/core/src/snapshot_packager_service.rs index 4c90a8bd18d793..6d81e2b5402039 100644 --- a/core/src/snapshot_packager_service.rs +++ b/core/src/snapshot_packager_service.rs @@ -2,7 +2,7 @@ mod snapshot_gossip_manager; use { crossbeam_channel::{Receiver, Sender}, snapshot_gossip_manager::SnapshotGossipManager, - solana_gossip::cluster_info::{ClusterInfo, MAX_LEGACY_SNAPSHOT_HASHES}, + solana_gossip::cluster_info::ClusterInfo, solana_measure::measure_us, solana_perf::thread::renice_this_thread, solana_runtime::{ @@ -39,25 +39,13 @@ impl SnapshotPackagerService { snapshot_config: SnapshotConfig, enable_gossip_push: bool, ) -> Self { - let max_full_snapshot_hashes = std::cmp::min( - MAX_LEGACY_SNAPSHOT_HASHES, - snapshot_config - .maximum_full_snapshot_archives_to_retain - .get(), - ); - let t_snapshot_packager = Builder::new() .name("solSnapshotPkgr".to_string()) .spawn(move || { info!("SnapshotPackagerService has started"); renice_this_thread(snapshot_config.packager_thread_niceness_adj).unwrap(); - let mut snapshot_gossip_manager = enable_gossip_push.then(|| { - SnapshotGossipManager::new( - cluster_info, - max_full_snapshot_hashes, - starting_snapshot_hashes, - ) - }); + let mut snapshot_gossip_manager = enable_gossip_push + .then(|| SnapshotGossipManager::new(cluster_info, starting_snapshot_hashes)); loop { if exit.load(Ordering::Relaxed) { diff --git a/core/src/snapshot_packager_service/snapshot_gossip_manager.rs b/core/src/snapshot_packager_service/snapshot_gossip_manager.rs index a2d7239b3197ae..d4ab9863642e09 100644 --- a/core/src/snapshot_packager_service/snapshot_gossip_manager.rs +++ b/core/src/snapshot_packager_service/snapshot_gossip_manager.rs @@ -4,7 +4,7 @@ use { snapshot_hash::{ FullSnapshotHash, IncrementalSnapshotHash, SnapshotHash, StartingSnapshotHashes, }, - snapshot_package::{retain_max_n_elements, SnapshotKind}, + snapshot_package::SnapshotKind, }, solana_sdk::{clock::Slot, hash::Hash}, std::sync::Arc, @@ -14,8 +14,6 @@ use { pub struct SnapshotGossipManager { cluster_info: Arc, latest_snapshot_hashes: Option, - max_legacy_full_snapshot_hashes: usize, - legacy_full_snapshot_hashes: Vec, } impl SnapshotGossipManager { @@ -24,14 +22,11 @@ impl SnapshotGossipManager { #[must_use] pub fn new( cluster_info: Arc, - max_legacy_full_snapshot_hashes: usize, starting_snapshot_hashes: Option, ) -> Self { let mut this = SnapshotGossipManager { cluster_info, latest_snapshot_hashes: None, - max_legacy_full_snapshot_hashes, - legacy_full_snapshot_hashes: Vec::default(), }; if let Some(starting_snapshot_hashes) = starting_snapshot_hashes { this.push_starting_snapshot_hashes(starting_snapshot_hashes); @@ -49,10 +44,6 @@ impl SnapshotGossipManager { ); } self.push_latest_snapshot_hashes_to_cluster(); - - // Handle legacy snapshot hashes here too - // Once LegacySnapshotHashes are removed from CRDS, also remove them here - self.push_legacy_full_snapshot_hash(starting_snapshot_hashes.full); } /// Push new snapshot hash to the cluster via CRDS @@ -78,10 +69,6 @@ impl SnapshotGossipManager { fn push_full_snapshot_hash(&mut self, full_snapshot_hash: FullSnapshotHash) { self.update_latest_full_snapshot_hash(full_snapshot_hash); self.push_latest_snapshot_hashes_to_cluster(); - - // Handle legacy snapshot hashes here too - // Once LegacySnapshotHashes are removed from CRDS, also remove them here - self.push_legacy_full_snapshot_hash(full_snapshot_hash); } /// Push new incremental snapshot hash to the cluster via CRDS @@ -146,22 +133,6 @@ impl SnapshotGossipManager { and a new error case has been added that has not been handled here.", ); } - - /// Add `full_snapshot_hash` to the vector of full snapshot hashes, then push that vector to - /// the cluster via CRDS. - fn push_legacy_full_snapshot_hash(&mut self, full_snapshot_hash: FullSnapshotHash) { - self.legacy_full_snapshot_hashes.push(full_snapshot_hash); - - retain_max_n_elements( - &mut self.legacy_full_snapshot_hashes, - self.max_legacy_full_snapshot_hashes, - ); - - self.cluster_info - .push_legacy_snapshot_hashes(clone_hashes_for_crds( - self.legacy_full_snapshot_hashes.as_slice(), - )); - } } #[derive(Debug, Copy, Clone, Eq, PartialEq)] @@ -191,8 +162,3 @@ impl AsSnapshotHash for IncrementalSnapshotHash { &self.0 } } - -/// Clones and maps snapshot hashes into what CRDS expects -fn clone_hashes_for_crds(hashes: &[impl AsSnapshotHash]) -> Vec<(Slot, Hash)> { - hashes.iter().map(AsSnapshotHash::clone_for_crds).collect() -} From 534d592dd502da6254df406795e42fc761395459 Mon Sep 17 00:00:00 2001 From: Tyera Date: Tue, 10 Oct 2023 10:39:31 -0600 Subject: [PATCH 016/213] v1.17: skip unrecognized keys in Blockstore special-column iterators (#33617) * Add helper trait for column key deprecation * Add ColumnIndexDeprecation iterator method * Impl ColumnIndexDeprecation for TransactionStatus * Fix get_transaction_status_with_counter * Impl ColumnIndexDeprecation for AddressSignatures * Fix find_address_signatures methods * Fix get_confirmed_signatures_for_address2 --- ledger/src/blockstore.rs | 78 +++++++++++++++++++++---------------- ledger/src/blockstore_db.rs | 75 ++++++++++++++++++++++++++++------- 2 files changed, 106 insertions(+), 47 deletions(-) diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index b4426aa3678501..6d053997ca6f60 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -2310,14 +2310,16 @@ impl Blockstore { let (lock, lowest_available_slot) = self.ensure_lowest_cleanup_slot(); for transaction_status_cf_primary_index in 0..=1 { - let index_iterator = self.transaction_status_cf.iter(IteratorMode::From( - ( - transaction_status_cf_primary_index, - signature, - lowest_available_slot, - ), - IteratorDirection::Forward, - ))?; + let index_iterator = + self.transaction_status_cf + .iter_current_index_filtered(IteratorMode::From( + ( + transaction_status_cf_primary_index, + signature, + lowest_available_slot, + ), + IteratorDirection::Forward, + ))?; for ((i, sig, slot), _data) in index_iterator { counter += 1; if i != transaction_status_cf_primary_index || sig != signature { @@ -2459,15 +2461,17 @@ impl Blockstore { let mut signatures: Vec<(Slot, Signature)> = vec![]; for transaction_status_cf_primary_index in 0..=1 { - let index_iterator = self.address_signatures_cf.iter(IteratorMode::From( - ( - transaction_status_cf_primary_index, - pubkey, - start_slot.max(lowest_available_slot), - Signature::default(), - ), - IteratorDirection::Forward, - ))?; + let index_iterator = + self.address_signatures_cf + .iter_current_index_filtered(IteratorMode::From( + ( + transaction_status_cf_primary_index, + pubkey, + start_slot.max(lowest_available_slot), + Signature::default(), + ), + IteratorDirection::Forward, + ))?; for ((i, address, slot, signature), _) in index_iterator { if i != transaction_status_cf_primary_index || slot > end_slot || address != pubkey { @@ -2494,15 +2498,17 @@ impl Blockstore { let (lock, lowest_available_slot) = self.ensure_lowest_cleanup_slot(); let mut signatures: Vec<(Slot, Signature)> = vec![]; for transaction_status_cf_primary_index in 0..=1 { - let index_iterator = self.address_signatures_cf.iter(IteratorMode::From( - ( - transaction_status_cf_primary_index, - pubkey, - slot.max(lowest_available_slot), - Signature::default(), - ), - IteratorDirection::Forward, - ))?; + let index_iterator = + self.address_signatures_cf + .iter_current_index_filtered(IteratorMode::From( + ( + transaction_status_cf_primary_index, + pubkey, + slot.max(lowest_available_slot), + Signature::default(), + ), + IteratorDirection::Forward, + ))?; for ((i, address, transaction_slot, signature), _) in index_iterator { if i != transaction_status_cf_primary_index || transaction_slot > slot @@ -2661,10 +2667,12 @@ impl Blockstore { let mut starting_primary_index_iter_timer = Measure::start("starting_primary_index_iter"); if slot > next_max_slot { - let mut starting_iterator = self.address_signatures_cf.iter(IteratorMode::From( - (starting_primary_index, address, slot, Signature::default()), - IteratorDirection::Reverse, - ))?; + let mut starting_iterator = + self.address_signatures_cf + .iter_current_index_filtered(IteratorMode::From( + (starting_primary_index, address, slot, Signature::default()), + IteratorDirection::Reverse, + ))?; // Iterate through starting_iterator until limit is reached while address_signatures.len() < limit { @@ -2697,10 +2705,12 @@ impl Blockstore { // Iterate through next_iterator until limit is reached let mut next_primary_index_iter_timer = Measure::start("next_primary_index_iter_timer"); - let mut next_iterator = self.address_signatures_cf.iter(IteratorMode::From( - (next_primary_index, address, slot, Signature::default()), - IteratorDirection::Reverse, - ))?; + let mut next_iterator = + self.address_signatures_cf + .iter_current_index_filtered(IteratorMode::From( + (next_primary_index, address, slot, Signature::default()), + IteratorDirection::Reverse, + ))?; while address_signatures.len() < limit { if let Some(((i, key_address, slot, signature), _)) = next_iterator.next() { // Skip next_max_slot, which is already included diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index 25f68b8ef65381..72660af445df5b 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -730,6 +730,19 @@ impl Column for T { } } +#[derive(Debug)] +pub enum IndexError { + UnpackError, +} + +/// Helper trait to transition primary indexes out from the columns that are using them. This +/// abbreviated trait assists in iterating past data with new keys. It will be modified and +/// expanded in a future version to support writing with the new key and reading both key types. +pub trait ColumnIndexDeprecation: Column { + const CURRENT_INDEX_LEN: usize; + fn try_current_index(key: &[u8]) -> std::result::Result; +} + impl Column for columns::TransactionStatus { type Index = (u64, Signature, Slot); @@ -742,14 +755,8 @@ impl Column for columns::TransactionStatus { } fn index(key: &[u8]) -> (u64, Signature, Slot) { - if key.len() != 80 { - Self::as_index(0) - } else { - let index = BigEndian::read_u64(&key[0..8]); - let signature = Signature::try_from(&key[8..72]).unwrap(); - let slot = BigEndian::read_u64(&key[72..80]); - (index, signature, slot) - } + ::try_current_index(key) + .unwrap_or_else(|_| Self::as_index(0)) } fn primary_index(index: Self::Index) -> u64 { @@ -771,6 +778,20 @@ impl ProtobufColumn for columns::TransactionStatus { type Type = generated::TransactionStatusMeta; } +impl ColumnIndexDeprecation for columns::TransactionStatus { + const CURRENT_INDEX_LEN: usize = 80; + + fn try_current_index(key: &[u8]) -> std::result::Result { + if key.len() != Self::CURRENT_INDEX_LEN { + return Err(IndexError::UnpackError); + } + let primary_index = BigEndian::read_u64(&key[0..8]); + let signature = Signature::try_from(&key[8..72]).unwrap(); + let slot = BigEndian::read_u64(&key[72..80]); + Ok((primary_index, signature, slot)) + } +} + impl Column for columns::AddressSignatures { type Index = (u64, Pubkey, Slot, Signature); @@ -784,11 +805,7 @@ impl Column for columns::AddressSignatures { } fn index(key: &[u8]) -> (u64, Pubkey, Slot, Signature) { - let index = BigEndian::read_u64(&key[0..8]); - let pubkey = Pubkey::try_from(&key[8..40]).unwrap(); - let slot = BigEndian::read_u64(&key[40..48]); - let signature = Signature::try_from(&key[48..112]).unwrap(); - (index, pubkey, slot, signature) + ::try_current_index(key).unwrap() } fn primary_index(index: Self::Index) -> u64 { @@ -807,6 +824,21 @@ impl ColumnName for columns::AddressSignatures { const NAME: &'static str = ADDRESS_SIGNATURES_CF; } +impl ColumnIndexDeprecation for columns::AddressSignatures { + const CURRENT_INDEX_LEN: usize = 112; + + fn try_current_index(key: &[u8]) -> std::result::Result { + if key.len() != Self::CURRENT_INDEX_LEN { + return Err(IndexError::UnpackError); + } + let primary_index = BigEndian::read_u64(&key[0..8]); + let pubkey = Pubkey::try_from(&key[8..40]).unwrap(); + let slot = BigEndian::read_u64(&key[40..48]); + let signature = Signature::try_from(&key[48..112]).unwrap(); + Ok((primary_index, pubkey, slot, signature)) + } +} + impl Column for columns::TransactionMemos { type Index = Signature; @@ -1617,6 +1649,23 @@ where } } +impl LedgerColumn +where + C: ColumnIndexDeprecation + ColumnName, +{ + pub(crate) fn iter_current_index_filtered( + &self, + iterator_mode: IteratorMode, + ) -> Result)> + '_> { + let cf = self.handle(); + let iter = self.backend.iterator_cf::(cf, iterator_mode); + Ok(iter.filter_map(|pair| { + let (key, value) = pair.unwrap(); + C::try_current_index(&key).ok().map(|index| (index, value)) + })) + } +} + impl<'a> WriteBatch<'a> { pub fn put_bytes(&mut self, key: C::Index, bytes: &[u8]) -> Result<()> { self.write_batch From d7dc802c11449167805f294324c962d964a13f68 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 18:44:46 +0200 Subject: [PATCH 017/213] v1.17: Fix - CPI interface `bool` masking (backport of #33623) (#33625) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix - CPI interface `bool` masking (#33623) Adds masking of booleans in CPI interface to disable_cpi_setting_executable_and_rent_epoch. (cherry picked from commit 1262ff7589d8de5adb6e7640b76544eb3c422ce8) Co-authored-by: Alexander Meißner --- programs/bpf_loader/src/syscalls/cpi.rs | 153 +++++++++++++++++++----- 1 file changed, 125 insertions(+), 28 deletions(-) diff --git a/programs/bpf_loader/src/syscalls/cpi.rs b/programs/bpf_loader/src/syscalls/cpi.rs index 0240ca65b0d54b..1509805b9f9cb0 100644 --- a/programs/bpf_loader/src/syscalls/cpi.rs +++ b/programs/bpf_loader/src/syscalls/cpi.rs @@ -106,6 +106,7 @@ impl<'a, 'b> CallerAccount<'a, 'b> { fn from_account_info( invoke_context: &InvokeContext, memory_mapping: &'b MemoryMapping<'a>, + is_disable_cpi_setting_executable_and_rent_epoch_active: bool, _vm_addr: u64, account_info: &AccountInfo, account_metadata: &SerializedAccountMetadata, @@ -257,8 +258,16 @@ impl<'a, 'b> CallerAccount<'a, 'b> { vm_data_addr, ref_to_len_in_vm, serialized_len_ptr, - executable: account_info.executable, - rent_epoch: account_info.rent_epoch, + executable: if is_disable_cpi_setting_executable_and_rent_epoch_active { + false + } else { + account_info.executable + }, + rent_epoch: if is_disable_cpi_setting_executable_and_rent_epoch_active { + 0 + } else { + account_info.rent_epoch + }, }) } @@ -266,6 +275,7 @@ impl<'a, 'b> CallerAccount<'a, 'b> { fn from_sol_account_info( invoke_context: &InvokeContext, memory_mapping: &'b MemoryMapping<'a>, + is_disable_cpi_setting_executable_and_rent_epoch_active: bool, vm_addr: u64, account_info: &SolAccountInfo, account_metadata: &SerializedAccountMetadata, @@ -391,8 +401,16 @@ impl<'a, 'b> CallerAccount<'a, 'b> { vm_data_addr: account_info.data_addr, ref_to_len_in_vm, serialized_len_ptr, - executable: account_info.executable, - rent_epoch: account_info.rent_epoch, + executable: if is_disable_cpi_setting_executable_and_rent_epoch_active { + false + } else { + account_info.executable + }, + rent_epoch: if is_disable_cpi_setting_executable_and_rent_epoch_active { + 0 + } else { + account_info.rent_epoch + }, }) } @@ -475,14 +493,36 @@ impl SyscallInvokeSigned for SyscallInvokeSignedRust { check_instruction_size(ix.accounts.len(), ix.data.len(), invoke_context)?; - let accounts = translate_slice::( + let account_metas = translate_slice::( memory_mapping, ix.accounts.as_ptr() as u64, ix.accounts.len() as u64, invoke_context.get_check_aligned(), invoke_context.get_check_size(), - )? - .to_vec(); + )?; + let accounts = if invoke_context + .feature_set + .is_active(&feature_set::disable_cpi_setting_executable_and_rent_epoch::id()) + { + let mut accounts = Vec::with_capacity(ix.accounts.len()); + #[allow(clippy::needless_range_loop)] + for account_index in 0..ix.accounts.len() { + #[allow(clippy::indexing_slicing)] + let account_meta = &account_metas[account_index]; + if unsafe { + std::ptr::read_volatile(&account_meta.is_signer as *const _ as *const u8) > 1 + || std::ptr::read_volatile( + &account_meta.is_writable as *const _ as *const u8, + ) > 1 + } { + return Err(Box::new(InstructionError::InvalidArgument)); + } + accounts.push(account_meta.clone()); + } + accounts + } else { + account_metas.to_vec() + }; let ix_data_len = ix.data.len() as u64; if invoke_context @@ -695,7 +735,7 @@ impl SyscallInvokeSigned for SyscallInvokeSignedC { ix_c.program_id_addr, invoke_context.get_check_aligned(), )?; - let meta_cs = translate_slice::( + let account_metas = translate_slice::( memory_mapping, ix_c.accounts_addr, ix_c.accounts_len, @@ -724,21 +764,53 @@ impl SyscallInvokeSigned for SyscallInvokeSignedC { invoke_context.get_check_size(), )? .to_vec(); - let accounts = meta_cs - .iter() - .map(|meta_c| { + + let accounts = if invoke_context + .feature_set + .is_active(&feature_set::disable_cpi_setting_executable_and_rent_epoch::id()) + { + let mut accounts = Vec::with_capacity(ix_c.accounts_len as usize); + #[allow(clippy::needless_range_loop)] + for account_index in 0..ix_c.accounts_len as usize { + #[allow(clippy::indexing_slicing)] + let account_meta = &account_metas[account_index]; + if unsafe { + std::ptr::read_volatile(&account_meta.is_signer as *const _ as *const u8) > 1 + || std::ptr::read_volatile( + &account_meta.is_writable as *const _ as *const u8, + ) > 1 + } { + return Err(Box::new(InstructionError::InvalidArgument)); + } let pubkey = translate_type::( memory_mapping, - meta_c.pubkey_addr, + account_meta.pubkey_addr, invoke_context.get_check_aligned(), )?; - Ok(AccountMeta { + accounts.push(AccountMeta { pubkey: *pubkey, - is_signer: meta_c.is_signer, - is_writable: meta_c.is_writable, + is_signer: account_meta.is_signer, + is_writable: account_meta.is_writable, + }); + } + accounts + } else { + account_metas + .iter() + .map(|account_meta| { + let pubkey = translate_type::( + memory_mapping, + account_meta.pubkey_addr, + invoke_context.get_check_aligned(), + )?; + Ok(AccountMeta { + pubkey: *pubkey, + is_signer: account_meta.is_signer, + is_writable: account_meta.is_writable, + }) }) - }) - .collect::, Error>>()?; + .collect::, Error>>()? + }; Ok(StableInstruction { accounts: accounts.into(), @@ -848,17 +920,34 @@ where invoke_context.get_check_size(), )?; check_account_infos(account_infos.len(), invoke_context)?; - let account_info_keys = account_infos - .iter() - .map(|account_info| { - translate_type::( + let account_info_keys = if invoke_context + .feature_set + .is_active(&feature_set::disable_cpi_setting_executable_and_rent_epoch::id()) + { + let mut account_info_keys = Vec::with_capacity(account_infos_len as usize); + #[allow(clippy::needless_range_loop)] + for account_index in 0..account_infos_len as usize { + #[allow(clippy::indexing_slicing)] + let account_info = &account_infos[account_index]; + account_info_keys.push(translate_type::( memory_mapping, key_addr(account_info), invoke_context.get_check_aligned(), - ) - }) - .collect::, Error>>()?; - + )?); + } + account_info_keys + } else { + account_infos + .iter() + .map(|account_info| { + translate_type::( + memory_mapping, + key_addr(account_info), + invoke_context.get_check_aligned(), + ) + }) + .collect::, Error>>()? + }; Ok((account_infos, account_info_keys)) } @@ -879,6 +968,7 @@ where F: Fn( &InvokeContext, &'b MemoryMapping<'a>, + bool, u64, &T, &SerializedAccountMetadata, @@ -887,6 +977,9 @@ where let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let mut accounts = Vec::with_capacity(instruction_accounts.len().saturating_add(1)); + let is_disable_cpi_setting_executable_and_rent_epoch_active = invoke_context + .feature_set + .is_active(&disable_cpi_setting_executable_and_rent_epoch::id()); let program_account_index = program_indices .last() @@ -943,16 +1036,19 @@ where })?; // build the CallerAccount corresponding to this account. + if caller_account_index >= account_infos.len() { + return Err(Box::new(SyscallError::InvalidLength)); + } + #[allow(clippy::indexing_slicing)] let caller_account = do_translate( invoke_context, memory_mapping, + is_disable_cpi_setting_executable_and_rent_epoch_active, account_infos_addr.saturating_add( caller_account_index.saturating_mul(mem::size_of::()) as u64, ), - account_infos - .get(caller_account_index) - .ok_or(SyscallError::InvalidLength)?, + &account_infos[caller_account_index], serialized_metadata, )?; @@ -1822,6 +1918,7 @@ mod tests { let caller_account = CallerAccount::from_account_info( &invoke_context, &memory_mapping, + false, vm_addr, account_info, &account_metadata, From 0e2bded0f645c66aec33b086227a1aaf54c72ca5 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:18:10 +0000 Subject: [PATCH 018/213] v1.17: Allow to create HTTP Sender with custom Client (backport of #33580) (#33660) Allow to create HTTP Sender with custom Client (#33580) * Allow to create HTTP Sender with custom Client * Update rpc-client/src/http_sender.rs Co-authored-by: Tyera --------- Co-authored-by: Tyera (cherry picked from commit a22678312e878d1a39c81cdfc96552371b70d742) Co-authored-by: Kirill Fomichev --- rpc-client/src/http_sender.rs | 36 ++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/rpc-client/src/http_sender.rs b/rpc-client/src/http_sender.rs index 902f86ce631a48..6ef22cc42c842a 100644 --- a/rpc-client/src/http_sender.rs +++ b/rpc-client/src/http_sender.rs @@ -47,31 +47,41 @@ impl HttpSender { /// /// The URL is an HTTP URL, usually for port 8899. pub fn new_with_timeout(url: U, timeout: Duration) -> Self { - let mut default_headers = header::HeaderMap::new(); - default_headers.append( - header::HeaderName::from_static("solana-client"), - header::HeaderValue::from_str( - format!("rust/{}", solana_version::Version::default()).as_str(), - ) - .unwrap(), - ); - - let client = Arc::new( + Self::new_with_client( + url, reqwest::Client::builder() - .default_headers(default_headers) + .default_headers(Self::default_headers()) .timeout(timeout) .pool_idle_timeout(timeout) .build() .expect("build rpc client"), - ); + ) + } + /// Create an HTTP RPC sender. + /// + /// Most flexible way to create a sender. Pass a created `reqwest::Client`. + pub fn new_with_client(url: U, client: reqwest::Client) -> Self { Self { - client, + client: Arc::new(client), url: url.to_string(), request_id: AtomicU64::new(0), stats: RwLock::new(RpcTransportStats::default()), } } + + /// Create default headers used by HTTP Sender. + pub fn default_headers() -> header::HeaderMap { + let mut default_headers = header::HeaderMap::new(); + default_headers.append( + header::HeaderName::from_static("solana-client"), + header::HeaderValue::from_str( + format!("rust/{}", solana_version::Version::default()).as_str(), + ) + .unwrap(), + ); + default_headers + } } struct StatsUpdater<'a> { From c6fadb7472a73783a7cc7b362c0af2a41cfb9846 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 14:16:53 -0400 Subject: [PATCH 019/213] v1.17: docs: Removes accounts-on-ramdisk section (backport of #33655) (#33657) (cherry picked from commit 99542d9b59ef9c6d8ace283e5d893e7329f4c193) Co-authored-by: Brooks --- docs/src/running-validator/validator-start.md | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/docs/src/running-validator/validator-start.md b/docs/src/running-validator/validator-start.md index d30533abd54b87..16940dc7030d45 100644 --- a/docs/src/running-validator/validator-start.md +++ b/docs/src/running-validator/validator-start.md @@ -431,40 +431,6 @@ solana-validator ..."); otherwise, when logrotate sends its signal to the validator, the enclosing script will die and take the validator process with it. -### Using a ramdisk with spill-over into swap for the accounts database to reduce SSD wear - -If your machine has plenty of RAM, a tmpfs ramdisk -([tmpfs](https://man7.org/linux/man-pages/man5/tmpfs.5.html)) may be used to hold -the accounts database - -When using tmpfs it's essential to also configure swap on your machine as well to -avoid running out of tmpfs space periodically. - -A 300GB tmpfs partition is recommended, with an accompanying 250GB swap -partition. - -Example configuration: - -1. `sudo mkdir /mnt/solana-accounts` -2. Add a 300GB tmpfs partition by adding a new line containing `tmpfs /mnt/solana-accounts tmpfs rw,size=300G,user=sol 0 0` to `/etc/fstab` - (assuming your validator is running under the user "sol"). **CAREFUL: If you - incorrectly edit /etc/fstab your machine may no longer boot** -3. Create at least 250GB of swap space - -- Choose a device to use in place of `SWAPDEV` for the remainder of these instructions. - Ideally select a free disk partition of 250GB or greater on a fast disk. If one is not - available, create a swap file with `sudo dd if=/dev/zero of=/swapfile bs=1MiB count=250KiB`, - set its permissions with `sudo chmod 0600 /swapfile` and use `/swapfile` as `SWAPDEV` for - the remainder of these instructions -- Format the device for usage as swap with `sudo mkswap SWAPDEV` - -4. Add the swap file to `/etc/fstab` with a new line containing `SWAPDEV swap swap defaults 0 0` -5. Enable swap with `sudo swapon -a` and mount the tmpfs with `sudo mount /mnt/solana-accounts/` -6. Confirm swap is active with `free -g` and the tmpfs is mounted with `mount` - -Now add the `--accounts /mnt/solana-accounts` argument to your `solana-validator` -command-line arguments and restart the validator. - ### Account indexing As the number of populated accounts on the cluster grows, account-data RPC From eceba1c241df85583243c46eff9871932c5dd792 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 12:26:12 -0700 Subject: [PATCH 020/213] v1.17: Update hashes per tick with feature gates (backport of #33600) (#33661) Update hashes per tick with feature gates (#33600) * Update hashes per tick with feature gates (cherry picked from commit b36d051b510bf2083034263b7321272f174b4a83) Co-authored-by: Brennan --- runtime/src/bank.rs | 23 +++++++++++- runtime/src/bank/tests.rs | 76 +++++++++++++++++++++++++++++++++++++++ sdk/program/src/clock.rs | 33 +++++++++++++++++ sdk/src/feature_set.rs | 25 +++++++++++++ 4 files changed, 156 insertions(+), 1 deletion(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 68e5492186ff9d..4fd3f8a4980436 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -128,7 +128,8 @@ use { BankId, Epoch, Slot, SlotCount, SlotIndex, UnixTimestamp, DEFAULT_HASHES_PER_TICK, DEFAULT_TICKS_PER_SECOND, INITIAL_RENT_EPOCH, MAX_PROCESSING_AGE, MAX_TRANSACTION_FORWARDING_DELAY, MAX_TRANSACTION_FORWARDING_DELAY_GPU, - SECONDS_PER_DAY, + SECONDS_PER_DAY, UPDATED_HASHES_PER_TICK2, UPDATED_HASHES_PER_TICK3, + UPDATED_HASHES_PER_TICK4, UPDATED_HASHES_PER_TICK5, UPDATED_HASHES_PER_TICK6, }, epoch_info::EpochInfo, epoch_schedule::EpochSchedule, @@ -8057,6 +8058,26 @@ impl Bank { self.apply_updated_hashes_per_tick(DEFAULT_HASHES_PER_TICK); } + if new_feature_activations.contains(&feature_set::update_hashes_per_tick2::id()) { + self.apply_updated_hashes_per_tick(UPDATED_HASHES_PER_TICK2); + } + + if new_feature_activations.contains(&feature_set::update_hashes_per_tick3::id()) { + self.apply_updated_hashes_per_tick(UPDATED_HASHES_PER_TICK3); + } + + if new_feature_activations.contains(&feature_set::update_hashes_per_tick4::id()) { + self.apply_updated_hashes_per_tick(UPDATED_HASHES_PER_TICK4); + } + + if new_feature_activations.contains(&feature_set::update_hashes_per_tick5::id()) { + self.apply_updated_hashes_per_tick(UPDATED_HASHES_PER_TICK5); + } + + if new_feature_activations.contains(&feature_set::update_hashes_per_tick6::id()) { + self.apply_updated_hashes_per_tick(UPDATED_HASHES_PER_TICK6); + } + if new_feature_activations.contains(&feature_set::programify_feature_gate_program::id()) { let datapoint_name = "bank-progamify_feature_gate_program"; if let Err(e) = replace_account::replace_empty_account_with_upgradeable_program( diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 58ce790d43d0d4..2a1fbb60ed3805 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -62,6 +62,8 @@ use { clock::{ BankId, Epoch, Slot, UnixTimestamp, DEFAULT_HASHES_PER_TICK, DEFAULT_SLOTS_PER_EPOCH, DEFAULT_TICKS_PER_SLOT, INITIAL_RENT_EPOCH, MAX_PROCESSING_AGE, MAX_RECENT_BLOCKHASHES, + UPDATED_HASHES_PER_TICK2, UPDATED_HASHES_PER_TICK3, UPDATED_HASHES_PER_TICK4, + UPDATED_HASHES_PER_TICK5, UPDATED_HASHES_PER_TICK6, }, compute_budget::ComputeBudgetInstruction, entrypoint::MAX_PERMITTED_DATA_INCREASE, @@ -12230,6 +12232,80 @@ fn test_feature_activation_idempotent() { assert_eq!(bank.hashes_per_tick, Some(DEFAULT_HASHES_PER_TICK)); } +#[test] +fn test_feature_hashes_per_tick() { + let mut genesis_config = GenesisConfig::default(); + const HASHES_PER_TICK_START: u64 = 3; + genesis_config.poh_config.hashes_per_tick = Some(HASHES_PER_TICK_START); + + let mut bank = Bank::new_for_tests(&genesis_config); + assert_eq!(bank.hashes_per_tick, Some(HASHES_PER_TICK_START)); + + // Don't activate feature + bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, false); + assert_eq!(bank.hashes_per_tick, Some(HASHES_PER_TICK_START)); + + // Activate feature + let feature_account_balance = + std::cmp::max(genesis_config.rent.minimum_balance(Feature::size_of()), 1); + bank.store_account( + &feature_set::update_hashes_per_tick::id(), + &feature::create_account(&Feature { activated_at: None }, feature_account_balance), + ); + bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, false); + assert_eq!(bank.hashes_per_tick, Some(DEFAULT_HASHES_PER_TICK)); + + // Activate feature + let feature_account_balance = + std::cmp::max(genesis_config.rent.minimum_balance(Feature::size_of()), 1); + bank.store_account( + &feature_set::update_hashes_per_tick2::id(), + &feature::create_account(&Feature { activated_at: None }, feature_account_balance), + ); + bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, false); + assert_eq!(bank.hashes_per_tick, Some(UPDATED_HASHES_PER_TICK2)); + + // Activate feature + let feature_account_balance = + std::cmp::max(genesis_config.rent.minimum_balance(Feature::size_of()), 1); + bank.store_account( + &feature_set::update_hashes_per_tick3::id(), + &feature::create_account(&Feature { activated_at: None }, feature_account_balance), + ); + bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, false); + assert_eq!(bank.hashes_per_tick, Some(UPDATED_HASHES_PER_TICK3)); + + // Activate feature + let feature_account_balance = + std::cmp::max(genesis_config.rent.minimum_balance(Feature::size_of()), 1); + bank.store_account( + &feature_set::update_hashes_per_tick4::id(), + &feature::create_account(&Feature { activated_at: None }, feature_account_balance), + ); + bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, false); + assert_eq!(bank.hashes_per_tick, Some(UPDATED_HASHES_PER_TICK4)); + + // Activate feature + let feature_account_balance = + std::cmp::max(genesis_config.rent.minimum_balance(Feature::size_of()), 1); + bank.store_account( + &feature_set::update_hashes_per_tick5::id(), + &feature::create_account(&Feature { activated_at: None }, feature_account_balance), + ); + bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, false); + assert_eq!(bank.hashes_per_tick, Some(UPDATED_HASHES_PER_TICK5)); + + // Activate feature + let feature_account_balance = + std::cmp::max(genesis_config.rent.minimum_balance(Feature::size_of()), 1); + bank.store_account( + &feature_set::update_hashes_per_tick6::id(), + &feature::create_account(&Feature { activated_at: None }, feature_account_balance), + ); + bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, false); + assert_eq!(bank.hashes_per_tick, Some(UPDATED_HASHES_PER_TICK6)); +} + #[test_case(true)] #[test_case(false)] fn test_stake_account_consistency_with_rent_epoch_max_feature( diff --git a/sdk/program/src/clock.rs b/sdk/program/src/clock.rs index 45f49f218b15c7..e988bafb21d354 100644 --- a/sdk/program/src/clock.rs +++ b/sdk/program/src/clock.rs @@ -44,10 +44,43 @@ pub const DEFAULT_TICKS_PER_SLOT: u64 = 64; // GCP n1-standard hardware and also a xeon e5-2520 v4 are about this rate of hashes/s pub const DEFAULT_HASHES_PER_SECOND: u64 = 2_000_000; +// Empirical sampling of mainnet validator hash rate showed the following stake +// percentages can exceed the designated hash rates as of July 2023: +// 97.6% +pub const UPDATED_HASHES_PER_SECOND_2: u64 = 2_800_000; +// 96.2% +pub const UPDATED_HASHES_PER_SECOND_3: u64 = 4_400_000; +// 96.2% +pub const UPDATED_HASHES_PER_SECOND_4: u64 = 7_600_000; +// 96.2% +pub const UPDATED_HASHES_PER_SECOND_5: u64 = 9_200_000; +// 96.2% +pub const UPDATED_HASHES_PER_SECOND_6: u64 = 10_000_000; + #[cfg(test)] static_assertions::const_assert_eq!(DEFAULT_HASHES_PER_TICK, 12_500); pub const DEFAULT_HASHES_PER_TICK: u64 = DEFAULT_HASHES_PER_SECOND / DEFAULT_TICKS_PER_SECOND; +#[cfg(test)] +static_assertions::const_assert_eq!(UPDATED_HASHES_PER_TICK2, 17_500); +pub const UPDATED_HASHES_PER_TICK2: u64 = UPDATED_HASHES_PER_SECOND_2 / DEFAULT_TICKS_PER_SECOND; + +#[cfg(test)] +static_assertions::const_assert_eq!(UPDATED_HASHES_PER_TICK3, 27_500); +pub const UPDATED_HASHES_PER_TICK3: u64 = UPDATED_HASHES_PER_SECOND_3 / DEFAULT_TICKS_PER_SECOND; + +#[cfg(test)] +static_assertions::const_assert_eq!(UPDATED_HASHES_PER_TICK4, 47_500); +pub const UPDATED_HASHES_PER_TICK4: u64 = UPDATED_HASHES_PER_SECOND_4 / DEFAULT_TICKS_PER_SECOND; + +#[cfg(test)] +static_assertions::const_assert_eq!(UPDATED_HASHES_PER_TICK5, 57_500); +pub const UPDATED_HASHES_PER_TICK5: u64 = UPDATED_HASHES_PER_SECOND_5 / DEFAULT_TICKS_PER_SECOND; + +#[cfg(test)] +static_assertions::const_assert_eq!(UPDATED_HASHES_PER_TICK6, 62_500); +pub const UPDATED_HASHES_PER_TICK6: u64 = UPDATED_HASHES_PER_SECOND_6 / DEFAULT_TICKS_PER_SECOND; + // 1 Dev Epoch = 400 ms * 8192 ~= 55 minutes pub const DEFAULT_DEV_SLOTS_PER_EPOCH: u64 = 8192; diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 9ec56b03e0e3bf..bc81d781a7c176 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -704,6 +704,26 @@ pub mod programify_feature_gate_program { solana_sdk::declare_id!("8GdovDzVwWU5edz2G697bbB7GZjrUc6aQZLWyNNAtHdg"); } +pub mod update_hashes_per_tick2 { + solana_sdk::declare_id!("EWme9uFqfy1ikK1jhJs8fM5hxWnK336QJpbscNtizkTU"); +} + +pub mod update_hashes_per_tick3 { + solana_sdk::declare_id!("8C8MCtsab5SsfammbzvYz65HHauuUYdbY2DZ4sznH6h5"); +} + +pub mod update_hashes_per_tick4 { + solana_sdk::declare_id!("8We4E7DPwF2WfAN8tRTtWQNhi98B99Qpuj7JoZ3Aikgg"); +} + +pub mod update_hashes_per_tick5 { + solana_sdk::declare_id!("BsKLKAn1WM4HVhPRDsjosmqSg2J8Tq5xP2s2daDS6Ni4"); +} + +pub mod update_hashes_per_tick6 { + solana_sdk::declare_id!("FKu1qYwLQSiehz644H6Si65U5ZQ2cp9GxsyFUfYcuADv"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -875,6 +895,11 @@ lazy_static! { (better_error_codes_for_tx_lamport_check::id(), "better error codes for tx lamport check #33353"), (enable_alt_bn128_compression_syscall::id(), "add alt_bn128 compression syscalls"), (programify_feature_gate_program::id(), "move feature gate activation logic to an on-chain program #32783"), + (update_hashes_per_tick2::id(), "Update desired hashes per tick to 2.8M"), + (update_hashes_per_tick3::id(), "Update desired hashes per tick to 4.4M"), + (update_hashes_per_tick4::id(), "Update desired hashes per tick to 7.6M"), + (update_hashes_per_tick5::id(), "Update desired hashes per tick to 9.2M"), + (update_hashes_per_tick6::id(), "Update desired hashes per tick to 10M"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() From e1278e212779974de9b6d9e8ac9af805e94c86a1 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 16:50:38 -0400 Subject: [PATCH 021/213] v1.17: Adds `--no-skip-initial-accounts-db-clean` *hidden* CLI flag (backport of #33664) (#33677) Adds `--no-skip-initial-accounts-db-clean` *hidden* CLI flag (#33664) (cherry picked from commit 452fd5d384e344377c4d14ab4373f9ad129f36d2) Co-authored-by: Brooks --- core/src/validator.rs | 3 +++ core/tests/epoch_accounts_hash.rs | 1 + core/tests/snapshots.rs | 3 +++ ledger/src/bank_forks_utils.rs | 1 + ledger/src/blockstore_processor.rs | 1 + local-cluster/src/validator_configs.rs | 1 + runtime/src/bank.rs | 7 ++++--- runtime/src/bank/serde_snapshot.rs | 1 + runtime/src/bank/tests.rs | 4 ++-- runtime/src/snapshot_bank_utils.rs | 11 +++++++++++ validator/src/cli.rs | 7 +++++++ validator/src/main.rs | 1 + 12 files changed, 36 insertions(+), 5 deletions(-) diff --git a/core/src/validator.rs b/core/src/validator.rs index e2b763f202f89b..16bf34961dc180 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -245,6 +245,7 @@ pub struct ValidatorConfig { pub warp_slot: Option, pub accounts_db_test_hash_calculation: bool, pub accounts_db_skip_shrink: bool, + pub accounts_db_force_initial_clean: bool, pub tpu_coalesce: Duration, pub staked_nodes_overrides: Arc>>, pub validator_exit: Arc>, @@ -311,6 +312,7 @@ impl Default for ValidatorConfig { warp_slot: None, accounts_db_test_hash_calculation: false, accounts_db_skip_shrink: false, + accounts_db_force_initial_clean: false, tpu_coalesce: DEFAULT_TPU_COALESCE, staked_nodes_overrides: Arc::new(RwLock::new(HashMap::new())), validator_exit: Arc::new(RwLock::new(Exit::default())), @@ -1724,6 +1726,7 @@ fn load_blockstore( shrink_ratio: config.accounts_shrink_ratio, accounts_db_test_hash_calculation: config.accounts_db_test_hash_calculation, accounts_db_skip_shrink: config.accounts_db_skip_shrink, + accounts_db_force_initial_clean: config.accounts_db_force_initial_clean, runtime_config: config.runtime_config.clone(), use_snapshot_archives_at_startup: config.use_snapshot_archives_at_startup, ..blockstore_processor::ProcessOptions::default() diff --git a/core/tests/epoch_accounts_hash.rs b/core/tests/epoch_accounts_hash.rs index 718e62688b8c4c..8fa6919e99db1f 100755 --- a/core/tests/epoch_accounts_hash.rs +++ b/core/tests/epoch_accounts_hash.rs @@ -461,6 +461,7 @@ fn test_snapshots_have_expected_epoch_accounts_hash() { AccountShrinkThreshold::default(), true, true, + false, true, None, None, diff --git a/core/tests/snapshots.rs b/core/tests/snapshots.rs index b61e84a90810c9..674c039bee2353 100644 --- a/core/tests/snapshots.rs +++ b/core/tests/snapshots.rs @@ -171,6 +171,7 @@ fn restore_from_snapshot( check_hash_calculation, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), @@ -893,6 +894,7 @@ fn restore_from_snapshots_and_check_banks_are_equal( false, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), @@ -1113,6 +1115,7 @@ fn test_snapshots_with_background_services( false, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, exit.clone(), diff --git a/ledger/src/bank_forks_utils.rs b/ledger/src/bank_forks_utils.rs index b46d950adba28a..0be01e9bde975b 100644 --- a/ledger/src/bank_forks_utils.rs +++ b/ledger/src/bank_forks_utils.rs @@ -264,6 +264,7 @@ fn bank_forks_from_snapshot( process_options.shrink_ratio, process_options.accounts_db_test_hash_calculation, process_options.accounts_db_skip_shrink, + process_options.accounts_db_force_initial_clean, process_options.verify_index, process_options.accounts_db_config.clone(), accounts_update_notifier, diff --git a/ledger/src/blockstore_processor.rs b/ledger/src/blockstore_processor.rs index f5a8836087d3d4..8738c200bfc2c0 100644 --- a/ledger/src/blockstore_processor.rs +++ b/ledger/src/blockstore_processor.rs @@ -610,6 +610,7 @@ pub struct ProcessOptions { pub allow_dead_slots: bool, pub accounts_db_test_hash_calculation: bool, pub accounts_db_skip_shrink: bool, + pub accounts_db_force_initial_clean: bool, pub accounts_db_config: Option, pub verify_index: bool, pub shrink_ratio: AccountShrinkThreshold, diff --git a/local-cluster/src/validator_configs.rs b/local-cluster/src/validator_configs.rs index 70211b5dac666b..627c5797cd8268 100644 --- a/local-cluster/src/validator_configs.rs +++ b/local-cluster/src/validator_configs.rs @@ -51,6 +51,7 @@ pub fn safe_clone_config(config: &ValidatorConfig) -> ValidatorConfig { warp_slot: config.warp_slot, accounts_db_test_hash_calculation: config.accounts_db_test_hash_calculation, accounts_db_skip_shrink: config.accounts_db_skip_shrink, + accounts_db_force_initial_clean: config.accounts_db_force_initial_clean, tpu_coalesce: config.tpu_coalesce, staked_nodes_overrides: config.staked_nodes_overrides.clone(), validator_exit: Arc::new(RwLock::new(Exit::default())), diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 4fd3f8a4980436..37bf8aeac5cc02 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -7613,12 +7613,13 @@ impl Bank { pub fn verify_snapshot_bank( &self, test_hash_calculation: bool, - accounts_db_skip_shrink: bool, + skip_shrink: bool, + force_clean: bool, last_full_snapshot_slot: Slot, base: Option<(Slot, /*capitalization*/ u64)>, ) -> bool { let (_, clean_time_us) = measure_us!({ - let should_clean = !accounts_db_skip_shrink && self.slot() > 0; + let should_clean = force_clean || (!skip_shrink && self.slot() > 0); if should_clean { info!("Cleaning..."); // We cannot clean past the last full snapshot's slot because we are about to @@ -7638,7 +7639,7 @@ impl Bank { }); let (_, shrink_time_us) = measure_us!({ - let should_shrink = !accounts_db_skip_shrink && self.slot() > 0; + let should_shrink = !skip_shrink && self.slot() > 0; if should_shrink { info!("Shrinking..."); self.rc.accounts.accounts_db.shrink_all_slots( diff --git a/runtime/src/bank/serde_snapshot.rs b/runtime/src/bank/serde_snapshot.rs index 2e0bdd3ecc7ab6..6208f03581234e 100644 --- a/runtime/src/bank/serde_snapshot.rs +++ b/runtime/src/bank/serde_snapshot.rs @@ -496,6 +496,7 @@ mod tests { false, false, false, + false, Some(solana_accounts_db::accounts_db::ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 2a1fbb60ed3805..37dbcd7bc04ad7 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -3608,11 +3608,11 @@ fn test_verify_snapshot_bank() { bank.freeze(); add_root_and_flush_write_cache(&bank); bank.update_accounts_hash_for_tests(); - assert!(bank.verify_snapshot_bank(true, false, bank.slot(), None)); + assert!(bank.verify_snapshot_bank(true, false, false, bank.slot(), None)); // tamper the bank after freeze! bank.increment_signature_count(1); - assert!(!bank.verify_snapshot_bank(true, false, bank.slot(), None)); + assert!(!bank.verify_snapshot_bank(true, false, false, bank.slot(), None)); } // Test that two bank forks with the same accounts should not hash to the same value. diff --git a/runtime/src/snapshot_bank_utils.rs b/runtime/src/snapshot_bank_utils.rs index 82d6f354a4e998..9f237def741b79 100644 --- a/runtime/src/snapshot_bank_utils.rs +++ b/runtime/src/snapshot_bank_utils.rs @@ -271,6 +271,7 @@ pub fn bank_from_snapshot_archives( shrink_ratio: AccountShrinkThreshold, test_hash_calculation: bool, accounts_db_skip_shrink: bool, + accounts_db_force_initial_clean: bool, verify_index: bool, accounts_db_config: Option, accounts_update_notifier: Option, @@ -365,6 +366,7 @@ pub fn bank_from_snapshot_archives( if !bank.verify_snapshot_bank( test_hash_calculation, accounts_db_skip_shrink || !full_snapshot_archive_info.is_remote(), + accounts_db_force_initial_clean, full_snapshot_archive_info.slot(), base, ) && limit_load_slot_count_from_snapshot.is_none() @@ -427,6 +429,7 @@ pub fn bank_from_latest_snapshot_archives( shrink_ratio: AccountShrinkThreshold, test_hash_calculation: bool, accounts_db_skip_shrink: bool, + accounts_db_force_initial_clean: bool, verify_index: bool, accounts_db_config: Option, accounts_update_notifier: Option, @@ -459,6 +462,7 @@ pub fn bank_from_latest_snapshot_archives( shrink_ratio, test_hash_calculation, accounts_db_skip_shrink, + accounts_db_force_initial_clean, verify_index, accounts_db_config, accounts_update_notifier, @@ -1326,6 +1330,7 @@ mod tests { false, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), @@ -1437,6 +1442,7 @@ mod tests { false, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), @@ -1568,6 +1574,7 @@ mod tests { false, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), @@ -1689,6 +1696,7 @@ mod tests { false, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), @@ -1826,6 +1834,7 @@ mod tests { false, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), @@ -1891,6 +1900,7 @@ mod tests { false, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), @@ -2255,6 +2265,7 @@ mod tests { false, false, false, + false, Some(ACCOUNTS_DB_CONFIG_FOR_TESTING), None, Arc::default(), diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 72e82ca13b56d9..afa894d7dd42f8 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -1196,6 +1196,13 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .help("Debug option to scan all append vecs and verify account index refcounts prior to clean") .hidden(hidden_unless_forced()) ) + .arg( + Arg::with_name("no_skip_initial_accounts_db_clean") + .long("no-skip-initial-accounts-db-clean") + .help("Do not skip the initial cleaning of accounts when verifying snapshot bank") + .hidden(hidden_unless_forced()) + .conflicts_with("accounts_db_skip_shrink") + ) .arg( Arg::with_name("accounts_db_create_ancient_storage_packed") .long("accounts-db-create-ancient-storage-packed") diff --git a/validator/src/main.rs b/validator/src/main.rs index b97789061c9e3b..123b9032562a02 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -1385,6 +1385,7 @@ pub fn main() { accounts_db_test_hash_calculation: matches.is_present("accounts_db_test_hash_calculation"), accounts_db_config, accounts_db_skip_shrink: true, + accounts_db_force_initial_clean: matches.is_present("no_skip_initial_accounts_db_clean"), tpu_coalesce, no_wait_for_vote_to_start_leader: matches.is_present("no_wait_for_vote_to_start_leader"), accounts_shrink_ratio, From c96223b69a88dd198e2d65b45537175bfced96fd Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 15:24:18 +0000 Subject: [PATCH 022/213] v1.17: Prevent delay_visibility_of_program_deployment feature from cache pruning (backport of #33689) (#33691) Prevent delay_visibility_of_program_deployment feature from cache pruning (#33689) (cherry picked from commit fd9297775a4b2e0e3f4a6f8bf4ed757e81ea1ad0) Co-authored-by: Pankaj Garg --- runtime/src/bank.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 37bf8aeac5cc02..ec184142d12633 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -8180,7 +8180,6 @@ impl Bank { feature_set::enable_partitioned_epoch_reward::id(), feature_set::disable_deploy_of_alloc_free_syscall::id(), feature_set::last_restart_slot_sysvar::id(), - feature_set::delay_visibility_of_program_deployment::id(), feature_set::remaining_compute_units_syscall_enabled::id(), ]; if !only_apply_transitions_for_new_features From 8d270720f33f700aeda0a5727140cdc490e563df Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 10:58:32 -0700 Subject: [PATCH 023/213] v1.17: validator: skip health check (backport of #33568) (#33588) validator: skip health check (#33568) * validator: skip health check * keep `healthy` as a boolean (cherry picked from commit 7afb11f1e6daa3e9bd93cfe203211de5b14ba56a) Co-authored-by: DimAn --- validator/src/cli.rs | 10 ++++++++++ validator/src/main.rs | 7 ++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/validator/src/cli.rs b/validator/src/cli.rs index afa894d7dd42f8..4acad7dc524663 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -1431,6 +1431,11 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .long("skip-new-snapshot-check") .help("Skip check for a new snapshot") ) + .arg( + Arg::with_name("skip_health_check") + .long("skip-health-check") + .help("Skip health check") + ) ) .subcommand( SubCommand::with_name("authorized-voter") @@ -1646,6 +1651,11 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .long("skip-new-snapshot-check") .help("Skip check for a new snapshot") ) + .arg( + Arg::with_name("skip_health_check") + .long("skip-health-check") + .help("Skip health check") + ) .after_help("Note: If this command exits with a non-zero status \ then this not a good time for a restart") ). diff --git a/validator/src/main.rs b/validator/src/main.rs index 123b9032562a02..abfe6e2009bc45 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -118,6 +118,7 @@ fn wait_for_restart_window( min_idle_time_in_minutes: usize, max_delinquency_percentage: u8, skip_new_snapshot_check: bool, + skip_health_check: bool, ) -> Result<(), Box> { let sleep_interval = Duration::from_secs(5); @@ -161,7 +162,7 @@ fn wait_for_restart_window( seen_incremential_snapshot |= snapshot_slot_info_has_incremential; let epoch_info = rpc_client.get_epoch_info_with_commitment(CommitmentConfig::processed())?; - let healthy = rpc_client.get_health().ok().is_some(); + let healthy = skip_health_check || rpc_client.get_health().ok().is_some(); let delinquent_stake_percentage = { let vote_accounts = rpc_client.get_vote_accounts()?; let current_stake: u64 = vote_accounts @@ -649,6 +650,7 @@ pub fn main() { let force = subcommand_matches.is_present("force"); let monitor = subcommand_matches.is_present("monitor"); let skip_new_snapshot_check = subcommand_matches.is_present("skip_new_snapshot_check"); + let skip_health_check = subcommand_matches.is_present("skip_health_check"); let max_delinquent_stake = value_t_or_exit!(subcommand_matches, "max_delinquent_stake", u8); @@ -659,6 +661,7 @@ pub fn main() { min_idle_time, max_delinquent_stake, skip_new_snapshot_check, + skip_health_check, ) .unwrap_or_else(|err| { println!("{err}"); @@ -777,6 +780,7 @@ pub fn main() { let max_delinquent_stake = value_t_or_exit!(subcommand_matches, "max_delinquent_stake", u8); let skip_new_snapshot_check = subcommand_matches.is_present("skip_new_snapshot_check"); + let skip_health_check = subcommand_matches.is_present("skip_health_check"); wait_for_restart_window( &ledger_path, @@ -784,6 +788,7 @@ pub fn main() { min_idle_time, max_delinquent_stake, skip_new_snapshot_check, + skip_health_check, ) .unwrap_or_else(|err| { println!("{err}"); From 10b00df3d137fb77f71ea700a55296d2067b09d4 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 20:22:34 +0100 Subject: [PATCH 024/213] v1.17: bank: do not remove trailing 0 bytes from return data (backport of #33639) (#33685) bank: do not remove trailing 0 bytes from return data (#33639) This is creating havoc for Solang, as the return data is borsh encoded and therefore `u64` values like 0x100 get truncated. (cherry picked from commit 47511999bbda8daac1c4b1f6a9ad0e8e8eb687f0) Co-authored-by: Sean Young --- runtime/src/bank.rs | 12 +++--------- runtime/src/bank/tests.rs | 9 +++++---- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index ec184142d12633..7e01ce4304d14b 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -4951,7 +4951,7 @@ impl Bank { let ExecutionRecord { accounts, - mut return_data, + return_data, touched_account_count, accounts_resize_delta, } = transaction_context.into(); @@ -4981,14 +4981,8 @@ impl Bank { accounts_data_len_delta = status.as_ref().map_or(0, |_| accounts_resize_delta); } - let return_data = if enable_return_data_recording { - if let Some(end_index) = return_data.data.iter().rposition(|&x| x != 0) { - let end_index = end_index.saturating_add(1); - return_data.data.truncate(end_index); - Some(return_data) - } else { - None - } + let return_data = if enable_return_data_recording && !return_data.data.is_empty() { + Some(return_data) } else { None }; diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 37dbcd7bc04ad7..a45e16dec58542 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -9712,9 +9712,9 @@ fn test_tx_return_data() { let mut return_data = [0u8; MAX_RETURN_DATA]; if !instruction_data.is_empty() { let index = usize::from_le_bytes(instruction_data.try_into().unwrap()); - return_data[index] = 1; + return_data[index / 2] = 1; transaction_context - .set_return_data(mock_program_id, return_data.to_vec()) + .set_return_data(mock_program_id, return_data[..index + 1].to_vec()) .unwrap(); } Ok(()) @@ -9766,8 +9766,9 @@ fn test_tx_return_data() { if let Some(index) = index { let return_data = return_data.unwrap(); assert_eq!(return_data.program_id, mock_program_id); - let mut expected_data = vec![0u8; index]; - expected_data.push(1u8); + let mut expected_data = vec![0u8; index + 1]; + // include some trailing zeros + expected_data[index / 2] = 1; assert_eq!(return_data.data, expected_data); } else { assert!(return_data.is_none()); From 02f9c97446c143f1d27866bb2f26852c7a75809e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 22:00:35 +0000 Subject: [PATCH 025/213] v1.17: Refactor - LoadedPrograms part 2 (backport of #33694) (#33695) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactor - LoadedPrograms part 2 (#33694) (cherry picked from commit a3f85aba21f6c43608a64ddd22a2ac0312fdc5ef) # Conflicts: # runtime/src/bank/tests.rs * fix merge conflicts --------- Co-authored-by: Alexander Meißner Co-authored-by: Pankaj Garg --- program-runtime/src/loaded_programs.rs | 242 +++++++++++++------------ runtime/src/bank.rs | 20 +- runtime/src/bank/tests.rs | 22 ++- 3 files changed, 154 insertions(+), 130 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 43061f19a0758e..0ded17ee7877de 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -56,9 +56,12 @@ pub trait ForkGraph { /// Provides information about current working slot, and its ancestors pub trait WorkingSlot { - /// Returns the current slot value + /// Returns the current slot fn current_slot(&self) -> Slot; + /// Returns the epoch of the current slot + fn current_epoch(&self) -> Epoch; + /// Returns true if the `other` slot is an ancestor of self, false otherwise fn is_ancestor(&self, other: Slot) -> bool; } @@ -99,6 +102,20 @@ impl Debug for LoadedProgramType { } } +impl LoadedProgramType { + /// Returns a reference to its environment if it has one + pub fn get_environment(&self) -> Option<&ProgramRuntimeEnvironment> { + match self { + LoadedProgramType::LegacyV0(program) + | LoadedProgramType::LegacyV1(program) + | LoadedProgramType::Typed(program) => Some(program.get_loader()), + #[cfg(test)] + LoadedProgramType::TestLoaded(environment) => Some(environment), + _ => None, + } + } +} + #[derive(Debug, Default)] pub struct LoadedProgram { /// The program of this entry @@ -338,16 +355,8 @@ impl LoadedProgram { } pub fn to_unloaded(&self) -> Option { - let env = match &self.program { - LoadedProgramType::LegacyV0(program) - | LoadedProgramType::LegacyV1(program) - | LoadedProgramType::Typed(program) => program.get_loader().clone(), - #[cfg(test)] - LoadedProgramType::TestLoaded(env) => env.clone(), - _ => return None, - }; Some(Self { - program: LoadedProgramType::Unloaded(env), + program: LoadedProgramType::Unloaded(self.program.get_environment()?.clone()), account_size: self.account_size, deployment_slot: self.deployment_slot, effective_slot: self.effective_slot, @@ -523,6 +532,11 @@ pub enum LoadedProgramMatchCriteria { } impl LoadedPrograms { + /// Returns the current environments depending on the given epoch + pub fn get_environments_for_epoch(&self, _epoch: Epoch) -> &ProgramRuntimeEnvironments { + &self.environments + } + /// Refill the cache with a single entry. It's typically called during transaction loading, /// when the cache doesn't contain the entry corresponding to program `key`. /// The function dedupes the cache, in case some other thread replenished the entry in parallel. @@ -586,41 +600,13 @@ impl LoadedPrograms { pub fn prune_feature_set_transition(&mut self) { for second_level in self.entries.values_mut() { second_level.retain(|entry| { - let retain = match &entry.program { - LoadedProgramType::Builtin(_) - | LoadedProgramType::DelayVisibility - | LoadedProgramType::Closed => true, - LoadedProgramType::LegacyV0(program) | LoadedProgramType::LegacyV1(program) - if Arc::ptr_eq( - program.get_loader(), - &self.environments.program_runtime_v1, - ) => - { - true - } - LoadedProgramType::Unloaded(environment) - | LoadedProgramType::FailedVerification(environment) - if Arc::ptr_eq(environment, &self.environments.program_runtime_v1) - || Arc::ptr_eq(environment, &self.environments.program_runtime_v2) => - { - true - } - LoadedProgramType::Typed(program) - if Arc::ptr_eq( - program.get_loader(), - &self.environments.program_runtime_v2, - ) => - { - true - } - _ => false, - }; - if !retain { - self.stats - .prunes_environment - .fetch_add(1, Ordering::Relaxed); + if Self::matches_environment(entry, &self.environments) { + return true; } - retain + self.stats + .prunes_environment + .fetch_add(1, Ordering::Relaxed); + false }); } self.remove_programs_with_no_entries(); @@ -688,6 +674,17 @@ impl LoadedPrograms { } } + fn matches_environment( + entry: &Arc, + environments: &ProgramRuntimeEnvironments, + ) -> bool { + let Some(environment) = entry.program.get_environment() else { + return true; + }; + Arc::ptr_eq(environment, &environments.program_runtime_v1) + || Arc::ptr_eq(environment, &environments.program_runtime_v2) + } + fn matches_loaded_program_criteria( program: &Arc, criteria: &LoadedProgramMatchCriteria, @@ -727,6 +724,7 @@ impl LoadedPrograms { working_slot: &S, keys: impl Iterator, ) -> ExtractedPrograms { + let environments = self.get_environments_for_epoch(working_slot.current_epoch()); let mut missing = Vec::new(); let mut unloaded = Vec::new(); let found = keys @@ -738,27 +736,22 @@ impl LoadedPrograms { || entry.deployment_slot == current_slot || working_slot.is_ancestor(entry.deployment_slot) { - if !Self::is_entry_usable(entry, current_slot, &match_criteria) { - missing.push((key, count)); - return None; - } + if current_slot >= entry.effective_slot { + if !Self::is_entry_usable(entry, current_slot, &match_criteria) { + missing.push((key, count)); + return None; + } - if let LoadedProgramType::Unloaded(environment) = &entry.program { - if Arc::ptr_eq(environment, &self.environments.program_runtime_v1) - || Arc::ptr_eq( - environment, - &self.environments.program_runtime_v2, - ) - { - // if the environment hasn't changed since the entry was unloaded. - unloaded.push((key, count)); - } else { + if !Self::matches_environment(entry, environments) { missing.push((key, count)); + return None; + } + + if let LoadedProgramType::Unloaded(_environment) = &entry.program { + unloaded.push((key, count)); + return None; } - return None; - } - if current_slot >= entry.effective_slot { let mut usage_count = entry.tx_usage_counter.load(Ordering::Relaxed); saturating_add_assign!(usage_count, count); @@ -794,7 +787,7 @@ impl LoadedPrograms { loaded: LoadedProgramsForTxBatch { entries: found, slot: working_slot.current_slot(), - environments: self.environments.clone(), + environments: environments.clone(), }, missing, unloaded, @@ -930,13 +923,16 @@ mod tests { use { crate::loaded_programs::{ BlockRelation, ExtractedPrograms, ForkGraph, LoadedProgram, LoadedProgramMatchCriteria, - LoadedProgramType, LoadedPrograms, LoadedProgramsForTxBatch, WorkingSlot, - DELAY_VISIBILITY_SLOT_OFFSET, + LoadedProgramType, LoadedPrograms, LoadedProgramsForTxBatch, ProgramRuntimeEnvironment, + WorkingSlot, DELAY_VISIBILITY_SLOT_OFFSET, }, assert_matches::assert_matches, percentage::Percentage, solana_rbpf::vm::BuiltinProgram, - solana_sdk::{clock::Slot, pubkey::Pubkey}, + solana_sdk::{ + clock::{Epoch, Slot}, + pubkey::Pubkey, + }, std::{ ops::ControlFlow, sync::{ @@ -946,6 +942,51 @@ mod tests { }, }; + static MOCK_ENVIRONMENT: std::sync::OnceLock = + std::sync::OnceLock::::new(); + + fn new_mock_cache() -> LoadedPrograms { + let mut cache = LoadedPrograms::default(); + cache.environments.program_runtime_v1 = MOCK_ENVIRONMENT + .get_or_init(|| Arc::new(BuiltinProgram::new_mock())) + .clone(); + cache + } + + fn new_test_loaded_program(deployment_slot: Slot, effective_slot: Slot) -> Arc { + new_test_loaded_program_with_usage(deployment_slot, effective_slot, AtomicU64::default()) + } + + fn new_test_loaded_program_with_usage( + deployment_slot: Slot, + effective_slot: Slot, + usage_counter: AtomicU64, + ) -> Arc { + new_test_loaded_program_with_usage_and_expiry( + deployment_slot, + effective_slot, + usage_counter, + None, + ) + } + + fn new_test_loaded_program_with_usage_and_expiry( + deployment_slot: Slot, + effective_slot: Slot, + usage_counter: AtomicU64, + expiry: Option, + ) -> Arc { + Arc::new(LoadedProgram { + program: LoadedProgramType::TestLoaded(MOCK_ENVIRONMENT.get().unwrap().clone()), + account_size: 0, + deployment_slot, + effective_slot, + maybe_expiration_slot: expiry, + tx_usage_counter: usage_counter, + ix_usage_counter: AtomicU64::default(), + }) + } + fn new_test_builtin_program(deployment_slot: Slot, effective_slot: Slot) -> Arc { Arc::new(LoadedProgram { program: LoadedProgramType::Builtin(BuiltinProgram::new_mock()), @@ -1011,7 +1052,7 @@ mod tests { let mut programs = vec![]; let mut num_total_programs: usize = 0; - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); let program1 = Pubkey::new_unique(); let program1_deployment_slots = [0, 10, 20]; @@ -1177,7 +1218,7 @@ mod tests { #[test] fn test_usage_count_of_unloaded_program() { - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); let program = Pubkey::new_unique(); let num_total_programs = 6; @@ -1229,7 +1270,7 @@ mod tests { #[test] fn test_replace_tombstones() { - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); let program1 = Pubkey::new_unique(); let env = Arc::new(BuiltinProgram::new_mock()); set_tombstone( @@ -1261,7 +1302,7 @@ mod tests { assert_eq!(tombstone.deployment_slot, 100); assert_eq!(tombstone.effective_slot, 100); - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); let program1 = Pubkey::new_unique(); let tombstone = set_tombstone( &mut cache, @@ -1321,7 +1362,7 @@ mod tests { #[test] fn test_prune_empty() { - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); let fork_graph = TestForkGraph { relation: BlockRelation::Unrelated, }; @@ -1332,7 +1373,7 @@ mod tests { cache.prune(&fork_graph, 10, 0); assert!(cache.entries.is_empty()); - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); let fork_graph = TestForkGraph { relation: BlockRelation::Ancestor, }; @@ -1343,7 +1384,7 @@ mod tests { cache.prune(&fork_graph, 10, 0); assert!(cache.entries.is_empty()); - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); let fork_graph = TestForkGraph { relation: BlockRelation::Descendant, }; @@ -1354,7 +1395,7 @@ mod tests { cache.prune(&fork_graph, 10, 0); assert!(cache.entries.is_empty()); - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); let fork_graph = TestForkGraph { relation: BlockRelation::Unknown, }; @@ -1443,6 +1484,10 @@ mod tests { self.slot } + fn current_epoch(&self) -> Epoch { + 0 + } + fn is_ancestor(&self, other: Slot) -> bool { self.fork .iter() @@ -1452,41 +1497,6 @@ mod tests { } } - fn new_test_loaded_program(deployment_slot: Slot, effective_slot: Slot) -> Arc { - new_test_loaded_program_with_usage(deployment_slot, effective_slot, AtomicU64::default()) - } - - fn new_test_loaded_program_with_usage( - deployment_slot: Slot, - effective_slot: Slot, - usage_counter: AtomicU64, - ) -> Arc { - new_test_loaded_program_with_usage_and_expiry( - deployment_slot, - effective_slot, - usage_counter, - None, - ) - } - - fn new_test_loaded_program_with_usage_and_expiry( - deployment_slot: Slot, - effective_slot: Slot, - usage_counter: AtomicU64, - expiry: Option, - ) -> Arc { - let env = Arc::new(BuiltinProgram::new_mock()); - Arc::new(LoadedProgram { - program: LoadedProgramType::TestLoaded(env), - account_size: 0, - deployment_slot, - effective_slot, - maybe_expiration_slot: expiry, - tx_usage_counter: usage_counter, - ix_usage_counter: AtomicU64::default(), - }) - } - fn match_slot( table: &LoadedProgramsForTxBatch, program: &Pubkey, @@ -1502,7 +1512,7 @@ mod tests { #[test] fn test_fork_extract_and_prune() { - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); // Fork graph created for the test // 0 @@ -1883,7 +1893,7 @@ mod tests { #[test] fn test_extract_using_deployment_slot() { - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); // Fork graph created for the test // 0 @@ -1968,7 +1978,7 @@ mod tests { #[test] fn test_extract_unloaded() { - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); // Fork graph created for the test // 0 @@ -2081,13 +2091,12 @@ mod tests { assert!(match_slot(&found, &program1, 20, 22)); assert!(missing.contains(&(program2, 1))); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(unloaded.contains(&(program3, 1))); } #[test] fn test_prune_expired() { - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); // Fork graph created for the test // 0 @@ -2206,7 +2215,7 @@ mod tests { #[test] fn test_fork_prune_find_first_ancestor() { - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); // Fork graph created for the test // 0 @@ -2252,7 +2261,7 @@ mod tests { #[test] fn test_prune_by_deployment_slot() { - let mut cache = LoadedPrograms::default(); + let mut cache = new_mock_cache(); // Fork graph created for the test // 0 @@ -2371,6 +2380,7 @@ mod tests { #[test] fn test_usable_entries_for_slot() { + new_mock_cache(); let tombstone = Arc::new(LoadedProgram::new_tombstone(0, LoadedProgramType::Closed)); assert!(LoadedPrograms::is_entry_usable( diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 7e01ce4304d14b..52fccda5afb34f 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -934,6 +934,10 @@ impl WorkingSlot for Bank { self.slot } + fn current_epoch(&self) -> Epoch { + self.epoch + } + fn is_ancestor(&self, other: Slot) -> bool { self.ancestors.contains_key(&other) } @@ -4663,12 +4667,8 @@ impl Bank { } pub fn load_program(&self, pubkey: &Pubkey, reload: bool) -> Arc { - let environments = self - .loaded_programs_cache - .read() - .unwrap() - .environments - .clone(); + let loaded_programs_cache = self.loaded_programs_cache.read().unwrap(); + let environments = loaded_programs_cache.get_environments_for_epoch(self.epoch); let mut load_program_metrics = LoadProgramMetrics { program_id: pubkey.to_string(), @@ -4761,20 +4761,22 @@ impl Bank { }) .unwrap_or(LoadedProgram::new_tombstone( self.slot, - LoadedProgramType::FailedVerification(environments.program_runtime_v2), + LoadedProgramType::FailedVerification( + environments.program_runtime_v2.clone(), + ), )); Ok(loaded_program) } ProgramAccountLoadResult::InvalidV4Program => Ok(LoadedProgram::new_tombstone( self.slot, - LoadedProgramType::FailedVerification(environments.program_runtime_v2), + LoadedProgramType::FailedVerification(environments.program_runtime_v2.clone()), )), } .unwrap_or_else(|_| { LoadedProgram::new_tombstone( self.slot, - LoadedProgramType::FailedVerification(environments.program_runtime_v1), + LoadedProgramType::FailedVerification(environments.program_runtime_v1.clone()), ) }); diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index a45e16dec58542..60462e174b88bb 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -7,12 +7,15 @@ use { *, }, crate::{ - accounts_background_service::{PrunedBanksRequestHandler, SendDroppedBankCallback}, + accounts_background_service::{ + AbsRequestSender, PrunedBanksRequestHandler, SendDroppedBankCallback, + }, bank::replace_account::{ replace_empty_account_with_upgradeable_program, replace_non_upgradeable_program_account, ReplaceAccountError, }, bank_client::BankClient, + bank_forks::BankForks, epoch_rewards_hasher::hash_rewards_into_partitions, genesis_utils::{ self, activate_all_features, activate_feature, bootstrap_validator_stake_lamports, @@ -12502,7 +12505,8 @@ fn test_runtime_feature_enable_with_program_cache() { genesis_config .accounts .remove(&feature_set::reject_callx_r10::id()); - let root_bank = Bank::new_for_tests(&genesis_config); + let mut bank_forks = BankForks::new(Bank::new_for_tests(&genesis_config)); + let root_bank = bank_forks.root_bank(); // Test a basic transfer let amount = genesis_config.rent.minimum_balance(0); @@ -12532,7 +12536,7 @@ fn test_runtime_feature_enable_with_program_cache() { // Advance the bank so the next transaction can be submitted. goto_end_of_slot(&root_bank); - let mut bank = new_from_parent(Arc::new(root_bank)); + let bank = Arc::new(new_from_parent(root_bank)); // Compose second instruction using the same program with a different block hash let instruction2 = Instruction::new_with_bytes(program_keypair.pubkey(), &[], Vec::new()); @@ -12558,9 +12562,17 @@ fn test_runtime_feature_enable_with_program_cache() { &feature_set::reject_callx_r10::id(), &feature::create_account(&Feature { activated_at: None }, feature_account_balance), ); - bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, false); - // Execute after feature is enabled to check it was pruned and reverified. + // Reroot to call LoadedPrograms::prune() and end the current recompilation phase + goto_end_of_slot(&bank); + bank_forks.insert(Arc::into_inner(bank).unwrap()); + let bank = bank_forks.working_bank(); + bank_forks.set_root(bank.slot, &AbsRequestSender::default(), None); + + // Advance to next epoch, which starts the next recompilation phase + let bank = new_from_parent_next_epoch(bank, 1); + + // Execute after feature is enabled to check it was filtered out and reverified. let result_with_feature_enabled = bank.process_transaction(&transaction2); assert_eq!( result_with_feature_enabled, From 05ebb1f0bba26caaa1a457a3e41314ef8c9768a7 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 13:04:33 -0500 Subject: [PATCH 026/213] v1.17: Change getHealth to compare optimistically confirmed slots (backport of #33651) (#33714) Change getHealth to compare optimistically confirmed slots (#33651) The current getHealth mechanism checks a local accounts hash slot vs. those of other nodes as specified by --known-validator. This is a very coarse comparison given that the default for this value is 100 slots. More so, any nodes using a value larger than the default (ie --incremental-snapshot-interval 500) will likely see getHealth return status behind at some point. Change the underlying mechanism of how health is computed. Instead of using the accounts hash slots published in gossip, use the latest optimistically confirmed slot from the cluster. Even when a node is behind, it is able to observe cluster optimistically confirmed by slots by viewing votes published in gossip. Thus, the latest cluster optimistically confirmed slot can be compared against the latest optimistically confirmed bank from replay to determine health. This new comparison is much more granular, and not needing to depend on individual known validators is also a plus. (cherry picked from commit 8bd0e4cd959f21f2423148aa51378b7b848cc719) Co-authored-by: steviez --- core/src/validator.rs | 4 +- docs/src/api/http.md | 10 +- docs/src/api/methods/_getHealth.mdx | 9 +- rpc/src/rpc.rs | 47 ++++-- rpc/src/rpc_health.rs | 231 ++++++++++++++++++---------- rpc/src/rpc_service.rs | 141 +++-------------- validator/src/cli.rs | 8 +- validator/src/main.rs | 1 + 8 files changed, 213 insertions(+), 238 deletions(-) diff --git a/core/src/validator.rs b/core/src/validator.rs index 16bf34961dc180..3c19756f47d054 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -936,7 +936,8 @@ impl Validator { // (by both replay stage and banking stage) let prioritization_fee_cache = Arc::new(PrioritizationFeeCache::default()); - let rpc_override_health_check = Arc::new(AtomicBool::new(false)); + let rpc_override_health_check = + Arc::new(AtomicBool::new(config.rpc_config.disable_health_check)); let ( json_rpc_service, pubsub_service, @@ -973,7 +974,6 @@ impl Validator { ledger_path, config.validator_exit.clone(), exit.clone(), - config.known_validators.clone(), rpc_override_health_check.clone(), startup_verification_complete, optimistically_confirmed_bank.clone(), diff --git a/docs/src/api/http.md b/docs/src/api/http.md index 63163fbfa4ccdf..9edf2c792cd9c5 100644 --- a/docs/src/api/http.md +++ b/docs/src/api/http.md @@ -154,13 +154,11 @@ Some methods support providing a `filters` object to enable pre-filtering the da Although not a JSON RPC API, a `GET /health` at the RPC HTTP Endpoint provides a health-check mechanism for use by load balancers or other network infrastructure. This request will always return a HTTP 200 OK response with a body of -"ok", "behind" or "unknown" based on the following conditions: +"ok", "behind" or "unknown": -1. If one or more `--known-validator` arguments are provided to `solana-validator` - "ok" is returned - when the node has within `HEALTH_CHECK_SLOT_DISTANCE` slots of the highest - known validator, otherwise "behind". "unknown" is returned when no slot - information from known validators is not yet available. -2. "ok" is always returned if no known validators are provided. +- `ok`: The node is within `HEALTH_CHECK_SLOT_DISTANCE` slots from the latest cluster confirmed slot +- `behind { distance }`: The node is behind `distance` slots from the latest cluster confirmed slot where `distance > HEALTH_CHECK_SLOT_DISTANCE` +- `unknown`: The node is unable to determine where it stands in relation to the cluster ## JSON RPC API Reference diff --git a/docs/src/api/methods/_getHealth.mdx b/docs/src/api/methods/_getHealth.mdx index 482a2ff62a076e..ceb30cc40fa04c 100644 --- a/docs/src/api/methods/_getHealth.mdx +++ b/docs/src/api/methods/_getHealth.mdx @@ -12,13 +12,8 @@ import { ## getHealth -Returns the current health of the node. - -:::caution -If one or more `--known-validator` arguments are provided to `solana-validator` - "ok" is returned -when the node has within `HEALTH_CHECK_SLOT_DISTANCE` slots of the highest known validator, -otherwise an error is returned. "ok" is always returned if no known validators are provided. -::: +Returns the current health of the node. A healthy node is one that is within +`HEALTH_CHECK_SLOT_DISTANCE` slots of the latest cluster confirmed slot. diff --git a/rpc/src/rpc.rs b/rpc/src/rpc.rs index 7ff2ffa42b5f3e..709c186889995e 100644 --- a/rpc/src/rpc.rs +++ b/rpc/src/rpc.rs @@ -149,12 +149,15 @@ pub struct JsonRpcConfig { pub obsolete_v1_7_api: bool, pub rpc_scan_and_fix_roots: bool, pub max_request_body_size: Option, + /// Disable the health check, used for tests and TestValidator + pub disable_health_check: bool, } impl JsonRpcConfig { pub fn default_for_test() -> Self { Self { full_api: true, + disable_health_check: true, ..Self::default() } } @@ -374,6 +377,10 @@ impl JsonRpcRequestProcessor { ); let leader_schedule_cache = Arc::new(LeaderScheduleCache::new_from_bank(&bank)); + let startup_verification_complete = Arc::clone(bank.get_startup_verification_complete()); + let slot = bank.slot(); + let optimistically_confirmed_bank = + Arc::new(RwLock::new(OptimisticallyConfirmedBank { bank })); Self { config: JsonRpcConfig::default(), snapshot_config: None, @@ -381,24 +388,22 @@ impl JsonRpcRequestProcessor { block_commitment_cache: Arc::new(RwLock::new(BlockCommitmentCache::new( HashMap::new(), 0, - CommitmentSlots::new_from_slot(bank.slot()), + CommitmentSlots::new_from_slot(slot), ))), - blockstore, + blockstore: Arc::clone(&blockstore), validator_exit: create_validator_exit(exit.clone()), health: Arc::new(RpcHealth::new( - cluster_info.clone(), - None, + Arc::clone(&optimistically_confirmed_bank), + blockstore, 0, exit, - Arc::clone(bank.get_startup_verification_complete()), + startup_verification_complete, )), cluster_info, genesis_hash, transaction_sender: Arc::new(Mutex::new(sender)), bigtable_ledger_storage: None, - optimistically_confirmed_bank: Arc::new(RwLock::new(OptimisticallyConfirmedBank { - bank, - })), + optimistically_confirmed_bank, largest_accounts_cache: Arc::new(RwLock::new(LargestAccountsCache::new(30))), max_slots: Arc::new(MaxSlots::default()), leader_schedule_cache, @@ -4787,6 +4792,8 @@ pub mod tests { // note that this means that slot 0 will always be considered complete let max_complete_transaction_status_slot = Arc::new(AtomicU64::new(0)); let max_complete_rewards_slot = Arc::new(AtomicU64::new(0)); + let optimistically_confirmed_bank = + OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let meta = JsonRpcRequestProcessor::new( config, @@ -4795,11 +4802,11 @@ pub mod tests { block_commitment_cache.clone(), blockstore.clone(), validator_exit, - RpcHealth::stub(), + RpcHealth::stub(optimistically_confirmed_bank.clone(), blockstore.clone()), cluster_info, Hash::default(), None, - OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks), + optimistically_confirmed_bank, Arc::new(RwLock::new(LargestAccountsCache::new(30))), max_slots.clone(), Arc::new(LeaderScheduleCache::new_from_bank(&bank)), @@ -6398,7 +6405,11 @@ pub mod tests { let blockstore = Arc::new(Blockstore::open(&ledger_path).unwrap()); let block_commitment_cache = Arc::new(RwLock::new(BlockCommitmentCache::default())); let (bank_forks, mint_keypair, ..) = new_bank_forks(); - let health = RpcHealth::stub(); + let optimistically_confirmed_bank = + OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); + let health = RpcHealth::stub(optimistically_confirmed_bank.clone(), blockstore.clone()); + // Mark the node as healthy to start + health.stub_set_health_status(Some(RpcHealthStatus::Ok)); // Freeze bank 0 to prevent a panic in `run_transaction_simulation()` bank_forks.write().unwrap().get(0).unwrap().freeze(); @@ -6429,7 +6440,7 @@ pub mod tests { cluster_info, Hash::default(), None, - OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks), + optimistically_confirmed_bank, Arc::new(RwLock::new(LargestAccountsCache::new(30))), Arc::new(MaxSlots::default()), Arc::new(LeaderScheduleCache::default()), @@ -6690,18 +6701,20 @@ pub mod tests { .my_contact_info() .tpu(connection_cache.protocol()) .unwrap(); + let optimistically_confirmed_bank = + OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let (request_processor, receiver) = JsonRpcRequestProcessor::new( JsonRpcConfig::default(), None, bank_forks.clone(), block_commitment_cache, - blockstore, + blockstore.clone(), validator_exit, - RpcHealth::stub(), + RpcHealth::stub(optimistically_confirmed_bank.clone(), blockstore), cluster_info, Hash::default(), None, - OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks), + optimistically_confirmed_bank, Arc::new(RwLock::new(LargestAccountsCache::new(30))), Arc::new(MaxSlots::default()), Arc::new(LeaderScheduleCache::default()), @@ -8327,9 +8340,9 @@ pub mod tests { None, bank_forks.clone(), block_commitment_cache, - blockstore, + blockstore.clone(), validator_exit, - RpcHealth::stub(), + RpcHealth::stub(optimistically_confirmed_bank.clone(), blockstore.clone()), cluster_info, Hash::default(), None, diff --git a/rpc/src/rpc_health.rs b/rpc/src/rpc_health.rs index 022b2e03d1eae2..8a6347cc7a6bd0 100644 --- a/rpc/src/rpc_health.rs +++ b/rpc/src/rpc_health.rs @@ -1,12 +1,10 @@ use { - solana_gossip::cluster_info::ClusterInfo, - solana_sdk::{clock::Slot, pubkey::Pubkey}, - std::{ - collections::HashSet, - sync::{ - atomic::{AtomicBool, Ordering}, - Arc, - }, + crate::optimistically_confirmed_bank_tracker::OptimisticallyConfirmedBank, + solana_ledger::blockstore::Blockstore, + solana_sdk::clock::Slot, + std::sync::{ + atomic::{AtomicBool, Ordering}, + Arc, RwLock, }, }; @@ -18,8 +16,8 @@ pub enum RpcHealthStatus { } pub struct RpcHealth { - cluster_info: Arc, - known_validators: Option>, + optimistically_confirmed_bank: Arc>, + blockstore: Arc, health_check_slot_distance: u64, override_health_check: Arc, startup_verification_complete: Arc, @@ -29,15 +27,15 @@ pub struct RpcHealth { impl RpcHealth { pub fn new( - cluster_info: Arc, - known_validators: Option>, + optimistically_confirmed_bank: Arc>, + blockstore: Arc, health_check_slot_distance: u64, override_health_check: Arc, startup_verification_complete: Arc, ) -> Self { Self { - cluster_info, - known_validators, + optimistically_confirmed_bank, + blockstore, health_check_slot_distance, override_health_check, startup_verification_complete, @@ -54,84 +52,74 @@ impl RpcHealth { } } + if self.override_health_check.load(Ordering::Relaxed) { + return RpcHealthStatus::Ok; + } if !self.startup_verification_complete.load(Ordering::Acquire) { return RpcHealthStatus::Unknown; } - if self.override_health_check.load(Ordering::Relaxed) { - RpcHealthStatus::Ok - } else if let Some(known_validators) = &self.known_validators { - match ( - self.cluster_info - .get_accounts_hash_for_node(&self.cluster_info.id(), |hashes| { - hashes - .iter() - .max_by(|a, b| a.0.cmp(&b.0)) - .map(|slot_hash| slot_hash.0) - }) - .flatten(), - known_validators - .iter() - .filter_map(|known_validator| { - self.cluster_info - .get_accounts_hash_for_node(known_validator, |hashes| { - hashes - .iter() - .max_by(|a, b| a.0.cmp(&b.0)) - .map(|slot_hash| slot_hash.0) - }) - .flatten() - }) - .max(), - ) { - ( - Some(latest_account_hash_slot), - Some(latest_known_validator_account_hash_slot), - ) => { - // The validator is considered healthy if its latest account hash slot is within - // `health_check_slot_distance` of the latest known validator's account hash slot - if latest_account_hash_slot - > latest_known_validator_account_hash_slot - .saturating_sub(self.health_check_slot_distance) - { - RpcHealthStatus::Ok - } else { - let num_slots = latest_known_validator_account_hash_slot - .saturating_sub(latest_account_hash_slot); - warn!( - "health check: behind by {} slots: me={}, latest known_validator={}", - num_slots, - latest_account_hash_slot, - latest_known_validator_account_hash_slot - ); - RpcHealthStatus::Behind { num_slots } - } - } - (latest_account_hash_slot, latest_known_validator_account_hash_slot) => { - if latest_account_hash_slot.is_none() { - warn!("health check: latest_account_hash_slot not available"); - } - if latest_known_validator_account_hash_slot.is_none() { - warn!( - "health check: latest_known_validator_account_hash_slot not available" - ); - } - RpcHealthStatus::Unknown - } + // A node can observe votes by both replaying blocks and observing gossip. + // + // ClusterInfoVoteListener receives votes from both of these sources and then records + // optimistically confirmed slots in the Blockstore via OptimisticConfirmationVerifier. + // Thus, it is possible for a node to record an optimistically confirmed slot before the + // node has replayed and validated the slot for itself. + // + // OptimisticallyConfirmedBank holds a bank for the latest optimistically confirmed slot + // that the node has replayed. It is true that the node will have replayed that slot by + // virtue of having a bank available. Observing that the cluster has optimistically + // confirmed a slot through gossip is not enough to reconstruct the bank. + // + // So, comparing the latest optimistic slot from the Blockstore vs. the slot from the + // OptimisticallyConfirmedBank bank allows a node to see where it stands in relation to the + // tip of the cluster. + let my_latest_optimistically_confirmed_slot = self + .optimistically_confirmed_bank + .read() + .unwrap() + .bank + .slot(); + + let mut optimistic_slot_infos = match self.blockstore.get_latest_optimistic_slots(1) { + Ok(infos) => infos, + Err(err) => { + warn!("health check: blockstore error: {err}"); + return RpcHealthStatus::Unknown; } - } else { - // No known validator point of reference available, so this validator is healthy - // because it's running + }; + let Some((cluster_latest_optimistically_confirmed_slot, _, _)) = + optimistic_slot_infos.pop() + else { + warn!("health check: blockstore does not contain any optimistically confirmed slots"); + return RpcHealthStatus::Unknown; + }; + + if my_latest_optimistically_confirmed_slot + >= cluster_latest_optimistically_confirmed_slot + .saturating_sub(self.health_check_slot_distance) + { RpcHealthStatus::Ok + } else { + let num_slots = cluster_latest_optimistically_confirmed_slot + .saturating_sub(my_latest_optimistically_confirmed_slot); + warn!( + "health check: behind by {num_slots} \ + slots: me={my_latest_optimistically_confirmed_slot}, \ + latest cluster={cluster_latest_optimistically_confirmed_slot}", + ); + RpcHealthStatus::Behind { num_slots } } } #[cfg(test)] - pub(crate) fn stub() -> Arc { - use crate::rpc::tests::new_test_cluster_info; + pub(crate) fn stub( + optimistically_confirmed_bank: Arc>, + blockstore: Arc, + ) -> Arc { Arc::new(Self::new( - Arc::new(new_test_cluster_info()), - None, + optimistically_confirmed_bank, + blockstore, 42, Arc::new(AtomicBool::new(false)), Arc::new(AtomicBool::new(true)), @@ -143,3 +131,84 @@ impl RpcHealth { *self.stub_health_status.write().unwrap() = stub_health_status; } } + +#[cfg(test)] +pub mod tests { + use { + super::*, + solana_ledger::{ + genesis_utils::{create_genesis_config, GenesisConfigInfo}, + get_tmp_ledger_path_auto_delete, + }, + solana_runtime::{bank::Bank, bank_forks::BankForks}, + solana_sdk::{clock::UnixTimestamp, hash::Hash, pubkey::Pubkey}, + }; + + #[test] + fn test_get_health() { + let ledger_path = get_tmp_ledger_path_auto_delete!(); + let blockstore = Arc::new(Blockstore::open(ledger_path.path()).unwrap()); + let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(100); + let bank = Bank::new_for_tests(&genesis_config); + let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let optimistically_confirmed_bank = + OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); + let bank0 = bank_forks.read().unwrap().root_bank(); + assert!(bank0.slot() == 0); + + let health_check_slot_distance = 10; + let override_health_check = Arc::new(AtomicBool::new(true)); + let startup_verification_complete = Arc::clone(bank0.get_startup_verification_complete()); + let health = RpcHealth::new( + optimistically_confirmed_bank.clone(), + blockstore.clone(), + health_check_slot_distance, + override_health_check.clone(), + startup_verification_complete, + ); + + // Override health check set to true - status is ok + assert_eq!(health.check(), RpcHealthStatus::Ok); + + // Remove the override - status now unknown with incomplete startup verification + override_health_check.store(false, Ordering::Relaxed); + assert_eq!(health.check(), RpcHealthStatus::Unknown); + + // Mark startup verification complete - status still unknown as no slots have been + // optimistically confirmed yet + bank0.set_startup_verification_complete(); + assert_eq!(health.check(), RpcHealthStatus::Unknown); + + // Mark slot 15 as being optimistically confirmed in the Blockstore, this could + // happen if the cluster confirmed the slot and this node became aware through gossip, + // but this node has not yet replayed slot 15. The local view of the latest optimistic + // slot is still slot 0 so status will be behind + blockstore + .insert_optimistic_slot(15, &Hash::default(), UnixTimestamp::default()) + .unwrap(); + assert_eq!(health.check(), RpcHealthStatus::Behind { num_slots: 15 }); + + // Simulate this node observing slot 4 as optimistically confirmed - status still behind + let bank4 = Arc::new(Bank::new_from_parent(bank0, &Pubkey::default(), 4)); + optimistically_confirmed_bank.write().unwrap().bank = bank4.clone(); + assert_eq!(health.check(), RpcHealthStatus::Behind { num_slots: 11 }); + + // Simulate this node observing slot 5 as optimistically confirmed - status now ok + // as distance is <= health_check_slot_distance + let bank5 = Arc::new(Bank::new_from_parent(bank4, &Pubkey::default(), 5)); + optimistically_confirmed_bank.write().unwrap().bank = bank5.clone(); + assert_eq!(health.check(), RpcHealthStatus::Ok); + + // Node now up with tip of cluster + let bank15 = Arc::new(Bank::new_from_parent(bank5, &Pubkey::default(), 15)); + optimistically_confirmed_bank.write().unwrap().bank = bank15.clone(); + assert_eq!(health.check(), RpcHealthStatus::Ok); + + // Node "beyond" tip of cluster - this technically isn't possible but could be + // observed locally due to a race between updates to Blockstore and + // OptimisticallyConfirmedBank. Either way, not a problem and status is ok. + let bank16 = Arc::new(Bank::new_from_parent(bank15, &Pubkey::default(), 16)); + optimistically_confirmed_bank.write().unwrap().bank = bank16.clone(); + assert_eq!(health.check(), RpcHealthStatus::Ok); + } +} diff --git a/rpc/src/rpc_service.rs b/rpc/src/rpc_service.rs index 4fdde57c31a9fe..2011578b70d3d8 100644 --- a/rpc/src/rpc_service.rs +++ b/rpc/src/rpc_service.rs @@ -37,12 +37,11 @@ use { }, solana_sdk::{ exit::Exit, genesis_config::DEFAULT_GENESIS_DOWNLOAD_PATH, hash::Hash, - native_token::lamports_to_sol, pubkey::Pubkey, + native_token::lamports_to_sol, }, solana_send_transaction_service::send_transaction_service::{self, SendTransactionService}, solana_storage_bigtable::CredentialType, std::{ - collections::HashSet, net::SocketAddr, path::{Path, PathBuf}, sync::{ @@ -350,7 +349,6 @@ impl JsonRpcService { ledger_path: &Path, validator_exit: Arc>, exit: Arc, - known_validators: Option>, override_health_check: Arc, startup_verification_complete: Arc, optimistically_confirmed_bank: Arc>, @@ -368,8 +366,8 @@ impl JsonRpcService { let rpc_niceness_adj = config.rpc_niceness_adj; let health = Arc::new(RpcHealth::new( - cluster_info.clone(), - known_validators, + Arc::clone(&optimistically_confirmed_bank), + Arc::clone(&blockstore), config.health_check_slot_distance, override_health_check, startup_verification_complete, @@ -586,10 +584,6 @@ mod tests { use { super::*, crate::rpc::{create_validator_exit, tests::new_test_cluster_info}, - solana_gossip::{ - crds::GossipRoute, - crds_value::{AccountsHashes, CrdsData, CrdsValue}, - }, solana_ledger::{ genesis_utils::{create_genesis_config, GenesisConfigInfo}, get_tmp_ledger_path, @@ -643,7 +637,6 @@ mod tests { &PathBuf::from("farf"), validator_exit, exit, - None, Arc::new(AtomicBool::new(false)), Arc::new(AtomicBool::new(true)), optimistically_confirmed_bank, @@ -726,18 +719,25 @@ mod tests { #[test] fn test_is_file_get_path() { + let ledger_path = get_tmp_ledger_path!(); + let blockstore = Arc::new(Blockstore::open(&ledger_path).unwrap()); + let bank_forks = create_bank_forks(); + let optimistically_confirmed_bank = + OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); + let health = RpcHealth::stub(optimistically_confirmed_bank, blockstore); + let bank_forks = create_bank_forks(); let rrm = RpcRequestMiddleware::new( - PathBuf::from("/"), + ledger_path.clone(), None, bank_forks.clone(), - RpcHealth::stub(), + health.clone(), ); let rrm_with_snapshot_config = RpcRequestMiddleware::new( - PathBuf::from("/"), + ledger_path.clone(), Some(SnapshotConfig::default()), bank_forks, - RpcHealth::stub(), + health, ); assert!(rrm.is_file_get_path(DEFAULT_GENESIS_DOWNLOAD_PATH)); @@ -828,14 +828,17 @@ mod tests { let runtime = Runtime::new().unwrap(); let ledger_path = get_tmp_ledger_path!(); - std::fs::create_dir(&ledger_path).unwrap(); - + let blockstore = Arc::new(Blockstore::open(&ledger_path).unwrap()); let genesis_path = ledger_path.join(DEFAULT_GENESIS_ARCHIVE); + let bank_forks = create_bank_forks(); + let optimistically_confirmed_bank = + OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); + let rrm = RpcRequestMiddleware::new( ledger_path.clone(), None, - create_bank_forks(), - RpcHealth::stub(), + bank_forks, + RpcHealth::stub(optimistically_confirmed_bank, blockstore), ); // File does not exist => request should fail. @@ -883,106 +886,4 @@ mod tests { } } } - - #[test] - fn test_health_check_with_no_known_validators() { - let rm = RpcRequestMiddleware::new( - PathBuf::from("/"), - None, - create_bank_forks(), - RpcHealth::stub(), - ); - assert_eq!(rm.health_check(), "ok"); - } - - #[test] - fn test_health_check_with_known_validators() { - let cluster_info = Arc::new(new_test_cluster_info()); - let health_check_slot_distance = 123; - let override_health_check = Arc::new(AtomicBool::new(false)); - let startup_verification_complete = Arc::new(AtomicBool::new(true)); - let known_validators = vec![ - solana_sdk::pubkey::new_rand(), - solana_sdk::pubkey::new_rand(), - solana_sdk::pubkey::new_rand(), - ]; - - let health = Arc::new(RpcHealth::new( - cluster_info.clone(), - Some(known_validators.clone().into_iter().collect()), - health_check_slot_distance, - override_health_check.clone(), - startup_verification_complete, - )); - - let rm = RpcRequestMiddleware::new(PathBuf::from("/"), None, create_bank_forks(), health); - - // No account hashes for this node or any known validators - assert_eq!(rm.health_check(), "unknown"); - - // No account hashes for any known validators - cluster_info.push_accounts_hashes(vec![(1000, Hash::default()), (900, Hash::default())]); - cluster_info.flush_push_queue(); - assert_eq!(rm.health_check(), "unknown"); - - // Override health check - override_health_check.store(true, Ordering::Relaxed); - assert_eq!(rm.health_check(), "ok"); - override_health_check.store(false, Ordering::Relaxed); - - // This node is ahead of the known validators - cluster_info - .gossip - .crds - .write() - .unwrap() - .insert( - CrdsValue::new_unsigned(CrdsData::AccountsHashes(AccountsHashes::new( - known_validators[0], - vec![ - (1, Hash::default()), - (1001, Hash::default()), - (2, Hash::default()), - ], - ))), - 1, - GossipRoute::LocalMessage, - ) - .unwrap(); - assert_eq!(rm.health_check(), "ok"); - - // Node is slightly behind the known validators - cluster_info - .gossip - .crds - .write() - .unwrap() - .insert( - CrdsValue::new_unsigned(CrdsData::AccountsHashes(AccountsHashes::new( - known_validators[1], - vec![(1000 + health_check_slot_distance - 1, Hash::default())], - ))), - 1, - GossipRoute::LocalMessage, - ) - .unwrap(); - assert_eq!(rm.health_check(), "ok"); - - // Node is far behind the known validators - cluster_info - .gossip - .crds - .write() - .unwrap() - .insert( - CrdsValue::new_unsigned(CrdsData::AccountsHashes(AccountsHashes::new( - known_validators[2], - vec![(1000 + health_check_slot_distance, Hash::default())], - ))), - 1, - GossipRoute::LocalMessage, - ) - .unwrap(); - assert_eq!(rm.health_check(), "behind"); - } } diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 4acad7dc524663..6a064841695b34 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -258,11 +258,9 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .value_name("SLOT_DISTANCE") .takes_value(true) .default_value(&default_args.health_check_slot_distance) - .help("If --known-validators are specified, report this validator healthy \ - if its latest account hash is no further behind than this number of \ - slots from the latest known validator account hash. \ - If no --known-validators are specified, the validator will always \ - report itself to be healthy") + .help("Report this validator healthy if its latest optimistically confirmed slot \ + that has been replayed is no further behind than this number of slots from \ + the cluster latest optimistically confirmed slot") ) .arg( Arg::with_name("rpc_faucet_addr") diff --git a/validator/src/main.rs b/validator/src/main.rs index abfe6e2009bc45..38bb9813ab3a70 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -1299,6 +1299,7 @@ pub fn main() { "health_check_slot_distance", u64 ), + disable_health_check: false, rpc_threads: value_t_or_exit!(matches, "rpc_threads", usize), rpc_niceness_adj: value_t_or_exit!(matches, "rpc_niceness_adj", i8), account_indexes: account_indexes.clone(), From dfa5829b4fd15bf394f96d29b535b480edfa1fea Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Mon, 16 Oct 2023 14:37:13 -0500 Subject: [PATCH 027/213] Prepare changelog for v1.17.2 (#33638) * Update v1.17 changelog to current version * Remove edge / beta / stable links. Leaving them is potentially confusing. Maintaining them is error prone and of limited benefit * Update v1.17.1 notes * Prepare CHANGELOG.md for v1.17.2 release --- CHANGELOG.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df54c187651d98..1cba94c0dcc823 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,15 +4,19 @@ All notable changes to this project will be documented in this file. Please follow the [guidance](#adding-to-this-changelog) at the bottom of this file when making changes The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) -and follows a [Backwards Compatability Policy](https://docs.solana.com/developing/backwards-compatibility) +and follows a [Backwards Compatibility Policy](https://docs.solana.com/developing/backwards-compatibility) -Release channels have their own copy of this changelog: -* [edge - v1.17](#edge-channel) -* [beta - v1.16](https://github.com/solana-labs/solana/blob/v1.16/CHANGELOG.md) -* [stable - v1.14](https://github.com/solana-labs/solana/blob/v1.14/CHANGELOG.md) +## [1.17.3] - Unreleased +* Changes +* Upgrade Notes + +## [1.17.2] +* minor bug fixes and improvements + +## [1.17.1] +* minor bug fixes and improvements - -## [1.17.0] - Unreleased +## [1.17.0] * Changes * Added a changelog. * Upgrade Notes From 944375b95375ee1065c0c71de314b6ba7eee9932 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Mon, 16 Oct 2023 16:08:19 -0500 Subject: [PATCH 028/213] Update version to v1.17.3 (#33721) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2ac760f8f1d2cc..cf2539729c0dbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2134,7 +2134,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "regex", @@ -2142,7 +2142,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.2" +version = "1.17.3" dependencies = [ "regex", ] @@ -4061,7 +4061,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.2" +version = "1.17.3" dependencies = [ "protobuf-src", "tonic-build", @@ -4306,7 +4306,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.2" +version = "1.17.3" [[package]] name = "rcgen" @@ -5095,7 +5095,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.2" +version = "1.17.3" dependencies = [ "Inflector", "assert_matches", @@ -5119,7 +5119,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 2.33.3", "log", @@ -5133,7 +5133,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 2.33.3", "log", @@ -5163,7 +5163,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.2" +version = "1.17.3" dependencies = [ "arrayref", "assert_matches", @@ -5227,7 +5227,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "bytemuck", @@ -5246,7 +5246,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -5257,7 +5257,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5281,7 +5281,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5298,7 +5298,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.2" +version = "1.17.3" dependencies = [ "serde", "solana-sdk", @@ -5307,7 +5307,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "crossbeam-channel", @@ -5325,7 +5325,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5377,7 +5377,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bv", "fnv", @@ -5394,7 +5394,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -5414,7 +5414,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -5425,7 +5425,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bv", "bytemuck", @@ -5444,7 +5444,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "solana-logger", @@ -5452,7 +5452,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_cmd", "bzip2", @@ -5473,11 +5473,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.2" +version = "1.17.3" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.2" +version = "1.17.3" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "chrono", @@ -5505,7 +5505,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "chrono", @@ -5523,7 +5523,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -5576,7 +5576,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.2" +version = "1.17.3" dependencies = [ "anyhow", "dirs-next", @@ -5591,7 +5591,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.2" +version = "1.17.3" dependencies = [ "Inflector", "base64 0.21.4", @@ -5617,7 +5617,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-trait", "bincode", @@ -5649,7 +5649,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.2" +version = "1.17.3" dependencies = [ "futures-util", "rand 0.8.5", @@ -5679,7 +5679,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5687,7 +5687,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "chrono", @@ -5700,7 +5700,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-trait", "bincode", @@ -5724,7 +5724,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.2" +version = "1.17.3" dependencies = [ "lazy_static", "log", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "clap 3.2.23", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "console", "indicatif", @@ -5874,7 +5874,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5885,7 +5885,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "byteorder", @@ -5929,7 +5929,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.2" +version = "1.17.3" dependencies = [ "ahash 0.8.3", "blake3", @@ -5958,7 +5958,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.2" +version = "1.17.3" dependencies = [ "proc-macro2", "quote", @@ -5968,7 +5968,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.2" +version = "1.17.3" dependencies = [ "base64 0.21.4", "bincode", @@ -5993,7 +5993,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "solana-accounts-db", @@ -6004,7 +6004,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "solana-sdk", @@ -6014,7 +6014,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bs58", "crossbeam-channel", @@ -6039,7 +6039,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.2" +version = "1.17.3" dependencies = [ "atty", "bincode", @@ -6125,7 +6125,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bs58", "clap 3.2.23", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -6210,7 +6210,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_cmd", "bs58", @@ -6259,7 +6259,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "log", @@ -6271,7 +6271,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6310,7 +6310,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.2" +version = "1.17.3" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6322,7 +6322,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.2" +version = "1.17.3" dependencies = [ "env_logger", "lazy_static", @@ -6331,7 +6331,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "solana-sdk", @@ -6339,11 +6339,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.2" +version = "1.17.3" [[package]] name = "solana-merkle-root-bench" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 2.33.3", "log", @@ -6356,7 +6356,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.2" +version = "1.17.3" dependencies = [ "fast-math", "hex", @@ -6365,7 +6365,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.2" +version = "1.17.3" dependencies = [ "crossbeam-channel", "env_logger", @@ -6381,7 +6381,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6392,7 +6392,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "clap 3.2.23", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "reqwest", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.2" +version = "1.17.3" dependencies = [ "ahash 0.8.3", "assert_matches", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 3.2.23", "log", @@ -6486,7 +6486,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "anyhow", "ark-bn254", @@ -6543,7 +6543,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6572,7 +6572,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "async-trait", @@ -6600,7 +6600,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "anyhow", "crossbeam-channel", @@ -6624,7 +6624,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-mutex", "async-trait", @@ -6652,7 +6652,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.2" +version = "1.17.3" dependencies = [ "lazy_static", "num_cpus", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "console", @@ -6679,7 +6679,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.2" +version = "1.17.3" dependencies = [ "base64 0.21.4", "bincode", @@ -6738,7 +6738,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "async-trait", @@ -6767,7 +6767,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.2" +version = "1.17.3" dependencies = [ "base64 0.21.4", "bs58", @@ -6787,7 +6787,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "anyhow", "clap 2.33.3", @@ -6804,7 +6804,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "bs58", @@ -6831,7 +6831,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.2" +version = "1.17.3" dependencies = [ "arrayref", "assert_matches", @@ -6914,7 +6914,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.2" +version = "1.17.3" dependencies = [ "anyhow", "assert_matches", @@ -6972,7 +6972,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bs58", "proc-macro2", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.2" +version = "1.17.3" dependencies = [ "crossbeam-channel", "log", @@ -6998,7 +6998,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7014,7 +7014,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.2" +version = "1.17.3" dependencies = [ "backoff", "bincode", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "bs58", @@ -7079,7 +7079,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 2.33.3", "log", @@ -7091,7 +7091,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "async-channel", @@ -7123,7 +7123,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -7137,7 +7137,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.2" +version = "1.17.3" dependencies = [ "base64 0.21.4", "bincode", @@ -7167,7 +7167,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "log", @@ -7181,7 +7181,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -7214,7 +7214,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-trait", "bincode", @@ -7236,7 +7236,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "clap 2.33.3", @@ -7263,7 +7263,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.2" +version = "1.17.3" dependencies = [ "Inflector", "base64 0.21.4", @@ -7286,7 +7286,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -7323,7 +7323,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-trait", "solana-connection-cache", @@ -7336,7 +7336,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.2" +version = "1.17.3" dependencies = [ "serde_json", "solana-metrics", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.2" +version = "1.17.3" dependencies = [ "chrono", "clap 2.33.3", @@ -7408,7 +7408,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "rustc_version 0.4.0", @@ -7422,7 +7422,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "crossbeam-channel", @@ -7441,7 +7441,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -7464,7 +7464,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 2.33.3", "humantime", @@ -7483,7 +7483,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bs58", "clap 3.2.23", @@ -7502,7 +7502,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bytemuck", "criterion", @@ -7516,7 +7516,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7528,7 +7528,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.2" +version = "1.17.3" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index e3e12fdffa1daa..845519fe0ebf58 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.2" +version = "1.17.3" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.7.2" -solana-account-decoder = { path = "account-decoder", version = "=1.17.2" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.2" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.2" } -solana-banks-client = { path = "banks-client", version = "=1.17.2" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.2" } -solana-banks-server = { path = "banks-server", version = "=1.17.2" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.2" } -solana-bloom = { path = "bloom", version = "=1.17.2" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.2" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.2" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.2", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.2" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.2" } -solana-cli = { path = "cli", version = "=1.17.2" } -solana-cli-config = { path = "cli-config", version = "=1.17.2" } -solana-cli-output = { path = "cli-output", version = "=1.17.2" } -solana-client = { path = "client", version = "=1.17.2" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.2" } -solana-config-program = { path = "programs/config", version = "=1.17.2" } -solana-core = { path = "core", version = "=1.17.2" } -solana-cost-model = { path = "cost-model", version = "=1.17.2" } -solana-download-utils = { path = "download-utils", version = "=1.17.2" } -solana-entry = { path = "entry", version = "=1.17.2" } -solana-faucet = { path = "faucet", version = "=1.17.2" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.2" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.2" } -solana-genesis = { path = "genesis", version = "=1.17.2" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.2" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.2" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.2" } -solana-gossip = { path = "gossip", version = "=1.17.2" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.2" } -solana-ledger = { path = "ledger", version = "=1.17.2" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.2" } -solana-logger = { path = "logger", version = "=1.17.2" } -solana-measure = { path = "measure", version = "=1.17.2" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.2" } -solana-metrics = { path = "metrics", version = "=1.17.2" } -solana-net-utils = { path = "net-utils", version = "=1.17.2" } -solana-notifier = { path = "notifier", version = "=1.17.2" } -solana-perf = { path = "perf", version = "=1.17.2" } -solana-poh = { path = "poh", version = "=1.17.2" } -solana-program = { path = "sdk/program", version = "=1.17.2" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.2" } -solana-program-test = { path = "program-test", version = "=1.17.2" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.2" } -solana-quic-client = { path = "quic-client", version = "=1.17.2" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.2" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.2", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.2" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.2", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.2" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.2" } -solana-runtime = { path = "runtime", version = "=1.17.2" } -solana-sdk = { path = "sdk", version = "=1.17.2" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.2" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.2" } -solana-stake-program = { path = "programs/stake", version = "=1.17.2" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.2" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.2" } -solana-streamer = { path = "streamer", version = "=1.17.2" } -solana-system-program = { path = "programs/system", version = "=1.17.2" } -solana-test-validator = { path = "test-validator", version = "=1.17.2" } -solana-thin-client = { path = "thin-client", version = "=1.17.2" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.2", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.2" } -solana-turbine = { path = "turbine", version = "=1.17.2" } -solana-udp-client = { path = "udp-client", version = "=1.17.2" } -solana-version = { path = "version", version = "=1.17.2" } -solana-vote = { path = "vote", version = "=1.17.2" } -solana-vote-program = { path = "programs/vote", version = "=1.17.2" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.2" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.2" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.2" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.3" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.3" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.3" } +solana-banks-client = { path = "banks-client", version = "=1.17.3" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.3" } +solana-banks-server = { path = "banks-server", version = "=1.17.3" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.3" } +solana-bloom = { path = "bloom", version = "=1.17.3" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.3" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.3" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.3", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.3" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.3" } +solana-cli = { path = "cli", version = "=1.17.3" } +solana-cli-config = { path = "cli-config", version = "=1.17.3" } +solana-cli-output = { path = "cli-output", version = "=1.17.3" } +solana-client = { path = "client", version = "=1.17.3" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.3" } +solana-config-program = { path = "programs/config", version = "=1.17.3" } +solana-core = { path = "core", version = "=1.17.3" } +solana-cost-model = { path = "cost-model", version = "=1.17.3" } +solana-download-utils = { path = "download-utils", version = "=1.17.3" } +solana-entry = { path = "entry", version = "=1.17.3" } +solana-faucet = { path = "faucet", version = "=1.17.3" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.3" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.3" } +solana-genesis = { path = "genesis", version = "=1.17.3" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.3" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.3" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.3" } +solana-gossip = { path = "gossip", version = "=1.17.3" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.3" } +solana-ledger = { path = "ledger", version = "=1.17.3" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.3" } +solana-logger = { path = "logger", version = "=1.17.3" } +solana-measure = { path = "measure", version = "=1.17.3" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.3" } +solana-metrics = { path = "metrics", version = "=1.17.3" } +solana-net-utils = { path = "net-utils", version = "=1.17.3" } +solana-notifier = { path = "notifier", version = "=1.17.3" } +solana-perf = { path = "perf", version = "=1.17.3" } +solana-poh = { path = "poh", version = "=1.17.3" } +solana-program = { path = "sdk/program", version = "=1.17.3" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.3" } +solana-program-test = { path = "program-test", version = "=1.17.3" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.3" } +solana-quic-client = { path = "quic-client", version = "=1.17.3" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.3" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.3", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.3" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.3", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.3" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.3" } +solana-runtime = { path = "runtime", version = "=1.17.3" } +solana-sdk = { path = "sdk", version = "=1.17.3" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.3" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.3" } +solana-stake-program = { path = "programs/stake", version = "=1.17.3" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.3" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.3" } +solana-streamer = { path = "streamer", version = "=1.17.3" } +solana-system-program = { path = "programs/system", version = "=1.17.3" } +solana-test-validator = { path = "test-validator", version = "=1.17.3" } +solana-thin-client = { path = "thin-client", version = "=1.17.3" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.3", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.3" } +solana-turbine = { path = "turbine", version = "=1.17.3" } +solana-udp-client = { path = "udp-client", version = "=1.17.3" } +solana-version = { path = "version", version = "=1.17.3" } +solana-vote = { path = "vote", version = "=1.17.3" } +solana-vote-program = { path = "programs/vote", version = "=1.17.3" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.3" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.3" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.3" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index cd3050a8680a42..30b6d92697e3b3 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.2" +version = "1.17.3" dependencies = [ "Inflector", "base64 0.21.4", @@ -4468,7 +4468,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.2" +version = "1.17.3" dependencies = [ "arrayref", "bincode", @@ -4525,7 +4525,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "bytemuck", @@ -4544,7 +4544,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4559,7 +4559,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.2" +version = "1.17.3" dependencies = [ "serde", "solana-sdk", @@ -4568,7 +4568,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "crossbeam-channel", @@ -4586,7 +4586,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bv", "fnv", @@ -4603,7 +4603,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.2" +version = "1.17.3" dependencies = [ "array-bytes", "serde", @@ -4630,7 +4630,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bv", "bytemuck", @@ -4646,7 +4646,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "chrono", "clap 2.33.3", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.2" +version = "1.17.3" dependencies = [ "dirs-next", "lazy_static", @@ -4675,7 +4675,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.2" +version = "1.17.3" dependencies = [ "Inflector", "base64 0.21.4", @@ -4700,7 +4700,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-trait", "bincode", @@ -4731,7 +4731,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4739,7 +4739,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "chrono", @@ -4751,7 +4751,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-trait", "bincode", @@ -4771,7 +4771,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.2" +version = "1.17.3" dependencies = [ "base64 0.21.4", "bincode", @@ -4843,7 +4843,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.2" +version = "1.17.3" dependencies = [ "lazy_static", "log", @@ -4865,7 +4865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "console", "indicatif", @@ -4877,7 +4877,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "crossbeam-channel", @@ -4897,7 +4897,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.2" +version = "1.17.3" dependencies = [ "ahash 0.8.3", "blake3", @@ -4947,7 +4947,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.2" +version = "1.17.3" dependencies = [ "proc-macro2", "quote", @@ -4957,7 +4957,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "solana-accounts-db", @@ -4968,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "solana-sdk", @@ -4978,7 +4978,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bs58", "crossbeam-channel", @@ -5003,7 +5003,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -5051,7 +5051,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "bincode", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "solana-measure", @@ -5126,7 +5126,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.2" +version = "1.17.3" dependencies = [ "env_logger", "lazy_static", @@ -5135,7 +5135,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "solana-sdk", @@ -5143,7 +5143,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.2" +version = "1.17.3" dependencies = [ "fast-math", "solana-program", @@ -5151,7 +5151,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.2" +version = "1.17.3" dependencies = [ "crossbeam-channel", "gethostname", @@ -5164,7 +5164,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "clap 3.1.6", @@ -5184,7 +5184,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.2" +version = "1.17.3" dependencies = [ "ahash 0.8.3", "bincode", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.2" +version = "1.17.3" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5224,7 +5224,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "ark-bn254", "ark-ec", @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.2" +version = "1.17.3" dependencies = [ "base64 0.21.4", "bincode", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "async-trait", @@ -5329,7 +5329,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "crossbeam-channel", "futures-util", @@ -5352,7 +5352,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-mutex", "async-trait", @@ -5377,7 +5377,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.2" +version = "1.17.3" dependencies = [ "lazy_static", "num_cpus", @@ -5385,7 +5385,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.2" +version = "1.17.3" dependencies = [ "console", "dialoguer", @@ -5402,7 +5402,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.2" +version = "1.17.3" dependencies = [ "base64 0.21.4", "bincode", @@ -5457,7 +5457,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-trait", "base64 0.21.4", @@ -5481,7 +5481,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.2" +version = "1.17.3" dependencies = [ "base64 0.21.4", "bs58", @@ -5501,7 +5501,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.2" +version = "1.17.3" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5512,7 +5512,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.2" +version = "1.17.3" dependencies = [ "arrayref", "base64 0.21.4", @@ -5587,7 +5587,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5616,7 +5616,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5624,21 +5624,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.2" +version = "1.17.3" dependencies = [ "array-bytes", "solana-program", @@ -5646,7 +5646,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.2" +version = "1.17.3" dependencies = [ "array-bytes", "solana-program", @@ -5654,21 +5654,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5676,14 +5676,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.2" +version = "1.17.3" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5691,21 +5691,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.2" +version = "1.17.3" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5715,42 +5715,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.2" +version = "1.17.3" dependencies = [ "rustversion", "solana-program", @@ -5760,49 +5760,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5810,14 +5810,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-program-runtime", @@ -5827,7 +5827,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5835,21 +5835,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5857,14 +5857,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.2" +version = "1.17.3" dependencies = [ "array-bytes", "solana-program", @@ -5872,7 +5872,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.2" +version = "1.17.3" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5881,14 +5881,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-program-runtime", @@ -5906,21 +5906,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-program-runtime", @@ -5930,7 +5930,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.2" +version = "1.17.3" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5938,7 +5938,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.2" +version = "1.17.3" dependencies = [ "blake3", "solana-program", @@ -5946,21 +5946,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-logger", "solana-program", @@ -5971,21 +5971,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", "solana-program-runtime", @@ -5995,21 +5995,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.2" +version = "1.17.3" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.2" +version = "1.17.3" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6061,7 +6061,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bs58", "proc-macro2", @@ -6072,7 +6072,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.2" +version = "1.17.3" dependencies = [ "crossbeam-channel", "log", @@ -6086,7 +6086,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.2" +version = "1.17.3" dependencies = [ "backoff", "bincode", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "bs58", @@ -6146,7 +6146,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-channel", "bytes", @@ -6176,7 +6176,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "log", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.2" +version = "1.17.3" dependencies = [ "base64 0.21.4", "bincode", @@ -6218,7 +6218,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "log", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-trait", "bincode", @@ -6253,7 +6253,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.2" +version = "1.17.3" dependencies = [ "Inflector", "base64 0.21.4", @@ -6276,7 +6276,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "bytes", @@ -6311,7 +6311,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.2" +version = "1.17.3" dependencies = [ "async-trait", "solana-connection-cache", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.2" +version = "1.17.3" dependencies = [ "chrono", "clap 2.33.3", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.2" +version = "1.17.3" dependencies = [ "log", "rustc_version", @@ -6400,7 +6400,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.2" +version = "1.17.3" dependencies = [ "crossbeam-channel", "itertools", @@ -6417,7 +6417,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bincode", "log", @@ -6437,7 +6437,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.2" +version = "1.17.3" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6449,7 +6449,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.2" +version = "1.17.3" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index af1e6029580888..89bd68e8428ba9 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.2" +version = "1.17.3" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.7.2" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.2" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.2" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.2" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.2" } -solana-ledger = { path = "../../ledger", version = "=1.17.2" } -solana-logger = { path = "../../logger", version = "=1.17.2" } -solana-measure = { path = "../../measure", version = "=1.17.2" } -solana-program = { path = "../../sdk/program", version = "=1.17.2" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.2" } -solana-program-test = { path = "../../program-test", version = "=1.17.2" } -solana-runtime = { path = "../../runtime", version = "=1.17.2" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.2" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.2" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.2", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.2" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.2" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.2" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.2", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.2" } -solana-sdk = { path = "../../sdk", version = "=1.17.2" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.2" } -solana-validator = { path = "../../validator", version = "=1.17.2" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.2" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.3" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.3" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.3" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.3" } +solana-ledger = { path = "../../ledger", version = "=1.17.3" } +solana-logger = { path = "../../logger", version = "=1.17.3" } +solana-measure = { path = "../../measure", version = "=1.17.3" } +solana-program = { path = "../../sdk/program", version = "=1.17.3" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.3" } +solana-program-test = { path = "../../program-test", version = "=1.17.3" } +solana-runtime = { path = "../../runtime", version = "=1.17.3" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.3" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.3" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.3", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.3" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.3" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.3" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.3", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.3" } +solana-sdk = { path = "../../sdk", version = "=1.17.3" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.3" } +solana-validator = { path = "../../validator", version = "=1.17.3" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.3" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 401e5d311d2120..7c999bca2d7eb4 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.2" +version = "1.17.3" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.2" } +solana-program = { path = "../../../../program", version = "=1.17.3" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index ff413e406da644..1ca6d96a145035 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.2" +version = "1.17.3" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.2" } +solana-program = { path = "../../../../program", version = "=1.17.3" } [lib] crate-type = ["cdylib"] From 8af823401ac57a2fd41afee81f9e66967914fd79 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 13:48:04 +0900 Subject: [PATCH 029/213] v1.17: Enable frozen_abi on banking trace file (backport of #33501) (#33578) * Enable frozen_abi on banking trace file (#33501) * Enable frozen_abi on banking trace file * Fix ci with really correct bugfix... * Remove tracker_callers * Fix typo... * Fix AbiExample for Arc/Rc's Weaks * Added comment for AbiExample impl of SystemTime * Simplify and document EvenAsOpaque with new usage * Minor clean-ups * Simplify SystemTime::example() with UNIX_EPOCH... * Add comment for AbiExample subtleties (cherry picked from commit 95810d876a7cf8bdf9991ff5b887074c8d835de1) # Conflicts: # Cargo.lock * fix conflict --------- Co-authored-by: Ryo Onodera --- Cargo.lock | 4 ++ core/src/banking_trace.rs | 7 ++- core/src/sigverify.rs | 2 +- frozen-abi/Cargo.toml | 1 + frozen-abi/src/abi_digester.rs | 54 +++++++++++++--- frozen-abi/src/abi_example.rs | 109 +++++++++++++++++++++++++-------- perf/Cargo.toml | 5 ++ perf/build.rs | 26 ++++++++ perf/src/cuda_runtime.rs | 2 +- perf/src/lib.rs | 4 ++ perf/src/packet.rs | 2 +- perf/src/recycler.rs | 9 +++ programs/sbf/Cargo.lock | 3 + sdk/src/packet.rs | 19 +++++- 14 files changed, 205 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf2539729c0dbb..70e9032b8fae9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5932,6 +5932,7 @@ name = "solana-frozen-abi" version = "1.17.3" dependencies = [ "ahash 0.8.3", + "bitflags 2.3.3", "blake3", "block-buffer 0.10.4", "bs58", @@ -6439,7 +6440,10 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "rayon", + "rustc_version 0.4.0", "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", "solana-logger", "solana-metrics", "solana-rayon-threadlimit", diff --git a/core/src/banking_trace.rs b/core/src/banking_trace.rs index 760121dc7c557d..ba76b794ba2919 100644 --- a/core/src/banking_trace.rs +++ b/core/src/banking_trace.rs @@ -62,16 +62,17 @@ pub struct BankingTracer { active_tracer: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[frozen_abi(digest = "Eq6YrAFtTbtPrCEvh6Et1mZZDCARUg1gcK2qiZdqyjUz")] +#[derive(Serialize, Deserialize, Debug, AbiExample)] pub struct TimedTracedEvent(pub std::time::SystemTime, pub TracedEvent); -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, AbiExample, AbiEnumVisitor)] pub enum TracedEvent { PacketBatch(ChannelLabel, BankingPacketBatch), BlockAndBankHash(Slot, Hash, Hash), } -#[derive(Serialize, Deserialize, Debug, Clone, Copy)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, AbiExample, AbiEnumVisitor)] pub enum ChannelLabel { NonVote, TpuVote, diff --git a/core/src/sigverify.rs b/core/src/sigverify.rs index 8140efac7ec2aa..b496452078d883 100644 --- a/core/src/sigverify.rs +++ b/core/src/sigverify.rs @@ -16,7 +16,7 @@ use { solana_sdk::{packet::Packet, saturating_add_assign}, }; -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize, AbiExample)] pub struct SigverifyTracerPacketStats { pub total_removed_before_sigverify_stage: usize, pub total_tracer_packets_received_in_sigverify_stage: usize, diff --git a/frozen-abi/Cargo.toml b/frozen-abi/Cargo.toml index 3121b6968ebdf5..898b6d9b205a10 100644 --- a/frozen-abi/Cargo.toml +++ b/frozen-abi/Cargo.toml @@ -38,6 +38,7 @@ cc = { workspace = true, features = ["jobserver", "parallel"] } [target.'cfg(not(target_os = "solana"))'.dev-dependencies] solana-logger = { workspace = true } +bitflags = { workspace = true } [build-dependencies] rustc_version = { workspace = true } diff --git a/frozen-abi/src/abi_digester.rs b/frozen-abi/src/abi_digester.rs index 0d0886daae7438..b014efd2ba1570 100644 --- a/frozen-abi/src/abi_digester.rs +++ b/frozen-abi/src/abi_digester.rs @@ -17,7 +17,7 @@ pub struct AbiDigester { data_types: std::rc::Rc>>, depth: usize, for_enum: bool, - opaque_scope: Option, + opaque_type_matcher: Option, } pub type DigestResult = Result; @@ -70,7 +70,7 @@ impl AbiDigester { data_types: std::rc::Rc::new(std::cell::RefCell::new(vec![])), for_enum: false, depth: 0, - opaque_scope: None, + opaque_type_matcher: None, } } @@ -81,16 +81,16 @@ impl AbiDigester { data_types: self.data_types.clone(), depth: self.depth, for_enum: false, - opaque_scope: self.opaque_scope.clone(), + opaque_type_matcher: self.opaque_type_matcher.clone(), } } - pub fn create_new_opaque(&self, top_scope: &str) -> Self { + pub fn create_new_opaque(&self, type_matcher: &str) -> Self { Self { data_types: self.data_types.clone(), depth: self.depth, for_enum: false, - opaque_scope: Some(top_scope.to_owned()), + opaque_type_matcher: Some(type_matcher.to_owned()), } } @@ -103,7 +103,7 @@ impl AbiDigester { data_types: self.data_types.clone(), depth, for_enum: false, - opaque_scope: self.opaque_scope.clone(), + opaque_type_matcher: self.opaque_type_matcher.clone(), }) } @@ -116,15 +116,15 @@ impl AbiDigester { data_types: self.data_types.clone(), depth, for_enum: true, - opaque_scope: self.opaque_scope.clone(), + opaque_type_matcher: self.opaque_type_matcher.clone(), }) } pub fn digest_data(&mut self, value: &T) -> DigestResult { let type_name = normalize_type_name(type_name::()); if type_name.ends_with("__SerializeWith") - || (self.opaque_scope.is_some() - && type_name.starts_with(self.opaque_scope.as_ref().unwrap())) + || (self.opaque_type_matcher.is_some() + && type_name.contains(self.opaque_type_matcher.as_ref().unwrap())) { // we can't use the AbiEnumVisitor trait for these cases. value.serialize(self.create_new()) @@ -661,6 +661,34 @@ mod tests { #[frozen_abi(digest = "9PMdHRb49BpkywrmPoJyZWMsEmf5E1xgmsFGkGmea5RW")] type TestBitVec = bv::BitVec; + mod bitflags_abi { + use crate::abi_example::{AbiExample, EvenAsOpaque, IgnoreAsHelper}; + + bitflags::bitflags! { + #[frozen_abi(digest = "HhKNkaeAd7AohTb8S8sPKjAWwzxWY2DPz5FvkWmx5bSH")] + #[derive(Serialize, Deserialize)] + struct TestFlags: u8 { + const TestBit = 0b0000_0001; + } + } + + impl AbiExample for TestFlags { + fn example() -> Self { + Self::empty() + } + } + + impl IgnoreAsHelper for TestFlags {} + // This (EvenAsOpaque) marker trait is needed for bitflags-generated types because we can't + // impl AbiExample for its private type: + // thread '...TestFlags_frozen_abi...' panicked at ...: + // derive or implement AbiExample/AbiEnumVisitor for + // solana_frozen_abi::abi_digester::tests::_::InternalBitFlags + impl EvenAsOpaque for TestFlags { + const TYPE_NAME_MATCHER: &'static str = "::_::InternalBitFlags"; + } + } + mod skip_should_be_same { #[frozen_abi(digest = "4LbuvQLX78XPbm4hqqZcHFHpseDJcw4qZL9EUZXSi2Ss")] #[derive(Serialize, AbiExample)] @@ -691,4 +719,12 @@ mod tests { Variant2(u8, u16, #[serde(skip)] u32), } } + + #[frozen_abi(digest = "B1PcwZdUfGnxaRid9e6ZwkST3NZ2KUEYobA1DkxWrYLP")] + #[derive(Serialize, AbiExample)] + struct TestArcWeak(std::sync::Weak); + + #[frozen_abi(digest = "4R8uCLR1BVU1aFgkSaNyKcFD1FeM6rGdsjbJBFpnqx4v")] + #[derive(Serialize, AbiExample)] + struct TestRcWeak(std::rc::Weak); } diff --git a/frozen-abi/src/abi_example.rs b/frozen-abi/src/abi_example.rs index c7765c4a573544..ab68c6ff25e32a 100644 --- a/frozen-abi/src/abi_example.rs +++ b/frozen-abi/src/abi_example.rs @@ -6,6 +6,24 @@ use { std::any::type_name, }; +// The most important trait for the abi digesting. This trait is used to create any complexities of +// object graph to generate the abi digest. The frozen abi test harness calls T::example() to +// instantiate the tested root type and traverses its fields recursively, abusing the +// serde::serialize(). +// +// This trait applicability is similar to the Default trait. That means all referenced types must +// implement this trait. AbiExample is implemented for almost all common types in this file. +// +// When implementing AbiExample manually, you need to return a _minimally-populated_ value +// from it to actually generate a meaningful digest. This impl semantics is unlike Default, which +// usually returns something empty. See actual impls for inspiration. +// +// The requirement of AbiExample impls even applies to those types of `#[serde(skip)]`-ed fields. +// That's because the abi digesting needs a properly initialized object to enter into the +// serde::serialize() to begin with, even knowning they aren't used for serialization and thus abi +// digest. Luckily, `#[serde(skip)]`-ed fields' AbiExample impls can just delegate to T::default(), +// exploiting the nature of this artificial impl requirement as an exception from the usual +// AbiExample semantics. pub trait AbiExample: Sized { fn example() -> Self; } @@ -137,25 +155,12 @@ tuple_example_impls! { } } -// Source: https://github.com/rust-lang/rust/blob/ba18875557aabffe386a2534a1aa6118efb6ab88/src/libcore/array/mod.rs#L417 -macro_rules! array_example_impls { - {$n:expr, $t:ident $($ts:ident)*} => { - impl AbiExample for [T; $n] where T: AbiExample { - fn example() -> Self { - [$t::example(), $($ts::example()),*] - } - } - array_example_impls!{($n - 1), $($ts)*} - }; - {$n:expr,} => { - impl AbiExample for [T; $n] { - fn example() -> Self { [] } - } - }; +impl AbiExample for [T; N] { + fn example() -> Self { + std::array::from_fn(|_| T::example()) + } } -array_example_impls! {32, T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T} - // Source: https://github.com/rust-lang/rust/blob/ba18875557aabffe386a2534a1aa6118efb6ab88/src/libcore/default.rs#L137 macro_rules! example_impls { ($t:ty, $v:expr) => { @@ -232,7 +237,14 @@ impl AbiExample for BitVec { } impl IgnoreAsHelper for BitVec {} -impl EvenAsOpaque for BitVec {} +// This (EvenAsOpaque) marker trait is needed for BitVec because we can't impl AbiExample for its +// private type: +// thread '...TestBitVec_frozen_abi...' panicked at ...: +// derive or implement AbiExample/AbiEnumVisitor for +// bv::bit_vec::inner::Inner +impl EvenAsOpaque for BitVec { + const TYPE_NAME_MATCHER: &'static str = "bv::bit_vec::inner::"; +} pub(crate) fn normalize_type_name(type_name: &str) -> String { type_name.chars().filter(|c| *c != '&').collect() @@ -329,6 +341,23 @@ impl AbiExample for std::sync::Arc { } } +// When T is weakly owned by the likes of `std::{sync, rc}::Weak`s, we need to uphold the ownership +// of T in some way at least during abi digesting... However, there's no easy way. Stashing them +// into static is confronted with Send/Sync issue. Stashing them into thread_local is confronted +// with not enough (T + 'static) lifetime bound.. So, just leak the examples. This should be +// tolerated, considering ::example() should ever be called inside tests, not in production code... +fn leak_and_inhibit_drop<'a, T>(t: T) -> &'a mut T { + Box::leak(Box::new(t)) +} + +impl AbiExample for std::sync::Weak { + fn example() -> Self { + info!("AbiExample for (Arc's Weak): {}", type_name::()); + // leaking is needed otherwise Arc::upgrade() will always return None... + std::sync::Arc::downgrade(leak_and_inhibit_drop(std::sync::Arc::new(T::example()))) + } +} + impl AbiExample for std::rc::Rc { fn example() -> Self { info!("AbiExample for (Rc): {}", type_name::()); @@ -336,6 +365,14 @@ impl AbiExample for std::rc::Rc { } } +impl AbiExample for std::rc::Weak { + fn example() -> Self { + info!("AbiExample for (Rc's Weak): {}", type_name::()); + // leaking is needed otherwise Rc::upgrade() will always return None... + std::rc::Rc::downgrade(leak_and_inhibit_drop(std::rc::Rc::new(T::example()))) + } +} + impl AbiExample for std::sync::Mutex { fn example() -> Self { info!("AbiExample for (Mutex): {}", type_name::()); @@ -457,6 +494,13 @@ impl AbiExample for std::path::PathBuf { } } +#[cfg(not(target_os = "solana"))] +impl AbiExample for std::time::SystemTime { + fn example() -> Self { + std::time::SystemTime::UNIX_EPOCH + } +} + use std::net::{IpAddr, Ipv4Addr, SocketAddr}; impl AbiExample for SocketAddr { fn example() -> Self { @@ -470,13 +514,22 @@ impl AbiExample for IpAddr { } } -// This is a control flow indirection needed for digesting all variants of an enum +// This is a control flow indirection needed for digesting all variants of an enum. +// +// All of types (including non-enums) will be processed by this trait, albeit the +// name of this trait. +// User-defined enums usually just need to impl this with namesake derive macro (AbiEnumVisitor). +// +// Note that sometimes this indirection doesn't work for various reasons. For that end, there are +// hacks with marker traits (IgnoreAsHelper/EvenAsOpaque). pub trait AbiEnumVisitor: Serialize { fn visit_for_abi(&self, digester: &mut AbiDigester) -> DigestResult; } pub trait IgnoreAsHelper {} -pub trait EvenAsOpaque {} +pub trait EvenAsOpaque { + const TYPE_NAME_MATCHER: &'static str; +} impl AbiEnumVisitor for T { default fn visit_for_abi(&self, _digester: &mut AbiDigester) -> DigestResult { @@ -489,7 +542,9 @@ impl AbiEnumVisitor for T { impl AbiEnumVisitor for T { default fn visit_for_abi(&self, digester: &mut AbiDigester) -> DigestResult { - info!("AbiEnumVisitor for (default): {}", type_name::()); + info!("AbiEnumVisitor for T: {}", type_name::()); + // not calling self.serialize(...) is intentional here as the most generic impl + // consider IgnoreAsHelper and EvenAsOpaque if you're stuck on this.... T::example() .serialize(digester.create_new()) .map_err(DigestError::wrap_by_type::) @@ -501,7 +556,7 @@ impl AbiEnumVisitor for T { // relevant test: TestVecEnum impl AbiEnumVisitor for &T { default fn visit_for_abi(&self, digester: &mut AbiDigester) -> DigestResult { - info!("AbiEnumVisitor for (&default): {}", type_name::()); + info!("AbiEnumVisitor for &T: {}", type_name::()); // Don't call self.visit_for_abi(...) to avoid the infinite recursion! T::visit_for_abi(self, digester) } @@ -521,9 +576,13 @@ impl AbiEnumVisitor for &T { // inability of implementing AbiExample for private structs from other crates impl AbiEnumVisitor for &T { default fn visit_for_abi(&self, digester: &mut AbiDigester) -> DigestResult { - info!("AbiEnumVisitor for (IgnoreAsOpaque): {}", type_name::()); - let top_scope = type_name::().split("::").next().unwrap(); - self.serialize(digester.create_new_opaque(top_scope)) + let type_name = type_name::(); + let matcher = T::TYPE_NAME_MATCHER; + info!( + "AbiEnumVisitor for (EvenAsOpaque): {}: matcher: {}", + type_name, matcher + ); + self.serialize(digester.create_new_opaque(matcher)) .map_err(DigestError::wrap_by_type::) } } diff --git a/perf/Cargo.toml b/perf/Cargo.toml index aea478da078c35..b62484f4249abd 100644 --- a/perf/Cargo.toml +++ b/perf/Cargo.toml @@ -21,6 +21,8 @@ log = { workspace = true } rand = { workspace = true } rayon = { workspace = true } serde = { workspace = true } +solana-frozen-abi = { workspace = true } +solana-frozen-abi-macro = { workspace = true } solana-metrics = { workspace = true } solana-rayon-threadlimit = { workspace = true } solana-sdk = { workspace = true } @@ -40,6 +42,9 @@ rand_chacha = { workspace = true } solana-logger = { workspace = true } test-case = { workspace = true } +[build-dependencies] +rustc_version = { workspace = true } + [[bench]] name = "sigverify" diff --git a/perf/build.rs b/perf/build.rs index 025c71008f092b..4925ee898eb612 100644 --- a/perf/build.rs +++ b/perf/build.rs @@ -1,3 +1,6 @@ +extern crate rustc_version; +use rustc_version::{version_meta, Channel}; + fn main() { #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] { @@ -8,4 +11,27 @@ fn main() { println!("cargo:rustc-cfg=build_target_feature_avx2"); } } + + // Copied and adapted from + // https://github.com/Kimundi/rustc-version-rs/blob/1d692a965f4e48a8cb72e82cda953107c0d22f47/README.md#example + // Licensed under Apache-2.0 + MIT + match version_meta().unwrap().channel { + Channel::Stable => { + println!("cargo:rustc-cfg=RUSTC_WITHOUT_SPECIALIZATION"); + } + Channel::Beta => { + println!("cargo:rustc-cfg=RUSTC_WITHOUT_SPECIALIZATION"); + } + Channel::Nightly => { + println!("cargo:rustc-cfg=RUSTC_WITH_SPECIALIZATION"); + } + Channel::Dev => { + println!("cargo:rustc-cfg=RUSTC_WITH_SPECIALIZATION"); + // See https://github.com/solana-labs/solana/issues/11055 + // We may be running the custom `rust-bpf-builder` toolchain, + // which currently needs `#![feature(proc_macro_hygiene)]` to + // be applied. + println!("cargo:rustc-cfg=RUSTC_NEEDS_PROC_MACRO_HYGIENE"); + } + } } diff --git a/perf/src/cuda_runtime.rs b/perf/src/cuda_runtime.rs index a2986af1813680..5b44099aecb36c 100644 --- a/perf/src/cuda_runtime.rs +++ b/perf/src/cuda_runtime.rs @@ -54,7 +54,7 @@ fn unpin(mem: *mut T) { // A vector wrapper where the underlying memory can be // page-pinned. Controlled by flags in case user only wants // to pin in certain circumstances. -#[derive(Debug, Default, Serialize, Deserialize)] +#[derive(Debug, Default, Serialize, Deserialize, AbiExample)] pub struct PinnedVec { x: Vec, pinned: bool, diff --git a/perf/src/lib.rs b/perf/src/lib.rs index 8d277d7ad69778..83cefe1f319145 100644 --- a/perf/src/lib.rs +++ b/perf/src/lib.rs @@ -1,3 +1,4 @@ +#![cfg_attr(RUSTC_WITH_SPECIALIZATION, feature(min_specialization))] pub mod cuda_runtime; pub mod data_budget; pub mod deduper; @@ -23,6 +24,9 @@ extern crate assert_matches; #[macro_use] extern crate solana_metrics; +#[macro_use] +extern crate solana_frozen_abi_macro; + fn is_rosetta_emulated() -> bool { #[cfg(target_os = "macos")] { diff --git a/perf/src/packet.rs b/perf/src/packet.rs index b030f04dae8ce6..fbb8a437d6bd32 100644 --- a/perf/src/packet.rs +++ b/perf/src/packet.rs @@ -18,7 +18,7 @@ pub const NUM_PACKETS: usize = 1024 * 8; pub const PACKETS_PER_BATCH: usize = 64; pub const NUM_RCVMMSGS: usize = 64; -#[derive(Debug, Default, Clone, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, Serialize, Deserialize, AbiExample)] pub struct PacketBatch { packets: PinnedVec, } diff --git a/perf/src/recycler.rs b/perf/src/recycler.rs index 27c47d0df45103..87c44399e7fbc8 100644 --- a/perf/src/recycler.rs +++ b/perf/src/recycler.rs @@ -57,6 +57,15 @@ impl Default for RecyclerX { } } +#[cfg(RUSTC_WITH_SPECIALIZATION)] +impl solana_frozen_abi::abi_example::AbiExample + for RecyclerX> +{ + fn example() -> Self { + Self::default() + } +} + pub trait Reset { fn reset(&mut self); fn warm(&mut self, size_hint: usize); diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 30b6d92697e3b3..93341f97a137b7 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -5199,7 +5199,10 @@ dependencies = [ "nix", "rand 0.8.5", "rayon", + "rustc_version", "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", "solana-metrics", "solana-rayon-threadlimit", "solana-sdk", diff --git a/sdk/src/packet.rs b/sdk/src/packet.rs index b70d8adae8a4bb..faea9ab4753c67 100644 --- a/sdk/src/packet.rs +++ b/sdk/src/packet.rs @@ -36,7 +36,7 @@ bitflags! { } } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, AbiExample)] #[repr(C)] pub struct Meta { pub size: usize, @@ -45,6 +45,21 @@ pub struct Meta { pub flags: PacketFlags, } +#[cfg(RUSTC_WITH_SPECIALIZATION)] +impl ::solana_frozen_abi::abi_example::AbiExample for PacketFlags { + fn example() -> Self { + Self::empty() + } +} + +#[cfg(RUSTC_WITH_SPECIALIZATION)] +impl ::solana_frozen_abi::abi_example::IgnoreAsHelper for PacketFlags {} + +#[cfg(RUSTC_WITH_SPECIALIZATION)] +impl ::solana_frozen_abi::abi_example::EvenAsOpaque for PacketFlags { + const TYPE_NAME_MATCHER: &'static str = "::_::InternalBitFlags"; +} + // serde_as is used as a work around because array isn't supported by serde // (and serde_bytes). // @@ -71,7 +86,7 @@ pub struct Meta { // ryoqun's dirty experiments: // https://github.com/ryoqun/serde-array-comparisons #[serde_as] -#[derive(Clone, Eq, Serialize, Deserialize)] +#[derive(Clone, Eq, Serialize, Deserialize, AbiExample)] #[repr(C)] pub struct Packet { // Bytes past Packet.meta.size are not valid to read from. From 37a73508937e8375de1dcef407c0cd0a1d5ffe9a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 19:52:13 +0000 Subject: [PATCH 030/213] v1.17: remove redundant pubkey update record (backport of #33722) (#33735) remove redundant pubkey update record (#33722) * remove redundant pubkey update record * from became unused, so removed from all process_pull_response() calls (cherry picked from commit 6efc7ec61dbee1608b2fd142ceea34f939ab5bb8) Co-authored-by: Greg Cusack --- gossip/src/cluster_info.rs | 1 - gossip/src/crds_gossip.rs | 2 -- gossip/src/crds_gossip_pull.rs | 19 ++----------------- gossip/tests/crds_gossip.rs | 1 - 4 files changed, 2 insertions(+), 21 deletions(-) diff --git a/gossip/src/cluster_info.rs b/gossip/src/cluster_info.rs index b0b99b1c02dca4..07fbbf93334e12 100644 --- a/gossip/src/cluster_info.rs +++ b/gossip/src/cluster_info.rs @@ -2211,7 +2211,6 @@ impl ClusterInfo { { let _st = ScopedTimer::from(&self.stats.process_pull_response); self.gossip.process_pull_responses( - from, filtered_pulls, filtered_pulls_expired_timeout, failed_inserts, diff --git a/gossip/src/crds_gossip.rs b/gossip/src/crds_gossip.rs index 41a0e4c9ab4a7f..015deed1d2a472 100644 --- a/gossip/src/crds_gossip.rs +++ b/gossip/src/crds_gossip.rs @@ -274,7 +274,6 @@ impl CrdsGossip { /// Process a pull response. pub fn process_pull_responses( &self, - from: &Pubkey, responses: Vec, responses_expired_timeout: Vec, failed_inserts: Vec, @@ -283,7 +282,6 @@ impl CrdsGossip { ) { self.pull.process_pull_responses( &self.crds, - from, responses, responses_expired_timeout, failed_inserts, diff --git a/gossip/src/crds_gossip_pull.rs b/gossip/src/crds_gossip_pull.rs index 3e69192f2ac7e9..dae1eb3d79a7d3 100644 --- a/gossip/src/crds_gossip_pull.rs +++ b/gossip/src/crds_gossip_pull.rs @@ -360,7 +360,6 @@ impl CrdsGossipPull { pub(crate) fn process_pull_responses( &self, crds: &RwLock, - from: &Pubkey, responses: Vec, responses_expired_timeout: Vec, failed_inserts: Vec, @@ -382,7 +381,6 @@ impl CrdsGossipPull { } stats.success += num_inserts; self.num_pulls.fetch_add(num_inserts, Ordering::Relaxed); - owners.insert(*from); for owner in owners { crds.update_record_timestamp(&owner, now); } @@ -543,7 +541,6 @@ impl CrdsGossipPull { fn process_pull_response( &self, crds: &RwLock, - from: &Pubkey, timeouts: &CrdsTimeouts, response: Vec, now: u64, @@ -553,7 +550,6 @@ impl CrdsGossipPull { self.filter_pull_responses(crds, timeouts, response, now, &mut stats); self.process_pull_responses( crds, - from, versioned, versioned_expired_timeout, failed_inserts, @@ -1196,7 +1192,6 @@ pub(crate) mod tests { let failed = node .process_pull_response( &node_crds, - &node_pubkey, &node.make_timeouts(node_pubkey, &HashMap::new(), Duration::default()), rsp.into_iter().flatten().collect(), 1, @@ -1375,14 +1370,8 @@ pub(crate) mod tests { ); // inserting a fresh value should be fine. assert_eq!( - node.process_pull_response( - &node_crds, - &peer_pubkey, - &timeouts, - vec![peer_entry.clone()], - 1, - ) - .0, + node.process_pull_response(&node_crds, &timeouts, vec![peer_entry.clone()], 1,) + .0, 0 ); @@ -1394,7 +1383,6 @@ pub(crate) mod tests { assert_eq!( node.process_pull_response( &node_crds, - &peer_pubkey, &timeouts, vec![peer_entry.clone(), unstaked_peer_entry], node.crds_timeout + 100, @@ -1408,7 +1396,6 @@ pub(crate) mod tests { assert_eq!( node.process_pull_response( &node_crds, - &peer_pubkey, &timeouts, vec![peer_entry], node.crds_timeout + 1, @@ -1425,7 +1412,6 @@ pub(crate) mod tests { assert_eq!( node.process_pull_response( &node_crds, - &peer_pubkey, &timeouts, vec![peer_vote.clone()], node.crds_timeout + 1, @@ -1439,7 +1425,6 @@ pub(crate) mod tests { assert_eq!( node.process_pull_response( &node_crds, - &peer_pubkey, &timeouts, vec![peer_vote], node.crds_timeout + 2, diff --git a/gossip/tests/crds_gossip.rs b/gossip/tests/crds_gossip.rs index 827da50390c305..74415ec3c8ff33 100644 --- a/gossip/tests/crds_gossip.rs +++ b/gossip/tests/crds_gossip.rs @@ -575,7 +575,6 @@ fn network_run_pull( .gossip .filter_pull_responses(&timeouts, rsp, now, &mut stats); node.gossip.process_pull_responses( - &from, vers, vers_expired_timeout, failed_inserts, From eb31c69fdfdabf155da39fe06b274d58c0b4c31b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 16:40:46 +0000 Subject: [PATCH 031/213] v1.17: down samples outgoing gossip pull requests (backport of #33719) (#33752) down samples outgoing gossip pull requests (#33719) Push message propagation has improved in recent versions of the gossip code and we don't rely on pull requests as much as before. Handling pull requests is also inefficient and expensive. The commit reduces number of outgoing pull requests by down sampling. (cherry picked from commit c699bc9cab1e017476dbf34f6f43acd78927b2cf) Co-authored-by: behzad nouri --- gossip/benches/crds_gossip_pull.rs | 2 +- gossip/src/crds_gossip_pull.rs | 96 ++++++++++++++++++------------ 2 files changed, 60 insertions(+), 38 deletions(-) diff --git a/gossip/benches/crds_gossip_pull.rs b/gossip/benches/crds_gossip_pull.rs index eaed9b671166ef..35be66b4bad97c 100644 --- a/gossip/benches/crds_gossip_pull.rs +++ b/gossip/benches/crds_gossip_pull.rs @@ -52,6 +52,6 @@ fn bench_build_crds_filters(bencher: &mut Bencher) { let crds = RwLock::new(crds); bencher.iter(|| { let filters = crds_gossip_pull.build_crds_filters(&thread_pool, &crds, MAX_BLOOM_SIZE); - assert_eq!(filters.len(), 128); + assert_eq!(filters.len(), 16); }); } diff --git a/gossip/src/crds_gossip_pull.rs b/gossip/src/crds_gossip_pull.rs index dae1eb3d79a7d3..c3044dbba8cc43 100644 --- a/gossip/src/crds_gossip_pull.rs +++ b/gossip/src/crds_gossip_pull.rs @@ -53,8 +53,6 @@ use { pub const CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS: u64 = 15000; // Retention period of hashes of received outdated values. const FAILED_INSERTS_RETENTION_MS: u64 = 20_000; -// Maximum number of pull requests to send out each time around. -const MAX_NUM_PULL_REQUESTS: usize = 1024; pub const FALSE_RATE: f64 = 0.1f64; pub const KEYS: f64 = 8f64; @@ -143,19 +141,26 @@ impl CrdsFilter { /// A vector of crds filters that together hold a complete set of Hashes. struct CrdsFilterSet { - filters: Vec>, + filters: Vec>>, mask_bits: u32, } impl CrdsFilterSet { - fn new(num_items: usize, max_bytes: usize) -> Self { + fn new(rng: &mut R, num_items: usize, max_bytes: usize) -> Self { + const SAMPLE_RATE: usize = 8; + const MAX_NUM_FILTERS: usize = 1024; let max_bits = (max_bytes * 8) as f64; let max_items = CrdsFilter::max_items(max_bits, FALSE_RATE, KEYS); let mask_bits = CrdsFilter::mask_bits(num_items as f64, max_items); - let filters = - repeat_with(|| Bloom::random(max_items as usize, FALSE_RATE, max_bits as usize).into()) - .take(1 << mask_bits) - .collect(); + let mut filters: Vec<_> = repeat_with(|| None).take(1usize << mask_bits).collect(); + let mut indices: Vec<_> = (0..filters.len()).collect(); + let size = (filters.len() + SAMPLE_RATE - 1) / SAMPLE_RATE; + for _ in 0..MAX_NUM_FILTERS.min(size) { + let k = rng.gen_range(0..indices.len()); + let k = indices.swap_remove(k); + let filter = Bloom::random(max_items as usize, FALSE_RATE, max_bits as usize); + filters[k] = Some(AtomicBloom::::from(filter)); + } Self { filters, mask_bits } } @@ -167,7 +172,9 @@ impl CrdsFilterSet { .unwrap_or_default(), ) .unwrap(); - self.filters[index].add(&hash_value); + if let Some(filter) = &self.filters[index] { + filter.add(&hash_value); + } } } @@ -177,10 +184,12 @@ impl From for Vec { cfs.filters .into_iter() .enumerate() - .map(|(seed, filter)| CrdsFilter { - filter: filter.into(), - mask: CrdsFilter::compute_mask(seed as u64, mask_bits), - mask_bits, + .filter_map(|(seed, filter)| { + Some(CrdsFilter { + filter: Bloom::::from(filter?), + mask: CrdsFilter::compute_mask(seed as u64, mask_bits), + mask_bits, + }) }) .collect() } @@ -269,14 +278,7 @@ impl CrdsGossipPull { if nodes.is_empty() { return Err(CrdsGossipError::NoPeers); } - let mut filters = self.build_crds_filters(thread_pool, crds, bloom_size); - if filters.len() > MAX_NUM_PULL_REQUESTS { - for i in 0..MAX_NUM_PULL_REQUESTS { - let j = rng.gen_range(i..filters.len()); - filters.swap(i, j); - } - filters.truncate(MAX_NUM_PULL_REQUESTS); - } + let filters = self.build_crds_filters(thread_pool, crds, bloom_size); // Associate each pull-request filter with a randomly selected peer. let dist = WeightedIndex::new(weights).unwrap(); let nodes = repeat_with(|| nodes[dist.sample(&mut rng)].clone()); @@ -425,7 +427,7 @@ impl CrdsGossipPull { let crds = crds.read().unwrap(); let num_items = crds.len() + crds.num_purged() + failed_inserts.len(); let num_items = MIN_NUM_BLOOM_ITEMS.max(num_items); - let filters = CrdsFilterSet::new(num_items, bloom_size); + let filters = CrdsFilterSet::new(&mut rand::thread_rng(), num_items, bloom_size); thread_pool.install(|| { crds.par_values() .with_min_len(PAR_MIN_LENGTH) @@ -669,45 +671,61 @@ pub(crate) mod tests { #[test] fn test_crds_filter_set_add() { - let crds_filter_set = - CrdsFilterSet::new(/*num_items=*/ 9672788, /*max_bytes=*/ 8196); - let hash_values: Vec<_> = repeat_with(Hash::new_unique).take(1024).collect(); + let mut rng = rand::thread_rng(); + let crds_filter_set = CrdsFilterSet::new( + &mut rng, /*num_items=*/ 59672788, /*max_bytes=*/ 8196, + ); + let hash_values: Vec<_> = repeat_with(|| { + let buf: [u8; 32] = rng.gen(); + solana_sdk::hash::hashv(&[&buf]) + }) + .take(1024) + .collect(); + assert_eq!(crds_filter_set.filters.len(), 8192); for hash_value in &hash_values { crds_filter_set.add(*hash_value); } let filters: Vec = crds_filter_set.into(); + let mut num_hits = 0; assert_eq!(filters.len(), 1024); for hash_value in hash_values { - let mut num_hits = 0; + let mut hit = false; let mut false_positives = 0; for filter in &filters { if filter.test_mask(&hash_value) { num_hits += 1; + assert!(!hit); + hit = true; assert!(filter.contains(&hash_value)); assert!(filter.filter.contains(&hash_value)); } else if filter.filter.contains(&hash_value) { false_positives += 1; } } - assert_eq!(num_hits, 1); assert!(false_positives < 5); } + assert!(num_hits > 96, "num_hits: {num_hits}"); } #[test] fn test_crds_filter_set_new() { // Validates invariances required by CrdsFilterSet::get in the // vector of filters generated by CrdsFilterSet::new. - let filters: Vec = - CrdsFilterSet::new(/*num_items=*/ 55345017, /*max_bytes=*/ 4098).into(); - assert_eq!(filters.len(), 16384); + let filters = CrdsFilterSet::new( + &mut rand::thread_rng(), + 55345017, // num_items + 4098, // max_bytes + ); + assert_eq!(filters.filters.len(), 16384); + let filters = Vec::::from(filters); + assert_eq!(filters.len(), 1024); let mask_bits = filters[0].mask_bits; let right_shift = 64 - mask_bits; let ones = !0u64 >> mask_bits; - for (i, filter) in filters.iter().enumerate() { + for filter in &filters { // Check that all mask_bits are equal. assert_eq!(mask_bits, filter.mask_bits); - assert_eq!(i as u64, filter.mask >> right_shift); + assert!((0..16384).contains(&(filter.mask >> right_shift))); assert_eq!(ones, ones & filter.mask); } } @@ -740,7 +758,7 @@ pub(crate) mod tests { let crds = RwLock::new(crds); assert!(num_inserts > 30_000, "num inserts: {num_inserts}"); let filters = crds_gossip_pull.build_crds_filters(&thread_pool, &crds, MAX_BLOOM_SIZE); - assert_eq!(filters.len(), MIN_NUM_BLOOM_FILTERS.max(32)); + assert_eq!(filters.len(), MIN_NUM_BLOOM_FILTERS.max(4)); let crds = crds.read().unwrap(); let purged: Vec<_> = thread_pool.install(|| crds.purged().collect()); let hash_values: Vec<_> = crds.values().map(|v| v.value_hash).chain(purged).collect(); @@ -751,21 +769,24 @@ pub(crate) mod tests { "hash_values.len(): {}", hash_values.len() ); + let mut num_hits = 0; let mut false_positives = 0; for hash_value in hash_values { - let mut num_hits = 0; + let mut hit = false; for filter in &filters { if filter.test_mask(&hash_value) { num_hits += 1; + assert!(!hit); + hit = true; assert!(filter.contains(&hash_value)); assert!(filter.filter.contains(&hash_value)); } else if filter.filter.contains(&hash_value) { false_positives += 1; } } - assert_eq!(num_hits, 1); } - assert!(false_positives < 150_000, "fp: {false_positives}"); + assert!(num_hits > 4000, "num_hits: {num_hits}"); + assert!(false_positives < 20_000, "fp: {false_positives}"); } #[test] @@ -1308,7 +1329,8 @@ pub(crate) mod tests { } #[test] fn test_crds_filter_complete_set_add_mask() { - let mut filters: Vec = CrdsFilterSet::new(1000, 10).into(); + let mut filters = + Vec::::from(CrdsFilterSet::new(&mut rand::thread_rng(), 1000, 10)); assert!(filters.iter().all(|f| f.mask_bits > 0)); let mut h: Hash = Hash::default(); // rev to make the hash::default() miss on the first few test_masks From ab99086553ce0743d67617efda3d768768aca428 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 00:19:26 +0200 Subject: [PATCH 032/213] v1.17: token-2022: Update to use program build with zk-ops enabled (backport of #33747) (#33757) token-2022: Update to use program build with zk-ops enabled (#33747) token-2022: Update to use version with zk-ops enabled (cherry picked from commit d33758171be87236992b2832cc5a81ceb7247934) Co-authored-by: Jon Cinque --- .../src/programs/spl_token_2022-0.9.0.so | Bin 518392 -> 599088 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/program-test/src/programs/spl_token_2022-0.9.0.so b/program-test/src/programs/spl_token_2022-0.9.0.so index 805d3ed1a4131fe44c9bb00b6e865db27c593195..704fce119087717dafb64963b1c15faac125f6df 100644 GIT binary patch delta 148738 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 IzP8o>2TL_XSpWb4 delta 82320 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 cg*OvPH>@9XKeJxiZfMUy?p Date: Thu, 19 Oct 2023 08:56:43 -0700 Subject: [PATCH 033/213] v1.17: Fix non-determinism in account_hash_ignore_slot on genesis (backport of #33692) (#33720) Fix non-determinism in account_hash_ignore_slot on genesis (#33692) (cherry picked from commit 69495f4c13e025d8dc473438b31cc0f1788dc352) Co-authored-by: Jeff Washington (jwash) --- runtime/src/bank.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 52fccda5afb34f..2ff10135615408 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -3841,6 +3841,16 @@ impl Bank { // Bootstrap validator collects fees until `new_from_parent` is called. self.fee_rate_governor = genesis_config.fee_rate_governor.clone(); + // Make sure to activate the account_hash_ignore_slot feature + // before calculating any account hashes. + if genesis_config + .accounts + .iter() + .any(|(pubkey, _)| pubkey == &feature_set::account_hash_ignore_slot::id()) + { + self.activate_feature(&feature_set::account_hash_ignore_slot::id()); + } + for (pubkey, account) in genesis_config.accounts.iter() { assert!( self.get_account(pubkey).is_none(), From 423de49f8f592d955d65e3bddf6c71d590a2df13 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 20:24:30 +0200 Subject: [PATCH 034/213] v1.17: program error: add `InvalidAccountOwner` (backport of #33766) (#33773) --- sdk/program/src/program_error.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/program/src/program_error.rs b/sdk/program/src/program_error.rs index a0d217a96b84f4..928a12dab84543 100644 --- a/sdk/program/src/program_error.rs +++ b/sdk/program/src/program_error.rs @@ -59,6 +59,8 @@ pub enum ProgramError { MaxInstructionTraceLengthExceeded, #[error("Builtin programs must consume compute units")] BuiltinProgramsMustConsumeComputeUnits, + #[error("Invalid account owner")] + InvalidAccountOwner, } pub trait PrintProgramError { @@ -107,6 +109,7 @@ impl PrintProgramError for ProgramError { Self::BuiltinProgramsMustConsumeComputeUnits => { msg!("Error: BuiltinProgramsMustConsumeComputeUnits") } + Self::InvalidAccountOwner => msg!("Error: InvalidAccountOwner"), } } } @@ -141,6 +144,7 @@ pub const MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED: u64 = to_builtin!(19); pub const INVALID_ACCOUNT_DATA_REALLOC: u64 = to_builtin!(20); pub const MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED: u64 = to_builtin!(21); pub const BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS: u64 = to_builtin!(22); +pub const INVALID_ACCOUNT_OWNER: u64 = to_builtin!(23); // Warning: Any new program errors added here must also be: // - Added to the below conversions // - Added as an equivalent to InstructionError @@ -177,6 +181,7 @@ impl From for u64 { ProgramError::BuiltinProgramsMustConsumeComputeUnits => { BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS } + ProgramError::InvalidAccountOwner => INVALID_ACCOUNT_OWNER, ProgramError::Custom(error) => { if error == 0 { CUSTOM_ZERO @@ -215,6 +220,7 @@ impl From for ProgramError { BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS => { Self::BuiltinProgramsMustConsumeComputeUnits } + INVALID_ACCOUNT_OWNER => Self::InvalidAccountOwner, _ => Self::Custom(error as u32), } } @@ -253,6 +259,7 @@ impl TryFrom for ProgramError { Self::Error::BuiltinProgramsMustConsumeComputeUnits => { Ok(Self::BuiltinProgramsMustConsumeComputeUnits) } + Self::Error::InvalidAccountOwner => Ok(Self::InvalidAccountOwner), _ => Err(error), } } @@ -289,6 +296,7 @@ where BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS => { Self::BuiltinProgramsMustConsumeComputeUnits } + INVALID_ACCOUNT_OWNER => Self::InvalidAccountOwner, _ => { // A valid custom error has no bits set in the upper 32 if error >> BUILTIN_BIT_SHIFT == 0 { From 945daef906fdaa2dfb7c9bfdbbfb5c8074365e28 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 16:55:52 +0200 Subject: [PATCH 035/213] v1.17: SDK: update error variants in `Feature::from_account_info` (backport of #33750) (#33780) SDK: update error variants in `Feature::from_account_info` (#33750) (cherry picked from commit 6b1e9b89749b4323459e51b4d6bc6b2b3092d5f7) Co-authored-by: Joe C --- sdk/program/src/feature.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/program/src/feature.rs b/sdk/program/src/feature.rs index 25a3ec8a45b73e..b46704ebcb9992 100644 --- a/sdk/program/src/feature.rs +++ b/sdk/program/src/feature.rs @@ -30,9 +30,10 @@ impl Feature { pub fn from_account_info(account_info: &AccountInfo) -> Result { if *account_info.owner != id() { - return Err(ProgramError::InvalidArgument); + return Err(ProgramError::InvalidAccountOwner); } - bincode::deserialize(&account_info.data.borrow()).map_err(|_| ProgramError::InvalidArgument) + bincode::deserialize(&account_info.data.borrow()) + .map_err(|_| ProgramError::InvalidAccountData) } } From d550015e7ed122f79a3beba3cc5cb3ec0a4d9bdb Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 18:12:57 +0200 Subject: [PATCH 036/213] v1.17: program error: add `ArithmeticOverflow` (backport of #33767) (#33779) program error: add `ArithmeticOverflow` (#33767) (cherry picked from commit 37d093a30ef58bf4999f18a676ee2f86f70ac22e) Co-authored-by: Joe C --- sdk/program/src/program_error.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/program/src/program_error.rs b/sdk/program/src/program_error.rs index 928a12dab84543..6eb7e9ecd71981 100644 --- a/sdk/program/src/program_error.rs +++ b/sdk/program/src/program_error.rs @@ -61,6 +61,8 @@ pub enum ProgramError { BuiltinProgramsMustConsumeComputeUnits, #[error("Invalid account owner")] InvalidAccountOwner, + #[error("Program arithmetic overflowed")] + ArithmeticOverflow, } pub trait PrintProgramError { @@ -110,6 +112,7 @@ impl PrintProgramError for ProgramError { msg!("Error: BuiltinProgramsMustConsumeComputeUnits") } Self::InvalidAccountOwner => msg!("Error: InvalidAccountOwner"), + Self::ArithmeticOverflow => msg!("Error: ArithmeticOverflow"), } } } @@ -145,6 +148,7 @@ pub const INVALID_ACCOUNT_DATA_REALLOC: u64 = to_builtin!(20); pub const MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED: u64 = to_builtin!(21); pub const BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS: u64 = to_builtin!(22); pub const INVALID_ACCOUNT_OWNER: u64 = to_builtin!(23); +pub const ARITHMETIC_OVERFLOW: u64 = to_builtin!(24); // Warning: Any new program errors added here must also be: // - Added to the below conversions // - Added as an equivalent to InstructionError @@ -182,6 +186,7 @@ impl From for u64 { BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS } ProgramError::InvalidAccountOwner => INVALID_ACCOUNT_OWNER, + ProgramError::ArithmeticOverflow => ARITHMETIC_OVERFLOW, ProgramError::Custom(error) => { if error == 0 { CUSTOM_ZERO @@ -221,6 +226,7 @@ impl From for ProgramError { Self::BuiltinProgramsMustConsumeComputeUnits } INVALID_ACCOUNT_OWNER => Self::InvalidAccountOwner, + ARITHMETIC_OVERFLOW => Self::ArithmeticOverflow, _ => Self::Custom(error as u32), } } @@ -260,6 +266,7 @@ impl TryFrom for ProgramError { Ok(Self::BuiltinProgramsMustConsumeComputeUnits) } Self::Error::InvalidAccountOwner => Ok(Self::InvalidAccountOwner), + Self::Error::ArithmeticOverflow => Ok(Self::ArithmeticOverflow), _ => Err(error), } } @@ -297,6 +304,7 @@ where Self::BuiltinProgramsMustConsumeComputeUnits } INVALID_ACCOUNT_OWNER => Self::InvalidAccountOwner, + ARITHMETIC_OVERFLOW => Self::ArithmeticOverflow, _ => { // A valid custom error has no bits set in the upper 32 if error >> BUILTIN_BIT_SHIFT == 0 { From ae1bfff31f4e21bcd4f0fc24625759794790c16e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:03:37 +0000 Subject: [PATCH 037/213] v1.17: separates out routing repair requests from establishing connections (backport of #33742) (#33769) separates out routing repair requests from establishing connections (#33742) Currently each outgoing repair request will attempt to establish a connection if one does not already exist. This is very wasteful and consumes many tokio tasks if the remote node is down or unresponsive. The commit decouples routing packets from establishing connections by adding a buffering channel for each remote address. Outgoing packets are always sent down this channel to be processed once the connection is established. If connecting attempt fails, all packets already pushed to the channel are dropped at once, reducing the number of attempts to make a connection if the remote node is down or unresponsive. (cherry picked from commit 7aa0faea96426f541b4e20543a0c418340592c79) Co-authored-by: behzad nouri --- core/src/repair/quic_endpoint.rs | 280 ++++++++++++++++++------------- 1 file changed, 168 insertions(+), 112 deletions(-) diff --git a/core/src/repair/quic_endpoint.rs b/core/src/repair/quic_endpoint.rs index f7b445011c937a..bf3a1802144a42 100644 --- a/core/src/repair/quic_endpoint.rs +++ b/core/src/repair/quic_endpoint.rs @@ -21,16 +21,15 @@ use { collections::{hash_map::Entry, HashMap}, io::{Cursor, Error as IoError}, net::{IpAddr, SocketAddr, UdpSocket}, - ops::Deref, sync::Arc, time::Duration, }, thiserror::Error, tokio::{ sync::{ - mpsc::{Receiver as AsyncReceiver, Sender as AsyncSender}, + mpsc::{error::TrySendError, Receiver as AsyncReceiver, Sender as AsyncSender}, oneshot::Sender as OneShotSender, - RwLock, + Mutex, RwLock as AsyncRwLock, }, task::JoinHandle, }, @@ -39,7 +38,8 @@ use { const ALPN_REPAIR_PROTOCOL_ID: &[u8] = b"solana-repair"; const CONNECT_SERVER_NAME: &str = "solana-repair"; -const CLIENT_CHANNEL_CAPACITY: usize = 1 << 14; +const CLIENT_CHANNEL_BUFFER: usize = 1 << 14; +const ROUTER_CHANNEL_BUFFER: usize = 64; const CONNECTION_CACHE_CAPACITY: usize = 4096; const MAX_CONCURRENT_BIDI_STREAMS: VarInt = VarInt::from_u32(512); @@ -54,7 +54,6 @@ const CONNECTION_CLOSE_REASON_INVALID_IDENTITY: &[u8] = b"INVALID_IDENTITY"; const CONNECTION_CLOSE_REASON_REPLACED: &[u8] = b"REPLACED"; pub(crate) type AsyncTryJoinHandle = TryJoin, JoinHandle<()>>; -type ConnectionCache = HashMap<(SocketAddr, Option), Arc>>>; // Outgoing local requests. pub struct LocalRequest { @@ -125,17 +124,20 @@ pub(crate) fn new_quic_endpoint( )? }; endpoint.set_default_client_config(client_config); - let cache = Arc::>::default(); - let (client_sender, client_receiver) = tokio::sync::mpsc::channel(CLIENT_CHANNEL_CAPACITY); + let cache = Arc::>>::default(); + let (client_sender, client_receiver) = tokio::sync::mpsc::channel(CLIENT_CHANNEL_BUFFER); + let router = Arc::>>>::default(); let server_task = runtime.spawn(run_server( endpoint.clone(), remote_request_sender.clone(), + router.clone(), cache.clone(), )); let client_task = runtime.spawn(run_client( endpoint.clone(), client_receiver, remote_request_sender, + router, cache, )); let task = futures::future::try_join(server_task, client_task); @@ -187,13 +189,15 @@ fn new_transport_config() -> TransportConfig { async fn run_server( endpoint: Endpoint, remote_request_sender: Sender, - cache: Arc>, + router: Arc>>>, + cache: Arc>>, ) { while let Some(connecting) = endpoint.accept().await { tokio::task::spawn(handle_connecting_error( endpoint.clone(), connecting, remote_request_sender.clone(), + router.clone(), cache.clone(), )); } @@ -203,26 +207,68 @@ async fn run_client( endpoint: Endpoint, mut receiver: AsyncReceiver, remote_request_sender: Sender, - cache: Arc>, + router: Arc>>>, + cache: Arc>>, ) { while let Some(request) = receiver.recv().await { - tokio::task::spawn(send_request_task( + let Some(request) = try_route_request(request, &*router.read().await) else { + continue; + }; + let remote_address = request.remote_address; + let receiver = { + let mut router = router.write().await; + let Some(request) = try_route_request(request, &router) else { + continue; + }; + let (sender, receiver) = tokio::sync::mpsc::channel(ROUTER_CHANNEL_BUFFER); + sender.try_send(request).unwrap(); + router.insert(remote_address, sender); + receiver + }; + tokio::task::spawn(make_connection_task( endpoint.clone(), - request, + remote_address, remote_request_sender.clone(), + receiver, + router.clone(), cache.clone(), )); } close_quic_endpoint(&endpoint); + // Drop sender channels to unblock threads waiting on the receiving end. + router.write().await.clear(); +} + +// Routes the local request to respective channel. Drops the request if the +// channel is full. Bounces the request back if the channel is closed or does +// not exist. +fn try_route_request( + request: LocalRequest, + router: &HashMap>, +) -> Option { + match router.get(&request.remote_address) { + None => Some(request), + Some(sender) => match sender.try_send(request) { + Ok(()) => None, + Err(TrySendError::Full(request)) => { + error!("TrySendError::Full {}", request.remote_address); + None + } + Err(TrySendError::Closed(request)) => Some(request), + }, + } } async fn handle_connecting_error( endpoint: Endpoint, connecting: Connecting, remote_request_sender: Sender, - cache: Arc>, + router: Arc>>>, + cache: Arc>>, ) { - if let Err(err) = handle_connecting(endpoint, connecting, remote_request_sender, cache).await { + if let Err(err) = + handle_connecting(endpoint, connecting, remote_request_sender, router, cache).await + { error!("handle_connecting: {err:?}"); } } @@ -231,52 +277,75 @@ async fn handle_connecting( endpoint: Endpoint, connecting: Connecting, remote_request_sender: Sender, - cache: Arc>, + router: Arc>>>, + cache: Arc>>, ) -> Result<(), Error> { let connection = connecting.await?; let remote_address = connection.remote_address(); let remote_pubkey = get_remote_pubkey(&connection)?; - handle_connection_error( + let receiver = { + let (sender, receiver) = tokio::sync::mpsc::channel(ROUTER_CHANNEL_BUFFER); + router.write().await.insert(remote_address, sender); + receiver + }; + handle_connection( endpoint, remote_address, remote_pubkey, connection, remote_request_sender, + receiver, + router, cache, ) .await; Ok(()) } -async fn handle_connection_error( +async fn handle_connection( endpoint: Endpoint, remote_address: SocketAddr, remote_pubkey: Pubkey, connection: Connection, remote_request_sender: Sender, - cache: Arc>, + receiver: AsyncReceiver, + router: Arc>>>, + cache: Arc>>, ) { - cache_connection(remote_address, remote_pubkey, connection.clone(), &cache).await; - if let Err(err) = handle_connection( - &endpoint, + cache_connection(remote_pubkey, connection.clone(), &cache).await; + let send_requests_task = tokio::task::spawn(send_requests_task( + endpoint.clone(), + connection.clone(), + receiver, + )); + let recv_requests_task = tokio::task::spawn(recv_requests_task( + endpoint, remote_address, remote_pubkey, - &connection, - &remote_request_sender, - ) - .await - { - drop_connection(remote_address, remote_pubkey, &connection, &cache).await; - error!("handle_connection: {remote_pubkey}, {remote_address}, {err:?}"); + connection.clone(), + remote_request_sender, + )); + match futures::future::try_join(send_requests_task, recv_requests_task).await { + Err(err) => error!("handle_connection: {remote_pubkey}, {remote_address}, {err:?}"), + Ok(((), Err(ref err))) => { + error!("recv_requests_task: {remote_pubkey}, {remote_address}, {err:?}"); + } + Ok(((), Ok(()))) => (), + } + drop_connection(remote_pubkey, &connection, &cache).await; + if let Entry::Occupied(entry) = router.write().await.entry(remote_address) { + if entry.get().is_closed() { + entry.remove(); + } } } -async fn handle_connection( - endpoint: &Endpoint, +async fn recv_requests_task( + endpoint: Endpoint, remote_address: SocketAddr, remote_pubkey: Pubkey, - connection: &Connection, - remote_request_sender: &Sender, + connection: Connection, + remote_request_sender: Sender, ) -> Result<(), Error> { loop { let (send_stream, recv_stream) = connection.accept_bi().await?; @@ -352,32 +421,39 @@ async fn handle_streams( send_stream.finish().await.map_err(Error::from) } -async fn send_request_task( +async fn send_requests_task( endpoint: Endpoint, - request: LocalRequest, - remote_request_sender: Sender, - cache: Arc>, + connection: Connection, + mut receiver: AsyncReceiver, ) { - if let Err(err) = send_request(&endpoint, request, remote_request_sender, cache).await { - error!("send_request_task: {err:?}"); + while let Some(request) = receiver.recv().await { + tokio::task::spawn(send_request_task( + endpoint.clone(), + connection.clone(), + request, + )); + } +} + +async fn send_request_task(endpoint: Endpoint, connection: Connection, request: LocalRequest) { + if let Err(err) = send_request(endpoint, connection, request).await { + error!("send_request: {err:?}") } } async fn send_request( - endpoint: &Endpoint, + endpoint: Endpoint, + connection: Connection, LocalRequest { - remote_address, + remote_address: _, bytes, num_expected_responses, response_sender, }: LocalRequest, - remote_request_sender: Sender, - cache: Arc>, ) -> Result<(), Error> { // Assert that send won't block. debug_assert_eq!(response_sender.capacity(), None); const READ_TIMEOUT_DURATION: Duration = Duration::from_secs(10); - let connection = get_connection(endpoint, remote_address, remote_request_sender, cache).await?; let (mut send_stream, mut recv_stream) = connection.open_bi().await?; send_stream.write_all(&bytes).await?; send_stream.finish().await?; @@ -405,50 +481,57 @@ async fn send_request( response_sender .send((remote_address, chunk)) .map_err(|err| { - close_quic_endpoint(endpoint); + close_quic_endpoint(&endpoint); Error::from(err) }) }) } -async fn get_connection( - endpoint: &Endpoint, +async fn make_connection_task( + endpoint: Endpoint, remote_address: SocketAddr, remote_request_sender: Sender, - cache: Arc>, -) -> Result { - let entry = get_cache_entry(remote_address, &cache).await; + receiver: AsyncReceiver, + router: Arc>>>, + cache: Arc>>, +) { + if let Err(err) = make_connection( + endpoint, + remote_address, + remote_request_sender, + receiver, + router, + cache, + ) + .await { - let connection: Option = entry.read().await.clone(); - if let Some(connection) = connection { - if connection.close_reason().is_none() { - return Ok(connection); - } - } + error!("make_connection: {remote_address}, {err:?}"); } - let connection = { - // Need to write lock here so that only one task initiates - // a new connection to the same remote_address. - let mut entry = entry.write().await; - if let Some(connection) = entry.deref() { - if connection.close_reason().is_none() { - return Ok(connection.clone()); - } - } - let connection = endpoint - .connect(remote_address, CONNECT_SERVER_NAME)? - .await?; - entry.insert(connection).clone() - }; - tokio::task::spawn(handle_connection_error( - endpoint.clone(), +} + +async fn make_connection( + endpoint: Endpoint, + remote_address: SocketAddr, + remote_request_sender: Sender, + receiver: AsyncReceiver, + router: Arc>>>, + cache: Arc>>, +) -> Result<(), Error> { + let connection = endpoint + .connect(remote_address, CONNECT_SERVER_NAME)? + .await?; + handle_connection( + endpoint, connection.remote_address(), get_remote_pubkey(&connection)?, - connection.clone(), + connection, remote_request_sender, + receiver, + router, cache, - )); - Ok(connection) + ) + .await; + Ok(()) } fn get_remote_pubkey(connection: &Connection) -> Result { @@ -464,27 +547,13 @@ fn get_remote_pubkey(connection: &Connection) -> Result { } } -async fn get_cache_entry( - remote_address: SocketAddr, - cache: &RwLock, -) -> Arc>> { - let key = (remote_address, /*remote_pubkey:*/ None); - if let Some(entry) = cache.read().await.get(&key) { - return entry.clone(); - } - cache.write().await.entry(key).or_default().clone() -} - async fn cache_connection( - remote_address: SocketAddr, remote_pubkey: Pubkey, connection: Connection, - cache: &RwLock, + cache: &Mutex>, ) { - // The 2nd cache entry with remote_pubkey == None allows to lookup an entry - // only by SocketAddr when establishing outgoing connections. - let entries: [Arc>>; 2] = { - let mut cache = cache.write().await; + let old = { + let mut cache = cache.lock().await; if cache.len() >= CONNECTION_CACHE_CAPACITY { connection.close( CONNECTION_CLOSE_ERROR_CODE_DROPPED, @@ -492,15 +561,9 @@ async fn cache_connection( ); return; } - [Some(remote_pubkey), None].map(|remote_pubkey| { - let key = (remote_address, remote_pubkey); - cache.entry(key).or_default().clone() - }) + cache.insert(remote_pubkey, connection) }; - let mut entry = entries[0].write().await; - *entries[1].write().await = Some(connection.clone()); - if let Some(old) = entry.replace(connection) { - drop(entry); + if let Some(old) = old { old.close( CONNECTION_CLOSE_ERROR_CODE_REPLACED, CONNECTION_CLOSE_REASON_REPLACED, @@ -509,26 +572,19 @@ async fn cache_connection( } async fn drop_connection( - remote_address: SocketAddr, remote_pubkey: Pubkey, connection: &Connection, - cache: &RwLock, + cache: &Mutex>, ) { - if connection.close_reason().is_none() { - connection.close( - CONNECTION_CLOSE_ERROR_CODE_DROPPED, - CONNECTION_CLOSE_REASON_DROPPED, - ); - } - let key = (remote_address, Some(remote_pubkey)); - if let Entry::Occupied(entry) = cache.write().await.entry(key) { - if matches!(entry.get().read().await.deref(), - Some(entry) if entry.stable_id() == connection.stable_id()) - { + connection.close( + CONNECTION_CLOSE_ERROR_CODE_DROPPED, + CONNECTION_CLOSE_REASON_DROPPED, + ); + if let Entry::Occupied(entry) = cache.lock().await.entry(remote_pubkey) { + if entry.get().stable_id() == connection.stable_id() { entry.remove(); } } - // Cache entry for (remote_address, None) will be lazily evicted. } impl From> for Error { From 685e329dc8e2e57dec7ab7abefe8a1777be7a8b4 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:16:36 -0500 Subject: [PATCH 038/213] v1.17: docs: move rpc info to rpc docs (backport of #33723) (#33738) docs: move rpc info to rpc docs (#33723) docs: link fixes docs: link fixes docs: link fixes (cherry picked from commit 2c6cc4dd7dcf994229ef450b70a865ce30b853e6) Co-authored-by: Jacob Creech <82475023+jacobcreech@users.noreply.github.com> --- docs/src/running-validator/validator-start.md | 15 --------------- .../validator/get-started/setup-an-rpc-node.md | 17 ++++++++++++++++- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/src/running-validator/validator-start.md b/docs/src/running-validator/validator-start.md index 16940dc7030d45..cfa3aa152f15a6 100644 --- a/docs/src/running-validator/validator-start.md +++ b/docs/src/running-validator/validator-start.md @@ -430,18 +430,3 @@ which starts the solana validator process uses "exec" to do so (example: "exec solana-validator ..."); otherwise, when logrotate sends its signal to the validator, the enclosing script will die and take the validator process with it. - -### Account indexing - -As the number of populated accounts on the cluster grows, account-data RPC -requests that scan the entire account set -- like -[`getProgramAccounts`](../api/http#getprogramaccounts) and -[SPL-token-specific requests](../api/http#gettokenaccountsbydelegate) -- -may perform poorly. If your validator needs to support any of these requests, -you can use the `--account-index` parameter to activate one or more in-memory -account indexes that significantly improve RPC performance by indexing accounts -by the key field. Currently supports the following parameter values: - -- `program-id`: each account indexed by its owning program; used by [getProgramAccounts](../api/http#getprogramaccounts) -- `spl-token-mint`: each SPL token account indexed by its token Mint; used by [getTokenAccountsByDelegate](../api/http#gettokenaccountsbydelegate), and [getTokenLargestAccounts](../api/http#gettokenlargestaccounts) -- `spl-token-owner`: each SPL token account indexed by the token-owner address; used by [getTokenAccountsByOwner](../api/http#gettokenaccountsbyowner), and [getProgramAccounts](../api/http#getprogramaccounts) requests that include an spl-token-owner filter. diff --git a/docs/src/validator/get-started/setup-an-rpc-node.md b/docs/src/validator/get-started/setup-an-rpc-node.md index fc2038e67783c9..2c3f35031042e7 100644 --- a/docs/src/validator/get-started/setup-an-rpc-node.md +++ b/docs/src/validator/get-started/setup-an-rpc-node.md @@ -67,4 +67,19 @@ The identities of the [known validators](../../running-validator/validator-start Additional examples of other Solana cluster specific validator commands can be found on the [Clusters](../../clusters.md) page. -Keep in mind, you will still need to customize these commands to operate as an RPC node, as well other operator specific configuration settings. \ No newline at end of file +Keep in mind, you will still need to customize these commands to operate as an RPC node, as well other operator specific configuration settings. + +## Account indexing + +As the number of populated accounts on the cluster grows, account-data RPC +requests that scan the entire account set -- like +[`getProgramAccounts`](../../api/http#getprogramaccounts) and +[SPL-token-specific requests](../../api/http#gettokenaccountsbydelegate) -- +may perform poorly. If your validator needs to support any of these requests, +you can use the `--account-index` parameter to activate one or more in-memory +account indexes that significantly improve RPC performance by indexing accounts +by the key field. Currently supports the following parameter values: + +- `program-id`: each account indexed by its owning program; used by [getProgramAccounts](../../api/http#getprogramaccounts) +- `spl-token-mint`: each SPL token account indexed by its token Mint; used by [getTokenAccountsByDelegate](../../api/http#gettokenaccountsbydelegate), and [getTokenLargestAccounts](../../api/http#gettokenlargestaccounts) +- `spl-token-owner`: each SPL token account indexed by the token-owner address; used by [getTokenAccountsByOwner](../../api/http#gettokenaccountsbyowner), and [getProgramAccounts](../../api/http#getprogramaccounts) requests that include an spl-token-owner filter. From de407ad4a4ad6582cb3598697c5d8dedbe58a13e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 20:48:32 +0000 Subject: [PATCH 039/213] v1.17: separates out routing shreds from establishing connections (backport of #33599) (#33772) separates out routing shreds from establishing connections (#33599) Currently each outgoing shred will attempt to establish a connection if one does not already exist. This is very wasteful and consumes many tokio tasks if the remote node is down or unresponsive. The commit decouples routing packets from establishing connections by adding a buffering channel for each remote address. Outgoing packets are always sent down this channel to be processed once the connection is established. If connecting attempt fails, all packets already pushed to the channel are dropped at once, reducing the number of attempts to make a connection if the remote node is down or unresponsive. (cherry picked from commit 8becb72b3eebd932e88cf975642f89b50526559e) Co-authored-by: behzad nouri --- turbine/src/quic_endpoint.rs | 276 +++++++++++++++++++---------------- 1 file changed, 153 insertions(+), 123 deletions(-) diff --git a/turbine/src/quic_endpoint.rs b/turbine/src/quic_endpoint.rs index 0f93391e042b47..9be1dd11294c62 100644 --- a/turbine/src/quic_endpoint.rs +++ b/turbine/src/quic_endpoint.rs @@ -18,20 +18,20 @@ use { collections::{hash_map::Entry, HashMap}, io::Error as IoError, net::{IpAddr, SocketAddr, UdpSocket}, - ops::Deref, sync::Arc, }, thiserror::Error, tokio::{ sync::{ - mpsc::{Receiver as AsyncReceiver, Sender as AsyncSender}, - RwLock, + mpsc::{error::TrySendError, Receiver as AsyncReceiver, Sender as AsyncSender}, + Mutex, RwLock as AsyncRwLock, }, task::JoinHandle, }, }; -const CLIENT_CHANNEL_CAPACITY: usize = 1 << 20; +const CLIENT_CHANNEL_BUFFER: usize = 1 << 14; +const ROUTER_CHANNEL_BUFFER: usize = 64; const INITIAL_MAXIMUM_TRANSMISSION_UNIT: u16 = 1280; const ALPN_TURBINE_PROTOCOL_ID: &[u8] = b"solana-turbine"; const CONNECT_SERVER_NAME: &str = "solana-turbine"; @@ -47,7 +47,6 @@ const CONNECTION_CLOSE_REASON_INVALID_IDENTITY: &[u8] = b"INVALID_IDENTITY"; const CONNECTION_CLOSE_REASON_REPLACED: &[u8] = b"REPLACED"; pub type AsyncTryJoinHandle = TryJoin, JoinHandle<()>>; -type ConnectionCache = HashMap<(SocketAddr, Option), Arc>>>; #[derive(Error, Debug)] pub enum Error { @@ -99,10 +98,22 @@ pub fn new_quic_endpoint( )? }; endpoint.set_default_client_config(client_config); - let cache = Arc::>::default(); - let (client_sender, client_receiver) = tokio::sync::mpsc::channel(CLIENT_CHANNEL_CAPACITY); - let server_task = runtime.spawn(run_server(endpoint.clone(), sender.clone(), cache.clone())); - let client_task = runtime.spawn(run_client(endpoint.clone(), client_receiver, sender, cache)); + let cache = Arc::>>::default(); + let router = Arc::>>>::default(); + let (client_sender, client_receiver) = tokio::sync::mpsc::channel(CLIENT_CHANNEL_BUFFER); + let server_task = runtime.spawn(run_server( + endpoint.clone(), + sender.clone(), + router.clone(), + cache.clone(), + )); + let client_task = runtime.spawn(run_client( + endpoint.clone(), + client_receiver, + sender, + router, + cache, + )); let task = futures::future::try_join(server_task, client_task); Ok((endpoint, client_sender, task)) } @@ -152,13 +163,15 @@ fn new_transport_config() -> TransportConfig { async fn run_server( endpoint: Endpoint, sender: Sender<(Pubkey, SocketAddr, Bytes)>, - cache: Arc>, + router: Arc>>>, + cache: Arc>>, ) { while let Some(connecting) = endpoint.accept().await { tokio::task::spawn(handle_connecting_error( endpoint.clone(), connecting, sender.clone(), + router.clone(), cache.clone(), )); } @@ -168,27 +181,63 @@ async fn run_client( endpoint: Endpoint, mut receiver: AsyncReceiver<(SocketAddr, Bytes)>, sender: Sender<(Pubkey, SocketAddr, Bytes)>, - cache: Arc>, + router: Arc>>>, + cache: Arc>>, ) { while let Some((remote_address, bytes)) = receiver.recv().await { - tokio::task::spawn(send_datagram_task( + let Some(bytes) = try_route_bytes(&remote_address, bytes, &*router.read().await) else { + continue; + }; + let receiver = { + let mut router = router.write().await; + let Some(bytes) = try_route_bytes(&remote_address, bytes, &router) else { + continue; + }; + let (sender, receiver) = tokio::sync::mpsc::channel(ROUTER_CHANNEL_BUFFER); + sender.try_send(bytes).unwrap(); + router.insert(remote_address, sender); + receiver + }; + tokio::task::spawn(make_connection_task( endpoint.clone(), remote_address, - bytes, sender.clone(), + receiver, + router.clone(), cache.clone(), )); } close_quic_endpoint(&endpoint); + // Drop sender channels to unblock threads waiting on the receiving end. + router.write().await.clear(); +} + +fn try_route_bytes( + remote_address: &SocketAddr, + bytes: Bytes, + router: &HashMap>, +) -> Option { + match router.get(remote_address) { + None => Some(bytes), + Some(sender) => match sender.try_send(bytes) { + Ok(()) => None, + Err(TrySendError::Full(_)) => { + error!("TrySendError::Full {remote_address}"); + None + } + Err(TrySendError::Closed(bytes)) => Some(bytes), + }, + } } async fn handle_connecting_error( endpoint: Endpoint, connecting: Connecting, sender: Sender<(Pubkey, SocketAddr, Bytes)>, - cache: Arc>, + router: Arc>>>, + cache: Arc>>, ) { - if let Err(err) = handle_connecting(endpoint, connecting, sender, cache).await { + if let Err(err) = handle_connecting(endpoint, connecting, sender, router, cache).await { error!("handle_connecting: {err:?}"); } } @@ -197,52 +246,75 @@ async fn handle_connecting( endpoint: Endpoint, connecting: Connecting, sender: Sender<(Pubkey, SocketAddr, Bytes)>, - cache: Arc>, + router: Arc>>>, + cache: Arc>>, ) -> Result<(), Error> { let connection = connecting.await?; let remote_address = connection.remote_address(); let remote_pubkey = get_remote_pubkey(&connection)?; - handle_connection_error( + let receiver = { + let (sender, receiver) = tokio::sync::mpsc::channel(ROUTER_CHANNEL_BUFFER); + router.write().await.insert(remote_address, sender); + receiver + }; + handle_connection( endpoint, remote_address, remote_pubkey, connection, sender, + receiver, + router, cache, ) .await; Ok(()) } -async fn handle_connection_error( +async fn handle_connection( endpoint: Endpoint, remote_address: SocketAddr, remote_pubkey: Pubkey, connection: Connection, sender: Sender<(Pubkey, SocketAddr, Bytes)>, - cache: Arc>, + receiver: AsyncReceiver, + router: Arc>>>, + cache: Arc>>, ) { - cache_connection(remote_address, remote_pubkey, connection.clone(), &cache).await; - if let Err(err) = handle_connection( - &endpoint, + cache_connection(remote_pubkey, connection.clone(), &cache).await; + let send_datagram_task = tokio::task::spawn(send_datagram_task(connection.clone(), receiver)); + let read_datagram_task = tokio::task::spawn(read_datagram_task( + endpoint, remote_address, remote_pubkey, - &connection, - &sender, - ) - .await - { - drop_connection(remote_address, remote_pubkey, &connection, &cache).await; - error!("handle_connection: {remote_pubkey}, {remote_address}, {err:?}"); + connection.clone(), + sender, + )); + match futures::future::try_join(send_datagram_task, read_datagram_task).await { + Err(err) => error!("handle_connection: {remote_pubkey}, {remote_address}, {err:?}"), + Ok(out) => { + if let (Err(ref err), _) = out { + error!("send_datagram_task: {remote_pubkey}, {remote_address}, {err:?}"); + } + if let (_, Err(ref err)) = out { + error!("read_datagram_task: {remote_pubkey}, {remote_address}, {err:?}"); + } + } + } + drop_connection(remote_pubkey, &connection, &cache).await; + if let Entry::Occupied(entry) = router.write().await.entry(remote_address) { + if entry.get().is_closed() { + entry.remove(); + } } } -async fn handle_connection( - endpoint: &Endpoint, +async fn read_datagram_task( + endpoint: Endpoint, remote_address: SocketAddr, remote_pubkey: Pubkey, - connection: &Connection, - sender: &Sender<(Pubkey, SocketAddr, Bytes)>, + connection: Connection, + sender: Sender<(Pubkey, SocketAddr, Bytes)>, ) -> Result<(), Error> { // Assert that send won't block. debug_assert_eq!(sender.capacity(), None); @@ -250,7 +322,7 @@ async fn handle_connection( match connection.read_datagram().await { Ok(bytes) => { if let Err(err) = sender.send((remote_pubkey, remote_address, bytes)) { - close_quic_endpoint(endpoint); + close_quic_endpoint(&endpoint); return Err(Error::from(err)); } } @@ -265,67 +337,53 @@ async fn handle_connection( } async fn send_datagram_task( + connection: Connection, + mut receiver: AsyncReceiver, +) -> Result<(), Error> { + while let Some(bytes) = receiver.recv().await { + connection.send_datagram(bytes)?; + } + Ok(()) +} + +async fn make_connection_task( endpoint: Endpoint, remote_address: SocketAddr, - bytes: Bytes, sender: Sender<(Pubkey, SocketAddr, Bytes)>, - cache: Arc>, + receiver: AsyncReceiver, + router: Arc>>>, + cache: Arc>>, ) { - if let Err(err) = send_datagram(&endpoint, remote_address, bytes, sender, cache).await { - error!("send_datagram: {remote_address}, {err:?}"); + if let Err(err) = + make_connection(endpoint, remote_address, sender, receiver, router, cache).await + { + error!("make_connection: {remote_address}, {err:?}"); } } -async fn send_datagram( - endpoint: &Endpoint, +async fn make_connection( + endpoint: Endpoint, remote_address: SocketAddr, - bytes: Bytes, sender: Sender<(Pubkey, SocketAddr, Bytes)>, - cache: Arc>, + receiver: AsyncReceiver, + router: Arc>>>, + cache: Arc>>, ) -> Result<(), Error> { - let connection = get_connection(endpoint, remote_address, sender, cache).await?; - connection.send_datagram(bytes)?; - Ok(()) -} - -async fn get_connection( - endpoint: &Endpoint, - remote_address: SocketAddr, - sender: Sender<(Pubkey, SocketAddr, Bytes)>, - cache: Arc>, -) -> Result { - let entry = get_cache_entry(remote_address, &cache).await; - { - let connection: Option = entry.read().await.clone(); - if let Some(connection) = connection { - if connection.close_reason().is_none() { - return Ok(connection); - } - } - } - let connection = { - // Need to write lock here so that only one task initiates - // a new connection to the same remote_address. - let mut entry = entry.write().await; - if let Some(connection) = entry.deref() { - if connection.close_reason().is_none() { - return Ok(connection.clone()); - } - } - let connection = endpoint - .connect(remote_address, CONNECT_SERVER_NAME)? - .await?; - entry.insert(connection).clone() - }; - tokio::task::spawn(handle_connection_error( - endpoint.clone(), + let connection = endpoint + .connect(remote_address, CONNECT_SERVER_NAME)? + .await?; + handle_connection( + endpoint, connection.remote_address(), get_remote_pubkey(&connection)?, - connection.clone(), + connection, sender, + receiver, + router, cache, - )); - Ok(connection) + ) + .await; + Ok(()) } fn get_remote_pubkey(connection: &Connection) -> Result { @@ -341,62 +399,34 @@ fn get_remote_pubkey(connection: &Connection) -> Result { } } -async fn get_cache_entry( - remote_address: SocketAddr, - cache: &RwLock, -) -> Arc>> { - let key = (remote_address, /*remote_pubkey:*/ None); - if let Some(entry) = cache.read().await.get(&key) { - return entry.clone(); - } - cache.write().await.entry(key).or_default().clone() -} - async fn cache_connection( - remote_address: SocketAddr, remote_pubkey: Pubkey, connection: Connection, - cache: &RwLock, + cache: &Mutex>, ) { - let entries: [Arc>>; 2] = { - let mut cache = cache.write().await; - [Some(remote_pubkey), None].map(|remote_pubkey| { - let key = (remote_address, remote_pubkey); - cache.entry(key).or_default().clone() - }) + let Some(old) = cache.lock().await.insert(remote_pubkey, connection) else { + return; }; - let mut entry = entries[0].write().await; - *entries[1].write().await = Some(connection.clone()); - if let Some(old) = entry.replace(connection) { - drop(entry); - old.close( - CONNECTION_CLOSE_ERROR_CODE_REPLACED, - CONNECTION_CLOSE_REASON_REPLACED, - ); - } + old.close( + CONNECTION_CLOSE_ERROR_CODE_REPLACED, + CONNECTION_CLOSE_REASON_REPLACED, + ); } async fn drop_connection( - remote_address: SocketAddr, remote_pubkey: Pubkey, connection: &Connection, - cache: &RwLock, + cache: &Mutex>, ) { - if connection.close_reason().is_none() { - connection.close( - CONNECTION_CLOSE_ERROR_CODE_DROPPED, - CONNECTION_CLOSE_REASON_DROPPED, - ); - } - let key = (remote_address, Some(remote_pubkey)); - if let Entry::Occupied(entry) = cache.write().await.entry(key) { - if matches!(entry.get().read().await.deref(), - Some(entry) if entry.stable_id() == connection.stable_id()) - { + connection.close( + CONNECTION_CLOSE_ERROR_CODE_DROPPED, + CONNECTION_CLOSE_REASON_DROPPED, + ); + if let Entry::Occupied(entry) = cache.lock().await.entry(remote_pubkey) { + if entry.get().stable_id() == connection.stable_id() { entry.remove(); } } - // Cache entry for (remote_address, None) will be lazily evicted. } impl From> for Error { From f3308f733fe3c18bb3df019a5797c98fdfa13c2c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:19:22 +0000 Subject: [PATCH 040/213] v1.17: prunes repair QUIC connections (backport of #33775) (#33792) prunes repair QUIC connections (#33775) The commit implements lazy eviction for repair QUIC connections. The cache is allowed to grow to 2 x capacity at which point at least half of the entries with lowest stake are evicted, resulting in an amortized O(1) performance. (cherry picked from commit dc3c827299f0139b681dc79fa0a71622bce2feeb) Co-authored-by: behzad nouri --- core/src/repair/quic_endpoint.rs | 144 +++++++++++++++++++++++++++---- core/src/validator.rs | 1 + 2 files changed, 130 insertions(+), 15 deletions(-) diff --git a/core/src/repair/quic_endpoint.rs b/core/src/repair/quic_endpoint.rs index bf3a1802144a42..7d1cd29a32589f 100644 --- a/core/src/repair/quic_endpoint.rs +++ b/core/src/repair/quic_endpoint.rs @@ -13,15 +13,20 @@ use { rustls::{Certificate, PrivateKey}, serde_bytes::ByteBuf, solana_quic_client::nonblocking::quic_client::SkipServerVerification, + solana_runtime::bank_forks::BankForks, solana_sdk::{packet::PACKET_DATA_SIZE, pubkey::Pubkey, signature::Keypair}, solana_streamer::{ quic::SkipClientVerification, tls_certificates::new_self_signed_tls_certificate, }, std::{ + cmp::Reverse, collections::{hash_map::Entry, HashMap}, io::{Cursor, Error as IoError}, net::{IpAddr, SocketAddr, UdpSocket}, - sync::Arc, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, RwLock, + }, time::Duration, }, thiserror::Error, @@ -40,18 +45,20 @@ const CONNECT_SERVER_NAME: &str = "solana-repair"; const CLIENT_CHANNEL_BUFFER: usize = 1 << 14; const ROUTER_CHANNEL_BUFFER: usize = 64; -const CONNECTION_CACHE_CAPACITY: usize = 4096; +const CONNECTION_CACHE_CAPACITY: usize = 3072; const MAX_CONCURRENT_BIDI_STREAMS: VarInt = VarInt::from_u32(512); const CONNECTION_CLOSE_ERROR_CODE_SHUTDOWN: VarInt = VarInt::from_u32(1); const CONNECTION_CLOSE_ERROR_CODE_DROPPED: VarInt = VarInt::from_u32(2); const CONNECTION_CLOSE_ERROR_CODE_INVALID_IDENTITY: VarInt = VarInt::from_u32(3); const CONNECTION_CLOSE_ERROR_CODE_REPLACED: VarInt = VarInt::from_u32(4); +const CONNECTION_CLOSE_ERROR_CODE_PRUNED: VarInt = VarInt::from_u32(5); const CONNECTION_CLOSE_REASON_SHUTDOWN: &[u8] = b"SHUTDOWN"; const CONNECTION_CLOSE_REASON_DROPPED: &[u8] = b"DROPPED"; const CONNECTION_CLOSE_REASON_INVALID_IDENTITY: &[u8] = b"INVALID_IDENTITY"; const CONNECTION_CLOSE_REASON_REPLACED: &[u8] = b"REPLACED"; +const CONNECTION_CLOSE_REASON_PRUNED: &[u8] = b"PRUNED"; pub(crate) type AsyncTryJoinHandle = TryJoin, JoinHandle<()>>; @@ -108,6 +115,7 @@ pub(crate) fn new_quic_endpoint( socket: UdpSocket, address: IpAddr, remote_request_sender: Sender, + bank_forks: Arc>, ) -> Result<(Endpoint, AsyncSender, AsyncTryJoinHandle), Error> { let (cert, key) = new_self_signed_tls_certificate(keypair, address)?; let server_config = new_server_config(cert.clone(), key.clone())?; @@ -124,12 +132,15 @@ pub(crate) fn new_quic_endpoint( )? }; endpoint.set_default_client_config(client_config); + let prune_cache_pending = Arc::::default(); let cache = Arc::>>::default(); let (client_sender, client_receiver) = tokio::sync::mpsc::channel(CLIENT_CHANNEL_BUFFER); let router = Arc::>>>::default(); let server_task = runtime.spawn(run_server( endpoint.clone(), remote_request_sender.clone(), + bank_forks.clone(), + prune_cache_pending.clone(), router.clone(), cache.clone(), )); @@ -137,6 +148,8 @@ pub(crate) fn new_quic_endpoint( endpoint.clone(), client_receiver, remote_request_sender, + bank_forks, + prune_cache_pending, router, cache, )); @@ -189,6 +202,8 @@ fn new_transport_config() -> TransportConfig { async fn run_server( endpoint: Endpoint, remote_request_sender: Sender, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { @@ -197,6 +212,8 @@ async fn run_server( endpoint.clone(), connecting, remote_request_sender.clone(), + bank_forks.clone(), + prune_cache_pending.clone(), router.clone(), cache.clone(), )); @@ -207,6 +224,8 @@ async fn run_client( endpoint: Endpoint, mut receiver: AsyncReceiver, remote_request_sender: Sender, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { @@ -230,6 +249,8 @@ async fn run_client( remote_address, remote_request_sender.clone(), receiver, + bank_forks.clone(), + prune_cache_pending.clone(), router.clone(), cache.clone(), )); @@ -263,11 +284,21 @@ async fn handle_connecting_error( endpoint: Endpoint, connecting: Connecting, remote_request_sender: Sender, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { - if let Err(err) = - handle_connecting(endpoint, connecting, remote_request_sender, router, cache).await + if let Err(err) = handle_connecting( + endpoint, + connecting, + remote_request_sender, + bank_forks, + prune_cache_pending, + router, + cache, + ) + .await { error!("handle_connecting: {err:?}"); } @@ -277,6 +308,8 @@ async fn handle_connecting( endpoint: Endpoint, connecting: Connecting, remote_request_sender: Sender, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) -> Result<(), Error> { @@ -295,6 +328,8 @@ async fn handle_connecting( connection, remote_request_sender, receiver, + bank_forks, + prune_cache_pending, router, cache, ) @@ -302,6 +337,7 @@ async fn handle_connecting( Ok(()) } +#[allow(clippy::too_many_arguments)] async fn handle_connection( endpoint: Endpoint, remote_address: SocketAddr, @@ -309,10 +345,20 @@ async fn handle_connection( connection: Connection, remote_request_sender: Sender, receiver: AsyncReceiver, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { - cache_connection(remote_pubkey, connection.clone(), &cache).await; + cache_connection( + remote_pubkey, + connection.clone(), + bank_forks, + prune_cache_pending, + router.clone(), + cache.clone(), + ) + .await; let send_requests_task = tokio::task::spawn(send_requests_task( endpoint.clone(), connection.clone(), @@ -492,6 +538,8 @@ async fn make_connection_task( remote_address: SocketAddr, remote_request_sender: Sender, receiver: AsyncReceiver, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { @@ -500,6 +548,8 @@ async fn make_connection_task( remote_address, remote_request_sender, receiver, + bank_forks, + prune_cache_pending, router, cache, ) @@ -514,6 +564,8 @@ async fn make_connection( remote_address: SocketAddr, remote_request_sender: Sender, receiver: AsyncReceiver, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) -> Result<(), Error> { @@ -527,6 +579,8 @@ async fn make_connection( connection, remote_request_sender, receiver, + bank_forks, + prune_cache_pending, router, cache, ) @@ -550,18 +604,17 @@ fn get_remote_pubkey(connection: &Connection) -> Result { async fn cache_connection( remote_pubkey: Pubkey, connection: Connection, - cache: &Mutex>, + bank_forks: Arc>, + prune_cache_pending: Arc, + router: Arc>>>, + cache: Arc>>, ) { - let old = { + let (old, should_prune_cache) = { let mut cache = cache.lock().await; - if cache.len() >= CONNECTION_CACHE_CAPACITY { - connection.close( - CONNECTION_CLOSE_ERROR_CODE_DROPPED, - CONNECTION_CLOSE_REASON_DROPPED, - ); - return; - } - cache.insert(remote_pubkey, connection) + ( + cache.insert(remote_pubkey, connection), + cache.len() >= CONNECTION_CACHE_CAPACITY.saturating_mul(2), + ) }; if let Some(old) = old { old.close( @@ -569,6 +622,14 @@ async fn cache_connection( CONNECTION_CLOSE_REASON_REPLACED, ); } + if should_prune_cache && !prune_cache_pending.swap(true, Ordering::Relaxed) { + tokio::task::spawn(prune_connection_cache( + bank_forks, + prune_cache_pending, + router, + cache, + )); + } } async fn drop_connection( @@ -587,6 +648,50 @@ async fn drop_connection( } } +async fn prune_connection_cache( + bank_forks: Arc>, + prune_cache_pending: Arc, + router: Arc>>>, + cache: Arc>>, +) { + debug_assert!(prune_cache_pending.load(Ordering::Relaxed)); + let staked_nodes = { + let root_bank = bank_forks.read().unwrap().root_bank(); + root_bank.staked_nodes() + }; + { + let mut cache = cache.lock().await; + if cache.len() < CONNECTION_CACHE_CAPACITY.saturating_mul(2) { + prune_cache_pending.store(false, Ordering::Relaxed); + return; + } + let mut connections: Vec<_> = cache + .drain() + .filter(|(_, connection)| connection.close_reason().is_none()) + .map(|entry @ (pubkey, _)| { + let stake = staked_nodes.get(&pubkey).copied().unwrap_or_default(); + (stake, entry) + }) + .collect(); + connections + .select_nth_unstable_by_key(CONNECTION_CACHE_CAPACITY, |&(stake, _)| Reverse(stake)); + for (_, (_, connection)) in &connections[CONNECTION_CACHE_CAPACITY..] { + connection.close( + CONNECTION_CLOSE_ERROR_CODE_PRUNED, + CONNECTION_CLOSE_REASON_PRUNED, + ); + } + cache.extend( + connections + .into_iter() + .take(CONNECTION_CACHE_CAPACITY) + .map(|(_, entry)| entry), + ); + prune_cache_pending.store(false, Ordering::Relaxed); + } + router.write().await.retain(|_, sender| !sender.is_closed()); +} + impl From> for Error { fn from(_: crossbeam_channel::SendError) -> Self { Error::ChannelSendError @@ -598,6 +703,8 @@ mod tests { use { super::*, itertools::{izip, multiunzip}, + solana_ledger::genesis_utils::{create_genesis_config, GenesisConfigInfo}, + solana_runtime::bank::Bank, solana_sdk::signature::Signer, std::{iter::repeat_with, net::Ipv4Addr, time::Duration}, }; @@ -625,6 +732,12 @@ mod tests { repeat_with(crossbeam_channel::unbounded::) .take(NUM_ENDPOINTS) .unzip(); + let bank_forks = { + let GenesisConfigInfo { genesis_config, .. } = + create_genesis_config(/*mint_lamports:*/ 100_000); + let bank = Bank::new_for_tests(&genesis_config); + Arc::new(RwLock::new(BankForks::new(bank))) + }; let (endpoints, senders, tasks): (Vec<_>, Vec<_>, Vec<_>) = multiunzip( keypairs .iter() @@ -637,6 +750,7 @@ mod tests { socket, IpAddr::V4(Ipv4Addr::LOCALHOST), remote_request_sender, + bank_forks.clone(), ) .unwrap() }), diff --git a/core/src/validator.rs b/core/src/validator.rs index 3c19756f47d054..c23c724d5ec81f 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -1201,6 +1201,7 @@ impl Validator { .expect("Operator must spin up node with valid QUIC serve-repair address") .ip(), repair_quic_endpoint_sender, + bank_forks.clone(), ) .unwrap(); From c9e8f9c81a6818db762ec15a8d22d81300c0de71 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 14:20:24 -0700 Subject: [PATCH 041/213] v1.17: [zk-token-sdk] Limit max seed length for key derivations (backport of #33700) (#33795) [zk-token-sdk] Limit max seed length for key derivations (#33700) * limit max seed length for elgamal keypairs * limit max seed length for authenticated encryption keys * Apply suggestions from code review Co-authored-by: Jon Cinque * rename `SeedLengthTooLarge` to `SeedLengthTooLong` --------- Co-authored-by: Jon Cinque (cherry picked from commit dd2b1bb5a00ad9385aa16845148a7d32f68ca3c7) Co-authored-by: samkim-crypto --- zk-token-sdk/src/encryption/auth_encryption.rs | 18 ++++++++++++++++++ zk-token-sdk/src/encryption/elgamal.rs | 9 +++++++++ 2 files changed, 27 insertions(+) diff --git a/zk-token-sdk/src/encryption/auth_encryption.rs b/zk-token-sdk/src/encryption/auth_encryption.rs index 4445a40dfc1689..046f529ca4e634 100644 --- a/zk-token-sdk/src/encryption/auth_encryption.rs +++ b/zk-token-sdk/src/encryption/auth_encryption.rs @@ -50,6 +50,8 @@ pub enum AuthenticatedEncryptionError { DerivationMethodNotSupported, #[error("seed length too short for derivation")] SeedLengthTooShort, + #[error("seed length too long for derivation")] + SeedLengthTooLong, } struct AuthenticatedEncryption; @@ -172,10 +174,14 @@ impl EncodableKey for AeKey { impl SeedDerivable for AeKey { fn from_seed(seed: &[u8]) -> Result> { const MINIMUM_SEED_LEN: usize = AE_KEY_LEN; + const MAXIMUM_SEED_LEN: usize = 65535; if seed.len() < MINIMUM_SEED_LEN { return Err(AuthenticatedEncryptionError::SeedLengthTooShort.into()); } + if seed.len() > MAXIMUM_SEED_LEN { + return Err(AuthenticatedEncryptionError::SeedLengthTooLong.into()); + } let mut hasher = Sha3_512::new(); hasher.update(seed); @@ -278,4 +284,16 @@ mod tests { let null_signer = NullSigner::new(&Pubkey::default()); assert!(AeKey::new_from_signer(&null_signer, Pubkey::default().as_ref()).is_err()); } + + #[test] + fn test_aes_key_from_seed() { + let good_seed = vec![0; 32]; + assert!(AeKey::from_seed(&good_seed).is_ok()); + + let too_short_seed = vec![0; 15]; + assert!(AeKey::from_seed(&too_short_seed).is_err()); + + let too_long_seed = vec![0; 65536]; + assert!(AeKey::from_seed(&too_long_seed).is_err()); + } } diff --git a/zk-token-sdk/src/encryption/elgamal.rs b/zk-token-sdk/src/encryption/elgamal.rs index c57a10b740024e..bee5cb39c307ec 100644 --- a/zk-token-sdk/src/encryption/elgamal.rs +++ b/zk-token-sdk/src/encryption/elgamal.rs @@ -76,6 +76,8 @@ pub enum ElGamalError { DerivationMethodNotSupported, #[error("seed length too short for derivation")] SeedLengthTooShort, + #[error("seed length too long for derivation")] + SeedLengthTooLong, } /// Algorithm handle for the twisted ElGamal encryption scheme @@ -449,10 +451,14 @@ impl ElGamalSecretKey { /// Derive an ElGamal secret key from an entropy seed. pub fn from_seed(seed: &[u8]) -> Result { const MINIMUM_SEED_LEN: usize = ELGAMAL_SECRET_KEY_LEN; + const MAXIMUM_SEED_LEN: usize = 65535; if seed.len() < MINIMUM_SEED_LEN { return Err(ElGamalError::SeedLengthTooShort); } + if seed.len() > MAXIMUM_SEED_LEN { + return Err(ElGamalError::SeedLengthTooLong); + } Ok(ElGamalSecretKey(Scalar::hash_from_bytes::(seed))) } @@ -1026,6 +1032,9 @@ mod tests { let too_short_seed = vec![0; 31]; assert!(ElGamalKeypair::from_seed(&too_short_seed).is_err()); + + let too_long_seed = vec![0; 65536]; + assert!(ElGamalKeypair::from_seed(&too_long_seed).is_err()); } #[test] From a5188a4966dfd939b970a69246283824d4f888f0 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Fri, 20 Oct 2023 17:43:34 -0500 Subject: [PATCH 042/213] Update version to v1.17.4 (#33799) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 70e9032b8fae9f..42f4205359645e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2134,7 +2134,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "regex", @@ -2142,7 +2142,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.3" +version = "1.17.4" dependencies = [ "regex", ] @@ -4061,7 +4061,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.3" +version = "1.17.4" dependencies = [ "protobuf-src", "tonic-build", @@ -4306,7 +4306,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.3" +version = "1.17.4" [[package]] name = "rcgen" @@ -5095,7 +5095,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.3" +version = "1.17.4" dependencies = [ "Inflector", "assert_matches", @@ -5119,7 +5119,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 2.33.3", "log", @@ -5133,7 +5133,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 2.33.3", "log", @@ -5163,7 +5163,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.3" +version = "1.17.4" dependencies = [ "arrayref", "assert_matches", @@ -5227,7 +5227,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "bytemuck", @@ -5246,7 +5246,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -5257,7 +5257,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5281,7 +5281,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5298,7 +5298,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.3" +version = "1.17.4" dependencies = [ "serde", "solana-sdk", @@ -5307,7 +5307,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "crossbeam-channel", @@ -5325,7 +5325,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5377,7 +5377,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bv", "fnv", @@ -5394,7 +5394,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -5414,7 +5414,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -5425,7 +5425,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bv", "bytemuck", @@ -5444,7 +5444,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "solana-logger", @@ -5452,7 +5452,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_cmd", "bzip2", @@ -5473,11 +5473,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.3" +version = "1.17.4" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.3" +version = "1.17.4" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "chrono", @@ -5505,7 +5505,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "chrono", @@ -5523,7 +5523,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -5576,7 +5576,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.3" +version = "1.17.4" dependencies = [ "anyhow", "dirs-next", @@ -5591,7 +5591,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.3" +version = "1.17.4" dependencies = [ "Inflector", "base64 0.21.4", @@ -5617,7 +5617,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-trait", "bincode", @@ -5649,7 +5649,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.3" +version = "1.17.4" dependencies = [ "futures-util", "rand 0.8.5", @@ -5679,7 +5679,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5687,7 +5687,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "chrono", @@ -5700,7 +5700,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-trait", "bincode", @@ -5724,7 +5724,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.3" +version = "1.17.4" dependencies = [ "lazy_static", "log", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "clap 3.2.23", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "console", "indicatif", @@ -5874,7 +5874,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5885,7 +5885,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "byteorder", @@ -5929,7 +5929,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.3" +version = "1.17.4" dependencies = [ "ahash 0.8.3", "bitflags 2.3.3", @@ -5959,7 +5959,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.3" +version = "1.17.4" dependencies = [ "proc-macro2", "quote", @@ -5969,7 +5969,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.3" +version = "1.17.4" dependencies = [ "base64 0.21.4", "bincode", @@ -5994,7 +5994,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "solana-accounts-db", @@ -6005,7 +6005,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "solana-sdk", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bs58", "crossbeam-channel", @@ -6040,7 +6040,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -6091,7 +6091,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.3" +version = "1.17.4" dependencies = [ "atty", "bincode", @@ -6126,7 +6126,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bs58", "clap 3.2.23", @@ -6143,7 +6143,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -6211,7 +6211,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_cmd", "bs58", @@ -6260,7 +6260,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "log", @@ -6272,7 +6272,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6311,7 +6311,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.3" +version = "1.17.4" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6323,7 +6323,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.3" +version = "1.17.4" dependencies = [ "env_logger", "lazy_static", @@ -6332,7 +6332,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "solana-sdk", @@ -6340,11 +6340,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.3" +version = "1.17.4" [[package]] name = "solana-merkle-root-bench" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 2.33.3", "log", @@ -6357,7 +6357,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.3" +version = "1.17.4" dependencies = [ "fast-math", "hex", @@ -6366,7 +6366,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.3" +version = "1.17.4" dependencies = [ "crossbeam-channel", "env_logger", @@ -6382,7 +6382,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6393,7 +6393,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "clap 3.2.23", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "reqwest", @@ -6423,7 +6423,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.3" +version = "1.17.4" dependencies = [ "ahash 0.8.3", "assert_matches", @@ -6454,7 +6454,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -6475,7 +6475,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 3.2.23", "log", @@ -6490,7 +6490,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "anyhow", "ark-bn254", @@ -6547,7 +6547,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6576,7 +6576,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "async-trait", @@ -6604,7 +6604,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "anyhow", "crossbeam-channel", @@ -6628,7 +6628,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-mutex", "async-trait", @@ -6656,7 +6656,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.3" +version = "1.17.4" dependencies = [ "lazy_static", "num_cpus", @@ -6664,7 +6664,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "console", @@ -6683,7 +6683,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.3" +version = "1.17.4" dependencies = [ "base64 0.21.4", "bincode", @@ -6742,7 +6742,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "async-trait", @@ -6771,7 +6771,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.3" +version = "1.17.4" dependencies = [ "base64 0.21.4", "bs58", @@ -6791,7 +6791,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "anyhow", "clap 2.33.3", @@ -6808,7 +6808,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "bs58", @@ -6835,7 +6835,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.3" +version = "1.17.4" dependencies = [ "arrayref", "assert_matches", @@ -6918,7 +6918,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.3" +version = "1.17.4" dependencies = [ "anyhow", "assert_matches", @@ -6976,7 +6976,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bs58", "proc-macro2", @@ -6987,7 +6987,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.3" +version = "1.17.4" dependencies = [ "crossbeam-channel", "log", @@ -7002,7 +7002,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7018,7 +7018,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -7035,7 +7035,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.3" +version = "1.17.4" dependencies = [ "backoff", "bincode", @@ -7067,7 +7067,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "bs58", @@ -7083,7 +7083,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 2.33.3", "log", @@ -7095,7 +7095,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "async-channel", @@ -7127,7 +7127,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -7141,7 +7141,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.3" +version = "1.17.4" dependencies = [ "base64 0.21.4", "bincode", @@ -7171,7 +7171,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "log", @@ -7185,7 +7185,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -7218,7 +7218,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-trait", "bincode", @@ -7240,7 +7240,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "clap 2.33.3", @@ -7267,7 +7267,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.3" +version = "1.17.4" dependencies = [ "Inflector", "base64 0.21.4", @@ -7290,7 +7290,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -7327,7 +7327,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-trait", "solana-connection-cache", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.3" +version = "1.17.4" dependencies = [ "serde_json", "solana-metrics", @@ -7348,7 +7348,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.3" +version = "1.17.4" dependencies = [ "chrono", "clap 2.33.3", @@ -7412,7 +7412,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "rustc_version 0.4.0", @@ -7426,7 +7426,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "crossbeam-channel", @@ -7445,7 +7445,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -7468,7 +7468,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 2.33.3", "humantime", @@ -7487,7 +7487,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bs58", "clap 3.2.23", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bytemuck", "criterion", @@ -7520,7 +7520,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7532,7 +7532,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.3" +version = "1.17.4" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 845519fe0ebf58..cd0d499f68408e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.3" +version = "1.17.4" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.7.2" -solana-account-decoder = { path = "account-decoder", version = "=1.17.3" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.3" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.3" } -solana-banks-client = { path = "banks-client", version = "=1.17.3" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.3" } -solana-banks-server = { path = "banks-server", version = "=1.17.3" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.3" } -solana-bloom = { path = "bloom", version = "=1.17.3" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.3" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.3" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.3", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.3" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.3" } -solana-cli = { path = "cli", version = "=1.17.3" } -solana-cli-config = { path = "cli-config", version = "=1.17.3" } -solana-cli-output = { path = "cli-output", version = "=1.17.3" } -solana-client = { path = "client", version = "=1.17.3" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.3" } -solana-config-program = { path = "programs/config", version = "=1.17.3" } -solana-core = { path = "core", version = "=1.17.3" } -solana-cost-model = { path = "cost-model", version = "=1.17.3" } -solana-download-utils = { path = "download-utils", version = "=1.17.3" } -solana-entry = { path = "entry", version = "=1.17.3" } -solana-faucet = { path = "faucet", version = "=1.17.3" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.3" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.3" } -solana-genesis = { path = "genesis", version = "=1.17.3" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.3" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.3" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.3" } -solana-gossip = { path = "gossip", version = "=1.17.3" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.3" } -solana-ledger = { path = "ledger", version = "=1.17.3" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.3" } -solana-logger = { path = "logger", version = "=1.17.3" } -solana-measure = { path = "measure", version = "=1.17.3" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.3" } -solana-metrics = { path = "metrics", version = "=1.17.3" } -solana-net-utils = { path = "net-utils", version = "=1.17.3" } -solana-notifier = { path = "notifier", version = "=1.17.3" } -solana-perf = { path = "perf", version = "=1.17.3" } -solana-poh = { path = "poh", version = "=1.17.3" } -solana-program = { path = "sdk/program", version = "=1.17.3" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.3" } -solana-program-test = { path = "program-test", version = "=1.17.3" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.3" } -solana-quic-client = { path = "quic-client", version = "=1.17.3" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.3" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.3", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.3" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.3", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.3" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.3" } -solana-runtime = { path = "runtime", version = "=1.17.3" } -solana-sdk = { path = "sdk", version = "=1.17.3" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.3" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.3" } -solana-stake-program = { path = "programs/stake", version = "=1.17.3" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.3" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.3" } -solana-streamer = { path = "streamer", version = "=1.17.3" } -solana-system-program = { path = "programs/system", version = "=1.17.3" } -solana-test-validator = { path = "test-validator", version = "=1.17.3" } -solana-thin-client = { path = "thin-client", version = "=1.17.3" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.3", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.3" } -solana-turbine = { path = "turbine", version = "=1.17.3" } -solana-udp-client = { path = "udp-client", version = "=1.17.3" } -solana-version = { path = "version", version = "=1.17.3" } -solana-vote = { path = "vote", version = "=1.17.3" } -solana-vote-program = { path = "programs/vote", version = "=1.17.3" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.3" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.3" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.3" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.4" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.4" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.4" } +solana-banks-client = { path = "banks-client", version = "=1.17.4" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.4" } +solana-banks-server = { path = "banks-server", version = "=1.17.4" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.4" } +solana-bloom = { path = "bloom", version = "=1.17.4" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.4" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.4" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.4", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.4" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.4" } +solana-cli = { path = "cli", version = "=1.17.4" } +solana-cli-config = { path = "cli-config", version = "=1.17.4" } +solana-cli-output = { path = "cli-output", version = "=1.17.4" } +solana-client = { path = "client", version = "=1.17.4" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.4" } +solana-config-program = { path = "programs/config", version = "=1.17.4" } +solana-core = { path = "core", version = "=1.17.4" } +solana-cost-model = { path = "cost-model", version = "=1.17.4" } +solana-download-utils = { path = "download-utils", version = "=1.17.4" } +solana-entry = { path = "entry", version = "=1.17.4" } +solana-faucet = { path = "faucet", version = "=1.17.4" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.4" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.4" } +solana-genesis = { path = "genesis", version = "=1.17.4" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.4" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.4" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.4" } +solana-gossip = { path = "gossip", version = "=1.17.4" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.4" } +solana-ledger = { path = "ledger", version = "=1.17.4" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.4" } +solana-logger = { path = "logger", version = "=1.17.4" } +solana-measure = { path = "measure", version = "=1.17.4" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.4" } +solana-metrics = { path = "metrics", version = "=1.17.4" } +solana-net-utils = { path = "net-utils", version = "=1.17.4" } +solana-notifier = { path = "notifier", version = "=1.17.4" } +solana-perf = { path = "perf", version = "=1.17.4" } +solana-poh = { path = "poh", version = "=1.17.4" } +solana-program = { path = "sdk/program", version = "=1.17.4" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.4" } +solana-program-test = { path = "program-test", version = "=1.17.4" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.4" } +solana-quic-client = { path = "quic-client", version = "=1.17.4" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.4" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.4", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.4" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.4", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.4" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.4" } +solana-runtime = { path = "runtime", version = "=1.17.4" } +solana-sdk = { path = "sdk", version = "=1.17.4" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.4" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.4" } +solana-stake-program = { path = "programs/stake", version = "=1.17.4" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.4" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.4" } +solana-streamer = { path = "streamer", version = "=1.17.4" } +solana-system-program = { path = "programs/system", version = "=1.17.4" } +solana-test-validator = { path = "test-validator", version = "=1.17.4" } +solana-thin-client = { path = "thin-client", version = "=1.17.4" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.4", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.4" } +solana-turbine = { path = "turbine", version = "=1.17.4" } +solana-udp-client = { path = "udp-client", version = "=1.17.4" } +solana-version = { path = "version", version = "=1.17.4" } +solana-vote = { path = "vote", version = "=1.17.4" } +solana-vote-program = { path = "programs/vote", version = "=1.17.4" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.4" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.4" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.4" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 93341f97a137b7..a4ac202f254bc3 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.3" +version = "1.17.4" dependencies = [ "Inflector", "base64 0.21.4", @@ -4468,7 +4468,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.3" +version = "1.17.4" dependencies = [ "arrayref", "bincode", @@ -4525,7 +4525,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "bytemuck", @@ -4544,7 +4544,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4559,7 +4559,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.3" +version = "1.17.4" dependencies = [ "serde", "solana-sdk", @@ -4568,7 +4568,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "crossbeam-channel", @@ -4586,7 +4586,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bv", "fnv", @@ -4603,7 +4603,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.3" +version = "1.17.4" dependencies = [ "array-bytes", "serde", @@ -4630,7 +4630,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bv", "bytemuck", @@ -4646,7 +4646,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "chrono", "clap 2.33.3", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.3" +version = "1.17.4" dependencies = [ "dirs-next", "lazy_static", @@ -4675,7 +4675,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.3" +version = "1.17.4" dependencies = [ "Inflector", "base64 0.21.4", @@ -4700,7 +4700,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-trait", "bincode", @@ -4731,7 +4731,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4739,7 +4739,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "chrono", @@ -4751,7 +4751,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-trait", "bincode", @@ -4771,7 +4771,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.3" +version = "1.17.4" dependencies = [ "base64 0.21.4", "bincode", @@ -4843,7 +4843,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.3" +version = "1.17.4" dependencies = [ "lazy_static", "log", @@ -4865,7 +4865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "console", "indicatif", @@ -4877,7 +4877,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "crossbeam-channel", @@ -4897,7 +4897,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.3" +version = "1.17.4" dependencies = [ "ahash 0.8.3", "blake3", @@ -4947,7 +4947,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.3" +version = "1.17.4" dependencies = [ "proc-macro2", "quote", @@ -4957,7 +4957,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "solana-accounts-db", @@ -4968,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "solana-sdk", @@ -4978,7 +4978,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bs58", "crossbeam-channel", @@ -5003,7 +5003,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -5051,7 +5051,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "bincode", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "solana-measure", @@ -5126,7 +5126,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.3" +version = "1.17.4" dependencies = [ "env_logger", "lazy_static", @@ -5135,7 +5135,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "solana-sdk", @@ -5143,7 +5143,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.3" +version = "1.17.4" dependencies = [ "fast-math", "solana-program", @@ -5151,7 +5151,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.3" +version = "1.17.4" dependencies = [ "crossbeam-channel", "gethostname", @@ -5164,7 +5164,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "clap 3.1.6", @@ -5184,7 +5184,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.3" +version = "1.17.4" dependencies = [ "ahash 0.8.3", "bincode", @@ -5211,7 +5211,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.3" +version = "1.17.4" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5227,7 +5227,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "ark-bn254", "ark-ec", @@ -5279,7 +5279,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.3" +version = "1.17.4" dependencies = [ "base64 0.21.4", "bincode", @@ -5305,7 +5305,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "async-trait", @@ -5332,7 +5332,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "crossbeam-channel", "futures-util", @@ -5355,7 +5355,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-mutex", "async-trait", @@ -5380,7 +5380,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.3" +version = "1.17.4" dependencies = [ "lazy_static", "num_cpus", @@ -5388,7 +5388,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.3" +version = "1.17.4" dependencies = [ "console", "dialoguer", @@ -5405,7 +5405,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.3" +version = "1.17.4" dependencies = [ "base64 0.21.4", "bincode", @@ -5460,7 +5460,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-trait", "base64 0.21.4", @@ -5484,7 +5484,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.3" +version = "1.17.4" dependencies = [ "base64 0.21.4", "bs58", @@ -5504,7 +5504,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.3" +version = "1.17.4" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5515,7 +5515,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.3" +version = "1.17.4" dependencies = [ "arrayref", "base64 0.21.4", @@ -5590,7 +5590,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5619,7 +5619,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5627,21 +5627,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.3" +version = "1.17.4" dependencies = [ "array-bytes", "solana-program", @@ -5649,7 +5649,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.3" +version = "1.17.4" dependencies = [ "array-bytes", "solana-program", @@ -5657,21 +5657,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5679,14 +5679,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.3" +version = "1.17.4" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5694,21 +5694,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.3" +version = "1.17.4" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5718,42 +5718,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.3" +version = "1.17.4" dependencies = [ "rustversion", "solana-program", @@ -5763,49 +5763,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5813,14 +5813,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-program-runtime", @@ -5830,7 +5830,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5838,21 +5838,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5860,14 +5860,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.3" +version = "1.17.4" dependencies = [ "array-bytes", "solana-program", @@ -5875,7 +5875,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.3" +version = "1.17.4" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5884,14 +5884,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5899,7 +5899,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-program-runtime", @@ -5909,21 +5909,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-program-runtime", @@ -5933,7 +5933,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.3" +version = "1.17.4" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5941,7 +5941,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.3" +version = "1.17.4" dependencies = [ "blake3", "solana-program", @@ -5949,21 +5949,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-logger", "solana-program", @@ -5974,21 +5974,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", "solana-program-runtime", @@ -5998,21 +5998,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.3" +version = "1.17.4" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.3" +version = "1.17.4" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6064,7 +6064,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bs58", "proc-macro2", @@ -6075,7 +6075,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.3" +version = "1.17.4" dependencies = [ "crossbeam-channel", "log", @@ -6089,7 +6089,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "log", @@ -6102,7 +6102,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.3" +version = "1.17.4" dependencies = [ "backoff", "bincode", @@ -6134,7 +6134,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "bs58", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-channel", "bytes", @@ -6179,7 +6179,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "log", @@ -6191,7 +6191,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.3" +version = "1.17.4" dependencies = [ "base64 0.21.4", "bincode", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "log", @@ -6234,7 +6234,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-trait", "bincode", @@ -6256,7 +6256,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.3" +version = "1.17.4" dependencies = [ "Inflector", "base64 0.21.4", @@ -6279,7 +6279,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "bytes", @@ -6314,7 +6314,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.3" +version = "1.17.4" dependencies = [ "async-trait", "solana-connection-cache", @@ -6327,7 +6327,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.3" +version = "1.17.4" dependencies = [ "chrono", "clap 2.33.3", @@ -6389,7 +6389,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.3" +version = "1.17.4" dependencies = [ "log", "rustc_version", @@ -6403,7 +6403,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.3" +version = "1.17.4" dependencies = [ "crossbeam-channel", "itertools", @@ -6420,7 +6420,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bincode", "log", @@ -6440,7 +6440,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.3" +version = "1.17.4" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6452,7 +6452,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.3" +version = "1.17.4" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 89bd68e8428ba9..3ed974440b21bb 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.3" +version = "1.17.4" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.7.2" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.3" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.3" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.3" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.3" } -solana-ledger = { path = "../../ledger", version = "=1.17.3" } -solana-logger = { path = "../../logger", version = "=1.17.3" } -solana-measure = { path = "../../measure", version = "=1.17.3" } -solana-program = { path = "../../sdk/program", version = "=1.17.3" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.3" } -solana-program-test = { path = "../../program-test", version = "=1.17.3" } -solana-runtime = { path = "../../runtime", version = "=1.17.3" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.3" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.3" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.3", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.3" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.3" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.3" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.3", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.3" } -solana-sdk = { path = "../../sdk", version = "=1.17.3" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.3" } -solana-validator = { path = "../../validator", version = "=1.17.3" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.3" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.4" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.4" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.4" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.4" } +solana-ledger = { path = "../../ledger", version = "=1.17.4" } +solana-logger = { path = "../../logger", version = "=1.17.4" } +solana-measure = { path = "../../measure", version = "=1.17.4" } +solana-program = { path = "../../sdk/program", version = "=1.17.4" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.4" } +solana-program-test = { path = "../../program-test", version = "=1.17.4" } +solana-runtime = { path = "../../runtime", version = "=1.17.4" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.4" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.4" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.4", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.4" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.4" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.4" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.4", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.4" } +solana-sdk = { path = "../../sdk", version = "=1.17.4" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.4" } +solana-validator = { path = "../../validator", version = "=1.17.4" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.4" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 7c999bca2d7eb4..20c13366f9c0c2 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.3" +version = "1.17.4" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.3" } +solana-program = { path = "../../../../program", version = "=1.17.4" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 1ca6d96a145035..ad11a14fe504e2 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.3" +version = "1.17.4" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.3" } +solana-program = { path = "../../../../program", version = "=1.17.4" } [lib] crate-type = ["cdylib"] From 9021d224bee3f1a945be4d82cde6b463993d826f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 21 Oct 2023 14:14:23 +0200 Subject: [PATCH 043/213] v1.17: Bump solana_rbpf to v0.8.0 (backport of #33679) (#33793) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * updated inner_call for hashing fn to follow generic approach (#33128) * updated inner_call for hashing fn to follow generic approach * different hash compute budget values for all digests * fixed conflicts * reverted changes to compute_budget.rs and added 3method to trait to get compute budget values * updated type for result fn for HasherImpl * using Hash directly in result fn, got rid of HASH_BYTES and removed comment form compute_budget * updated import statement * cargo fmt -all * removed unused import and reference related warning * oops forgot semicolon * removed trailing white space (cherry picked from commit a60d1857bf805edd6e9b5e0e039fd7e2f6f8b518) * Bump solana_rbpf to v0.8.0 (#33679) * Bumps solana_rbpf to v0.8.0 * Adjustments: Replaces declare_syscall!() with declare_builtin_function!(). Removes Config::encrypt_runtime_environment. Simplifies error propagation. (cherry picked from commit a5c7c999e2060971d9369bde13e05247c9ddd415) --------- Co-authored-by: Alexander Meißner --- Cargo.lock | 5 +- Cargo.toml | 2 +- ledger/src/blockstore_processor.rs | 8 +- program-runtime/src/invoke_context.rs | 125 +-- program-runtime/src/loaded_programs.rs | 13 +- program-runtime/src/message_processor.rs | 12 +- program-runtime/src/stable_log.rs | 4 +- program-test/Cargo.toml | 1 + program-test/src/lib.rs | 56 +- .../tests/common.rs | 7 +- .../tests/create_lookup_table_ix.rs | 7 +- .../address-lookup-table/src/processor.rs | 40 +- programs/bpf-loader-tests/tests/common.rs | 3 +- programs/bpf_loader/src/lib.rs | 61 +- programs/bpf_loader/src/syscalls/cpi.rs | 12 +- programs/bpf_loader/src/syscalls/logging.rs | 22 +- programs/bpf_loader/src/syscalls/mem_ops.rs | 59 +- programs/bpf_loader/src/syscalls/mod.rs | 878 +++++++----------- programs/bpf_loader/src/syscalls/sysvar.rs | 26 +- programs/compute-budget/src/lib.rs | 12 +- programs/config/src/config_processor.rs | 220 +++-- programs/loader-v4/src/lib.rs | 43 +- programs/sbf/Cargo.lock | 5 +- programs/sbf/Cargo.toml | 2 +- programs/sbf/tests/programs.rs | 6 +- programs/stake/src/stake_instruction.rs | 702 +++++++------- programs/system/src/system_processor.rs | 462 +++++---- programs/vote/benches/process_vote.rs | 2 +- programs/vote/src/vote_processor.rs | 361 ++++--- programs/zk-token-proof/src/lib.rs | 2 +- runtime/benches/bank.rs | 4 +- runtime/src/bank.rs | 6 +- runtime/src/bank/tests.rs | 92 +- runtime/src/builtins.rs | 30 +- 34 files changed, 1539 insertions(+), 1751 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 42f4205359645e..55974005a539bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6597,6 +6597,7 @@ dependencies = [ "solana-sdk", "solana-stake-program", "solana-vote-program", + "solana_rbpf", "test-case", "thiserror", "tokio", @@ -7560,9 +7561,9 @@ dependencies = [ [[package]] name = "solana_rbpf" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "103318aa365ff7caa8cf534f2246b5eb7e5b34668736d52b1266b143f7a21196" +checksum = "3d457cc2ba742c120492a64b7fa60e22c575e891f6b55039f4d736568fb112a3" dependencies = [ "byteorder", "combine", diff --git a/Cargo.toml b/Cargo.toml index cd0d499f68408e..218fcc4ab82d38 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -298,7 +298,7 @@ siphasher = "0.3.11" smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" -solana_rbpf = "=0.7.2" +solana_rbpf = "=0.8.0" solana-account-decoder = { path = "account-decoder", version = "=1.17.4" } solana-accounts-db = { path = "accounts-db", version = "=1.17.4" } solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.4" } diff --git a/ledger/src/blockstore_processor.rs b/ledger/src/blockstore_processor.rs index 8738c200bfc2c0..1a5ff7100c365c 100644 --- a/ledger/src/blockstore_processor.rs +++ b/ledger/src/blockstore_processor.rs @@ -2989,7 +2989,7 @@ pub mod tests { ] } - declare_process_instruction!(mock_processor_ok, 1, |_invoke_context| { + declare_process_instruction!(MockBuiltinOk, 1, |_invoke_context| { // Always succeeds Ok(()) }); @@ -2997,7 +2997,7 @@ pub mod tests { let mock_program_id = solana_sdk::pubkey::new_rand(); let mut bank = Bank::new_for_tests(&genesis_config); - bank.add_mockup_builtin(mock_program_id, mock_processor_ok); + bank.add_mockup_builtin(mock_program_id, MockBuiltinOk::vm); let tx = Transaction::new_signed_with_payer( &[Instruction::new_with_bincode( @@ -3018,7 +3018,7 @@ pub mod tests { let bankhash_ok = bank.hash(); assert!(result.is_ok()); - declare_process_instruction!(mock_processor_err, 1, |invoke_context| { + declare_process_instruction!(MockBuiltinErr, 1, |invoke_context| { let instruction_errors = get_instruction_errors(); let err = invoke_context @@ -3038,7 +3038,7 @@ pub mod tests { (0..get_instruction_errors().len()).for_each(|err| { let mut bank = Bank::new_for_tests(&genesis_config); - bank.add_mockup_builtin(mock_program_id, mock_processor_err); + bank.add_mockup_builtin(mock_program_id, MockBuiltinErr::vm); let tx = Transaction::new_signed_with_payer( &[Instruction::new_with_bincode( diff --git a/program-runtime/src/invoke_context.rs b/program-runtime/src/invoke_context.rs index 12f82300d78521..9a270ed2d19617 100644 --- a/program-runtime/src/invoke_context.rs +++ b/program-runtime/src/invoke_context.rs @@ -13,9 +13,10 @@ use { solana_measure::measure::Measure, solana_rbpf::{ ebpf::MM_HEAP_START, - elf::SBPFVersion, + error::{EbpfError, ProgramResult}, memory_region::MemoryMapping, - vm::{BuiltinFunction, Config, ContextObject, ProgramResult}, + program::{BuiltinFunction, SBPFVersion}, + vm::{Config, ContextObject, EbpfVm}, }, solana_sdk::{ account::{AccountSharedData, ReadableAccount}, @@ -44,44 +45,46 @@ use { }, }; -pub type ProcessInstructionWithContext = BuiltinFunction>; +pub type BuiltinFunctionWithContext = BuiltinFunction>; /// Adapter so we can unify the interfaces of built-in programs and syscalls #[macro_export] macro_rules! declare_process_instruction { ($process_instruction:ident, $cu_to_consume:expr, |$invoke_context:ident| $inner:tt) => { - pub fn $process_instruction( - invoke_context: &mut $crate::invoke_context::InvokeContext, - _arg0: u64, - _arg1: u64, - _arg2: u64, - _arg3: u64, - _arg4: u64, - _memory_mapping: &mut $crate::solana_rbpf::memory_region::MemoryMapping, - result: &mut $crate::solana_rbpf::vm::ProgramResult, - ) { - fn process_instruction_inner( - $invoke_context: &mut $crate::invoke_context::InvokeContext, - ) -> std::result::Result<(), solana_sdk::instruction::InstructionError> { - $inner + $crate::solana_rbpf::declare_builtin_function!( + $process_instruction, + fn rust( + invoke_context: &mut $crate::invoke_context::InvokeContext, + _arg0: u64, + _arg1: u64, + _arg2: u64, + _arg3: u64, + _arg4: u64, + _memory_mapping: &mut $crate::solana_rbpf::memory_region::MemoryMapping, + ) -> std::result::Result> { + fn process_instruction_inner( + $invoke_context: &mut $crate::invoke_context::InvokeContext, + ) -> std::result::Result<(), solana_sdk::instruction::InstructionError> { + $inner + } + let consumption_result = if $cu_to_consume > 0 + && invoke_context + .feature_set + .is_active(&solana_sdk::feature_set::native_programs_consume_cu::id()) + { + invoke_context.consume_checked($cu_to_consume) + } else { + Ok(()) + }; + consumption_result + .and_then(|_| { + process_instruction_inner(invoke_context) + .map(|_| 0) + .map_err(|err| Box::new(err) as Box) + }) + .into() } - let consumption_result = if $cu_to_consume > 0 - && invoke_context - .feature_set - .is_active(&solana_sdk::feature_set::native_programs_consume_cu::id()) - { - invoke_context.consume_checked($cu_to_consume) - } else { - Ok(()) - }; - *result = consumption_result - .and_then(|_| { - process_instruction_inner(invoke_context) - .map(|_| 0) - .map_err(|err| Box::new(err) as Box) - }) - .into(); - } + ); }; } @@ -746,11 +749,11 @@ impl<'a> InvokeContext<'a> { .programs_loaded_for_tx_batch .find(&builtin_id) .ok_or(InstructionError::UnsupportedProgramId)?; - let process_instruction = match &entry.program { + let function = match &entry.program { LoadedProgramType::Builtin(program) => program .get_function_registry() .lookup_by_key(ENTRYPOINT_KEY) - .map(|(_name, process_instruction)| process_instruction), + .map(|(_name, function)| function), _ => None, } .ok_or(InstructionError::UnsupportedProgramId)?; @@ -762,31 +765,41 @@ impl<'a> InvokeContext<'a> { let logger = self.get_log_collector(); stable_log::program_invoke(&logger, &program_id, self.get_stack_height()); let pre_remaining_units = self.get_remaining(); + // In program-runtime v2 we will create this VM instance only once per transaction. + // `program_runtime_environment_v2.get_config()` will be used instead of `mock_config`. + // For now, only built-ins are invoked from here, so the VM and its Config are irrelevant. let mock_config = Config::default(); - let mut mock_memory_mapping = - MemoryMapping::new(Vec::new(), &mock_config, &SBPFVersion::V2).unwrap(); - let mut result = ProgramResult::Ok(0); - process_instruction( + let empty_memory_mapping = + MemoryMapping::new(Vec::new(), &mock_config, &SBPFVersion::V1).unwrap(); + let mut vm = EbpfVm::new( + self.programs_loaded_for_tx_batch + .environments + .program_runtime_v2 + .clone(), + &SBPFVersion::V1, // Removes lifetime tracking unsafe { std::mem::transmute::<&mut InvokeContext, &mut InvokeContext>(self) }, + empty_memory_mapping, 0, - 0, - 0, - 0, - 0, - &mut mock_memory_mapping, - &mut result, ); - let result = match result { + vm.invoke_function(function); + let result = match vm.program_result { ProgramResult::Ok(_) => { stable_log::program_success(&logger, &program_id); Ok(()) } - ProgramResult::Err(err) => { - stable_log::program_failure(&logger, &program_id, err.as_ref()); - if let Some(err) = err.downcast_ref::() { - Err(err.clone()) + ProgramResult::Err(ref err) => { + if let EbpfError::SyscallError(syscall_error) = err { + if let Some(instruction_err) = syscall_error.downcast_ref::() + { + stable_log::program_failure(&logger, &program_id, instruction_err); + Err(instruction_err.clone()) + } else { + stable_log::program_failure(&logger, &program_id, syscall_error); + Err(InstructionError::ProgramFailedToComplete) + } } else { + stable_log::program_failure(&logger, &program_id, err); Err(InstructionError::ProgramFailedToComplete) } } @@ -979,7 +992,7 @@ pub fn mock_process_instruction, instruction_account_metas: Vec, expected_result: Result<(), InstructionError>, - process_instruction: ProcessInstructionWithContext, + builtin_function: BuiltinFunctionWithContext, mut pre_adjustments: F, mut post_adjustments: G, ) -> Vec { @@ -1014,7 +1027,7 @@ pub fn mock_process_instruction Self { let mut function_registry = FunctionRegistry::default(); function_registry - .register_function_hashed(*b"entrypoint", entrypoint) + .register_function_hashed(*b"entrypoint", builtin_function) .unwrap(); Self { deployment_slot, @@ -928,7 +929,7 @@ mod tests { }, assert_matches::assert_matches, percentage::Percentage, - solana_rbpf::vm::BuiltinProgram, + solana_rbpf::program::BuiltinProgram, solana_sdk::{ clock::{Epoch, Slot}, pubkey::Pubkey, diff --git a/program-runtime/src/message_processor.rs b/program-runtime/src/message_processor.rs index 80bfaf16e974bc..77735f7f50bdca 100644 --- a/program-runtime/src/message_processor.rs +++ b/program-runtime/src/message_processor.rs @@ -222,7 +222,7 @@ mod tests { ChangeData { data: u8 }, } - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_data = instruction_context.get_instruction_data(); @@ -274,7 +274,7 @@ mod tests { let mut programs_loaded_for_tx_batch = LoadedProgramsForTxBatch::default(); programs_loaded_for_tx_batch.replenish( mock_system_program_id, - Arc::new(LoadedProgram::new_builtin(0, 0, process_instruction)), + Arc::new(LoadedProgram::new_builtin(0, 0, MockBuiltin::vm)), ); let account_keys = (0..transaction_context.get_number_of_accounts()) .map(|index| { @@ -438,7 +438,7 @@ mod tests { DoWork { lamports: u64, data: u8 }, } - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_data = instruction_context.get_instruction_data(); @@ -507,7 +507,7 @@ mod tests { let mut programs_loaded_for_tx_batch = LoadedProgramsForTxBatch::default(); programs_loaded_for_tx_batch.replenish( mock_program_id, - Arc::new(LoadedProgram::new_builtin(0, 0, process_instruction)), + Arc::new(LoadedProgram::new_builtin(0, 0, MockBuiltin::vm)), ); let account_metas = vec![ AccountMeta::new( @@ -655,7 +655,7 @@ mod tests { #[test] fn test_precompile() { let mock_program_id = Pubkey::new_unique(); - declare_process_instruction!(process_instruction, 1, |_invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |_invoke_context| { Err(InstructionError::Custom(0xbabb1e)) }); @@ -695,7 +695,7 @@ mod tests { let mut programs_loaded_for_tx_batch = LoadedProgramsForTxBatch::default(); programs_loaded_for_tx_batch.replenish( mock_program_id, - Arc::new(LoadedProgram::new_builtin(0, 0, process_instruction)), + Arc::new(LoadedProgram::new_builtin(0, 0, MockBuiltin::vm)), ); let mut programs_modified_by_tx = LoadedProgramsForTxBatch::default(); let mut programs_updated_only_for_global_cache = LoadedProgramsForTxBatch::default(); diff --git a/program-runtime/src/stable_log.rs b/program-runtime/src/stable_log.rs index 9ba7542e9c0fbf..748c4d7639214a 100644 --- a/program-runtime/src/stable_log.rs +++ b/program-runtime/src/stable_log.rs @@ -101,10 +101,10 @@ pub fn program_success(log_collector: &Option>>, progra /// ```notrust /// "Program
failed: " /// ``` -pub fn program_failure( +pub fn program_failure( log_collector: &Option>>, program_id: &Pubkey, - err: &dyn std::error::Error, + err: &E, ) { ic_logger_msg!(log_collector, "Program {} failed: {}", program_id, err); } diff --git a/program-test/Cargo.toml b/program-test/Cargo.toml index 87a9c88487a30d..c4ab4507b27eae 100644 --- a/program-test/Cargo.toml +++ b/program-test/Cargo.toml @@ -27,6 +27,7 @@ solana-program-runtime = { workspace = true } solana-runtime = { workspace = true } solana-sdk = { workspace = true } solana-vote-program = { workspace = true } +solana_rbpf = { workspace = true } test-case = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true, features = ["full"] } diff --git a/program-test/src/lib.rs b/program-test/src/lib.rs index 4cc8fc9ba21bf5..1f8d7d18c013d8 100644 --- a/program-test/src/lib.rs +++ b/program-test/src/lib.rs @@ -13,7 +13,7 @@ use { solana_banks_server::banks_server::start_local_server, solana_bpf_loader_program::serialization::serialize_parameters, solana_program_runtime::{ - compute_budget::ComputeBudget, ic_msg, invoke_context::ProcessInstructionWithContext, + compute_budget::ComputeBudget, ic_msg, invoke_context::BuiltinFunctionWithContext, loaded_programs::LoadedProgram, stable_log, timings::ExecuteTimings, }, solana_runtime::{ @@ -66,6 +66,10 @@ pub use { solana_banks_client::{BanksClient, BanksClientError}, solana_banks_interface::BanksTransactionResultWithMetadata, solana_program_runtime::invoke_context::InvokeContext, + solana_rbpf::{ + error::EbpfError, + vm::{get_runtime_environment_key, EbpfVm}, + }, solana_sdk::transaction_context::IndexOfAccount, }; @@ -94,10 +98,10 @@ fn get_invoke_context<'a, 'b>() -> &'a mut InvokeContext<'b> { unsafe { transmute::(ptr) } } -pub fn builtin_process_instruction( - process_instruction: solana_sdk::entrypoint::ProcessInstruction, +pub fn invoke_builtin_function( + builtin_function: solana_sdk::entrypoint::ProcessInstruction, invoke_context: &mut InvokeContext, -) -> Result<(), Box> { +) -> Result> { set_invoke_context(invoke_context); let transaction_context = &invoke_context.transaction_context; @@ -131,9 +135,10 @@ pub fn builtin_process_instruction( unsafe { deserialize(&mut parameter_bytes.as_slice_mut()[0] as *mut u8) }; // Execute the program - process_instruction(program_id, &account_infos, instruction_data).map_err(|err| { - let err: Box = Box::new(InstructionError::from(u64::from(err))); - stable_log::program_failure(&log_collector, program_id, err.as_ref()); + builtin_function(program_id, &account_infos, instruction_data).map_err(|err| { + let err = InstructionError::from(u64::from(err)); + stable_log::program_failure(&log_collector, program_id, &err); + let err: Box = Box::new(err); err })?; stable_log::program_success(&log_collector, program_id); @@ -170,21 +175,24 @@ pub fn builtin_process_instruction( } } - Ok(()) + Ok(0) } /// Converts a `solana-program`-style entrypoint into the runtime's entrypoint style, for /// use with `ProgramTest::add_program` #[macro_export] macro_rules! processor { - ($process_instruction:expr) => { - Some( - |invoke_context, _arg0, _arg1, _arg2, _arg3, _arg4, _memory_mapping, result| { - *result = $crate::builtin_process_instruction($process_instruction, invoke_context) - .map(|_| 0) + ($builtin_function:expr) => { + Some(|vm, _arg0, _arg1, _arg2, _arg3, _arg4| { + let vm = unsafe { + &mut *((vm as *mut u64).offset(-($crate::get_runtime_environment_key() as isize)) + as *mut $crate::EbpfVm<$crate::InvokeContext>) + }; + vm.program_result = + $crate::invoke_builtin_function($builtin_function, vm.context_object_pointer) + .map_err(|err| $crate::EbpfError::SyscallError(err)) .into(); - }, - ) + }) }; } @@ -507,10 +515,10 @@ impl ProgramTest { pub fn new( program_name: &str, program_id: Pubkey, - process_instruction: Option, + builtin_function: Option, ) -> Self { let mut me = Self::default(); - me.add_program(program_name, program_id, process_instruction); + me.add_program(program_name, program_id, builtin_function); me } @@ -601,13 +609,13 @@ impl ProgramTest { /// `program_name` will also be used to locate the SBF shared object in the current or fixtures /// directory. /// - /// If `process_instruction` is provided, the natively built-program may be used instead of the + /// If `builtin_function` is provided, the natively built-program may be used instead of the /// SBF shared object depending on the `BPF_OUT_DIR` environment variable. pub fn add_program( &mut self, program_name: &str, program_id: Pubkey, - process_instruction: Option, + builtin_function: Option, ) { let add_bpf = |this: &mut ProgramTest, program_file: PathBuf| { let data = read_file(&program_file); @@ -681,7 +689,7 @@ impl ProgramTest { }; let program_file = find_file(&format!("{program_name}.so")); - match (self.prefer_bpf, program_file, process_instruction) { + match (self.prefer_bpf, program_file, builtin_function) { // If SBF is preferred (i.e., `test-sbf` is invoked) and a BPF shared object exists, // use that as the program data. (true, Some(file), _) => add_bpf(self, file), @@ -690,8 +698,8 @@ impl ProgramTest { // processor function as is. // // TODO: figure out why tests hang if a processor panics when running native code. - (false, _, Some(process)) => { - self.add_builtin_program(program_name, program_id, process) + (false, _, Some(builtin_function)) => { + self.add_builtin_program(program_name, program_id, builtin_function) } // Invalid: `test-sbf` invocation with no matching SBF shared object. @@ -714,13 +722,13 @@ impl ProgramTest { &mut self, program_name: &str, program_id: Pubkey, - process_instruction: ProcessInstructionWithContext, + builtin_function: BuiltinFunctionWithContext, ) { info!("\"{}\" builtin program", program_name); self.builtin_programs.push(( program_id, program_name.to_string(), - LoadedProgram::new_builtin(0, program_name.len(), process_instruction), + LoadedProgram::new_builtin(0, program_name.len(), builtin_function), )); } diff --git a/programs/address-lookup-table-tests/tests/common.rs b/programs/address-lookup-table-tests/tests/common.rs index 48b80199312a14..064244858cda70 100644 --- a/programs/address-lookup-table-tests/tests/common.rs +++ b/programs/address-lookup-table-tests/tests/common.rs @@ -1,6 +1,5 @@ #![allow(dead_code)] use { - solana_address_lookup_table_program::processor::process_instruction, solana_program_test::*, solana_sdk::{ account::AccountSharedData, @@ -20,7 +19,11 @@ use { }; pub async fn setup_test_context() -> ProgramTestContext { - let program_test = ProgramTest::new("", id(), Some(process_instruction)); + let program_test = ProgramTest::new( + "", + id(), + Some(solana_address_lookup_table_program::processor::Entrypoint::vm), + ); program_test.start_with_context().await } diff --git a/programs/address-lookup-table-tests/tests/create_lookup_table_ix.rs b/programs/address-lookup-table-tests/tests/create_lookup_table_ix.rs index 183de53e31382a..39ff9aea6604d5 100644 --- a/programs/address-lookup-table-tests/tests/create_lookup_table_ix.rs +++ b/programs/address-lookup-table-tests/tests/create_lookup_table_ix.rs @@ -1,7 +1,6 @@ use { assert_matches::assert_matches, common::{assert_ix_error, overwrite_slot_hashes_with_slots, setup_test_context}, - solana_address_lookup_table_program::processor::process_instruction, solana_program_test::*, solana_sdk::{ address_lookup_table::{ @@ -23,7 +22,11 @@ use { mod common; pub async fn setup_test_context_without_authority_feature() -> ProgramTestContext { - let mut program_test = ProgramTest::new("", id(), Some(process_instruction)); + let mut program_test = ProgramTest::new( + "", + id(), + Some(solana_address_lookup_table_program::processor::Entrypoint::vm), + ); program_test.deactivate_feature( feature_set::relax_authority_signer_check_for_lookup_table_creation::id(), ); diff --git a/programs/address-lookup-table/src/processor.rs b/programs/address-lookup-table/src/processor.rs index 6f71b293d03a4c..4db568c71a1a20 100644 --- a/programs/address-lookup-table/src/processor.rs +++ b/programs/address-lookup-table/src/processor.rs @@ -21,29 +21,25 @@ use { pub const DEFAULT_COMPUTE_UNITS: u64 = 750; -declare_process_instruction!( - process_instruction, - DEFAULT_COMPUTE_UNITS, - |invoke_context| { - let transaction_context = &invoke_context.transaction_context; - let instruction_context = transaction_context.get_current_instruction_context()?; - let instruction_data = instruction_context.get_instruction_data(); - match limited_deserialize(instruction_data)? { - ProgramInstruction::CreateLookupTable { - recent_slot, - bump_seed, - } => Processor::create_lookup_table(invoke_context, recent_slot, bump_seed), - ProgramInstruction::FreezeLookupTable => Processor::freeze_lookup_table(invoke_context), - ProgramInstruction::ExtendLookupTable { new_addresses } => { - Processor::extend_lookup_table(invoke_context, new_addresses) - } - ProgramInstruction::DeactivateLookupTable => { - Processor::deactivate_lookup_table(invoke_context) - } - ProgramInstruction::CloseLookupTable => Processor::close_lookup_table(invoke_context), - } +declare_process_instruction!(Entrypoint, DEFAULT_COMPUTE_UNITS, |invoke_context| { + let transaction_context = &invoke_context.transaction_context; + let instruction_context = transaction_context.get_current_instruction_context()?; + let instruction_data = instruction_context.get_instruction_data(); + match limited_deserialize(instruction_data)? { + ProgramInstruction::CreateLookupTable { + recent_slot, + bump_seed, + } => Processor::create_lookup_table(invoke_context, recent_slot, bump_seed), + ProgramInstruction::FreezeLookupTable => Processor::freeze_lookup_table(invoke_context), + ProgramInstruction::ExtendLookupTable { new_addresses } => { + Processor::extend_lookup_table(invoke_context, new_addresses) + } + ProgramInstruction::DeactivateLookupTable => { + Processor::deactivate_lookup_table(invoke_context) + } + ProgramInstruction::CloseLookupTable => Processor::close_lookup_table(invoke_context), } -); +}); fn checked_add(a: usize, b: usize) -> Result { a.checked_add(b).ok_or(InstructionError::ArithmeticOverflow) diff --git a/programs/bpf-loader-tests/tests/common.rs b/programs/bpf-loader-tests/tests/common.rs index eeaf957a7e140c..99cae212c7f481 100644 --- a/programs/bpf-loader-tests/tests/common.rs +++ b/programs/bpf-loader-tests/tests/common.rs @@ -1,7 +1,6 @@ #![allow(dead_code)] use { - solana_bpf_loader_program::process_instruction, solana_program_test::*, solana_sdk::{ account::AccountSharedData, @@ -15,7 +14,7 @@ use { }; pub async fn setup_test_context() -> ProgramTestContext { - let program_test = ProgramTest::new("", id(), Some(process_instruction)); + let program_test = ProgramTest::new("", id(), Some(solana_bpf_loader_program::Entrypoint::vm)); program_test.start_with_context().await } diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index 82c623746406f2..768567187175c1 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -18,12 +18,14 @@ use { }, solana_rbpf::{ aligned_memory::AlignedMemory, + declare_builtin_function, ebpf::{self, HOST_ALIGN, MM_HEAP_START}, elf::Executable, - error::EbpfError, + error::{EbpfError, ProgramResult}, memory_region::{AccessType, MemoryCowCallback, MemoryMapping, MemoryRegion}, + program::BuiltinProgram, verifier::RequisiteVerifier, - vm::{BuiltinProgram, ContextObject, EbpfVm, ProgramResult}, + vm::{ContextObject, EbpfVm}, }, solana_sdk::{ account::WritableAccount, @@ -268,7 +270,7 @@ pub fn create_vm<'a, 'b>( trace_log: Vec::new(), })?; Ok(EbpfVm::new( - program.get_config(), + program.get_loader().clone(), program.get_sbpf_version(), invoke_context, memory_mapping, @@ -320,7 +322,7 @@ macro_rules! create_vm { macro_rules! mock_create_vm { ($vm:ident, $additional_regions:expr, $accounts_metadata:expr, $invoke_context:expr $(,)?) => { let loader = std::sync::Arc::new(BuiltinProgram::new_mock()); - let function_registry = solana_rbpf::elf::FunctionRegistry::default(); + let function_registry = solana_rbpf::program::FunctionRegistry::default(); let executable = solana_rbpf::elf::Executable::::from_text_bytes( &[0x95, 0, 0, 0, 0, 0, 0, 0], loader, @@ -374,20 +376,22 @@ fn create_memory_mapping<'a, 'b, C: ContextObject>( }) } -pub fn process_instruction( - invoke_context: &mut InvokeContext, - _arg0: u64, - _arg1: u64, - _arg2: u64, - _arg3: u64, - _arg4: u64, - _memory_mapping: &mut MemoryMapping, - result: &mut ProgramResult, -) { - *result = process_instruction_inner(invoke_context).into(); -} +declare_builtin_function!( + Entrypoint, + fn rust( + invoke_context: &mut InvokeContext, + _arg0: u64, + _arg1: u64, + _arg2: u64, + _arg3: u64, + _arg4: u64, + _memory_mapping: &mut MemoryMapping, + ) -> Result> { + process_instruction_inner(invoke_context) + } +); -fn process_instruction_inner( +pub fn process_instruction_inner( invoke_context: &mut InvokeContext, ) -> Result> { let log_collector = invoke_context.get_log_collector(); @@ -1619,13 +1623,12 @@ fn execute<'a, 'b: 'a>( } ProgramResult::Err(mut error) => { if direct_mapping { - if let Some(EbpfError::AccessViolation( - _pc, + if let EbpfError::AccessViolation( AccessType::Store, address, _size, _section_name, - )) = error.downcast_ref() + ) = error { // If direct_mapping is enabled and a program tries to write to a readonly // region we'll get a memory access violation. Map it to a more specific @@ -1633,7 +1636,7 @@ fn execute<'a, 'b: 'a>( if let Some((instruction_account_index, _)) = account_region_addrs .iter() .enumerate() - .find(|(_, vm_region)| vm_region.contains(address)) + .find(|(_, vm_region)| vm_region.contains(&address)) { let transaction_context = &invoke_context.transaction_context; let instruction_context = @@ -1644,17 +1647,21 @@ fn execute<'a, 'b: 'a>( instruction_account_index as IndexOfAccount, )?; - error = Box::new(if account.is_executable() { + error = EbpfError::SyscallError(Box::new(if account.is_executable() { InstructionError::ExecutableDataModified } else if account.is_writable() { InstructionError::ExternalAccountDataModified } else { InstructionError::ReadonlyDataModified - }) + })); } } } - Err(error) + Err(if let EbpfError::SyscallError(err) = error { + err + } else { + error.into() + }) } _ => Ok(()), } @@ -1802,7 +1809,7 @@ mod tests { transaction_accounts, instruction_accounts, expected_result, - super::process_instruction, + Entrypoint::vm, |invoke_context| { test_utils::load_all_invoked_programs(invoke_context); }, @@ -2021,7 +2028,7 @@ mod tests { vec![(program_id, program_account.clone())], Vec::new(), Err(InstructionError::ProgramFailedToComplete), - super::process_instruction, + Entrypoint::vm, |invoke_context| { invoke_context.mock_set_remaining(0); test_utils::load_all_invoked_programs(invoke_context); @@ -2567,7 +2574,7 @@ mod tests { transaction_accounts, instruction_accounts, expected_result, - super::process_instruction, + Entrypoint::vm, |_invoke_context| {}, |_invoke_context| {}, ) diff --git a/programs/bpf_loader/src/syscalls/cpi.rs b/programs/bpf_loader/src/syscalls/cpi.rs index 1509805b9f9cb0..3f8190d26df143 100644 --- a/programs/bpf_loader/src/syscalls/cpi.rs +++ b/programs/bpf_loader/src/syscalls/cpi.rs @@ -1,6 +1,6 @@ use { super::*, - crate::{declare_syscall, serialization::account_data_region_memory_state}, + crate::serialization::account_data_region_memory_state, scopeguard::defer, solana_program_runtime::invoke_context::SerializedAccountMetadata, solana_rbpf::{ @@ -455,10 +455,10 @@ trait SyscallInvokeSigned { ) -> Result, Error>; } -declare_syscall!( +declare_builtin_function!( /// Cross-program invocation called from Rust SyscallInvokeSignedRust, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, instruction_addr: u64, account_infos_addr: u64, @@ -689,10 +689,10 @@ struct SolSignerSeedsC { len: u64, } -declare_syscall!( +declare_builtin_function!( /// Cross-program invocation called from C SyscallInvokeSignedC, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, instruction_addr: u64, account_infos_addr: u64, @@ -1739,7 +1739,7 @@ mod tests { invoke_context::SerializedAccountMetadata, with_mock_invoke_context, }, solana_rbpf::{ - ebpf::MM_INPUT_START, elf::SBPFVersion, memory_region::MemoryRegion, vm::Config, + ebpf::MM_INPUT_START, memory_region::MemoryRegion, program::SBPFVersion, vm::Config, }, solana_sdk::{ account::{Account, AccountSharedData}, diff --git a/programs/bpf_loader/src/syscalls/logging.rs b/programs/bpf_loader/src/syscalls/logging.rs index f6d69153d2bc52..c5faf0a1057fde 100644 --- a/programs/bpf_loader/src/syscalls/logging.rs +++ b/programs/bpf_loader/src/syscalls/logging.rs @@ -1,9 +1,9 @@ -use {super::*, crate::declare_syscall, solana_rbpf::vm::ContextObject}; +use {super::*, solana_rbpf::vm::ContextObject}; -declare_syscall!( +declare_builtin_function!( /// Log a user's info message SyscallLog, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, addr: u64, len: u64, @@ -36,10 +36,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Log 5 64-bit values SyscallLogU64, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, arg1: u64, arg2: u64, @@ -59,10 +59,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Log current compute consumption SyscallLogBpfComputeUnits, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, _arg1: u64, _arg2: u64, @@ -83,10 +83,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Log 5 64-bit values SyscallLogPubkey, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, pubkey_addr: u64, _arg2: u64, @@ -108,10 +108,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Log data handling SyscallLogData, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, addr: u64, len: u64, diff --git a/programs/bpf_loader/src/syscalls/mem_ops.rs b/programs/bpf_loader/src/syscalls/mem_ops.rs index 93d5b69cecd818..9354270ac2f0b7 100644 --- a/programs/bpf_loader/src/syscalls/mem_ops.rs +++ b/programs/bpf_loader/src/syscalls/mem_ops.rs @@ -1,6 +1,5 @@ use { super::*, - crate::declare_syscall, solana_rbpf::{error::EbpfError, memory_region::MemoryRegion}, std::slice, }; @@ -14,10 +13,10 @@ fn mem_op_consume(invoke_context: &mut InvokeContext, n: u64) -> Result<(), Erro consume_compute_meter(invoke_context, cost) } -declare_syscall!( +declare_builtin_function!( /// memcpy SyscallMemcpy, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, dst_addr: u64, src_addr: u64, @@ -37,10 +36,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// memmove SyscallMemmove, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, dst_addr: u64, src_addr: u64, @@ -55,10 +54,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// memcmp SyscallMemcmp, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, s1_addr: u64, s2_addr: u64, @@ -113,10 +112,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// memset SyscallMemset, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, dst_addr: u64, c: u64, @@ -375,7 +374,6 @@ impl<'a> MemoryChunkIterator<'a> { len: u64, ) -> Result, EbpfError> { let vm_addr_end = vm_addr.checked_add(len).ok_or(EbpfError::AccessViolation( - 0, access_type, vm_addr, len, @@ -394,26 +392,19 @@ impl<'a> MemoryChunkIterator<'a> { fn region(&mut self, vm_addr: u64) -> Result<&'a MemoryRegion, Error> { match self.memory_mapping.region(self.access_type, vm_addr) { Ok(region) => Ok(region), - Err(error) => match error.downcast_ref() { - Some(EbpfError::AccessViolation(pc, access_type, _vm_addr, _len, name)) => { - Err(Box::new(EbpfError::AccessViolation( - *pc, - *access_type, - self.initial_vm_addr, - self.len, - name, - ))) - } - Some(EbpfError::StackAccessViolation(pc, access_type, _vm_addr, _len, frame)) => { + Err(error) => match error { + EbpfError::AccessViolation(access_type, _vm_addr, _len, name) => Err(Box::new( + EbpfError::AccessViolation(access_type, self.initial_vm_addr, self.len, name), + )), + EbpfError::StackAccessViolation(access_type, _vm_addr, _len, frame) => { Err(Box::new(EbpfError::StackAccessViolation( - *pc, - *access_type, + access_type, self.initial_vm_addr, self.len, - *frame, + frame, ))) } - _ => Err(error), + _ => Err(error.into()), }, } } @@ -489,7 +480,7 @@ mod tests { use { super::*, assert_matches::assert_matches, - solana_rbpf::{ebpf::MM_PROGRAM_START, elf::SBPFVersion}, + solana_rbpf::{ebpf::MM_PROGRAM_START, program::SBPFVersion}, }; fn to_chunk_vec<'a>( @@ -547,7 +538,7 @@ mod tests { .unwrap(); assert_matches!( src_chunk_iter.next().unwrap().unwrap_err().downcast_ref().unwrap(), - EbpfError::AccessViolation(0, AccessType::Load, addr, 42, "unknown") if *addr == MM_PROGRAM_START - 1 + EbpfError::AccessViolation(AccessType::Load, addr, 42, "unknown") if *addr == MM_PROGRAM_START - 1 ); // check oob at the upper bound. Since the memory mapping isn't empty, @@ -558,7 +549,7 @@ mod tests { assert!(src_chunk_iter.next().unwrap().is_ok()); assert_matches!( src_chunk_iter.next().unwrap().unwrap_err().downcast_ref().unwrap(), - EbpfError::AccessViolation(0, AccessType::Load, addr, 43, "program") if *addr == MM_PROGRAM_START + EbpfError::AccessViolation(AccessType::Load, addr, 43, "program") if *addr == MM_PROGRAM_START ); // check oob at the upper bound on the first next_back() @@ -568,7 +559,7 @@ mod tests { .rev(); assert_matches!( src_chunk_iter.next().unwrap().unwrap_err().downcast_ref().unwrap(), - EbpfError::AccessViolation(0, AccessType::Load, addr, 43, "program") if *addr == MM_PROGRAM_START + EbpfError::AccessViolation(AccessType::Load, addr, 43, "program") if *addr == MM_PROGRAM_START ); // check oob at the upper bound on the 2nd next_back() @@ -579,7 +570,7 @@ mod tests { assert!(src_chunk_iter.next().unwrap().is_ok()); assert_matches!( src_chunk_iter.next().unwrap().unwrap_err().downcast_ref().unwrap(), - EbpfError::AccessViolation(0, AccessType::Load, addr, 43, "unknown") if *addr == MM_PROGRAM_START - 1 + EbpfError::AccessViolation(AccessType::Load, addr, 43, "unknown") if *addr == MM_PROGRAM_START - 1 ); } @@ -707,7 +698,7 @@ mod tests { false, |_src, _dst, _len| Ok::<_, Error>(0), ).unwrap_err().downcast_ref().unwrap(), - EbpfError::AccessViolation(0, AccessType::Load, addr, 8, "program") if *addr == MM_PROGRAM_START + 8 + EbpfError::AccessViolation(AccessType::Load, addr, 8, "program") if *addr == MM_PROGRAM_START + 8 ); // src is shorter than dst @@ -722,12 +713,12 @@ mod tests { false, |_src, _dst, _len| Ok::<_, Error>(0), ).unwrap_err().downcast_ref().unwrap(), - EbpfError::AccessViolation(0, AccessType::Load, addr, 3, "program") if *addr == MM_PROGRAM_START + 10 + EbpfError::AccessViolation(AccessType::Load, addr, 3, "program") if *addr == MM_PROGRAM_START + 10 ); } #[test] - #[should_panic(expected = "AccessViolation(0, Store, 4294967296, 4")] + #[should_panic(expected = "AccessViolation(Store, 4294967296, 4")] fn test_memmove_non_contiguous_readonly() { let config = Config { aligned_memory_mapping: false, @@ -817,7 +808,7 @@ mod tests { } #[test] - #[should_panic(expected = "AccessViolation(0, Store, 4294967296, 9")] + #[should_panic(expected = "AccessViolation(Store, 4294967296, 9")] fn test_memset_non_contiguous_readonly() { let config = Config { aligned_memory_mapping: false, diff --git a/programs/bpf_loader/src/syscalls/mod.rs b/programs/bpf_loader/src/syscalls/mod.rs index c4a7fe1e6db50b..47654a0f6b2f1e 100644 --- a/programs/bpf_loader/src/syscalls/mod.rs +++ b/programs/bpf_loader/src/syscalls/mod.rs @@ -16,9 +16,10 @@ use { stable_log, timings::ExecuteTimings, }, solana_rbpf::{ - elf::FunctionRegistry, + declare_builtin_function, memory_region::{AccessType, MemoryMapping}, - vm::{BuiltinFunction, BuiltinProgram, Config, ProgramResult}, + program::{BuiltinFunction, BuiltinProgram, FunctionRegistry}, + vm::Config, }, solana_sdk::{ account::{ReadableAccount, WritableAccount}, @@ -44,7 +45,7 @@ use { remaining_compute_units_syscall_enabled, stop_sibling_instruction_search_at_parent, stop_truncating_strings_in_syscalls, switch_to_new_elf_parser, }, - hash::{Hasher, HASH_BYTES}, + hash::{Hash, Hasher}, instruction::{ AccountMeta, InstructionError, ProcessedSiblingInstruction, TRANSACTION_LEVEL_STACK_HEIGHT, @@ -133,6 +134,103 @@ pub enum SyscallError { type Error = Box; +pub trait HasherImpl { + const NAME: &'static str; + type Output: AsRef<[u8]>; + + fn create_hasher() -> Self; + fn hash(&mut self, val: &[u8]); + fn result(self) -> Self::Output; + fn get_base_cost(compute_budget: &ComputeBudget) -> u64; + fn get_byte_cost(compute_budget: &ComputeBudget) -> u64; + fn get_max_slices(compute_budget: &ComputeBudget) -> u64; +} + +pub struct Sha256Hasher(Hasher); +pub struct Blake3Hasher(blake3::Hasher); +pub struct Keccak256Hasher(keccak::Hasher); + +impl HasherImpl for Sha256Hasher { + const NAME: &'static str = "Sha256"; + type Output = Hash; + + fn create_hasher() -> Self { + Sha256Hasher(Hasher::default()) + } + + fn hash(&mut self, val: &[u8]) { + self.0.hash(val); + } + + fn result(self) -> Self::Output { + self.0.result() + } + + fn get_base_cost(compute_budget: &ComputeBudget) -> u64 { + compute_budget.sha256_base_cost + } + fn get_byte_cost(compute_budget: &ComputeBudget) -> u64 { + compute_budget.sha256_byte_cost + } + fn get_max_slices(compute_budget: &ComputeBudget) -> u64 { + compute_budget.sha256_max_slices + } +} + +impl HasherImpl for Blake3Hasher { + const NAME: &'static str = "Blake3"; + type Output = blake3::Hash; + + fn create_hasher() -> Self { + Blake3Hasher(blake3::Hasher::default()) + } + + fn hash(&mut self, val: &[u8]) { + self.0.hash(val); + } + + fn result(self) -> Self::Output { + self.0.result() + } + + fn get_base_cost(compute_budget: &ComputeBudget) -> u64 { + compute_budget.sha256_base_cost + } + fn get_byte_cost(compute_budget: &ComputeBudget) -> u64 { + compute_budget.sha256_byte_cost + } + fn get_max_slices(compute_budget: &ComputeBudget) -> u64 { + compute_budget.sha256_max_slices + } +} + +impl HasherImpl for Keccak256Hasher { + const NAME: &'static str = "Keccak256"; + type Output = keccak::Hash; + + fn create_hasher() -> Self { + Keccak256Hasher(keccak::Hasher::default()) + } + + fn hash(&mut self, val: &[u8]) { + self.0.hash(val); + } + + fn result(self) -> Self::Output { + self.0.result() + } + + fn get_base_cost(compute_budget: &ComputeBudget) -> u64 { + compute_budget.sha256_base_cost + } + fn get_byte_cost(compute_budget: &ComputeBudget) -> u64 { + compute_budget.sha256_byte_cost + } + fn get_max_slices(compute_budget: &ComputeBudget) -> u64 { + compute_budget.sha256_max_slices + } +} + fn consume_compute_meter(invoke_context: &InvokeContext, amount: u64) -> Result<(), Error> { invoke_context.consume_checked(amount)?; Ok(()) @@ -185,7 +283,6 @@ pub fn create_program_runtime_environment_v1<'a>( reject_broken_elfs: reject_deployment_of_broken_elfs, noop_instruction_rate: 256, sanitize_user_provided_values: true, - encrypt_runtime_environment: true, external_internal_function_hash_collision: feature_set .is_active(&error_on_syscall_bpf_function_hash_collisions::id()), reject_callx_r10: feature_set.is_active(&reject_callx_r10::id()), @@ -199,42 +296,42 @@ pub fn create_program_runtime_environment_v1<'a>( let mut result = FunctionRegistry::>::default(); // Abort - result.register_function_hashed(*b"abort", SyscallAbort::call)?; + result.register_function_hashed(*b"abort", SyscallAbort::vm)?; // Panic - result.register_function_hashed(*b"sol_panic_", SyscallPanic::call)?; + result.register_function_hashed(*b"sol_panic_", SyscallPanic::vm)?; // Logging - result.register_function_hashed(*b"sol_log_", SyscallLog::call)?; - result.register_function_hashed(*b"sol_log_64_", SyscallLogU64::call)?; - result.register_function_hashed(*b"sol_log_compute_units_", SyscallLogBpfComputeUnits::call)?; - result.register_function_hashed(*b"sol_log_pubkey", SyscallLogPubkey::call)?; + result.register_function_hashed(*b"sol_log_", SyscallLog::vm)?; + result.register_function_hashed(*b"sol_log_64_", SyscallLogU64::vm)?; + result.register_function_hashed(*b"sol_log_compute_units_", SyscallLogBpfComputeUnits::vm)?; + result.register_function_hashed(*b"sol_log_pubkey", SyscallLogPubkey::vm)?; // Program defined addresses (PDA) result.register_function_hashed( *b"sol_create_program_address", - SyscallCreateProgramAddress::call, + SyscallCreateProgramAddress::vm, )?; result.register_function_hashed( *b"sol_try_find_program_address", - SyscallTryFindProgramAddress::call, + SyscallTryFindProgramAddress::vm, )?; // Sha256 - result.register_function_hashed(*b"sol_sha256", SyscallSha256::call)?; + result.register_function_hashed(*b"sol_sha256", SyscallHash::vm::)?; // Keccak256 - result.register_function_hashed(*b"sol_keccak256", SyscallKeccak256::call)?; + result.register_function_hashed(*b"sol_keccak256", SyscallHash::vm::)?; // Secp256k1 Recover - result.register_function_hashed(*b"sol_secp256k1_recover", SyscallSecp256k1Recover::call)?; + result.register_function_hashed(*b"sol_secp256k1_recover", SyscallSecp256k1Recover::vm)?; // Blake3 register_feature_gated_function!( result, blake3_syscall_enabled, *b"sol_blake3", - SyscallBlake3::call, + SyscallHash::vm::, )?; // Elliptic Curve Operations @@ -242,78 +339,78 @@ pub fn create_program_runtime_environment_v1<'a>( result, curve25519_syscall_enabled, *b"sol_curve_validate_point", - SyscallCurvePointValidation::call, + SyscallCurvePointValidation::vm, )?; register_feature_gated_function!( result, curve25519_syscall_enabled, *b"sol_curve_group_op", - SyscallCurveGroupOps::call, + SyscallCurveGroupOps::vm, )?; register_feature_gated_function!( result, curve25519_syscall_enabled, *b"sol_curve_multiscalar_mul", - SyscallCurveMultiscalarMultiplication::call, + SyscallCurveMultiscalarMultiplication::vm, )?; // Sysvars - result.register_function_hashed(*b"sol_get_clock_sysvar", SyscallGetClockSysvar::call)?; + result.register_function_hashed(*b"sol_get_clock_sysvar", SyscallGetClockSysvar::vm)?; result.register_function_hashed( *b"sol_get_epoch_schedule_sysvar", - SyscallGetEpochScheduleSysvar::call, + SyscallGetEpochScheduleSysvar::vm, )?; register_feature_gated_function!( result, !disable_fees_sysvar, *b"sol_get_fees_sysvar", - SyscallGetFeesSysvar::call, + SyscallGetFeesSysvar::vm, )?; - result.register_function_hashed(*b"sol_get_rent_sysvar", SyscallGetRentSysvar::call)?; + result.register_function_hashed(*b"sol_get_rent_sysvar", SyscallGetRentSysvar::vm)?; register_feature_gated_function!( result, last_restart_slot_syscall_enabled, *b"sol_get_last_restart_slot", - SyscallGetLastRestartSlotSysvar::call, + SyscallGetLastRestartSlotSysvar::vm, )?; register_feature_gated_function!( result, epoch_rewards_syscall_enabled, *b"sol_get_epoch_rewards_sysvar", - SyscallGetEpochRewardsSysvar::call, + SyscallGetEpochRewardsSysvar::vm, )?; // Memory ops - result.register_function_hashed(*b"sol_memcpy_", SyscallMemcpy::call)?; - result.register_function_hashed(*b"sol_memmove_", SyscallMemmove::call)?; - result.register_function_hashed(*b"sol_memcmp_", SyscallMemcmp::call)?; - result.register_function_hashed(*b"sol_memset_", SyscallMemset::call)?; + result.register_function_hashed(*b"sol_memcpy_", SyscallMemcpy::vm)?; + result.register_function_hashed(*b"sol_memmove_", SyscallMemmove::vm)?; + result.register_function_hashed(*b"sol_memcmp_", SyscallMemcmp::vm)?; + result.register_function_hashed(*b"sol_memset_", SyscallMemset::vm)?; // Processed sibling instructions result.register_function_hashed( *b"sol_get_processed_sibling_instruction", - SyscallGetProcessedSiblingInstruction::call, + SyscallGetProcessedSiblingInstruction::vm, )?; // Stack height - result.register_function_hashed(*b"sol_get_stack_height", SyscallGetStackHeight::call)?; + result.register_function_hashed(*b"sol_get_stack_height", SyscallGetStackHeight::vm)?; // Return data - result.register_function_hashed(*b"sol_set_return_data", SyscallSetReturnData::call)?; - result.register_function_hashed(*b"sol_get_return_data", SyscallGetReturnData::call)?; + result.register_function_hashed(*b"sol_set_return_data", SyscallSetReturnData::vm)?; + result.register_function_hashed(*b"sol_get_return_data", SyscallGetReturnData::vm)?; // Cross-program invocation - result.register_function_hashed(*b"sol_invoke_signed_c", SyscallInvokeSignedC::call)?; - result.register_function_hashed(*b"sol_invoke_signed_rust", SyscallInvokeSignedRust::call)?; + result.register_function_hashed(*b"sol_invoke_signed_c", SyscallInvokeSignedC::vm)?; + result.register_function_hashed(*b"sol_invoke_signed_rust", SyscallInvokeSignedRust::vm)?; // Memory allocator register_feature_gated_function!( result, !disable_deploy_of_alloc_free_syscall, *b"sol_alloc_free_", - SyscallAllocFree::call, + SyscallAllocFree::vm, )?; // Alt_bn128 @@ -321,7 +418,7 @@ pub fn create_program_runtime_environment_v1<'a>( result, enable_alt_bn128_syscall, *b"sol_alt_bn128_group_op", - SyscallAltBn128::call, + SyscallAltBn128::vm, )?; // Big_mod_exp @@ -329,7 +426,7 @@ pub fn create_program_runtime_environment_v1<'a>( result, enable_big_mod_exp_syscall, *b"sol_big_mod_exp", - SyscallBigModExp::call, + SyscallBigModExp::vm, )?; // Poseidon @@ -337,7 +434,7 @@ pub fn create_program_runtime_environment_v1<'a>( result, enable_poseidon_syscall, *b"sol_poseidon", - SyscallPoseidon::call, + SyscallPoseidon::vm, )?; // Accessing remaining compute units @@ -345,7 +442,7 @@ pub fn create_program_runtime_environment_v1<'a>( result, remaining_compute_units_syscall_enabled, *b"sol_remaining_compute_units", - SyscallRemainingComputeUnits::call + SyscallRemainingComputeUnits::vm )?; // Alt_bn128_compression @@ -353,11 +450,11 @@ pub fn create_program_runtime_environment_v1<'a>( result, enable_alt_bn128_compression_syscall, *b"sol_alt_bn128_compression", - SyscallAltBn128Compression::call, + SyscallAltBn128Compression::vm, )?; // Log data - result.register_function_hashed(*b"sol_log_data", SyscallLogData::call)?; + result.register_function_hashed(*b"sol_log_data", SyscallLogData::vm)?; Ok(BuiltinProgram::new_loader(config, result)) } @@ -375,7 +472,10 @@ fn translate( vm_addr: u64, len: u64, ) -> Result { - memory_mapping.map(access_type, vm_addr, len, 0).into() + memory_mapping + .map(access_type, vm_addr, len) + .map_err(|err| err.into()) + .into() } fn translate_type_inner<'a, T>( @@ -494,39 +594,13 @@ fn translate_string_and_do( } } -#[macro_export] -macro_rules! declare_syscall { - ($(#[$attr:meta])* $name:ident, $inner_call:item) => { - $(#[$attr])* - pub struct $name {} - impl $name { - $inner_call - pub fn call( - invoke_context: &mut InvokeContext, - arg_a: u64, - arg_b: u64, - arg_c: u64, - arg_d: u64, - arg_e: u64, - memory_mapping: &mut MemoryMapping, - result: &mut ProgramResult, - ) { - let converted_result: ProgramResult = Self::inner_call( - invoke_context, arg_a, arg_b, arg_c, arg_d, arg_e, memory_mapping, - ).into(); - *result = converted_result; - } - } - }; -} - -declare_syscall!( +declare_builtin_function!( /// Abort syscall functions, called when the SBF program calls `abort()` /// LLVM will insert calls to `abort()` if it detects an untenable situation, /// `abort()` is not intended to be called explicitly by the program. /// Causes the SBF program to be halted immediately SyscallAbort, - fn inner_call( + fn rust( _invoke_context: &mut InvokeContext, _arg1: u64, _arg2: u64, @@ -539,11 +613,11 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Panic syscall function, called when the SBF program calls 'sol_panic_()` /// Causes the SBF program to be halted immediately SyscallPanic, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, file: u64, len: u64, @@ -568,7 +642,7 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Dynamic memory allocation syscall called when the SBF program calls /// `sol_alloc_free_()`. The allocator is expected to allocate/free /// from/to a given chunk of memory and enforce size restrictions. The @@ -576,7 +650,7 @@ declare_syscall!( /// information about that memory (start address and size) is passed /// to the VM to use for enforcement. SyscallAllocFree, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, size: u64, free_addr: u64, @@ -643,10 +717,10 @@ fn translate_and_check_program_address_inputs<'a>( Ok((seeds, program_id)) } -declare_syscall!( +declare_builtin_function!( /// Create a program address SyscallCreateProgramAddress, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, seeds_addr: u64, seeds_len: u64, @@ -684,10 +758,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Create a program address SyscallTryFindProgramAddress, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, seeds_addr: u64, seeds_len: u64, @@ -751,140 +825,10 @@ declare_syscall!( } ); -declare_syscall!( - /// SHA256 - SyscallSha256, - fn inner_call( - invoke_context: &mut InvokeContext, - vals_addr: u64, - vals_len: u64, - result_addr: u64, - _arg4: u64, - _arg5: u64, - memory_mapping: &mut MemoryMapping, - ) -> Result { - let compute_budget = invoke_context.get_compute_budget(); - if compute_budget.sha256_max_slices < vals_len { - ic_msg!( - invoke_context, - "Sha256 hashing {} sequences in one syscall is over the limit {}", - vals_len, - compute_budget.sha256_max_slices, - ); - return Err(SyscallError::TooManySlices.into()); - } - - consume_compute_meter(invoke_context, compute_budget.sha256_base_cost)?; - - let hash_result = translate_slice_mut::( - memory_mapping, - result_addr, - HASH_BYTES as u64, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )?; - let mut hasher = Hasher::default(); - if vals_len > 0 { - let vals = translate_slice::<&[u8]>( - memory_mapping, - vals_addr, - vals_len, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )?; - for val in vals.iter() { - let bytes = translate_slice::( - memory_mapping, - val.as_ptr() as u64, - val.len() as u64, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )?; - let cost = compute_budget.mem_op_base_cost.max( - compute_budget.sha256_byte_cost.saturating_mul( - (val.len() as u64) - .checked_div(2) - .expect("div by non-zero literal"), - ), - ); - consume_compute_meter(invoke_context, cost)?; - hasher.hash(bytes); - } - } - hash_result.copy_from_slice(&hasher.result().to_bytes()); - Ok(0) - } -); - -declare_syscall!( - // Keccak256 - SyscallKeccak256, - fn inner_call( - invoke_context: &mut InvokeContext, - vals_addr: u64, - vals_len: u64, - result_addr: u64, - _arg4: u64, - _arg5: u64, - memory_mapping: &mut MemoryMapping, - ) -> Result { - let compute_budget = invoke_context.get_compute_budget(); - if compute_budget.sha256_max_slices < vals_len { - ic_msg!( - invoke_context, - "Keccak256 hashing {} sequences in one syscall is over the limit {}", - vals_len, - compute_budget.sha256_max_slices, - ); - return Err(SyscallError::TooManySlices.into()); - } - - consume_compute_meter(invoke_context, compute_budget.sha256_base_cost)?; - - let hash_result = translate_slice_mut::( - memory_mapping, - result_addr, - keccak::HASH_BYTES as u64, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )?; - let mut hasher = keccak::Hasher::default(); - if vals_len > 0 { - let vals = translate_slice::<&[u8]>( - memory_mapping, - vals_addr, - vals_len, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )?; - for val in vals.iter() { - let bytes = translate_slice::( - memory_mapping, - val.as_ptr() as u64, - val.len() as u64, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )?; - let cost = compute_budget.mem_op_base_cost.max( - compute_budget.sha256_byte_cost.saturating_mul( - (val.len() as u64) - .checked_div(2) - .expect("div by non-zero literal"), - ), - ); - consume_compute_meter(invoke_context, cost)?; - hasher.hash(bytes); - } - } - hash_result.copy_from_slice(&hasher.result().to_bytes()); - Ok(0) - } -); - -declare_syscall!( +declare_builtin_function!( /// secp256k1_recover SyscallSecp256k1Recover, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, hash_addr: u64, recovery_id_val: u64, @@ -952,12 +896,12 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( // Elliptic Curve Point Validation // // Currently, only curve25519 Edwards and Ristretto representations are supported SyscallCurvePointValidation, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, curve_id: u64, point_addr: u64, @@ -1009,12 +953,12 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( // Elliptic Curve Group Operations // // Currently, only curve25519 Edwards and Ristretto representations are supported SyscallCurveGroupOps, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, curve_id: u64, group_op: u64, @@ -1210,12 +1154,12 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( // Elliptic Curve Multiscalar Multiplication // // Currently, only curve25519 Edwards and Ristretto representations are supported SyscallCurveMultiscalarMultiplication, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, curve_id: u64, scalars_addr: u64, @@ -1315,75 +1259,10 @@ declare_syscall!( } ); -declare_syscall!( - // Blake3 - SyscallBlake3, - fn inner_call( - invoke_context: &mut InvokeContext, - vals_addr: u64, - vals_len: u64, - result_addr: u64, - _arg4: u64, - _arg5: u64, - memory_mapping: &mut MemoryMapping, - ) -> Result { - let compute_budget = invoke_context.get_compute_budget(); - if compute_budget.sha256_max_slices < vals_len { - ic_msg!( - invoke_context, - "Blake3 hashing {} sequences in one syscall is over the limit {}", - vals_len, - compute_budget.sha256_max_slices, - ); - return Err(SyscallError::TooManySlices.into()); - } - - consume_compute_meter(invoke_context, compute_budget.sha256_base_cost)?; - - let hash_result = translate_slice_mut::( - memory_mapping, - result_addr, - blake3::HASH_BYTES as u64, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )?; - let mut hasher = blake3::Hasher::default(); - if vals_len > 0 { - let vals = translate_slice::<&[u8]>( - memory_mapping, - vals_addr, - vals_len, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )?; - for val in vals.iter() { - let bytes = translate_slice::( - memory_mapping, - val.as_ptr() as u64, - val.len() as u64, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )?; - let cost = compute_budget.mem_op_base_cost.max( - compute_budget.sha256_byte_cost.saturating_mul( - (val.len() as u64) - .checked_div(2) - .expect("div by non-zero literal"), - ), - ); - consume_compute_meter(invoke_context, cost)?; - hasher.hash(bytes); - } - } - hash_result.copy_from_slice(&hasher.result().to_bytes()); - Ok(0) - } -); - -declare_syscall!( +declare_builtin_function!( /// Set return data SyscallSetReturnData, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, addr: u64, len: u64, @@ -1429,13 +1308,13 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Get return data SyscallGetReturnData, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, return_data_addr: u64, - mut length: u64, + length: u64, program_id_addr: u64, _arg4: u64, _arg5: u64, @@ -1446,7 +1325,7 @@ declare_syscall!( consume_compute_meter(invoke_context, budget.syscall_base_cost)?; let (program_id, return_data) = invoke_context.transaction_context.get_return_data(); - length = length.min(return_data.len() as u64); + let length = length.min(return_data.len() as u64); if length != 0 { let cost = length .saturating_add(size_of::() as u64) @@ -1494,10 +1373,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Get a processed sigling instruction SyscallGetProcessedSiblingInstruction, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, index: u64, meta_addr: u64, @@ -1640,10 +1519,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Get current call stack height SyscallGetStackHeight, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, _arg1: u64, _arg2: u64, @@ -1660,10 +1539,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// alt_bn128 group operations SyscallAltBn128, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, group_op: u64, input_addr: u64, @@ -1747,10 +1626,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Big integer modular exponentiation SyscallBigModExp, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, params: u64, return_value: u64, @@ -1826,10 +1705,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( // Poseidon SyscallPoseidon, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, parameters: u64, endianness: u64, @@ -1898,10 +1777,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Read remaining compute units SyscallRemainingComputeUnits, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, _arg1: u64, _arg2: u64, @@ -1918,10 +1797,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// alt_bn128 g1 and g2 compression and decompression SyscallAltBn128Compression, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, op: u64, input_addr: u64, @@ -2021,6 +1900,75 @@ declare_syscall!( } ); +declare_builtin_function!( + // Generic Hashing Syscall + SyscallHash, + fn rust( + invoke_context: &mut InvokeContext, + vals_addr: u64, + vals_len: u64, + result_addr: u64, + _arg4: u64, + _arg5: u64, + memory_mapping: &mut MemoryMapping, + ) -> Result { + let compute_budget = invoke_context.get_compute_budget(); + let hash_base_cost = H::get_base_cost(compute_budget); + let hash_byte_cost = H::get_byte_cost(compute_budget); + let hash_max_slices = H::get_max_slices(compute_budget); + if hash_max_slices < vals_len { + ic_msg!( + invoke_context, + "{} Hashing {} sequences in one syscall is over the limit {}", + H::NAME, + vals_len, + hash_max_slices, + ); + return Err(SyscallError::TooManySlices.into()); + } + + consume_compute_meter(invoke_context, hash_base_cost)?; + + let hash_result = translate_slice_mut::( + memory_mapping, + result_addr, + std::mem::size_of::() as u64, + invoke_context.get_check_aligned(), + invoke_context.get_check_size(), + )?; + let mut hasher = H::create_hasher(); + if vals_len > 0 { + let vals = translate_slice::<&[u8]>( + memory_mapping, + vals_addr, + vals_len, + invoke_context.get_check_aligned(), + invoke_context.get_check_size(), + )?; + for val in vals.iter() { + let bytes = translate_slice::( + memory_mapping, + val.as_ptr() as u64, + val.len() as u64, + invoke_context.get_check_aligned(), + invoke_context.get_check_size(), + )?; + let cost = compute_budget.mem_op_base_cost.max( + hash_byte_cost.saturating_mul( + (val.len() as u64) + .checked_div(2) + .expect("div by non-zero literal"), + ), + ); + consume_compute_meter(invoke_context, cost)?; + hasher.hash(bytes); + } + } + hash_result.copy_from_slice(hasher.result().as_ref()); + Ok(0) + } +); + #[cfg(test)] #[allow(clippy::arithmetic_side_effects)] #[allow(clippy::indexing_slicing)] @@ -2034,16 +1982,13 @@ mod tests { core::slice, solana_program_runtime::{invoke_context::InvokeContext, with_mock_invoke_context}, solana_rbpf::{ - elf::SBPFVersion, - error::EbpfError, - memory_region::MemoryRegion, - vm::{BuiltinFunction, Config}, + error::EbpfError, memory_region::MemoryRegion, program::SBPFVersion, vm::Config, }, solana_sdk::{ account::{create_account_shared_data_for_test, AccountSharedData}, bpf_loader, fee_calculator::FeeCalculator, - hash::hashv, + hash::{hashv, HASH_BYTES}, instruction::Instruction, program::check_type_assumptions, stable_layout::stable_instruction::StableInstruction, @@ -2057,9 +2002,8 @@ mod tests { macro_rules! assert_access_violation { ($result:expr, $va:expr, $len:expr) => { match $result.unwrap_err().downcast_ref::().unwrap() { - EbpfError::AccessViolation(_, _, va, len, _) if $va == *va && $len == *len => {} - EbpfError::StackAccessViolation(_, _, va, len, _) if $va == *va && $len == *len => { - } + EbpfError::AccessViolation(_, va, len, _) if $va == *va && $len == *len => {} + EbpfError::StackAccessViolation(_, va, len, _) if $va == *va && $len == *len => {} _ => panic!(), } }; @@ -2295,17 +2239,7 @@ mod tests { prepare_mockup!(invoke_context, program_id, bpf_loader::id()); let config = Config::default(); let mut memory_mapping = MemoryMapping::new(vec![], &config, &SBPFVersion::V2).unwrap(); - let mut result = ProgramResult::Ok(0); - SyscallAbort::call( - &mut invoke_context, - 0, - 0, - 0, - 0, - 0, - &mut memory_mapping, - &mut result, - ); + let result = SyscallAbort::rust(&mut invoke_context, 0, 0, 0, 0, 0, &mut memory_mapping); result.unwrap(); } @@ -2324,8 +2258,7 @@ mod tests { .unwrap(); invoke_context.mock_set_remaining(string.len() as u64 - 1); - let mut result = ProgramResult::Ok(0); - SyscallPanic::call( + let result = SyscallPanic::rust( &mut invoke_context, 0x100000000, string.len() as u64, @@ -2333,16 +2266,14 @@ mod tests { 84, 0, &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded + Result::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded ); invoke_context.mock_set_remaining(string.len() as u64); - let mut result = ProgramResult::Ok(0); - SyscallPanic::call( + let result = SyscallPanic::rust( &mut invoke_context, 0x100000000, string.len() as u64, @@ -2350,7 +2281,6 @@ mod tests { 84, 0, &mut memory_mapping, - &mut result, ); result.unwrap(); } @@ -2369,8 +2299,7 @@ mod tests { .unwrap(); invoke_context.mock_set_remaining(400 - 1); - let mut result = ProgramResult::Ok(0); - SyscallLog::call( + let result = SyscallLog::rust( &mut invoke_context, 0x100000001, // AccessViolation string.len() as u64, @@ -2378,11 +2307,9 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_access_violation!(result, 0x100000001, string.len() as u64); - let mut result = ProgramResult::Ok(0); - SyscallLog::call( + let result = SyscallLog::rust( &mut invoke_context, 0x100000000, string.len() as u64 * 2, // AccessViolation @@ -2390,12 +2317,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_access_violation!(result, 0x100000000, string.len() as u64 * 2); - let mut result = ProgramResult::Ok(0); - SyscallLog::call( + let result = SyscallLog::rust( &mut invoke_context, 0x100000000, string.len() as u64, @@ -2403,11 +2328,9 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); result.unwrap(); - let mut result = ProgramResult::Ok(0); - SyscallLog::call( + let result = SyscallLog::rust( &mut invoke_context, 0x100000000, string.len() as u64, @@ -2415,11 +2338,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded + Result::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded ); assert_eq!( @@ -2440,17 +2362,7 @@ mod tests { invoke_context.mock_set_remaining(cost); let config = Config::default(); let mut memory_mapping = MemoryMapping::new(vec![], &config, &SBPFVersion::V2).unwrap(); - let mut result = ProgramResult::Ok(0); - SyscallLogU64::call( - &mut invoke_context, - 1, - 2, - 3, - 4, - 5, - &mut memory_mapping, - &mut result, - ); + let result = SyscallLogU64::rust(&mut invoke_context, 1, 2, 3, 4, 5, &mut memory_mapping); result.unwrap(); assert_eq!( @@ -2477,8 +2389,7 @@ mod tests { ) .unwrap(); - let mut result = ProgramResult::Ok(0); - SyscallLogPubkey::call( + let result = SyscallLogPubkey::rust( &mut invoke_context, 0x100000001, // AccessViolation 32, @@ -2486,30 +2397,19 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_access_violation!(result, 0x100000001, 32); invoke_context.mock_set_remaining(1); - let mut result = ProgramResult::Ok(0); - SyscallLogPubkey::call( - &mut invoke_context, - 100, - 32, - 0, - 0, - 0, - &mut memory_mapping, - &mut result, - ); + let result = + SyscallLogPubkey::rust(&mut invoke_context, 100, 32, 0, 0, 0, &mut memory_mapping); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded + Result::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded ); invoke_context.mock_set_remaining(cost); - let mut result = ProgramResult::Ok(0); - SyscallLogPubkey::call( + let result = SyscallLogPubkey::rust( &mut invoke_context, 0x100000000, 0, @@ -2517,7 +2417,6 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); result.unwrap(); @@ -2540,8 +2439,7 @@ mod tests { let mut vm = vm.unwrap(); let invoke_context = &mut vm.context_object_pointer; let memory_mapping = &mut vm.memory_mapping; - let mut result = ProgramResult::Ok(0); - SyscallAllocFree::call( + let result = SyscallAllocFree::rust( invoke_context, solana_sdk::entrypoint::HEAP_LENGTH as u64, 0, @@ -2549,11 +2447,9 @@ mod tests { 0, 0, memory_mapping, - &mut result, ); assert_ne!(result.unwrap(), 0); - let mut result = ProgramResult::Ok(0); - SyscallAllocFree::call( + let result = SyscallAllocFree::rust( invoke_context, solana_sdk::entrypoint::HEAP_LENGTH as u64, 0, @@ -2561,20 +2457,10 @@ mod tests { 0, 0, memory_mapping, - &mut result, ); assert_eq!(result.unwrap(), 0); - let mut result = ProgramResult::Ok(0); - SyscallAllocFree::call( - invoke_context, - u64::MAX, - 0, - 0, - 0, - 0, - memory_mapping, - &mut result, - ); + let result = + SyscallAllocFree::rust(invoke_context, u64::MAX, 0, 0, 0, 0, memory_mapping); assert_eq!(result.unwrap(), 0); } @@ -2587,12 +2473,10 @@ mod tests { let invoke_context = &mut vm.context_object_pointer; let memory_mapping = &mut vm.memory_mapping; for _ in 0..100 { - let mut result = ProgramResult::Ok(0); - SyscallAllocFree::call(invoke_context, 1, 0, 0, 0, 0, memory_mapping, &mut result); + let result = SyscallAllocFree::rust(invoke_context, 1, 0, 0, 0, 0, memory_mapping); assert_ne!(result.unwrap(), 0); } - let mut result = ProgramResult::Ok(0); - SyscallAllocFree::call( + let result = SyscallAllocFree::rust( invoke_context, solana_sdk::entrypoint::HEAP_LENGTH as u64, 0, @@ -2600,7 +2484,6 @@ mod tests { 0, 0, memory_mapping, - &mut result, ); assert_eq!(result.unwrap(), 0); } @@ -2613,12 +2496,10 @@ mod tests { let invoke_context = &mut vm.context_object_pointer; let memory_mapping = &mut vm.memory_mapping; for _ in 0..12 { - let mut result = ProgramResult::Ok(0); - SyscallAllocFree::call(invoke_context, 1, 0, 0, 0, 0, memory_mapping, &mut result); + let result = SyscallAllocFree::rust(invoke_context, 1, 0, 0, 0, 0, memory_mapping); assert_ne!(result.unwrap(), 0); } - let mut result = ProgramResult::Ok(0); - SyscallAllocFree::call( + let result = SyscallAllocFree::rust( invoke_context, solana_sdk::entrypoint::HEAP_LENGTH as u64, 0, @@ -2626,7 +2507,6 @@ mod tests { 0, 0, memory_mapping, - &mut result, ); assert_eq!(result.unwrap(), 0); } @@ -2639,8 +2519,7 @@ mod tests { let mut vm = vm.unwrap(); let invoke_context = &mut vm.context_object_pointer; let memory_mapping = &mut vm.memory_mapping; - let mut result = ProgramResult::Ok(0); - SyscallAllocFree::call( + let result = SyscallAllocFree::rust( invoke_context, size_of::() as u64, 0, @@ -2648,7 +2527,6 @@ mod tests { 0, 0, memory_mapping, - &mut result, ); let address = result.unwrap(); assert_ne!(address, 0); @@ -2705,8 +2583,7 @@ mod tests { * 4, ); - let mut result = ProgramResult::Ok(0); - SyscallSha256::call( + let result = SyscallHash::rust::( &mut invoke_context, ro_va, ro_len, @@ -2714,14 +2591,12 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); result.unwrap(); let hash_local = hashv(&[bytes1.as_ref(), bytes2.as_ref()]).to_bytes(); assert_eq!(hash_result, hash_local); - let mut result = ProgramResult::Ok(0); - SyscallSha256::call( + let result = SyscallHash::rust::( &mut invoke_context, ro_va - 1, // AccessViolation ro_len, @@ -2729,11 +2604,9 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_access_violation!(result, ro_va - 1, 32); - let mut result = ProgramResult::Ok(0); - SyscallSha256::call( + let result = SyscallHash::rust::( &mut invoke_context, ro_va, ro_len + 1, // AccessViolation @@ -2741,11 +2614,9 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_access_violation!(result, ro_va, 48); - let mut result = ProgramResult::Ok(0); - SyscallSha256::call( + let result = SyscallHash::rust::( &mut invoke_context, ro_va, ro_len, @@ -2753,11 +2624,9 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_access_violation!(result, rw_va - 1, HASH_BYTES as u64); - let mut result = ProgramResult::Ok(0); - SyscallSha256::call( + let result = SyscallHash::rust::( &mut invoke_context, ro_va, ro_len, @@ -2765,11 +2634,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded + Result::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded ); } @@ -2809,8 +2677,7 @@ mod tests { * 2, ); - let mut result = ProgramResult::Ok(0); - SyscallCurvePointValidation::call( + let result = SyscallCurvePointValidation::rust( &mut invoke_context, CURVE25519_EDWARDS, valid_bytes_va, @@ -2818,12 +2685,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_eq!(0, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurvePointValidation::call( + let result = SyscallCurvePointValidation::rust( &mut invoke_context, CURVE25519_EDWARDS, invalid_bytes_va, @@ -2831,12 +2696,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_eq!(1, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurvePointValidation::call( + let result = SyscallCurvePointValidation::rust( &mut invoke_context, CURVE25519_EDWARDS, valid_bytes_va, @@ -2844,11 +2707,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded + Result::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded ); } @@ -2888,8 +2750,7 @@ mod tests { * 2, ); - let mut result = ProgramResult::Ok(0); - SyscallCurvePointValidation::call( + let result = SyscallCurvePointValidation::rust( &mut invoke_context, CURVE25519_RISTRETTO, valid_bytes_va, @@ -2897,12 +2758,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_eq!(0, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurvePointValidation::call( + let result = SyscallCurvePointValidation::rust( &mut invoke_context, CURVE25519_RISTRETTO, invalid_bytes_va, @@ -2910,12 +2769,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_eq!(1, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurvePointValidation::call( + let result = SyscallCurvePointValidation::rust( &mut invoke_context, CURVE25519_RISTRETTO, valid_bytes_va, @@ -2923,11 +2780,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded + Result::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded ); } @@ -2989,8 +2845,7 @@ mod tests { * 2, ); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_EDWARDS, ADD, @@ -2998,7 +2853,6 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(0, result.unwrap()); @@ -3008,8 +2862,7 @@ mod tests { ]; assert_eq!(expected_sum, result_point); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_EDWARDS, ADD, @@ -3017,12 +2870,10 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(1, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_EDWARDS, SUB, @@ -3030,7 +2881,6 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(0, result.unwrap()); @@ -3040,8 +2890,7 @@ mod tests { ]; assert_eq!(expected_difference, result_point); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_EDWARDS, SUB, @@ -3049,12 +2898,10 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(1, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_EDWARDS, MUL, @@ -3062,7 +2909,6 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); result.unwrap(); @@ -3072,8 +2918,7 @@ mod tests { ]; assert_eq!(expected_product, result_point); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_EDWARDS, MUL, @@ -3081,12 +2926,10 @@ mod tests { invalid_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(1, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_EDWARDS, MUL, @@ -3094,11 +2937,10 @@ mod tests { invalid_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded + Result::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded ); } @@ -3160,8 +3002,7 @@ mod tests { * 2, ); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_RISTRETTO, ADD, @@ -3169,7 +3010,6 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(0, result.unwrap()); @@ -3179,8 +3019,7 @@ mod tests { ]; assert_eq!(expected_sum, result_point); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_RISTRETTO, ADD, @@ -3188,12 +3027,10 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(1, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_RISTRETTO, SUB, @@ -3201,7 +3038,6 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(0, result.unwrap()); @@ -3211,8 +3047,7 @@ mod tests { ]; assert_eq!(expected_difference, result_point); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_RISTRETTO, SUB, @@ -3220,13 +3055,11 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(1, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_RISTRETTO, MUL, @@ -3234,7 +3067,6 @@ mod tests { right_point_va, result_point_va, &mut memory_mapping, - &mut result, ); result.unwrap(); @@ -3244,8 +3076,7 @@ mod tests { ]; assert_eq!(expected_product, result_point); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_RISTRETTO, MUL, @@ -3253,13 +3084,11 @@ mod tests { invalid_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(1, result.unwrap()); - let mut result = ProgramResult::Ok(0); - SyscallCurveGroupOps::call( + let result = SyscallCurveGroupOps::rust( &mut invoke_context, CURVE25519_RISTRETTO, MUL, @@ -3267,11 +3096,10 @@ mod tests { invalid_point_va, result_point_va, &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded + Result::Err(error) if error.downcast_ref::().unwrap() == &InstructionError::ComputationalBudgetExceeded ); } @@ -3348,8 +3176,7 @@ mod tests { .curve25519_ristretto_msm_incremental_cost, ); - let mut result = ProgramResult::Ok(0); - SyscallCurveMultiscalarMultiplication::call( + let result = SyscallCurveMultiscalarMultiplication::rust( &mut invoke_context, CURVE25519_EDWARDS, scalars_va, @@ -3357,7 +3184,6 @@ mod tests { 2, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(0, result.unwrap()); @@ -3367,8 +3193,7 @@ mod tests { ]; assert_eq!(expected_product, result_point); - let mut result = ProgramResult::Ok(0); - SyscallCurveMultiscalarMultiplication::call( + let result = SyscallCurveMultiscalarMultiplication::rust( &mut invoke_context, CURVE25519_RISTRETTO, scalars_va, @@ -3376,7 +3201,6 @@ mod tests { 2, result_point_va, &mut memory_mapping, - &mut result, ); assert_eq!(0, result.unwrap()); @@ -3488,8 +3312,7 @@ mod tests { ) .unwrap(); - let mut result = ProgramResult::Ok(0); - SyscallGetClockSysvar::call( + let result = SyscallGetClockSysvar::rust( &mut invoke_context, got_clock_va, 0, @@ -3497,7 +3320,6 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); result.unwrap(); assert_eq!(got_clock, src_clock); @@ -3526,8 +3348,7 @@ mod tests { ) .unwrap(); - let mut result = ProgramResult::Ok(0); - SyscallGetEpochScheduleSysvar::call( + let result = SyscallGetEpochScheduleSysvar::rust( &mut invoke_context, got_epochschedule_va, 0, @@ -3535,7 +3356,6 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); result.unwrap(); assert_eq!(got_epochschedule, src_epochschedule); @@ -3565,8 +3385,7 @@ mod tests { ) .unwrap(); - let mut result = ProgramResult::Ok(0); - SyscallGetFeesSysvar::call( + let result = SyscallGetFeesSysvar::rust( &mut invoke_context, got_fees_va, 0, @@ -3574,7 +3393,6 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); result.unwrap(); assert_eq!(got_fees, src_fees); @@ -3599,8 +3417,7 @@ mod tests { ) .unwrap(); - let mut result = ProgramResult::Ok(0); - SyscallGetRentSysvar::call( + let result = SyscallGetRentSysvar::rust( &mut invoke_context, got_rent_va, 0, @@ -3608,7 +3425,6 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); result.unwrap(); assert_eq!(got_rent, src_rent); @@ -3635,8 +3451,7 @@ mod tests { ) .unwrap(); - let mut result = ProgramResult::Ok(0); - SyscallGetEpochRewardsSysvar::call( + let result = SyscallGetEpochRewardsSysvar::rust( &mut invoke_context, got_rewards_va, 0, @@ -3644,7 +3459,6 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); result.unwrap(); assert_eq!(got_rewards, src_rewards); @@ -3658,12 +3472,22 @@ mod tests { } } + type BuiltinFunctionRustInterface<'a> = fn( + &mut InvokeContext<'a>, + u64, + u64, + u64, + u64, + u64, + &mut MemoryMapping, + ) -> Result>; + fn call_program_address_common<'a, 'b: 'a>( invoke_context: &'a mut InvokeContext<'b>, seeds: &[&[u8]], program_id: &Pubkey, overlap_outputs: bool, - syscall: BuiltinFunction>, + syscall: BuiltinFunctionRustInterface<'b>, ) -> Result<(Pubkey, u8), Error> { const SEEDS_VA: u64 = 0x100000000; const PROGRAM_ID_VA: u64 = 0x200000000; @@ -3696,8 +3520,7 @@ mod tests { )); let mut memory_mapping = MemoryMapping::new(regions, &config, &SBPFVersion::V2).unwrap(); - let mut result = ProgramResult::Ok(0); - syscall( + let result = syscall( invoke_context, SEEDS_VA, seeds.len() as u64, @@ -3709,9 +3532,8 @@ mod tests { BUMP_SEED_VA }, &mut memory_mapping, - &mut result, ); - Result::::from(result).map(|_| (address, bump_seed)) + result.map(|_| (address, bump_seed)) } fn create_program_address( @@ -3724,7 +3546,7 @@ mod tests { seeds, address, false, - SyscallCreateProgramAddress::call, + SyscallCreateProgramAddress::rust, )?; Ok(address) } @@ -3739,7 +3561,7 @@ mod tests { seeds, address, false, - SyscallTryFindProgramAddress::call, + SyscallTryFindProgramAddress::rust, ) } @@ -3766,8 +3588,7 @@ mod tests { prepare_mockup!(invoke_context, program_id, bpf_loader::id()); - let mut result = ProgramResult::Ok(0); - SyscallSetReturnData::call( + let result = SyscallSetReturnData::rust( &mut invoke_context, SRC_VA, data.len() as u64, @@ -3775,12 +3596,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_eq!(result.unwrap(), 0); - let mut result = ProgramResult::Ok(0); - SyscallGetReturnData::call( + let result = SyscallGetReturnData::rust( &mut invoke_context, DST_VA, data_buffer.len() as u64, @@ -3788,14 +3607,12 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_eq!(result.unwrap() as usize, data.len()); assert_eq!(data.get(0..data_buffer.len()).unwrap(), data_buffer); assert_eq!(id_buffer, program_id.to_bytes()); - let mut result = ProgramResult::Ok(0); - SyscallGetReturnData::call( + let result = SyscallGetReturnData::rust( &mut invoke_context, PROGRAM_ID_VA, data_buffer.len() as u64, @@ -3803,11 +3620,10 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &SyscallError::CopyOverlapping + Result::Err(error) if error.downcast_ref::().unwrap() == &SyscallError::CopyOverlapping ); } @@ -3901,8 +3717,7 @@ mod tests { .unwrap(); invoke_context.mock_set_remaining(syscall_base_cost); - let mut result = ProgramResult::Ok(0); - SyscallGetProcessedSiblingInstruction::call( + let result = SyscallGetProcessedSiblingInstruction::rust( &mut invoke_context, 0, VM_BASE_ADDRESS.saturating_add(META_OFFSET as u64), @@ -3910,7 +3725,6 @@ mod tests { VM_BASE_ADDRESS.saturating_add(DATA_OFFSET as u64), VM_BASE_ADDRESS.saturating_add(ACCOUNTS_OFFSET as u64), &mut memory_mapping, - &mut result, ); assert_eq!(result.unwrap(), 1); { @@ -3933,8 +3747,7 @@ mod tests { } invoke_context.mock_set_remaining(syscall_base_cost); - let mut result = ProgramResult::Ok(0); - SyscallGetProcessedSiblingInstruction::call( + let result = SyscallGetProcessedSiblingInstruction::rust( &mut invoke_context, 1, VM_BASE_ADDRESS.saturating_add(META_OFFSET as u64), @@ -3942,13 +3755,11 @@ mod tests { VM_BASE_ADDRESS.saturating_add(DATA_OFFSET as u64), VM_BASE_ADDRESS.saturating_add(ACCOUNTS_OFFSET as u64), &mut memory_mapping, - &mut result, ); assert_eq!(result.unwrap(), 0); invoke_context.mock_set_remaining(syscall_base_cost); - let mut result = ProgramResult::Ok(0); - SyscallGetProcessedSiblingInstruction::call( + let result = SyscallGetProcessedSiblingInstruction::rust( &mut invoke_context, 0, VM_BASE_ADDRESS.saturating_add(META_OFFSET as u64), @@ -3956,11 +3767,10 @@ mod tests { VM_BASE_ADDRESS.saturating_add(META_OFFSET as u64), VM_BASE_ADDRESS.saturating_add(META_OFFSET as u64), &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &SyscallError::CopyOverlapping + Result::Err(error) if error.downcast_ref::().unwrap() == &SyscallError::CopyOverlapping ); } @@ -4142,7 +3952,7 @@ mod tests { seeds, &address, true, - SyscallTryFindProgramAddress::call, + SyscallTryFindProgramAddress::rust, ), Result::Err(error) if error.downcast_ref::().unwrap() == &SyscallError::CopyOverlapping ); @@ -4190,8 +4000,7 @@ mod tests { + (MAX_LEN * MAX_LEN) / budget.big_modular_exponentiation_cost, ); - let mut result = ProgramResult::Ok(0); - SyscallBigModExp::call( + let result = SyscallBigModExp::rust( &mut invoke_context, VADDR_PARAMS, VADDR_OUT, @@ -4199,7 +4008,6 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_eq!(result.unwrap(), 0); @@ -4233,8 +4041,7 @@ mod tests { + (INV_LEN * INV_LEN) / budget.big_modular_exponentiation_cost, ); - let mut result = ProgramResult::Ok(0); - SyscallBigModExp::call( + let result = SyscallBigModExp::rust( &mut invoke_context, VADDR_PARAMS, VADDR_OUT, @@ -4242,12 +4049,11 @@ mod tests { 0, 0, &mut memory_mapping, - &mut result, ); assert_matches!( result, - ProgramResult::Err(error) if error.downcast_ref::().unwrap() == &SyscallError::InvalidLength + Result::Err(error) if error.downcast_ref::().unwrap() == &SyscallError::InvalidLength ); } } diff --git a/programs/bpf_loader/src/syscalls/sysvar.rs b/programs/bpf_loader/src/syscalls/sysvar.rs index d86402b34078e5..e8777569cef1da 100644 --- a/programs/bpf_loader/src/syscalls/sysvar.rs +++ b/programs/bpf_loader/src/syscalls/sysvar.rs @@ -1,4 +1,4 @@ -use {super::*, crate::declare_syscall}; +use super::*; fn get_sysvar( sysvar: Result, InstructionError>, @@ -22,10 +22,10 @@ fn get_sysvar( Ok(SUCCESS) } -declare_syscall!( +declare_builtin_function!( /// Get a Clock sysvar SyscallGetClockSysvar, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, var_addr: u64, _arg2: u64, @@ -44,10 +44,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Get a EpochSchedule sysvar SyscallGetEpochScheduleSysvar, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, var_addr: u64, _arg2: u64, @@ -66,10 +66,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Get a EpochRewards sysvar SyscallGetEpochRewardsSysvar, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, var_addr: u64, _arg2: u64, @@ -88,10 +88,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Get a Fees sysvar SyscallGetFeesSysvar, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, var_addr: u64, _arg2: u64, @@ -113,10 +113,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Get a Rent sysvar SyscallGetRentSysvar, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, var_addr: u64, _arg2: u64, @@ -135,10 +135,10 @@ declare_syscall!( } ); -declare_syscall!( +declare_builtin_function!( /// Get a Last Restart Slot sysvar SyscallGetLastRestartSlotSysvar, - fn inner_call( + fn rust( invoke_context: &mut InvokeContext, var_addr: u64, _arg2: u64, diff --git a/programs/compute-budget/src/lib.rs b/programs/compute-budget/src/lib.rs index e296ca3a2f8324..01bbd7a8b4f21c 100644 --- a/programs/compute-budget/src/lib.rs +++ b/programs/compute-budget/src/lib.rs @@ -2,11 +2,7 @@ use solana_program_runtime::declare_process_instruction; pub const DEFAULT_COMPUTE_UNITS: u64 = 150; -declare_process_instruction!( - process_instruction, - DEFAULT_COMPUTE_UNITS, - |_invoke_context| { - // Do nothing, compute budget instructions handled by the runtime - Ok(()) - } -); +declare_process_instruction!(Entrypoint, DEFAULT_COMPUTE_UNITS, |_invoke_context| { + // Do nothing, compute budget instructions handled by the runtime + Ok(()) +}); diff --git a/programs/config/src/config_processor.rs b/programs/config/src/config_processor.rs index 628e77cb93af43..d053405698452a 100644 --- a/programs/config/src/config_processor.rs +++ b/programs/config/src/config_processor.rs @@ -13,131 +13,127 @@ use { pub const DEFAULT_COMPUTE_UNITS: u64 = 450; -declare_process_instruction!( - process_instruction, - DEFAULT_COMPUTE_UNITS, - |invoke_context| { - let transaction_context = &invoke_context.transaction_context; - let instruction_context = transaction_context.get_current_instruction_context()?; - let data = instruction_context.get_instruction_data(); - - let key_list: ConfigKeys = limited_deserialize(data)?; - let config_account_key = transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(0)?, - )?; - let config_account = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - let is_config_account_signer = config_account.is_signer(); - let current_data: ConfigKeys = { - if config_account.get_owner() != &crate::id() { - return Err(InstructionError::InvalidAccountOwner); - } +declare_process_instruction!(Entrypoint, DEFAULT_COMPUTE_UNITS, |invoke_context| { + let transaction_context = &invoke_context.transaction_context; + let instruction_context = transaction_context.get_current_instruction_context()?; + let data = instruction_context.get_instruction_data(); + + let key_list: ConfigKeys = limited_deserialize(data)?; + let config_account_key = transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(0)?, + )?; + let config_account = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + let is_config_account_signer = config_account.is_signer(); + let current_data: ConfigKeys = { + if config_account.get_owner() != &crate::id() { + return Err(InstructionError::InvalidAccountOwner); + } - deserialize(config_account.get_data()).map_err(|err| { - ic_msg!( - invoke_context, - "Unable to deserialize config account: {}", - err - ); - InstructionError::InvalidAccountData - })? - }; - drop(config_account); - - let current_signer_keys: Vec = current_data - .keys - .iter() - .filter(|(_, is_signer)| *is_signer) - .map(|(pubkey, _)| *pubkey) - .collect(); - if current_signer_keys.is_empty() { - // Config account keypair must be a signer on account initialization, - // or when no signers specified in Config data - if !is_config_account_signer { - return Err(InstructionError::MissingRequiredSignature); - } + deserialize(config_account.get_data()).map_err(|err| { + ic_msg!( + invoke_context, + "Unable to deserialize config account: {}", + err + ); + InstructionError::InvalidAccountData + })? + }; + drop(config_account); + + let current_signer_keys: Vec = current_data + .keys + .iter() + .filter(|(_, is_signer)| *is_signer) + .map(|(pubkey, _)| *pubkey) + .collect(); + if current_signer_keys.is_empty() { + // Config account keypair must be a signer on account initialization, + // or when no signers specified in Config data + if !is_config_account_signer { + return Err(InstructionError::MissingRequiredSignature); } + } - let mut counter = 0; - for (signer, _) in key_list.keys.iter().filter(|(_, is_signer)| *is_signer) { - counter += 1; - if signer != config_account_key { - let signer_account = instruction_context - .try_borrow_instruction_account(transaction_context, counter as IndexOfAccount) - .map_err(|_| { - ic_msg!( - invoke_context, - "account {:?} is not in account list", - signer, - ); - InstructionError::MissingRequiredSignature - })?; - if !signer_account.is_signer() { - ic_msg!( - invoke_context, - "account {:?} signer_key().is_none()", - signer - ); - return Err(InstructionError::MissingRequiredSignature); - } - if signer_account.get_key() != signer { + let mut counter = 0; + for (signer, _) in key_list.keys.iter().filter(|(_, is_signer)| *is_signer) { + counter += 1; + if signer != config_account_key { + let signer_account = instruction_context + .try_borrow_instruction_account(transaction_context, counter as IndexOfAccount) + .map_err(|_| { ic_msg!( invoke_context, - "account[{:?}].signer_key() does not match Config data)", - counter + 1 + "account {:?} is not in account list", + signer, ); - return Err(InstructionError::MissingRequiredSignature); - } - // If Config account is already initialized, update signatures must match Config data - if !current_data.keys.is_empty() - && !current_signer_keys.iter().any(|pubkey| pubkey == signer) - { - ic_msg!( - invoke_context, - "account {:?} is not in stored signer list", - signer - ); - return Err(InstructionError::MissingRequiredSignature); - } - } else if !is_config_account_signer { - ic_msg!(invoke_context, "account[0].signer_key().is_none()"); + InstructionError::MissingRequiredSignature + })?; + if !signer_account.is_signer() { + ic_msg!( + invoke_context, + "account {:?} signer_key().is_none()", + signer + ); return Err(InstructionError::MissingRequiredSignature); } - } - - if invoke_context - .feature_set - .is_active(&feature_set::dedupe_config_program_signers::id()) - { - let total_new_keys = key_list.keys.len(); - let unique_new_keys = key_list.keys.into_iter().collect::>(); - if unique_new_keys.len() != total_new_keys { - ic_msg!(invoke_context, "new config contains duplicate keys"); - return Err(InstructionError::InvalidArgument); + if signer_account.get_key() != signer { + ic_msg!( + invoke_context, + "account[{:?}].signer_key() does not match Config data)", + counter + 1 + ); + return Err(InstructionError::MissingRequiredSignature); } - } - - // Check for Config data signers not present in incoming account update - if current_signer_keys.len() > counter { - ic_msg!( - invoke_context, - "too few signers: {:?}; expected: {:?}", - counter, - current_signer_keys.len() - ); + // If Config account is already initialized, update signatures must match Config data + if !current_data.keys.is_empty() + && !current_signer_keys.iter().any(|pubkey| pubkey == signer) + { + ic_msg!( + invoke_context, + "account {:?} is not in stored signer list", + signer + ); + return Err(InstructionError::MissingRequiredSignature); + } + } else if !is_config_account_signer { + ic_msg!(invoke_context, "account[0].signer_key().is_none()"); return Err(InstructionError::MissingRequiredSignature); } + } - let mut config_account = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - if config_account.get_data().len() < data.len() { - ic_msg!(invoke_context, "instruction data too large"); - return Err(InstructionError::InvalidInstructionData); + if invoke_context + .feature_set + .is_active(&feature_set::dedupe_config_program_signers::id()) + { + let total_new_keys = key_list.keys.len(); + let unique_new_keys = key_list.keys.into_iter().collect::>(); + if unique_new_keys.len() != total_new_keys { + ic_msg!(invoke_context, "new config contains duplicate keys"); + return Err(InstructionError::InvalidArgument); } - config_account.get_data_mut()?[..data.len()].copy_from_slice(data); - Ok(()) } -); + + // Check for Config data signers not present in incoming account update + if current_signer_keys.len() > counter { + ic_msg!( + invoke_context, + "too few signers: {:?}; expected: {:?}", + counter, + current_signer_keys.len() + ); + return Err(InstructionError::MissingRequiredSignature); + } + + let mut config_account = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + if config_account.get_data().len() < data.len() { + ic_msg!(invoke_context, "instruction data too large"); + return Err(InstructionError::InvalidInstructionData); + } + config_account.get_data_mut()?[..data.len()].copy_from_slice(data); + Ok(()) +}); #[cfg(test)] mod tests { @@ -169,7 +165,7 @@ mod tests { transaction_accounts, instruction_accounts, expected_result, - super::process_instruction, + Entrypoint::vm, |_invoke_context| {}, |_invoke_context| {}, ) diff --git a/programs/loader-v4/src/lib.rs b/programs/loader-v4/src/lib.rs index 4645b33c26a6e0..4047de8b092048 100644 --- a/programs/loader-v4/src/lib.rs +++ b/programs/loader-v4/src/lib.rs @@ -12,10 +12,12 @@ use { }, solana_rbpf::{ aligned_memory::AlignedMemory, - ebpf, - elf::{Executable, FunctionRegistry}, + declare_builtin_function, ebpf, + elf::Executable, + error::ProgramResult, memory_region::{MemoryMapping, MemoryRegion}, - vm::{BuiltinProgram, Config, ContextObject, EbpfVm, ProgramResult}, + program::{BuiltinProgram, FunctionRegistry}, + vm::{Config, ContextObject, EbpfVm}, }, solana_sdk::{ entrypoint::SUCCESS, @@ -81,7 +83,6 @@ pub fn create_program_runtime_environment_v2<'a>( reject_broken_elfs: true, noop_instruction_rate: 256, sanitize_user_provided_values: true, - encrypt_runtime_environment: true, external_internal_function_hash_collision: true, reject_callx_r10: true, enable_sbpf_v1: false, @@ -131,7 +132,7 @@ pub fn create_vm<'a, 'b>( Box::new(InstructionError::ProgramEnvironmentSetupFailure) })?; Ok(EbpfVm::new( - config, + program.get_loader().clone(), sbpf_version, invoke_context, memory_mapping, @@ -182,9 +183,9 @@ fn execute<'a, 'b: 'a>( match result { ProgramResult::Ok(status) if status != SUCCESS => { let error: InstructionError = status.into(); - Err(Box::new(error) as Box) + Err(error.into()) } - ProgramResult::Err(error) => Err(error), + ProgramResult::Err(error) => Err(error.into()), _ => Ok(()), } } @@ -523,18 +524,20 @@ pub fn process_instruction_transfer_authority( Ok(()) } -pub fn process_instruction( - invoke_context: &mut InvokeContext, - _arg0: u64, - _arg1: u64, - _arg2: u64, - _arg3: u64, - _arg4: u64, - _memory_mapping: &mut MemoryMapping, - result: &mut ProgramResult, -) { - *result = process_instruction_inner(invoke_context).into(); -} +declare_builtin_function!( + Entrypoint, + fn rust( + invoke_context: &mut InvokeContext, + _arg0: u64, + _arg1: u64, + _arg2: u64, + _arg3: u64, + _arg4: u64, + _memory_mapping: &mut MemoryMapping, + ) -> Result> { + process_instruction_inner(invoke_context) + } +); pub fn process_instruction_inner( invoke_context: &mut InvokeContext, @@ -696,7 +699,7 @@ mod tests { transaction_accounts, instruction_accounts, expected_result, - super::process_instruction, + Entrypoint::vm, |invoke_context| { invoke_context .programs_modified_by_tx diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index a4ac202f254bc3..17f4d199f478d3 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -5325,6 +5325,7 @@ dependencies = [ "solana-runtime", "solana-sdk", "solana-vote-program", + "solana_rbpf", "test-case", "thiserror", "tokio", @@ -6479,9 +6480,9 @@ dependencies = [ [[package]] name = "solana_rbpf" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "103318aa365ff7caa8cf534f2246b5eb7e5b34668736d52b1266b143f7a21196" +checksum = "3d457cc2ba742c120492a64b7fa60e22c575e891f6b55039f4d736568fb112a3" dependencies = [ "byteorder 1.4.3", "combine", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 3ed974440b21bb..9e485ccec2d9b5 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -25,7 +25,7 @@ rand = "0.8" rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" -solana_rbpf = "=0.7.2" +solana_rbpf = "=0.8.0" solana-account-decoder = { path = "../../account-decoder", version = "=1.17.4" } solana-accounts-db = { path = "../../accounts-db", version = "=1.17.4" } solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.4" } diff --git a/programs/sbf/tests/programs.rs b/programs/sbf/tests/programs.rs index f6b680b1054442..8a7cfb693afdd9 100644 --- a/programs/sbf/tests/programs.rs +++ b/programs/sbf/tests/programs.rs @@ -1449,7 +1449,7 @@ fn assert_instruction_count() { transaction_accounts, instruction_accounts, Ok(()), - solana_bpf_loader_program::process_instruction, + solana_bpf_loader_program::Entrypoint::vm, |invoke_context| { *prev_compute_meter.borrow_mut() = invoke_context.get_remaining(); solana_bpf_loader_program::test_utils::load_all_invoked_programs(invoke_context); @@ -4397,7 +4397,7 @@ fn test_cpi_change_account_data_memory_allocation() { let feature_set = FeatureSet::all_enabled(); bank.feature_set = Arc::new(feature_set); - declare_process_instruction!(process_instruction, 42, |invoke_context| { + declare_process_instruction!(MockBuiltin, 42, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_data = instruction_context.get_instruction_data(); @@ -4428,7 +4428,7 @@ fn test_cpi_change_account_data_memory_allocation() { bank.add_builtin( builtin_program_id, "test_cpi_change_account_data_memory_allocation_builtin".to_string(), - LoadedProgram::new_builtin(0, 42, process_instruction), + LoadedProgram::new_builtin(0, 42, MockBuiltin::vm), ); let bank = Arc::new(bank); diff --git a/programs/stake/src/stake_instruction.rs b/programs/stake/src/stake_instruction.rs index 20b6c9e0ebe3c4..cd0b59e82534ae 100644 --- a/programs/stake/src/stake_instruction.rs +++ b/programs/stake/src/stake_instruction.rs @@ -54,411 +54,391 @@ fn get_optional_pubkey<'a>( pub const DEFAULT_COMPUTE_UNITS: u64 = 750; -declare_process_instruction!( - process_instruction, - DEFAULT_COMPUTE_UNITS, - |invoke_context| { - let transaction_context = &invoke_context.transaction_context; - let instruction_context = transaction_context.get_current_instruction_context()?; - let data = instruction_context.get_instruction_data(); - - trace!("process_instruction: {:?}", data); - - let get_stake_account = || { - let me = instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - if *me.get_owner() != id() { - return Err(InstructionError::InvalidAccountOwner); - } - Ok(me) - }; +declare_process_instruction!(Entrypoint, DEFAULT_COMPUTE_UNITS, |invoke_context| { + let transaction_context = &invoke_context.transaction_context; + let instruction_context = transaction_context.get_current_instruction_context()?; + let data = instruction_context.get_instruction_data(); - let signers = instruction_context.get_signers(transaction_context)?; - match limited_deserialize(data) { - Ok(StakeInstruction::Initialize(authorized, lockup)) => { - let mut me = get_stake_account()?; - let rent = - get_sysvar_with_account_check::rent(invoke_context, instruction_context, 1)?; - initialize(&mut me, &authorized, &lockup, &rent) - } - Ok(StakeInstruction::Authorize(authorized_pubkey, stake_authorize)) => { - let mut me = get_stake_account()?; - let require_custodian_for_locked_stake_authorize = invoke_context - .feature_set - .is_active(&feature_set::require_custodian_for_locked_stake_authorize::id()); - - if require_custodian_for_locked_stake_authorize { - let clock = get_sysvar_with_account_check::clock( - invoke_context, - instruction_context, - 1, - )?; - instruction_context.check_number_of_instruction_accounts(3)?; - let custodian_pubkey = - get_optional_pubkey(transaction_context, instruction_context, 3, false)?; - - authorize( - &mut me, - &signers, - &authorized_pubkey, - stake_authorize, - require_custodian_for_locked_stake_authorize, - &clock, - custodian_pubkey, - ) - } else { - authorize( - &mut me, - &signers, - &authorized_pubkey, - stake_authorize, - require_custodian_for_locked_stake_authorize, - &Clock::default(), - None, - ) - } - } - Ok(StakeInstruction::AuthorizeWithSeed(args)) => { - let mut me = get_stake_account()?; - instruction_context.check_number_of_instruction_accounts(2)?; - let require_custodian_for_locked_stake_authorize = invoke_context - .feature_set - .is_active(&feature_set::require_custodian_for_locked_stake_authorize::id()); - if require_custodian_for_locked_stake_authorize { - let clock = get_sysvar_with_account_check::clock( - invoke_context, - instruction_context, - 2, - )?; - let custodian_pubkey = - get_optional_pubkey(transaction_context, instruction_context, 3, false)?; - - authorize_with_seed( - transaction_context, - instruction_context, - &mut me, - 1, - &args.authority_seed, - &args.authority_owner, - &args.new_authorized_pubkey, - args.stake_authorize, - require_custodian_for_locked_stake_authorize, - &clock, - custodian_pubkey, - ) - } else { - authorize_with_seed( - transaction_context, - instruction_context, - &mut me, - 1, - &args.authority_seed, - &args.authority_owner, - &args.new_authorized_pubkey, - args.stake_authorize, - require_custodian_for_locked_stake_authorize, - &Clock::default(), - None, - ) - } + trace!("process_instruction: {:?}", data); + + let get_stake_account = || { + let me = instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + if *me.get_owner() != id() { + return Err(InstructionError::InvalidAccountOwner); + } + Ok(me) + }; + + let signers = instruction_context.get_signers(transaction_context)?; + match limited_deserialize(data) { + Ok(StakeInstruction::Initialize(authorized, lockup)) => { + let mut me = get_stake_account()?; + let rent = get_sysvar_with_account_check::rent(invoke_context, instruction_context, 1)?; + initialize(&mut me, &authorized, &lockup, &rent) + } + Ok(StakeInstruction::Authorize(authorized_pubkey, stake_authorize)) => { + let mut me = get_stake_account()?; + let require_custodian_for_locked_stake_authorize = invoke_context + .feature_set + .is_active(&feature_set::require_custodian_for_locked_stake_authorize::id()); + + if require_custodian_for_locked_stake_authorize { + let clock = + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 1)?; + instruction_context.check_number_of_instruction_accounts(3)?; + let custodian_pubkey = + get_optional_pubkey(transaction_context, instruction_context, 3, false)?; + + authorize( + &mut me, + &signers, + &authorized_pubkey, + stake_authorize, + require_custodian_for_locked_stake_authorize, + &clock, + custodian_pubkey, + ) + } else { + authorize( + &mut me, + &signers, + &authorized_pubkey, + stake_authorize, + require_custodian_for_locked_stake_authorize, + &Clock::default(), + None, + ) } - Ok(StakeInstruction::DelegateStake) => { - let me = get_stake_account()?; - instruction_context.check_number_of_instruction_accounts(2)?; + } + Ok(StakeInstruction::AuthorizeWithSeed(args)) => { + let mut me = get_stake_account()?; + instruction_context.check_number_of_instruction_accounts(2)?; + let require_custodian_for_locked_stake_authorize = invoke_context + .feature_set + .is_active(&feature_set::require_custodian_for_locked_stake_authorize::id()); + if require_custodian_for_locked_stake_authorize { let clock = get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; - let stake_history = get_sysvar_with_account_check::stake_history( - invoke_context, - instruction_context, - 3, - )?; - instruction_context.check_number_of_instruction_accounts(5)?; - drop(me); - if !invoke_context - .feature_set - .is_active(&feature_set::reduce_stake_warmup_cooldown::id()) - { - // Post feature activation, remove both the feature gate code and the config completely in the interface - let config_account = instruction_context - .try_borrow_instruction_account(transaction_context, 4)?; - #[allow(deprecated)] - if !config::check_id(config_account.get_key()) { - return Err(InstructionError::InvalidArgument); - } - config::from(&config_account).ok_or(InstructionError::InvalidArgument)?; - } - delegate( - invoke_context, + let custodian_pubkey = + get_optional_pubkey(transaction_context, instruction_context, 3, false)?; + + authorize_with_seed( transaction_context, instruction_context, - 0, + &mut me, 1, + &args.authority_seed, + &args.authority_owner, + &args.new_authorized_pubkey, + args.stake_authorize, + require_custodian_for_locked_stake_authorize, &clock, - &stake_history, - &signers, - &invoke_context.feature_set, + custodian_pubkey, ) - } - Ok(StakeInstruction::Split(lamports)) => { - let me = get_stake_account()?; - instruction_context.check_number_of_instruction_accounts(2)?; - drop(me); - split( - invoke_context, + } else { + authorize_with_seed( transaction_context, instruction_context, - 0, - lamports, + &mut me, 1, - &signers, + &args.authority_seed, + &args.authority_owner, + &args.new_authorized_pubkey, + args.stake_authorize, + require_custodian_for_locked_stake_authorize, + &Clock::default(), + None, ) } - Ok(StakeInstruction::Merge) => { - let me = get_stake_account()?; - instruction_context.check_number_of_instruction_accounts(2)?; + } + Ok(StakeInstruction::DelegateStake) => { + let me = get_stake_account()?; + instruction_context.check_number_of_instruction_accounts(2)?; + let clock = + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; + let stake_history = get_sysvar_with_account_check::stake_history( + invoke_context, + instruction_context, + 3, + )?; + instruction_context.check_number_of_instruction_accounts(5)?; + drop(me); + if !invoke_context + .feature_set + .is_active(&feature_set::reduce_stake_warmup_cooldown::id()) + { + // Post feature activation, remove both the feature gate code and the config completely in the interface + let config_account = + instruction_context.try_borrow_instruction_account(transaction_context, 4)?; + #[allow(deprecated)] + if !config::check_id(config_account.get_key()) { + return Err(InstructionError::InvalidArgument); + } + config::from(&config_account).ok_or(InstructionError::InvalidArgument)?; + } + delegate( + invoke_context, + transaction_context, + instruction_context, + 0, + 1, + &clock, + &stake_history, + &signers, + &invoke_context.feature_set, + ) + } + Ok(StakeInstruction::Split(lamports)) => { + let me = get_stake_account()?; + instruction_context.check_number_of_instruction_accounts(2)?; + drop(me); + split( + invoke_context, + transaction_context, + instruction_context, + 0, + lamports, + 1, + &signers, + ) + } + Ok(StakeInstruction::Merge) => { + let me = get_stake_account()?; + instruction_context.check_number_of_instruction_accounts(2)?; + let clock = + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; + let stake_history = get_sysvar_with_account_check::stake_history( + invoke_context, + instruction_context, + 3, + )?; + drop(me); + merge( + invoke_context, + transaction_context, + instruction_context, + 0, + 1, + &clock, + &stake_history, + &signers, + ) + } + Ok(StakeInstruction::Withdraw(lamports)) => { + let me = get_stake_account()?; + instruction_context.check_number_of_instruction_accounts(2)?; + let clock = + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; + let stake_history = get_sysvar_with_account_check::stake_history( + invoke_context, + instruction_context, + 3, + )?; + instruction_context.check_number_of_instruction_accounts(5)?; + drop(me); + withdraw( + transaction_context, + instruction_context, + 0, + lamports, + 1, + &clock, + &stake_history, + 4, + if instruction_context.get_number_of_instruction_accounts() >= 6 { + Some(5) + } else { + None + }, + new_warmup_cooldown_rate_epoch(invoke_context), + ) + } + Ok(StakeInstruction::Deactivate) => { + let mut me = get_stake_account()?; + let clock = + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 1)?; + deactivate(invoke_context, &mut me, &clock, &signers) + } + Ok(StakeInstruction::SetLockup(lockup)) => { + let mut me = get_stake_account()?; + let clock = invoke_context.get_sysvar_cache().get_clock()?; + set_lockup(&mut me, &lockup, &signers, &clock) + } + Ok(StakeInstruction::InitializeChecked) => { + let mut me = get_stake_account()?; + if invoke_context + .feature_set + .is_active(&feature_set::vote_stake_checked_instructions::id()) + { + instruction_context.check_number_of_instruction_accounts(4)?; + let staker_pubkey = transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(2)?, + )?; + let withdrawer_pubkey = transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(3)?, + )?; + if !instruction_context.is_instruction_account_signer(3)? { + return Err(InstructionError::MissingRequiredSignature); + } + + let authorized = Authorized { + staker: *staker_pubkey, + withdrawer: *withdrawer_pubkey, + }; + + let rent = + get_sysvar_with_account_check::rent(invoke_context, instruction_context, 1)?; + initialize(&mut me, &authorized, &Lockup::default(), &rent) + } else { + Err(InstructionError::InvalidInstructionData) + } + } + Ok(StakeInstruction::AuthorizeChecked(stake_authorize)) => { + let mut me = get_stake_account()?; + if invoke_context + .feature_set + .is_active(&feature_set::vote_stake_checked_instructions::id()) + { let clock = - get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; - let stake_history = get_sysvar_with_account_check::stake_history( - invoke_context, - instruction_context, - 3, + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 1)?; + instruction_context.check_number_of_instruction_accounts(4)?; + let authorized_pubkey = transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(3)?, )?; - drop(me); - merge( - invoke_context, - transaction_context, - instruction_context, - 0, - 1, - &clock, - &stake_history, + if !instruction_context.is_instruction_account_signer(3)? { + return Err(InstructionError::MissingRequiredSignature); + } + let custodian_pubkey = + get_optional_pubkey(transaction_context, instruction_context, 4, false)?; + + authorize( + &mut me, &signers, + authorized_pubkey, + stake_authorize, + true, + &clock, + custodian_pubkey, ) + } else { + Err(InstructionError::InvalidInstructionData) } - Ok(StakeInstruction::Withdraw(lamports)) => { - let me = get_stake_account()?; + } + Ok(StakeInstruction::AuthorizeCheckedWithSeed(args)) => { + let mut me = get_stake_account()?; + if invoke_context + .feature_set + .is_active(&feature_set::vote_stake_checked_instructions::id()) + { instruction_context.check_number_of_instruction_accounts(2)?; let clock = get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; - let stake_history = get_sysvar_with_account_check::stake_history( - invoke_context, - instruction_context, - 3, + instruction_context.check_number_of_instruction_accounts(4)?; + let authorized_pubkey = transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(3)?, )?; - instruction_context.check_number_of_instruction_accounts(5)?; - drop(me); - withdraw( + if !instruction_context.is_instruction_account_signer(3)? { + return Err(InstructionError::MissingRequiredSignature); + } + let custodian_pubkey = + get_optional_pubkey(transaction_context, instruction_context, 4, false)?; + + authorize_with_seed( transaction_context, instruction_context, - 0, - lamports, + &mut me, 1, + &args.authority_seed, + &args.authority_owner, + authorized_pubkey, + args.stake_authorize, + true, &clock, - &stake_history, - 4, - if instruction_context.get_number_of_instruction_accounts() >= 6 { - Some(5) - } else { - None - }, - new_warmup_cooldown_rate_epoch(invoke_context), + custodian_pubkey, ) + } else { + Err(InstructionError::InvalidInstructionData) } - Ok(StakeInstruction::Deactivate) => { - let mut me = get_stake_account()?; - let clock = - get_sysvar_with_account_check::clock(invoke_context, instruction_context, 1)?; - deactivate(invoke_context, &mut me, &clock, &signers) - } - Ok(StakeInstruction::SetLockup(lockup)) => { - let mut me = get_stake_account()?; + } + Ok(StakeInstruction::SetLockupChecked(lockup_checked)) => { + let mut me = get_stake_account()?; + if invoke_context + .feature_set + .is_active(&feature_set::vote_stake_checked_instructions::id()) + { + let custodian_pubkey = + get_optional_pubkey(transaction_context, instruction_context, 2, true)?; + + let lockup = LockupArgs { + unix_timestamp: lockup_checked.unix_timestamp, + epoch: lockup_checked.epoch, + custodian: custodian_pubkey.cloned(), + }; let clock = invoke_context.get_sysvar_cache().get_clock()?; set_lockup(&mut me, &lockup, &signers, &clock) + } else { + Err(InstructionError::InvalidInstructionData) } - Ok(StakeInstruction::InitializeChecked) => { - let mut me = get_stake_account()?; - if invoke_context - .feature_set - .is_active(&feature_set::vote_stake_checked_instructions::id()) - { - instruction_context.check_number_of_instruction_accounts(4)?; - let staker_pubkey = transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(2)?, - )?; - let withdrawer_pubkey = transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(3)?, - )?; - if !instruction_context.is_instruction_account_signer(3)? { - return Err(InstructionError::MissingRequiredSignature); - } - - let authorized = Authorized { - staker: *staker_pubkey, - withdrawer: *withdrawer_pubkey, - }; - - let rent = get_sysvar_with_account_check::rent( - invoke_context, - instruction_context, - 1, - )?; - initialize(&mut me, &authorized, &Lockup::default(), &rent) - } else { - Err(InstructionError::InvalidInstructionData) - } - } - Ok(StakeInstruction::AuthorizeChecked(stake_authorize)) => { - let mut me = get_stake_account()?; - if invoke_context - .feature_set - .is_active(&feature_set::vote_stake_checked_instructions::id()) - { - let clock = get_sysvar_with_account_check::clock( - invoke_context, - instruction_context, - 1, - )?; - instruction_context.check_number_of_instruction_accounts(4)?; - let authorized_pubkey = transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(3)?, - )?; - if !instruction_context.is_instruction_account_signer(3)? { - return Err(InstructionError::MissingRequiredSignature); - } - let custodian_pubkey = - get_optional_pubkey(transaction_context, instruction_context, 4, false)?; - - authorize( - &mut me, - &signers, - authorized_pubkey, - stake_authorize, - true, - &clock, - custodian_pubkey, - ) - } else { - Err(InstructionError::InvalidInstructionData) - } - } - Ok(StakeInstruction::AuthorizeCheckedWithSeed(args)) => { - let mut me = get_stake_account()?; - if invoke_context + } + Ok(StakeInstruction::GetMinimumDelegation) => { + let feature_set = invoke_context.feature_set.as_ref(); + let minimum_delegation = crate::get_minimum_delegation(feature_set); + let minimum_delegation = Vec::from(minimum_delegation.to_le_bytes()); + invoke_context + .transaction_context + .set_return_data(id(), minimum_delegation) + } + Ok(StakeInstruction::DeactivateDelinquent) => { + let mut me = get_stake_account()?; + instruction_context.check_number_of_instruction_accounts(3)?; + + let clock = invoke_context.get_sysvar_cache().get_clock()?; + deactivate_delinquent( + invoke_context, + transaction_context, + instruction_context, + &mut me, + 1, + 2, + clock.epoch, + ) + } + Ok(StakeInstruction::Redelegate) => { + let mut me = get_stake_account()?; + if invoke_context + .feature_set + .is_active(&feature_set::stake_redelegate_instruction::id()) + { + instruction_context.check_number_of_instruction_accounts(3)?; + if !invoke_context .feature_set - .is_active(&feature_set::vote_stake_checked_instructions::id()) + .is_active(&feature_set::reduce_stake_warmup_cooldown::id()) { - instruction_context.check_number_of_instruction_accounts(2)?; - let clock = get_sysvar_with_account_check::clock( - invoke_context, - instruction_context, - 2, - )?; - instruction_context.check_number_of_instruction_accounts(4)?; - let authorized_pubkey = transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(3)?, - )?; - if !instruction_context.is_instruction_account_signer(3)? { - return Err(InstructionError::MissingRequiredSignature); + // Post feature activation, remove both the feature gate code and the config completely in the interface + let config_account = instruction_context + .try_borrow_instruction_account(transaction_context, 3)?; + #[allow(deprecated)] + if !config::check_id(config_account.get_key()) { + return Err(InstructionError::InvalidArgument); } - let custodian_pubkey = - get_optional_pubkey(transaction_context, instruction_context, 4, false)?; - - authorize_with_seed( - transaction_context, - instruction_context, - &mut me, - 1, - &args.authority_seed, - &args.authority_owner, - authorized_pubkey, - args.stake_authorize, - true, - &clock, - custodian_pubkey, - ) - } else { - Err(InstructionError::InvalidInstructionData) - } - } - Ok(StakeInstruction::SetLockupChecked(lockup_checked)) => { - let mut me = get_stake_account()?; - if invoke_context - .feature_set - .is_active(&feature_set::vote_stake_checked_instructions::id()) - { - let custodian_pubkey = - get_optional_pubkey(transaction_context, instruction_context, 2, true)?; - - let lockup = LockupArgs { - unix_timestamp: lockup_checked.unix_timestamp, - epoch: lockup_checked.epoch, - custodian: custodian_pubkey.cloned(), - }; - let clock = invoke_context.get_sysvar_cache().get_clock()?; - set_lockup(&mut me, &lockup, &signers, &clock) - } else { - Err(InstructionError::InvalidInstructionData) + config::from(&config_account).ok_or(InstructionError::InvalidArgument)?; } - } - Ok(StakeInstruction::GetMinimumDelegation) => { - let feature_set = invoke_context.feature_set.as_ref(); - let minimum_delegation = crate::get_minimum_delegation(feature_set); - let minimum_delegation = Vec::from(minimum_delegation.to_le_bytes()); - invoke_context - .transaction_context - .set_return_data(id(), minimum_delegation) - } - Ok(StakeInstruction::DeactivateDelinquent) => { - let mut me = get_stake_account()?; - instruction_context.check_number_of_instruction_accounts(3)?; - - let clock = invoke_context.get_sysvar_cache().get_clock()?; - deactivate_delinquent( + redelegate( invoke_context, transaction_context, instruction_context, &mut me, 1, 2, - clock.epoch, + &signers, ) + } else { + Err(InstructionError::InvalidInstructionData) } - Ok(StakeInstruction::Redelegate) => { - let mut me = get_stake_account()?; - if invoke_context - .feature_set - .is_active(&feature_set::stake_redelegate_instruction::id()) - { - instruction_context.check_number_of_instruction_accounts(3)?; - if !invoke_context - .feature_set - .is_active(&feature_set::reduce_stake_warmup_cooldown::id()) - { - // Post feature activation, remove both the feature gate code and the config completely in the interface - let config_account = instruction_context - .try_borrow_instruction_account(transaction_context, 3)?; - #[allow(deprecated)] - if !config::check_id(config_account.get_key()) { - return Err(InstructionError::InvalidArgument); - } - config::from(&config_account).ok_or(InstructionError::InvalidArgument)?; - } - redelegate( - invoke_context, - transaction_context, - instruction_context, - &mut me, - 1, - 2, - &signers, - ) - } else { - Err(InstructionError::InvalidInstructionData) - } - } - Err(err) => Err(err), } + Err(err) => Err(err), } -); +}); #[cfg(test)] mod tests { @@ -572,7 +552,7 @@ mod tests { transaction_accounts, instruction_accounts, expected_result, - super::process_instruction, + Entrypoint::vm, |invoke_context| { invoke_context.feature_set = Arc::clone(&feature_set); }, @@ -7046,7 +7026,7 @@ mod tests { transaction_accounts, instruction_accounts, Ok(()), - super::process_instruction, + Entrypoint::vm, |invoke_context| { invoke_context.feature_set = Arc::clone(&feature_set); }, diff --git a/programs/system/src/system_processor.rs b/programs/system/src/system_processor.rs index dc6c1e3dbe9c92..b224997dc625a7 100644 --- a/programs/system/src/system_processor.rs +++ b/programs/system/src/system_processor.rs @@ -314,252 +314,246 @@ fn transfer_with_seed( pub const DEFAULT_COMPUTE_UNITS: u64 = 150; -declare_process_instruction!( - process_instruction, - DEFAULT_COMPUTE_UNITS, - |invoke_context| { - let transaction_context = &invoke_context.transaction_context; - let instruction_context = transaction_context.get_current_instruction_context()?; - let instruction_data = instruction_context.get_instruction_data(); - let instruction = limited_deserialize(instruction_data)?; - - trace!("process_instruction: {:?}", instruction); - - let signers = instruction_context.get_signers(transaction_context)?; - match instruction { - SystemInstruction::CreateAccount { +declare_process_instruction!(Entrypoint, DEFAULT_COMPUTE_UNITS, |invoke_context| { + let transaction_context = &invoke_context.transaction_context; + let instruction_context = transaction_context.get_current_instruction_context()?; + let instruction_data = instruction_context.get_instruction_data(); + let instruction = limited_deserialize(instruction_data)?; + + trace!("process_instruction: {:?}", instruction); + + let signers = instruction_context.get_signers(transaction_context)?; + match instruction { + SystemInstruction::CreateAccount { + lamports, + space, + owner, + } => { + instruction_context.check_number_of_instruction_accounts(2)?; + let to_address = Address::create( + transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(1)?, + )?, + None, + invoke_context, + )?; + create_account( + 0, + 1, + &to_address, lamports, space, - owner, - } => { - instruction_context.check_number_of_instruction_accounts(2)?; - let to_address = Address::create( - transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(1)?, - )?, - None, - invoke_context, - )?; - create_account( - 0, - 1, - &to_address, - lamports, - space, - &owner, - &signers, - invoke_context, - transaction_context, - instruction_context, - ) - } - SystemInstruction::CreateAccountWithSeed { - base, - seed, + &owner, + &signers, + invoke_context, + transaction_context, + instruction_context, + ) + } + SystemInstruction::CreateAccountWithSeed { + base, + seed, + lamports, + space, + owner, + } => { + instruction_context.check_number_of_instruction_accounts(2)?; + let to_address = Address::create( + transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(1)?, + )?, + Some((&base, &seed, &owner)), + invoke_context, + )?; + create_account( + 0, + 1, + &to_address, lamports, space, - owner, - } => { - instruction_context.check_number_of_instruction_accounts(2)?; - let to_address = Address::create( - transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(1)?, - )?, - Some((&base, &seed, &owner)), - invoke_context, - )?; - create_account( - 0, - 1, - &to_address, - lamports, - space, - &owner, - &signers, - invoke_context, - transaction_context, - instruction_context, - ) - } - SystemInstruction::Assign { owner } => { - instruction_context.check_number_of_instruction_accounts(1)?; - let mut account = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - let address = Address::create( - transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(0)?, - )?, - None, - invoke_context, - )?; - assign(&mut account, &address, &owner, &signers, invoke_context) - } - SystemInstruction::Transfer { lamports } => { - instruction_context.check_number_of_instruction_accounts(2)?; - transfer( - 0, - 1, - lamports, - invoke_context, - transaction_context, - instruction_context, - ) - } - SystemInstruction::TransferWithSeed { + &owner, + &signers, + invoke_context, + transaction_context, + instruction_context, + ) + } + SystemInstruction::Assign { owner } => { + instruction_context.check_number_of_instruction_accounts(1)?; + let mut account = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + let address = Address::create( + transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(0)?, + )?, + None, + invoke_context, + )?; + assign(&mut account, &address, &owner, &signers, invoke_context) + } + SystemInstruction::Transfer { lamports } => { + instruction_context.check_number_of_instruction_accounts(2)?; + transfer( + 0, + 1, lamports, - from_seed, - from_owner, - } => { - instruction_context.check_number_of_instruction_accounts(3)?; - transfer_with_seed( - 0, - 1, - &from_seed, - &from_owner, - 2, - lamports, - invoke_context, - transaction_context, - instruction_context, - ) - } - SystemInstruction::AdvanceNonceAccount => { - instruction_context.check_number_of_instruction_accounts(1)?; - let mut me = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - #[allow(deprecated)] - let recent_blockhashes = get_sysvar_with_account_check::recent_blockhashes( - invoke_context, - instruction_context, - 1, - )?; - if recent_blockhashes.is_empty() { - ic_msg!( - invoke_context, - "Advance nonce account: recent blockhash list is empty", - ); - return Err(SystemError::NonceNoRecentBlockhashes.into()); - } - advance_nonce_account(&mut me, &signers, invoke_context) - } - SystemInstruction::WithdrawNonceAccount(lamports) => { - instruction_context.check_number_of_instruction_accounts(2)?; - #[allow(deprecated)] - let _recent_blockhashes = get_sysvar_with_account_check::recent_blockhashes( - invoke_context, - instruction_context, - 2, - )?; - let rent = - get_sysvar_with_account_check::rent(invoke_context, instruction_context, 3)?; - withdraw_nonce_account( - 0, - lamports, - 1, - &rent, - &signers, + invoke_context, + transaction_context, + instruction_context, + ) + } + SystemInstruction::TransferWithSeed { + lamports, + from_seed, + from_owner, + } => { + instruction_context.check_number_of_instruction_accounts(3)?; + transfer_with_seed( + 0, + 1, + &from_seed, + &from_owner, + 2, + lamports, + invoke_context, + transaction_context, + instruction_context, + ) + } + SystemInstruction::AdvanceNonceAccount => { + instruction_context.check_number_of_instruction_accounts(1)?; + let mut me = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + #[allow(deprecated)] + let recent_blockhashes = get_sysvar_with_account_check::recent_blockhashes( + invoke_context, + instruction_context, + 1, + )?; + if recent_blockhashes.is_empty() { + ic_msg!( invoke_context, - transaction_context, - instruction_context, - ) + "Advance nonce account: recent blockhash list is empty", + ); + return Err(SystemError::NonceNoRecentBlockhashes.into()); } - SystemInstruction::InitializeNonceAccount(authorized) => { - instruction_context.check_number_of_instruction_accounts(1)?; - let mut me = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - #[allow(deprecated)] - let recent_blockhashes = get_sysvar_with_account_check::recent_blockhashes( + advance_nonce_account(&mut me, &signers, invoke_context) + } + SystemInstruction::WithdrawNonceAccount(lamports) => { + instruction_context.check_number_of_instruction_accounts(2)?; + #[allow(deprecated)] + let _recent_blockhashes = get_sysvar_with_account_check::recent_blockhashes( + invoke_context, + instruction_context, + 2, + )?; + let rent = get_sysvar_with_account_check::rent(invoke_context, instruction_context, 3)?; + withdraw_nonce_account( + 0, + lamports, + 1, + &rent, + &signers, + invoke_context, + transaction_context, + instruction_context, + ) + } + SystemInstruction::InitializeNonceAccount(authorized) => { + instruction_context.check_number_of_instruction_accounts(1)?; + let mut me = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + #[allow(deprecated)] + let recent_blockhashes = get_sysvar_with_account_check::recent_blockhashes( + invoke_context, + instruction_context, + 1, + )?; + if recent_blockhashes.is_empty() { + ic_msg!( invoke_context, - instruction_context, - 1, - )?; - if recent_blockhashes.is_empty() { - ic_msg!( - invoke_context, - "Initialize nonce account: recent blockhash list is empty", - ); - return Err(SystemError::NonceNoRecentBlockhashes.into()); - } - let rent = - get_sysvar_with_account_check::rent(invoke_context, instruction_context, 2)?; - initialize_nonce_account(&mut me, &authorized, &rent, invoke_context) + "Initialize nonce account: recent blockhash list is empty", + ); + return Err(SystemError::NonceNoRecentBlockhashes.into()); } - SystemInstruction::AuthorizeNonceAccount(nonce_authority) => { - instruction_context.check_number_of_instruction_accounts(1)?; - let mut me = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - authorize_nonce_account(&mut me, &nonce_authority, &signers, invoke_context) + let rent = get_sysvar_with_account_check::rent(invoke_context, instruction_context, 2)?; + initialize_nonce_account(&mut me, &authorized, &rent, invoke_context) + } + SystemInstruction::AuthorizeNonceAccount(nonce_authority) => { + instruction_context.check_number_of_instruction_accounts(1)?; + let mut me = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + authorize_nonce_account(&mut me, &nonce_authority, &signers, invoke_context) + } + SystemInstruction::UpgradeNonceAccount => { + instruction_context.check_number_of_instruction_accounts(1)?; + let mut nonce_account = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + if !system_program::check_id(nonce_account.get_owner()) { + return Err(InstructionError::InvalidAccountOwner); } - SystemInstruction::UpgradeNonceAccount => { - instruction_context.check_number_of_instruction_accounts(1)?; - let mut nonce_account = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - if !system_program::check_id(nonce_account.get_owner()) { - return Err(InstructionError::InvalidAccountOwner); - } - if !nonce_account.is_writable() { - return Err(InstructionError::InvalidArgument); - } - let nonce_versions: nonce::state::Versions = nonce_account.get_state()?; - match nonce_versions.upgrade() { - None => Err(InstructionError::InvalidArgument), - Some(nonce_versions) => nonce_account.set_state(&nonce_versions), - } + if !nonce_account.is_writable() { + return Err(InstructionError::InvalidArgument); } - SystemInstruction::Allocate { space } => { - instruction_context.check_number_of_instruction_accounts(1)?; - let mut account = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - let address = Address::create( - transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(0)?, - )?, - None, - invoke_context, - )?; - allocate(&mut account, &address, space, &signers, invoke_context) + let nonce_versions: nonce::state::Versions = nonce_account.get_state()?; + match nonce_versions.upgrade() { + None => Err(InstructionError::InvalidArgument), + Some(nonce_versions) => nonce_account.set_state(&nonce_versions), } - SystemInstruction::AllocateWithSeed { - base, - seed, + } + SystemInstruction::Allocate { space } => { + instruction_context.check_number_of_instruction_accounts(1)?; + let mut account = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + let address = Address::create( + transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(0)?, + )?, + None, + invoke_context, + )?; + allocate(&mut account, &address, space, &signers, invoke_context) + } + SystemInstruction::AllocateWithSeed { + base, + seed, + space, + owner, + } => { + instruction_context.check_number_of_instruction_accounts(1)?; + let mut account = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + let address = Address::create( + transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(0)?, + )?, + Some((&base, &seed, &owner)), + invoke_context, + )?; + allocate_and_assign( + &mut account, + &address, space, - owner, - } => { - instruction_context.check_number_of_instruction_accounts(1)?; - let mut account = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - let address = Address::create( - transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(0)?, - )?, - Some((&base, &seed, &owner)), - invoke_context, - )?; - allocate_and_assign( - &mut account, - &address, - space, - &owner, - &signers, - invoke_context, - ) - } - SystemInstruction::AssignWithSeed { base, seed, owner } => { - instruction_context.check_number_of_instruction_accounts(1)?; - let mut account = - instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - let address = Address::create( - transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(0)?, - )?, - Some((&base, &seed, &owner)), - invoke_context, - )?; - assign(&mut account, &address, &owner, &signers, invoke_context) - } + &owner, + &signers, + invoke_context, + ) + } + SystemInstruction::AssignWithSeed { base, seed, owner } => { + instruction_context.check_number_of_instruction_accounts(1)?; + let mut account = + instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + let address = Address::create( + transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(0)?, + )?, + Some((&base, &seed, &owner)), + invoke_context, + )?; + assign(&mut account, &address, &owner, &signers, invoke_context) } } -); +}); #[cfg(test)] mod tests { @@ -609,7 +603,7 @@ mod tests { transaction_accounts, instruction_accounts, expected_result, - super::process_instruction, + Entrypoint::vm, |_invoke_context| {}, |_invoke_context| {}, ) @@ -1599,7 +1593,7 @@ mod tests { }, ], Ok(()), - super::process_instruction, + Entrypoint::vm, |invoke_context: &mut InvokeContext| { invoke_context.blockhash = hash(&serialize(&0).unwrap()); }, @@ -1946,7 +1940,7 @@ mod tests { }, ], Err(SystemError::NonceNoRecentBlockhashes.into()), - super::process_instruction, + Entrypoint::vm, |invoke_context: &mut InvokeContext| { invoke_context.blockhash = hash(&serialize(&0).unwrap()); }, diff --git a/programs/vote/benches/process_vote.rs b/programs/vote/benches/process_vote.rs index 6c9cb979c90484..9008971f086237 100644 --- a/programs/vote/benches/process_vote.rs +++ b/programs/vote/benches/process_vote.rs @@ -108,7 +108,7 @@ fn bench_process_vote_instruction( transaction_accounts.clone(), instruction_account_metas.clone(), Ok(()), - solana_vote_program::vote_processor::process_instruction, + solana_vote_program::vote_processor::Entrypoint::vm, |_invoke_context| {}, |_invoke_context| {}, ); diff --git a/programs/vote/src/vote_processor.rs b/programs/vote/src/vote_processor.rs index 423193f5d333c9..d09309ddc81fb5 100644 --- a/programs/vote/src/vote_processor.rs +++ b/programs/vote/src/vote_processor.rs @@ -54,209 +54,198 @@ fn process_authorize_with_seed_instruction( // units; can consume based on instructions in the future like `bpf_loader` does. pub const DEFAULT_COMPUTE_UNITS: u64 = 2_100; -declare_process_instruction!( - process_instruction, - DEFAULT_COMPUTE_UNITS, - |invoke_context| { - let transaction_context = &invoke_context.transaction_context; - let instruction_context = transaction_context.get_current_instruction_context()?; - let data = instruction_context.get_instruction_data(); - - trace!("process_instruction: {:?}", data); - - let mut me = instruction_context.try_borrow_instruction_account(transaction_context, 0)?; - if *me.get_owner() != id() { - return Err(InstructionError::InvalidAccountOwner); - } +declare_process_instruction!(Entrypoint, DEFAULT_COMPUTE_UNITS, |invoke_context| { + let transaction_context = &invoke_context.transaction_context; + let instruction_context = transaction_context.get_current_instruction_context()?; + let data = instruction_context.get_instruction_data(); - let signers = instruction_context.get_signers(transaction_context)?; - match limited_deserialize(data)? { - VoteInstruction::InitializeAccount(vote_init) => { - let rent = - get_sysvar_with_account_check::rent(invoke_context, instruction_context, 1)?; - if !rent.is_exempt(me.get_lamports(), me.get_data().len()) { - return Err(InstructionError::InsufficientFunds); - } - let clock = - get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; - vote_state::initialize_account( - &mut me, - &vote_init, - &signers, - &clock, - &invoke_context.feature_set, - ) + trace!("process_instruction: {:?}", data); + + let mut me = instruction_context.try_borrow_instruction_account(transaction_context, 0)?; + if *me.get_owner() != id() { + return Err(InstructionError::InvalidAccountOwner); + } + + let signers = instruction_context.get_signers(transaction_context)?; + match limited_deserialize(data)? { + VoteInstruction::InitializeAccount(vote_init) => { + let rent = get_sysvar_with_account_check::rent(invoke_context, instruction_context, 1)?; + if !rent.is_exempt(me.get_lamports(), me.get_data().len()) { + return Err(InstructionError::InsufficientFunds); } - VoteInstruction::Authorize(voter_pubkey, vote_authorize) => { - let clock = - get_sysvar_with_account_check::clock(invoke_context, instruction_context, 1)?; - vote_state::authorize( - &mut me, - &voter_pubkey, - vote_authorize, - &signers, - &clock, - &invoke_context.feature_set, - ) + let clock = + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; + vote_state::initialize_account( + &mut me, + &vote_init, + &signers, + &clock, + &invoke_context.feature_set, + ) + } + VoteInstruction::Authorize(voter_pubkey, vote_authorize) => { + let clock = + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 1)?; + vote_state::authorize( + &mut me, + &voter_pubkey, + vote_authorize, + &signers, + &clock, + &invoke_context.feature_set, + ) + } + VoteInstruction::AuthorizeWithSeed(args) => { + instruction_context.check_number_of_instruction_accounts(3)?; + process_authorize_with_seed_instruction( + invoke_context, + instruction_context, + transaction_context, + &mut me, + &args.new_authority, + args.authorization_type, + &args.current_authority_derived_key_owner, + args.current_authority_derived_key_seed.as_str(), + ) + } + VoteInstruction::AuthorizeCheckedWithSeed(args) => { + instruction_context.check_number_of_instruction_accounts(4)?; + let new_authority = transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(3)?, + )?; + if !instruction_context.is_instruction_account_signer(3)? { + return Err(InstructionError::MissingRequiredSignature); } - VoteInstruction::AuthorizeWithSeed(args) => { - instruction_context.check_number_of_instruction_accounts(3)?; - process_authorize_with_seed_instruction( - invoke_context, - instruction_context, - transaction_context, - &mut me, - &args.new_authority, - args.authorization_type, - &args.current_authority_derived_key_owner, - args.current_authority_derived_key_seed.as_str(), - ) + process_authorize_with_seed_instruction( + invoke_context, + instruction_context, + transaction_context, + &mut me, + new_authority, + args.authorization_type, + &args.current_authority_derived_key_owner, + args.current_authority_derived_key_seed.as_str(), + ) + } + VoteInstruction::UpdateValidatorIdentity => { + instruction_context.check_number_of_instruction_accounts(2)?; + let node_pubkey = transaction_context.get_key_of_account_at_index( + instruction_context.get_index_of_instruction_account_in_transaction(1)?, + )?; + vote_state::update_validator_identity( + &mut me, + node_pubkey, + &signers, + &invoke_context.feature_set, + ) + } + VoteInstruction::UpdateCommission(commission) => { + if invoke_context.feature_set.is_active( + &feature_set::commission_updates_only_allowed_in_first_half_of_epoch::id(), + ) { + let sysvar_cache = invoke_context.get_sysvar_cache(); + let epoch_schedule = sysvar_cache.get_epoch_schedule()?; + let clock = sysvar_cache.get_clock()?; + if !vote_state::is_commission_update_allowed(clock.slot, &epoch_schedule) { + return Err(VoteError::CommissionUpdateTooLate.into()); + } } - VoteInstruction::AuthorizeCheckedWithSeed(args) => { + vote_state::update_commission( + &mut me, + commission, + &signers, + &invoke_context.feature_set, + ) + } + VoteInstruction::Vote(vote) | VoteInstruction::VoteSwitch(vote, _) => { + let slot_hashes = + get_sysvar_with_account_check::slot_hashes(invoke_context, instruction_context, 1)?; + let clock = + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; + vote_state::process_vote_with_account( + &mut me, + &slot_hashes, + &clock, + &vote, + &signers, + &invoke_context.feature_set, + ) + } + VoteInstruction::UpdateVoteState(vote_state_update) + | VoteInstruction::UpdateVoteStateSwitch(vote_state_update, _) => { + let sysvar_cache = invoke_context.get_sysvar_cache(); + let slot_hashes = sysvar_cache.get_slot_hashes()?; + let clock = sysvar_cache.get_clock()?; + vote_state::process_vote_state_update( + &mut me, + slot_hashes.slot_hashes(), + &clock, + vote_state_update, + &signers, + &invoke_context.feature_set, + ) + } + VoteInstruction::CompactUpdateVoteState(vote_state_update) + | VoteInstruction::CompactUpdateVoteStateSwitch(vote_state_update, _) => { + let sysvar_cache = invoke_context.get_sysvar_cache(); + let slot_hashes = sysvar_cache.get_slot_hashes()?; + let clock = sysvar_cache.get_clock()?; + vote_state::process_vote_state_update( + &mut me, + slot_hashes.slot_hashes(), + &clock, + vote_state_update, + &signers, + &invoke_context.feature_set, + ) + } + + VoteInstruction::Withdraw(lamports) => { + instruction_context.check_number_of_instruction_accounts(2)?; + let rent_sysvar = invoke_context.get_sysvar_cache().get_rent()?; + let clock_sysvar = invoke_context.get_sysvar_cache().get_clock()?; + + drop(me); + vote_state::withdraw( + transaction_context, + instruction_context, + 0, + lamports, + 1, + &signers, + &rent_sysvar, + &clock_sysvar, + &invoke_context.feature_set, + ) + } + VoteInstruction::AuthorizeChecked(vote_authorize) => { + if invoke_context + .feature_set + .is_active(&feature_set::vote_stake_checked_instructions::id()) + { instruction_context.check_number_of_instruction_accounts(4)?; - let new_authority = transaction_context.get_key_of_account_at_index( + let voter_pubkey = transaction_context.get_key_of_account_at_index( instruction_context.get_index_of_instruction_account_in_transaction(3)?, )?; if !instruction_context.is_instruction_account_signer(3)? { return Err(InstructionError::MissingRequiredSignature); } - process_authorize_with_seed_instruction( - invoke_context, - instruction_context, - transaction_context, - &mut me, - new_authority, - args.authorization_type, - &args.current_authority_derived_key_owner, - args.current_authority_derived_key_seed.as_str(), - ) - } - VoteInstruction::UpdateValidatorIdentity => { - instruction_context.check_number_of_instruction_accounts(2)?; - let node_pubkey = transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(1)?, - )?; - vote_state::update_validator_identity( - &mut me, - node_pubkey, - &signers, - &invoke_context.feature_set, - ) - } - VoteInstruction::UpdateCommission(commission) => { - if invoke_context.feature_set.is_active( - &feature_set::commission_updates_only_allowed_in_first_half_of_epoch::id(), - ) { - let sysvar_cache = invoke_context.get_sysvar_cache(); - let epoch_schedule = sysvar_cache.get_epoch_schedule()?; - let clock = sysvar_cache.get_clock()?; - if !vote_state::is_commission_update_allowed(clock.slot, &epoch_schedule) { - return Err(VoteError::CommissionUpdateTooLate.into()); - } - } - vote_state::update_commission( - &mut me, - commission, - &signers, - &invoke_context.feature_set, - ) - } - VoteInstruction::Vote(vote) | VoteInstruction::VoteSwitch(vote, _) => { - let slot_hashes = get_sysvar_with_account_check::slot_hashes( - invoke_context, - instruction_context, - 1, - )?; let clock = - get_sysvar_with_account_check::clock(invoke_context, instruction_context, 2)?; - vote_state::process_vote_with_account( - &mut me, - &slot_hashes, - &clock, - &vote, - &signers, - &invoke_context.feature_set, - ) - } - VoteInstruction::UpdateVoteState(vote_state_update) - | VoteInstruction::UpdateVoteStateSwitch(vote_state_update, _) => { - let sysvar_cache = invoke_context.get_sysvar_cache(); - let slot_hashes = sysvar_cache.get_slot_hashes()?; - let clock = sysvar_cache.get_clock()?; - vote_state::process_vote_state_update( + get_sysvar_with_account_check::clock(invoke_context, instruction_context, 1)?; + vote_state::authorize( &mut me, - slot_hashes.slot_hashes(), - &clock, - vote_state_update, + voter_pubkey, + vote_authorize, &signers, - &invoke_context.feature_set, - ) - } - VoteInstruction::CompactUpdateVoteState(vote_state_update) - | VoteInstruction::CompactUpdateVoteStateSwitch(vote_state_update, _) => { - let sysvar_cache = invoke_context.get_sysvar_cache(); - let slot_hashes = sysvar_cache.get_slot_hashes()?; - let clock = sysvar_cache.get_clock()?; - vote_state::process_vote_state_update( - &mut me, - slot_hashes.slot_hashes(), &clock, - vote_state_update, - &signers, - &invoke_context.feature_set, - ) - } - - VoteInstruction::Withdraw(lamports) => { - instruction_context.check_number_of_instruction_accounts(2)?; - let rent_sysvar = invoke_context.get_sysvar_cache().get_rent()?; - let clock_sysvar = invoke_context.get_sysvar_cache().get_clock()?; - - drop(me); - vote_state::withdraw( - transaction_context, - instruction_context, - 0, - lamports, - 1, - &signers, - &rent_sysvar, - &clock_sysvar, &invoke_context.feature_set, ) - } - VoteInstruction::AuthorizeChecked(vote_authorize) => { - if invoke_context - .feature_set - .is_active(&feature_set::vote_stake_checked_instructions::id()) - { - instruction_context.check_number_of_instruction_accounts(4)?; - let voter_pubkey = transaction_context.get_key_of_account_at_index( - instruction_context.get_index_of_instruction_account_in_transaction(3)?, - )?; - if !instruction_context.is_instruction_account_signer(3)? { - return Err(InstructionError::MissingRequiredSignature); - } - let clock = get_sysvar_with_account_check::clock( - invoke_context, - instruction_context, - 1, - )?; - vote_state::authorize( - &mut me, - voter_pubkey, - vote_authorize, - &signers, - &clock, - &invoke_context.feature_set, - ) - } else { - Err(InstructionError::InvalidInstructionData) - } + } else { + Err(InstructionError::InvalidInstructionData) } } } -); +}); #[cfg(test)] mod tests { @@ -320,7 +309,7 @@ mod tests { transaction_accounts, instruction_accounts, expected_result, - super::process_instruction, + Entrypoint::vm, |_invoke_context| {}, |_invoke_context| {}, ) @@ -339,7 +328,7 @@ mod tests { transaction_accounts, instruction_accounts, expected_result, - super::process_instruction, + Entrypoint::vm, |invoke_context| { invoke_context.feature_set = std::sync::Arc::new(FeatureSet::default()); }, diff --git a/programs/zk-token-proof/src/lib.rs b/programs/zk-token-proof/src/lib.rs index 6ed1fb1f33e17f..3e43c564e70cef 100644 --- a/programs/zk-token-proof/src/lib.rs +++ b/programs/zk-token-proof/src/lib.rs @@ -130,7 +130,7 @@ fn process_close_proof_context(invoke_context: &mut InvokeContext) -> Result<(), Ok(()) } -declare_process_instruction!(process_instruction, 0, |invoke_context| { +declare_process_instruction!(Entrypoint, 0, |invoke_context| { // Consume compute units if feature `native_programs_consume_cu` is activated let native_programs_consume_cu = invoke_context .feature_set diff --git a/runtime/benches/bank.rs b/runtime/benches/bank.rs index fc8dfbd4a4e564..024df0d086cc0e 100644 --- a/runtime/benches/bank.rs +++ b/runtime/benches/bank.rs @@ -125,13 +125,13 @@ fn do_bench_transactions( // freeze bank so that slot hashes is populated bank.freeze(); - declare_process_instruction!(process_instruction, 1, |_invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |_invoke_context| { // Do nothing Ok(()) }); let mut bank = Bank::new_from_parent(Arc::new(bank), &Pubkey::default(), 1); - bank.add_mockup_builtin(Pubkey::from(BUILTIN_PROGRAM_ID), process_instruction); + bank.add_mockup_builtin(Pubkey::from(BUILTIN_PROGRAM_ID), MockBuiltin::vm); bank.add_builtin_account("solana_noop_program", &Pubkey::from(NOOP_PROGRAM_ID), false); let bank = Arc::new(bank); let bank_client = BankClient::new_shared(bank.clone()); diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 2ff10135615408..16911cef9e55b7 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -106,7 +106,7 @@ use { solana_program_runtime::{ accounts_data_meter::MAX_ACCOUNTS_DATA_LEN, compute_budget::{self, ComputeBudget}, - invoke_context::ProcessInstructionWithContext, + invoke_context::BuiltinFunctionWithContext, loaded_programs::{ LoadProgramMetrics, LoadedProgram, LoadedProgramMatchCriteria, LoadedProgramType, LoadedPrograms, LoadedProgramsForTxBatch, WorkingSlot, DELAY_VISIBILITY_SLOT_OFFSET, @@ -7894,12 +7894,12 @@ impl Bank { pub fn add_mockup_builtin( &mut self, program_id: Pubkey, - entrypoint: ProcessInstructionWithContext, + builtin_function: BuiltinFunctionWithContext, ) { self.add_builtin( program_id, "mockup".to_string(), - LoadedProgram::new_builtin(self.slot, 0, entrypoint), + LoadedProgram::new_builtin(self.slot, 0, builtin_function), ); } diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 60462e174b88bb..df776061ce6ed5 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -653,7 +653,7 @@ fn assert_capitalization_diff( } } -declare_process_instruction!(process_instruction, 1, |_invoke_context| { +declare_process_instruction!(MockBuiltin, 1, |_invoke_context| { // Default for all tests which don't bring their own processor Ok(()) }); @@ -1246,7 +1246,7 @@ fn test_rent_complex() { Deduction, } - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_data = instruction_context.get_instruction_data(); @@ -1281,7 +1281,7 @@ fn test_rent_complex() { root_bank.restore_old_behavior_for_fragile_tests(); let root_bank = Arc::new(root_bank); let mut bank = create_child_bank_for_rent_test(root_bank, &genesis_config); - bank.add_mockup_builtin(mock_program_id, process_instruction); + bank.add_mockup_builtin(mock_program_id, MockBuiltin::vm); assert_eq!(bank.last_blockhash(), genesis_config.hash()); @@ -4684,7 +4684,7 @@ fn test_add_builtin() { fn mock_vote_program_id() -> Pubkey { Pubkey::from([42u8; 32]) } - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let program_id = instruction_context.get_last_program_key(transaction_context)?; @@ -4695,7 +4695,7 @@ fn test_add_builtin() { }); assert!(bank.get_account(&mock_vote_program_id()).is_none()); - bank.add_mockup_builtin(mock_vote_program_id(), process_instruction); + bank.add_mockup_builtin(mock_vote_program_id(), MockBuiltin::vm); assert!(bank.get_account(&mock_vote_program_id()).is_some()); let mock_account = Keypair::new(); @@ -4740,7 +4740,7 @@ fn test_add_duplicate_static_program() { } = create_genesis_config_with_leader(500, &solana_sdk::pubkey::new_rand(), 0); let bank = Bank::new_for_tests(&genesis_config); - declare_process_instruction!(process_instruction, 1, |_invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |_invoke_context| { Err(InstructionError::Custom(42)) }); @@ -4771,7 +4771,7 @@ fn test_add_duplicate_static_program() { let mut bank = Bank::new_from_parent(Arc::new(bank), &Pubkey::default(), slot); let vote_loader_account = bank.get_account(&solana_vote_program::id()).unwrap(); - bank.add_mockup_builtin(solana_vote_program::id(), process_instruction); + bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm); let new_vote_loader_account = bank.get_account(&solana_vote_program::id()).unwrap(); // Vote loader account should not be updated since it was included in the genesis config. assert_eq!(vote_loader_account.data(), new_vote_loader_account.data()); @@ -4789,7 +4789,7 @@ fn test_add_instruction_processor_for_existing_unrelated_accounts() { for pass in 0..5 { let mut bank = create_simple_test_bank(500); - declare_process_instruction!(process_instruction, 1, |_invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |_invoke_context| { Err(InstructionError::Custom(42)) }); @@ -4825,12 +4825,12 @@ fn test_add_instruction_processor_for_existing_unrelated_accounts() { bank.add_builtin( vote_id, "mock_program1".to_string(), - LoadedProgram::new_builtin(0, 0, process_instruction), + LoadedProgram::new_builtin(0, 0, MockBuiltin::vm), ); bank.add_builtin( stake_id, "mock_program2".to_string(), - LoadedProgram::new_builtin(0, 0, process_instruction), + LoadedProgram::new_builtin(0, 0, MockBuiltin::vm), ); { let stakes = bank.stakes_cache.stakes(); @@ -4854,8 +4854,8 @@ fn test_add_instruction_processor_for_existing_unrelated_accounts() { // Re-adding builtin programs should be no-op bank.update_accounts_hash_for_tests(); let old_hash = bank.get_accounts_hash().unwrap(); - bank.add_mockup_builtin(vote_id, process_instruction); - bank.add_mockup_builtin(stake_id, process_instruction); + bank.add_mockup_builtin(vote_id, MockBuiltin::vm); + bank.add_mockup_builtin(stake_id, MockBuiltin::vm); add_root_and_flush_write_cache(&bank); bank.update_accounts_hash_for_tests(); let new_hash = bank.get_accounts_hash().unwrap(); @@ -6086,7 +6086,7 @@ fn test_transaction_with_duplicate_accounts_in_instruction() { let (genesis_config, mint_keypair) = create_genesis_config(500); let mut bank = Bank::new_for_tests(&genesis_config); - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_data = instruction_context.get_instruction_data(); @@ -6107,7 +6107,7 @@ fn test_transaction_with_duplicate_accounts_in_instruction() { }); let mock_program_id = Pubkey::from([2u8; 32]); - bank.add_mockup_builtin(mock_program_id, process_instruction); + bank.add_mockup_builtin(mock_program_id, MockBuiltin::vm); let from_pubkey = solana_sdk::pubkey::new_rand(); let to_pubkey = solana_sdk::pubkey::new_rand(); @@ -6143,7 +6143,7 @@ fn test_transaction_with_program_ids_passed_to_programs() { let mut bank = Bank::new_for_tests(&genesis_config); let mock_program_id = Pubkey::from([2u8; 32]); - bank.add_mockup_builtin(mock_program_id, process_instruction); + bank.add_mockup_builtin(mock_program_id, MockBuiltin::vm); let from_pubkey = solana_sdk::pubkey::new_rand(); let to_pubkey = solana_sdk::pubkey::new_rand(); @@ -6198,7 +6198,7 @@ fn test_account_ids_after_program_ids() { let slot = bank.slot().saturating_add(1); let mut bank = Bank::new_from_parent(Arc::new(bank), &Pubkey::default(), slot); - bank.add_mockup_builtin(solana_vote_program::id(), process_instruction); + bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm); let result = bank.process_transaction(&tx); assert_eq!(result, Ok(())); let account = bank.get_account(&solana_vote_program::id()).unwrap(); @@ -6248,7 +6248,7 @@ fn test_duplicate_account_key() { AccountMeta::new(to_pubkey, false), ]; - bank.add_mockup_builtin(solana_vote_program::id(), process_instruction); + bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm); let instruction = Instruction::new_with_bincode(solana_vote_program::id(), &10, account_metas); let mut tx = Transaction::new_signed_with_payer( @@ -6277,7 +6277,7 @@ fn test_process_transaction_with_too_many_account_locks() { AccountMeta::new(to_pubkey, false), ]; - bank.add_mockup_builtin(solana_vote_program::id(), process_instruction); + bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm); let instruction = Instruction::new_with_bincode(solana_vote_program::id(), &10, account_metas); let mut tx = Transaction::new_signed_with_payer( @@ -6310,7 +6310,7 @@ fn test_program_id_as_payer() { AccountMeta::new(to_pubkey, false), ]; - bank.add_mockup_builtin(solana_vote_program::id(), process_instruction); + bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm); let instruction = Instruction::new_with_bincode(solana_vote_program::id(), &10, account_metas); let mut tx = Transaction::new_signed_with_payer( @@ -6356,7 +6356,7 @@ fn test_ref_account_key_after_program_id() { let slot = bank.slot().saturating_add(1); let mut bank = Bank::new_from_parent(Arc::new(bank), &Pubkey::default(), slot); - bank.add_mockup_builtin(solana_vote_program::id(), process_instruction); + bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm); let instruction = Instruction::new_with_bincode(solana_vote_program::id(), &10, account_metas); let mut tx = Transaction::new_signed_with_payer( @@ -6390,7 +6390,7 @@ fn test_fuzz_instructions() { bank.add_builtin( key, name.clone(), - LoadedProgram::new_builtin(0, 0, process_instruction), + LoadedProgram::new_builtin(0, 0, MockBuiltin::vm), ); (key, name.as_bytes().to_vec()) }) @@ -6582,8 +6582,8 @@ fn test_bank_hash_consistency() { } #[test] -fn test_same_program_id_uses_unqiue_executable_accounts() { - declare_process_instruction!(process_instruction, 1, |invoke_context| { +fn test_same_program_id_uses_unique_executable_accounts() { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; instruction_context @@ -6596,7 +6596,7 @@ fn test_same_program_id_uses_unqiue_executable_accounts() { // Add a new program let program1_pubkey = solana_sdk::pubkey::new_rand(); - bank.add_mockup_builtin(program1_pubkey, process_instruction); + bank.add_mockup_builtin(program1_pubkey, MockBuiltin::vm); // Add a new program owned by the first let program2_pubkey = solana_sdk::pubkey::new_rand(); @@ -6813,13 +6813,13 @@ fn test_add_builtin_no_overwrite() { Arc::get_mut(&mut bank) .unwrap() - .add_mockup_builtin(program_id, process_instruction); + .add_mockup_builtin(program_id, MockBuiltin::vm); assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot); let mut bank = Arc::new(new_from_parent(bank)); Arc::get_mut(&mut bank) .unwrap() - .add_mockup_builtin(program_id, process_instruction); + .add_mockup_builtin(program_id, MockBuiltin::vm); assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot); } @@ -6837,13 +6837,13 @@ fn test_add_builtin_loader_no_overwrite() { Arc::get_mut(&mut bank) .unwrap() - .add_mockup_builtin(loader_id, process_instruction); + .add_mockup_builtin(loader_id, MockBuiltin::vm); assert_eq!(bank.get_account_modified_slot(&loader_id).unwrap().1, slot); let mut bank = Arc::new(new_from_parent(bank)); Arc::get_mut(&mut bank) .unwrap() - .add_mockup_builtin(loader_id, process_instruction); + .add_mockup_builtin(loader_id, MockBuiltin::vm); assert_eq!(bank.get_account_modified_slot(&loader_id).unwrap().1, slot); } @@ -7402,7 +7402,7 @@ fn test_bpf_loader_upgradeable_deploy_with_max_len() { ], Vec::new(), Ok(()), - solana_bpf_loader_program::process_instruction, + solana_bpf_loader_program::Entrypoint::vm, |invoke_context| { invoke_context .programs_modified_by_tx @@ -9707,7 +9707,7 @@ fn test_tx_return_data() { ); let mut bank = Bank::new_for_tests(&genesis_config); - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let mock_program_id = Pubkey::from([2u8; 32]); let transaction_context = &mut invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; @@ -9725,7 +9725,7 @@ fn test_tx_return_data() { let mock_program_id = Pubkey::from([2u8; 32]); let blockhash = bank.last_blockhash(); - bank.add_mockup_builtin(mock_program_id, process_instruction); + bank.add_mockup_builtin(mock_program_id, MockBuiltin::vm); for index in [ None, @@ -9905,7 +9905,7 @@ fn test_transfer_sysvar() { ); let mut bank = Bank::new_for_tests(&genesis_config); - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; instruction_context @@ -9915,7 +9915,7 @@ fn test_transfer_sysvar() { }); let program_id = solana_sdk::pubkey::new_rand(); - bank.add_mockup_builtin(program_id, process_instruction); + bank.add_mockup_builtin(program_id, MockBuiltin::vm); let blockhash = bank.last_blockhash(); #[allow(deprecated)] @@ -10114,7 +10114,7 @@ fn test_compute_budget_program_noop() { ); let mut bank = Bank::new_for_tests(&genesis_config); - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let compute_budget = invoke_context.get_compute_budget(); assert_eq!( *compute_budget, @@ -10127,7 +10127,7 @@ fn test_compute_budget_program_noop() { Ok(()) }); let program_id = solana_sdk::pubkey::new_rand(); - bank.add_mockup_builtin(program_id, process_instruction); + bank.add_mockup_builtin(program_id, MockBuiltin::vm); let message = Message::new( &[ @@ -10157,7 +10157,7 @@ fn test_compute_request_instruction() { ); let mut bank = Bank::new_for_tests(&genesis_config); - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let compute_budget = invoke_context.get_compute_budget(); assert_eq!( *compute_budget, @@ -10170,7 +10170,7 @@ fn test_compute_request_instruction() { Ok(()) }); let program_id = solana_sdk::pubkey::new_rand(); - bank.add_mockup_builtin(program_id, process_instruction); + bank.add_mockup_builtin(program_id, MockBuiltin::vm); let message = Message::new( &[ @@ -10207,7 +10207,7 @@ fn test_failed_compute_request_instruction() { bank.transfer(10, &mint_keypair, &payer1_keypair.pubkey()) .unwrap(); - declare_process_instruction!(process_instruction, 1, |invoke_context| { + declare_process_instruction!(MockBuiltin, 1, |invoke_context| { let compute_budget = invoke_context.get_compute_budget(); assert_eq!( *compute_budget, @@ -10220,7 +10220,7 @@ fn test_failed_compute_request_instruction() { Ok(()) }); let program_id = solana_sdk::pubkey::new_rand(); - bank.add_mockup_builtin(program_id, process_instruction); + bank.add_mockup_builtin(program_id, MockBuiltin::vm); // This message will not be executed because the compute budget request is invalid let message0 = Message::new( @@ -10824,7 +10824,7 @@ enum MockTransferInstruction { Transfer(u64), } -declare_process_instruction!(mock_transfer_process_instruction, 1, |invoke_context| { +declare_process_instruction!(MockTransferBuiltin, 1, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_data = instruction_context.get_instruction_data(); @@ -10907,7 +10907,7 @@ fn test_invalid_rent_state_changes_existing_accounts() { ); let mut bank = Bank::new_for_tests(&genesis_config); - bank.add_mockup_builtin(mock_program_id, mock_transfer_process_instruction); + bank.add_mockup_builtin(mock_program_id, MockTransferBuiltin::vm); let recent_blockhash = bank.last_blockhash(); let check_account_is_rent_exempt = |pubkey: &Pubkey| -> bool { @@ -10990,7 +10990,7 @@ fn test_invalid_rent_state_changes_new_accounts() { let rent_exempt_minimum = genesis_config.rent.minimum_balance(account_data_size); let mut bank = Bank::new_for_tests(&genesis_config); - bank.add_mockup_builtin(mock_program_id, mock_transfer_process_instruction); + bank.add_mockup_builtin(mock_program_id, MockTransferBuiltin::vm); let recent_blockhash = bank.last_blockhash(); let check_account_is_rent_exempt = |pubkey: &Pubkey| -> bool { @@ -11049,7 +11049,7 @@ fn test_drained_created_account() { let created_keypair = Keypair::new(); let mut bank = Bank::new_for_tests(&genesis_config); - bank.add_mockup_builtin(mock_program_id, mock_transfer_process_instruction); + bank.add_mockup_builtin(mock_program_id, MockTransferBuiltin::vm); let recent_blockhash = bank.last_blockhash(); // Create and drain a small data size account @@ -11577,7 +11577,7 @@ enum MockReallocInstruction { Realloc(usize, u64, Pubkey), } -declare_process_instruction!(mock_realloc_process_instruction, 1, |invoke_context| { +declare_process_instruction!(MockReallocBuiltin, 1, |invoke_context| { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_data = instruction_context.get_instruction_data(); @@ -11657,7 +11657,7 @@ fn test_resize_and_rent() { let mut bank = Bank::new_for_tests(&genesis_config); let mock_program_id = Pubkey::new_unique(); - bank.add_mockup_builtin(mock_program_id, mock_realloc_process_instruction); + bank.add_mockup_builtin(mock_program_id, MockReallocBuiltin::vm); let recent_blockhash = bank.last_blockhash(); let account_data_size_small = 1024; @@ -11928,7 +11928,7 @@ fn test_accounts_data_size_and_resize_transactions() { } = genesis_utils::create_genesis_config(100 * LAMPORTS_PER_SOL); let mut bank = Bank::new_for_tests(&genesis_config); let mock_program_id = Pubkey::new_unique(); - bank.add_mockup_builtin(mock_program_id, mock_realloc_process_instruction); + bank.add_mockup_builtin(mock_program_id, MockReallocBuiltin::vm); let recent_blockhash = bank.last_blockhash(); diff --git a/runtime/src/builtins.rs b/runtime/src/builtins.rs index 06a1709335b1db..2c7c36fa0ec415 100644 --- a/runtime/src/builtins.rs +++ b/runtime/src/builtins.rs @@ -1,5 +1,5 @@ use { - solana_program_runtime::invoke_context::ProcessInstructionWithContext, + solana_program_runtime::invoke_context::BuiltinFunctionWithContext, solana_sdk::{ bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable, feature_set, pubkey::Pubkey, }, @@ -10,7 +10,7 @@ pub struct BuiltinPrototype { pub feature_id: Option, pub program_id: Pubkey, pub name: &'static str, - pub entrypoint: ProcessInstructionWithContext, + pub entrypoint: BuiltinFunctionWithContext, } impl std::fmt::Debug for BuiltinPrototype { @@ -27,7 +27,7 @@ impl std::fmt::Debug for BuiltinPrototype { impl solana_frozen_abi::abi_example::AbiExample for BuiltinPrototype { fn example() -> Self { // BuiltinPrototype isn't serializable by definition. - solana_program_runtime::declare_process_instruction!(entrypoint, 0, |_invoke_context| { + solana_program_runtime::declare_process_instruction!(MockBuiltin, 0, |_invoke_context| { // Do nothing Ok(()) }); @@ -35,7 +35,7 @@ impl solana_frozen_abi::abi_example::AbiExample for BuiltinPrototype { feature_id: None, program_id: Pubkey::default(), name: "", - entrypoint, + entrypoint: MockBuiltin::vm, } } } @@ -45,66 +45,66 @@ pub static BUILTINS: &[BuiltinPrototype] = &[ feature_id: None, program_id: solana_system_program::id(), name: "system_program", - entrypoint: solana_system_program::system_processor::process_instruction, + entrypoint: solana_system_program::system_processor::Entrypoint::vm, }, BuiltinPrototype { feature_id: None, program_id: solana_vote_program::id(), name: "vote_program", - entrypoint: solana_vote_program::vote_processor::process_instruction, + entrypoint: solana_vote_program::vote_processor::Entrypoint::vm, }, BuiltinPrototype { feature_id: None, program_id: solana_stake_program::id(), name: "stake_program", - entrypoint: solana_stake_program::stake_instruction::process_instruction, + entrypoint: solana_stake_program::stake_instruction::Entrypoint::vm, }, BuiltinPrototype { feature_id: None, program_id: solana_config_program::id(), name: "config_program", - entrypoint: solana_config_program::config_processor::process_instruction, + entrypoint: solana_config_program::config_processor::Entrypoint::vm, }, BuiltinPrototype { feature_id: None, program_id: bpf_loader_deprecated::id(), name: "solana_bpf_loader_deprecated_program", - entrypoint: solana_bpf_loader_program::process_instruction, + entrypoint: solana_bpf_loader_program::Entrypoint::vm, }, BuiltinPrototype { feature_id: None, program_id: bpf_loader::id(), name: "solana_bpf_loader_program", - entrypoint: solana_bpf_loader_program::process_instruction, + entrypoint: solana_bpf_loader_program::Entrypoint::vm, }, BuiltinPrototype { feature_id: None, program_id: bpf_loader_upgradeable::id(), name: "solana_bpf_loader_upgradeable_program", - entrypoint: solana_bpf_loader_program::process_instruction, + entrypoint: solana_bpf_loader_program::Entrypoint::vm, }, BuiltinPrototype { feature_id: None, program_id: solana_sdk::compute_budget::id(), name: "compute_budget_program", - entrypoint: solana_compute_budget_program::process_instruction, + entrypoint: solana_compute_budget_program::Entrypoint::vm, }, BuiltinPrototype { feature_id: None, program_id: solana_sdk::address_lookup_table::program::id(), name: "address_lookup_table_program", - entrypoint: solana_address_lookup_table_program::processor::process_instruction, + entrypoint: solana_address_lookup_table_program::processor::Entrypoint::vm, }, BuiltinPrototype { feature_id: Some(feature_set::zk_token_sdk_enabled::id()), program_id: solana_zk_token_sdk::zk_token_proof_program::id(), name: "zk_token_proof_program", - entrypoint: solana_zk_token_proof_program::process_instruction, + entrypoint: solana_zk_token_proof_program::Entrypoint::vm, }, BuiltinPrototype { feature_id: Some(feature_set::enable_program_runtime_v2_and_loader_v4::id()), program_id: solana_sdk::loader_v4::id(), name: "loader_v4", - entrypoint: solana_loader_v4_program::process_instruction, + entrypoint: solana_loader_v4_program::Entrypoint::vm, }, ]; From cc4b71a8d7490bf50bd2d56484a77a9d5fbb4e70 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 21 Oct 2023 13:21:57 -0700 Subject: [PATCH 044/213] v1.17: Set a global fork graph in program cache (backport of #33776) (#33809) Set a global fork graph in program cache (#33776) * Set a global fork graph in program cache * fix deadlock * review feedback (cherry picked from commit 59cb3b57ee78b6c59f4cb5a744fa84b1198c77e4) Co-authored-by: Pankaj Garg --- core/src/replay_stage.rs | 1 + ledger/src/bank_forks_utils.rs | 9 ++ ledger/src/blockstore_processor.rs | 5 + program-runtime/src/loaded_programs.rs | 186 +++++++++++++++---------- runtime/src/bank.rs | 7 +- runtime/src/bank_forks.rs | 20 +-- 6 files changed, 145 insertions(+), 83 deletions(-) diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index 37067ce38f556d..f27f3e3d00f959 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -3869,6 +3869,7 @@ impl ReplayStage { epoch_slots_frozen_slots: &mut EpochSlotsFrozenSlots, drop_bank_sender: &Sender>>, ) { + bank_forks.read().unwrap().prune_program_cache(new_root); let removed_banks = bank_forks.write().unwrap().set_root( new_root, accounts_background_request_sender, diff --git a/ledger/src/bank_forks_utils.rs b/ledger/src/bank_forks_utils.rs index 0be01e9bde975b..8552a59033326f 100644 --- a/ledger/src/bank_forks_utils.rs +++ b/ledger/src/bank_forks_utils.rs @@ -189,6 +189,15 @@ pub fn load_bank_forks( (bank_forks, None) }; + bank_forks + .read() + .expect("Failed to read lock the bank forks") + .root_bank() + .loaded_programs_cache + .write() + .expect("Failed to write lock the program cache") + .set_fork_graph(bank_forks.clone()); + let mut leader_schedule_cache = LeaderScheduleCache::new_from_bank(&bank_forks.read().unwrap().root_bank()); if process_options.full_leader_cache { diff --git a/ledger/src/blockstore_processor.rs b/ledger/src/blockstore_processor.rs index 1a5ff7100c365c..647666806c91f1 100644 --- a/ledger/src/blockstore_processor.rs +++ b/ledger/src/blockstore_processor.rs @@ -1555,6 +1555,11 @@ fn load_frozen_forks( root = new_root_bank.slot(); leader_schedule_cache.set_root(new_root_bank); + new_root_bank + .loaded_programs_cache + .write() + .unwrap() + .prune(root, new_root_bank.epoch()); let _ = bank_forks.write().unwrap().set_root( root, accounts_background_request_sender, diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 310e9b77b17ed2..8b2b165136bf42 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -4,7 +4,7 @@ use { timings::ExecuteDetailsTimings, }, itertools::Itertools, - log::{debug, log_enabled, trace}, + log::{debug, error, log_enabled, trace}, percentage::PercentageInteger, solana_measure::measure::Measure, solana_rbpf::{ @@ -25,7 +25,7 @@ use { fmt::{Debug, Formatter}, sync::{ atomic::{AtomicU64, Ordering}, - Arc, + Arc, RwLock, }, }, }; @@ -443,8 +443,8 @@ impl Default for ProgramRuntimeEnvironments { } } -#[derive(Debug, Default)] -pub struct LoadedPrograms { +#[derive(Debug)] +pub struct LoadedPrograms { /// A two level index: /// /// Pubkey is the address of a program, multiple versions can coexists simultaneously under the same address (in different slots). @@ -456,6 +456,20 @@ pub struct LoadedPrograms { /// Environments of the current epoch pub environments: ProgramRuntimeEnvironments, pub stats: Stats, + fork_graph: Option>>, +} + +impl Default for LoadedPrograms { + fn default() -> Self { + Self { + entries: HashMap::new(), + latest_root_slot: 0, + latest_root_epoch: 0, + environments: ProgramRuntimeEnvironments::default(), + stats: Stats::default(), + fork_graph: None, + } + } } #[derive(Clone, Debug, Default)] @@ -532,7 +546,11 @@ pub enum LoadedProgramMatchCriteria { NoCriteria, } -impl LoadedPrograms { +impl LoadedPrograms { + pub fn set_fork_graph(&mut self, fork_graph: Arc>) { + self.fork_graph = Some(fork_graph); + } + /// Returns the current environments depending on the given epoch pub fn get_environments_for_epoch(&self, _epoch: Epoch) -> &ProgramRuntimeEnvironments { &self.environments @@ -626,12 +644,15 @@ impl LoadedPrograms { } /// Before rerooting the blockstore this removes all superfluous entries - pub fn prune( - &mut self, - fork_graph: &F, - new_root_slot: Slot, - new_root_epoch: Epoch, - ) { + pub fn prune(&mut self, new_root_slot: Slot, new_root_epoch: Epoch) { + let Some(fork_graph) = self.fork_graph.clone() else { + error!("Program cache doesn't have fork graph."); + return; + }; + let Ok(fork_graph) = fork_graph.read() else { + error!("Failed to lock fork graph for reading."); + return; + }; for second_level in self.entries.values_mut() { // Remove entries un/re/deployed on orphan forks let mut first_ancestor_found = false; @@ -912,7 +933,7 @@ impl solana_frozen_abi::abi_example::AbiExample for LoadedProgram { } #[cfg(RUSTC_WITH_SPECIALIZATION)] -impl solana_frozen_abi::abi_example::AbiExample for LoadedPrograms { +impl solana_frozen_abi::abi_example::AbiExample for LoadedPrograms { fn example() -> Self { // LoadedPrograms isn't serializable by definition. Self::default() @@ -938,7 +959,7 @@ mod tests { ops::ControlFlow, sync::{ atomic::{AtomicU64, Ordering}, - Arc, + Arc, RwLock, }, }, }; @@ -946,7 +967,7 @@ mod tests { static MOCK_ENVIRONMENT: std::sync::OnceLock = std::sync::OnceLock::::new(); - fn new_mock_cache() -> LoadedPrograms { + fn new_mock_cache() -> LoadedPrograms { let mut cache = LoadedPrograms::default(); cache.environments.program_runtime_v1 = MOCK_ENVIRONMENT .get_or_init(|| Arc::new(BuiltinProgram::new_mock())) @@ -1000,8 +1021,8 @@ mod tests { }) } - fn set_tombstone( - cache: &mut LoadedPrograms, + fn set_tombstone( + cache: &mut LoadedPrograms, key: Pubkey, slot: Slot, reason: LoadedProgramType, @@ -1009,8 +1030,8 @@ mod tests { cache.assign_program(key, Arc::new(LoadedProgram::new_tombstone(slot, reason))) } - fn insert_unloaded_program( - cache: &mut LoadedPrograms, + fn insert_unloaded_program( + cache: &mut LoadedPrograms, key: Pubkey, slot: Slot, ) -> Arc { @@ -1032,9 +1053,10 @@ mod tests { cache.replenish(key, unloaded).1 } - fn num_matching_entries

(cache: &LoadedPrograms, predicate: P) -> usize + fn num_matching_entries(cache: &LoadedPrograms, predicate: P) -> usize where P: Fn(&LoadedProgramType) -> bool, + FG: ForkGraph, { cache .entries @@ -1053,7 +1075,7 @@ mod tests { let mut programs = vec![]; let mut num_total_programs: usize = 0; - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); let program1 = Pubkey::new_unique(); let program1_deployment_slots = [0, 10, 20]; @@ -1219,7 +1241,7 @@ mod tests { #[test] fn test_usage_count_of_unloaded_program() { - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); let program = Pubkey::new_unique(); let num_total_programs = 6; @@ -1271,7 +1293,7 @@ mod tests { #[test] fn test_replace_tombstones() { - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); let program1 = Pubkey::new_unique(); let env = Arc::new(BuiltinProgram::new_mock()); set_tombstone( @@ -1303,7 +1325,7 @@ mod tests { assert_eq!(tombstone.deployment_slot, 100); assert_eq!(tombstone.effective_slot, 100); - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); let program1 = Pubkey::new_unique(); let tombstone = set_tombstone( &mut cache, @@ -1363,48 +1385,55 @@ mod tests { #[test] fn test_prune_empty() { - let mut cache = new_mock_cache(); - let fork_graph = TestForkGraph { + let mut cache = new_mock_cache::(); + let fork_graph = Arc::new(RwLock::new(TestForkGraph { relation: BlockRelation::Unrelated, - }; + })); - cache.prune(&fork_graph, 0, 0); + cache.set_fork_graph(fork_graph); + + cache.prune(0, 0); assert!(cache.entries.is_empty()); - cache.prune(&fork_graph, 10, 0); + cache.prune(10, 0); assert!(cache.entries.is_empty()); - let mut cache = new_mock_cache(); - let fork_graph = TestForkGraph { + let mut cache = new_mock_cache::(); + let fork_graph = Arc::new(RwLock::new(TestForkGraph { relation: BlockRelation::Ancestor, - }; + })); + + cache.set_fork_graph(fork_graph); - cache.prune(&fork_graph, 0, 0); + cache.prune(0, 0); assert!(cache.entries.is_empty()); - cache.prune(&fork_graph, 10, 0); + cache.prune(10, 0); assert!(cache.entries.is_empty()); - let mut cache = new_mock_cache(); - let fork_graph = TestForkGraph { + let mut cache = new_mock_cache::(); + let fork_graph = Arc::new(RwLock::new(TestForkGraph { relation: BlockRelation::Descendant, - }; + })); + + cache.set_fork_graph(fork_graph); - cache.prune(&fork_graph, 0, 0); + cache.prune(0, 0); assert!(cache.entries.is_empty()); - cache.prune(&fork_graph, 10, 0); + cache.prune(10, 0); assert!(cache.entries.is_empty()); - let mut cache = new_mock_cache(); - let fork_graph = TestForkGraph { + let mut cache = new_mock_cache::(); + let fork_graph = Arc::new(RwLock::new(TestForkGraph { relation: BlockRelation::Unknown, - }; + })); + cache.set_fork_graph(fork_graph); - cache.prune(&fork_graph, 0, 0); + cache.prune(0, 0); assert!(cache.entries.is_empty()); - cache.prune(&fork_graph, 10, 0); + cache.prune(10, 0); assert!(cache.entries.is_empty()); } @@ -1513,7 +1542,7 @@ mod tests { #[test] fn test_fork_extract_and_prune() { - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); // Fork graph created for the test // 0 @@ -1535,6 +1564,9 @@ mod tests { fork_graph.insert_fork(&[0, 5, 11, 15, 16, 19, 21, 23]); fork_graph.insert_fork(&[0, 5, 11, 25, 27]); + let fork_graph = Arc::new(RwLock::new(fork_graph)); + cache.set_fork_graph(fork_graph); + let program1 = Pubkey::new_unique(); assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); assert!(!cache.replenish(program1, new_test_loaded_program(10, 11)).0); @@ -1784,7 +1816,7 @@ mod tests { programs.pop(); } - cache.prune(&fork_graph, 5, 0); + cache.prune(5, 0); // Fork graph after pruning // 0 @@ -1849,7 +1881,7 @@ mod tests { assert!(match_slot(&found, &program3, 25, 27)); assert!(match_slot(&found, &program4, 5, 27)); - cache.prune(&fork_graph, 15, 0); + cache.prune(15, 0); // Fork graph after pruning // 0 @@ -1894,7 +1926,7 @@ mod tests { #[test] fn test_extract_using_deployment_slot() { - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); // Fork graph created for the test // 0 @@ -1916,6 +1948,9 @@ mod tests { fork_graph.insert_fork(&[0, 5, 11, 15, 16, 19, 21, 23]); fork_graph.insert_fork(&[0, 5, 11, 25, 27]); + let fork_graph = Arc::new(RwLock::new(fork_graph)); + cache.set_fork_graph(fork_graph); + let program1 = Pubkey::new_unique(); assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); @@ -1979,7 +2014,7 @@ mod tests { #[test] fn test_extract_unloaded() { - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); // Fork graph created for the test // 0 @@ -2001,6 +2036,9 @@ mod tests { fork_graph.insert_fork(&[0, 5, 11, 15, 16, 19, 21, 23]); fork_graph.insert_fork(&[0, 5, 11, 25, 27]); + let fork_graph = Arc::new(RwLock::new(fork_graph)); + cache.set_fork_graph(fork_graph); + let program1 = Pubkey::new_unique(); assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); @@ -2097,7 +2135,7 @@ mod tests { #[test] fn test_prune_expired() { - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); // Fork graph created for the test // 0 @@ -2118,6 +2156,8 @@ mod tests { fork_graph.insert_fork(&[0, 10, 20, 22]); fork_graph.insert_fork(&[0, 5, 11, 15, 16, 19, 21, 23]); fork_graph.insert_fork(&[0, 5, 11, 25, 27]); + let fork_graph = Arc::new(RwLock::new(fork_graph)); + cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); assert!(!cache.replenish(program1, new_test_loaded_program(10, 11)).0); @@ -2199,7 +2239,7 @@ mod tests { ); // New root 5 should not evict the expired entry for program1 - cache.prune(&fork_graph, 5, 0); + cache.prune(5, 0); assert_eq!( cache .entries @@ -2210,13 +2250,13 @@ mod tests { ); // New root 15 should evict the expired entry for program1 - cache.prune(&fork_graph, 15, 0); + cache.prune(15, 0); assert!(cache.entries.get(&program1).is_none()); } #[test] fn test_fork_prune_find_first_ancestor() { - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); // Fork graph created for the test // 0 @@ -2231,12 +2271,14 @@ mod tests { let mut fork_graph = TestForkGraphSpecific::default(); fork_graph.insert_fork(&[0, 10, 20]); fork_graph.insert_fork(&[0, 5]); + let fork_graph = Arc::new(RwLock::new(fork_graph)); + cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); assert!(!cache.replenish(program1, new_test_loaded_program(5, 6)).0); - cache.prune(&fork_graph, 10, 0); + cache.prune(10, 0); let working_slot = TestWorkingSlot::new(20, &[0, 10, 20]); let ExtractedPrograms { @@ -2262,7 +2304,7 @@ mod tests { #[test] fn test_prune_by_deployment_slot() { - let mut cache = new_mock_cache(); + let mut cache = new_mock_cache::(); // Fork graph created for the test // 0 @@ -2277,6 +2319,8 @@ mod tests { let mut fork_graph = TestForkGraphSpecific::default(); fork_graph.insert_fork(&[0, 10, 20]); fork_graph.insert_fork(&[0, 5]); + let fork_graph = Arc::new(RwLock::new(fork_graph)); + cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); @@ -2381,34 +2425,34 @@ mod tests { #[test] fn test_usable_entries_for_slot() { - new_mock_cache(); + new_mock_cache::(); let tombstone = Arc::new(LoadedProgram::new_tombstone(0, LoadedProgramType::Closed)); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &tombstone, 0, &LoadedProgramMatchCriteria::NoCriteria )); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &tombstone, 1, &LoadedProgramMatchCriteria::Tombstone )); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &tombstone, 1, &LoadedProgramMatchCriteria::NoCriteria )); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &tombstone, 1, &LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(0) )); - assert!(!LoadedPrograms::is_entry_usable( + assert!(!LoadedPrograms::::is_entry_usable( &tombstone, 1, &LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(1) @@ -2416,31 +2460,31 @@ mod tests { let program = new_test_loaded_program(0, 1); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &program, 0, &LoadedProgramMatchCriteria::NoCriteria )); - assert!(!LoadedPrograms::is_entry_usable( + assert!(!LoadedPrograms::::is_entry_usable( &program, 1, &LoadedProgramMatchCriteria::Tombstone )); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &program, 1, &LoadedProgramMatchCriteria::NoCriteria )); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &program, 1, &LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(0) )); - assert!(!LoadedPrograms::is_entry_usable( + assert!(!LoadedPrograms::::is_entry_usable( &program, 1, &LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(1) @@ -2453,37 +2497,37 @@ mod tests { Some(2), )); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &program, 0, &LoadedProgramMatchCriteria::NoCriteria )); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &program, 1, &LoadedProgramMatchCriteria::NoCriteria )); - assert!(!LoadedPrograms::is_entry_usable( + assert!(!LoadedPrograms::::is_entry_usable( &program, 1, &LoadedProgramMatchCriteria::Tombstone )); - assert!(!LoadedPrograms::is_entry_usable( + assert!(!LoadedPrograms::::is_entry_usable( &program, 2, &LoadedProgramMatchCriteria::NoCriteria )); - assert!(LoadedPrograms::is_entry_usable( + assert!(LoadedPrograms::::is_entry_usable( &program, 1, &LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(0) )); - assert!(!LoadedPrograms::is_entry_usable( + assert!(!LoadedPrograms::::is_entry_usable( &program, 1, &LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(1) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 16911cef9e55b7..d4993942ea2705 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -39,6 +39,7 @@ pub use solana_sdk::reward_type::RewardType; use { crate::{ bank::metrics::*, + bank_forks::BankForks, builtins::{BuiltinPrototype, BUILTINS}, epoch_rewards_hasher::hash_rewards_into_partitions, epoch_stakes::{EpochStakes, NodeVoteAccounts}, @@ -821,7 +822,7 @@ pub struct Bank { pub incremental_snapshot_persistence: Option, - pub loaded_programs_cache: Arc>, + pub loaded_programs_cache: Arc>>, pub check_program_modification_slot: bool, @@ -1071,7 +1072,7 @@ impl Bank { accounts_data_size_delta_on_chain: AtomicI64::new(0), accounts_data_size_delta_off_chain: AtomicI64::new(0), fee_structure: FeeStructure::default(), - loaded_programs_cache: Arc::>::default(), + loaded_programs_cache: Arc::>>::default(), check_program_modification_slot: false, epoch_reward_status: EpochRewardStatus::default(), }; @@ -1860,7 +1861,7 @@ impl Bank { accounts_data_size_delta_on_chain: AtomicI64::new(0), accounts_data_size_delta_off_chain: AtomicI64::new(0), fee_structure: FeeStructure::default(), - loaded_programs_cache: Arc::>::default(), + loaded_programs_cache: Arc::>>::default(), check_program_modification_slot: false, epoch_reward_status: EpochRewardStatus::default(), }; diff --git a/runtime/src/bank_forks.rs b/runtime/src/bank_forks.rs index ec69df9dded953..8ed5dd084efd68 100644 --- a/runtime/src/bank_forks.rs +++ b/runtime/src/bank_forks.rs @@ -55,6 +55,7 @@ struct SetRootTimings { prune_remove_ms: i64, } +#[derive(Debug)] pub struct BankForks { banks: HashMap>, descendants: HashMap>, @@ -404,6 +405,16 @@ impl BankForks { ) } + pub fn prune_program_cache(&self, root: Slot) { + if let Some(root_bank) = self.banks.get(&root) { + root_bank + .loaded_programs_cache + .write() + .unwrap() + .prune(root, root_bank.epoch()); + } + } + pub fn set_root( &mut self, root: Slot, @@ -411,15 +422,6 @@ impl BankForks { highest_super_majority_root: Option, ) -> Vec> { let program_cache_prune_start = Instant::now(); - let root_bank = self - .banks - .get(&root) - .expect("root bank didn't exist in bank_forks"); - root_bank - .loaded_programs_cache - .write() - .unwrap() - .prune(self, root, root_bank.epoch()); let set_root_start = Instant::now(); let (removed_banks, set_root_metrics) = self.do_set_root_return_metrics( root, From a186c5c31df6438ff670069fea2fe27f1bf855e3 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:39:32 +0000 Subject: [PATCH 045/213] v1.17: prunes turbine QUIC connections (backport of #33663) (#33800) prunes turbine QUIC connections (#33663) The commit implements lazy eviction for turbine QUIC connections. The cache is allowed to grow to 2 x capacity at which point at least half of the entries with lowest stake are evicted, resulting in an amortized O(1) performance. (cherry picked from commit e0b59a6f5351d889f9d1a2538d4607a7d340d6a9) Co-authored-by: behzad nouri --- core/src/validator.rs | 1 + turbine/src/quic_endpoint.rs | 158 ++++++++++++++++++++++++++++++++--- 2 files changed, 147 insertions(+), 12 deletions(-) diff --git a/core/src/validator.rs b/core/src/validator.rs index c23c724d5ec81f..5eca0ccaad28ef 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -1177,6 +1177,7 @@ impl Validator { .expect("Operator must spin up node with valid QUIC TVU address") .ip(), turbine_quic_endpoint_sender, + bank_forks.clone(), ) .unwrap(); diff --git a/turbine/src/quic_endpoint.rs b/turbine/src/quic_endpoint.rs index 9be1dd11294c62..0f362fd1a34c69 100644 --- a/turbine/src/quic_endpoint.rs +++ b/turbine/src/quic_endpoint.rs @@ -10,15 +10,20 @@ use { rcgen::RcgenError, rustls::{Certificate, PrivateKey}, solana_quic_client::nonblocking::quic_client::SkipServerVerification, + solana_runtime::bank_forks::BankForks, solana_sdk::{pubkey::Pubkey, signature::Keypair}, solana_streamer::{ quic::SkipClientVerification, tls_certificates::new_self_signed_tls_certificate, }, std::{ + cmp::Reverse, collections::{hash_map::Entry, HashMap}, io::Error as IoError, net::{IpAddr, SocketAddr, UdpSocket}, - sync::Arc, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, RwLock, + }, }, thiserror::Error, tokio::{ @@ -32,6 +37,7 @@ use { const CLIENT_CHANNEL_BUFFER: usize = 1 << 14; const ROUTER_CHANNEL_BUFFER: usize = 64; +const CONNECTION_CACHE_CAPACITY: usize = 3072; const INITIAL_MAXIMUM_TRANSMISSION_UNIT: u16 = 1280; const ALPN_TURBINE_PROTOCOL_ID: &[u8] = b"solana-turbine"; const CONNECT_SERVER_NAME: &str = "solana-turbine"; @@ -40,11 +46,13 @@ const CONNECTION_CLOSE_ERROR_CODE_SHUTDOWN: VarInt = VarInt::from_u32(1); const CONNECTION_CLOSE_ERROR_CODE_DROPPED: VarInt = VarInt::from_u32(2); const CONNECTION_CLOSE_ERROR_CODE_INVALID_IDENTITY: VarInt = VarInt::from_u32(3); const CONNECTION_CLOSE_ERROR_CODE_REPLACED: VarInt = VarInt::from_u32(4); +const CONNECTION_CLOSE_ERROR_CODE_PRUNED: VarInt = VarInt::from_u32(5); const CONNECTION_CLOSE_REASON_SHUTDOWN: &[u8] = b"SHUTDOWN"; const CONNECTION_CLOSE_REASON_DROPPED: &[u8] = b"DROPPED"; const CONNECTION_CLOSE_REASON_INVALID_IDENTITY: &[u8] = b"INVALID_IDENTITY"; const CONNECTION_CLOSE_REASON_REPLACED: &[u8] = b"REPLACED"; +const CONNECTION_CLOSE_REASON_PRUNED: &[u8] = b"PRUNED"; pub type AsyncTryJoinHandle = TryJoin, JoinHandle<()>>; @@ -75,6 +83,7 @@ pub fn new_quic_endpoint( socket: UdpSocket, address: IpAddr, sender: Sender<(Pubkey, SocketAddr, Bytes)>, + bank_forks: Arc>, ) -> Result< ( Endpoint, @@ -98,12 +107,15 @@ pub fn new_quic_endpoint( )? }; endpoint.set_default_client_config(client_config); + let prune_cache_pending = Arc::::default(); let cache = Arc::>>::default(); let router = Arc::>>>::default(); let (client_sender, client_receiver) = tokio::sync::mpsc::channel(CLIENT_CHANNEL_BUFFER); let server_task = runtime.spawn(run_server( endpoint.clone(), sender.clone(), + bank_forks.clone(), + prune_cache_pending.clone(), router.clone(), cache.clone(), )); @@ -111,6 +123,8 @@ pub fn new_quic_endpoint( endpoint.clone(), client_receiver, sender, + bank_forks, + prune_cache_pending, router, cache, )); @@ -163,6 +177,8 @@ fn new_transport_config() -> TransportConfig { async fn run_server( endpoint: Endpoint, sender: Sender<(Pubkey, SocketAddr, Bytes)>, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { @@ -171,6 +187,8 @@ async fn run_server( endpoint.clone(), connecting, sender.clone(), + bank_forks.clone(), + prune_cache_pending.clone(), router.clone(), cache.clone(), )); @@ -181,6 +199,8 @@ async fn run_client( endpoint: Endpoint, mut receiver: AsyncReceiver<(SocketAddr, Bytes)>, sender: Sender<(Pubkey, SocketAddr, Bytes)>, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { @@ -203,6 +223,8 @@ async fn run_client( remote_address, sender.clone(), receiver, + bank_forks.clone(), + prune_cache_pending.clone(), router.clone(), cache.clone(), )); @@ -234,10 +256,22 @@ async fn handle_connecting_error( endpoint: Endpoint, connecting: Connecting, sender: Sender<(Pubkey, SocketAddr, Bytes)>, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { - if let Err(err) = handle_connecting(endpoint, connecting, sender, router, cache).await { + if let Err(err) = handle_connecting( + endpoint, + connecting, + sender, + bank_forks, + prune_cache_pending, + router, + cache, + ) + .await + { error!("handle_connecting: {err:?}"); } } @@ -246,6 +280,8 @@ async fn handle_connecting( endpoint: Endpoint, connecting: Connecting, sender: Sender<(Pubkey, SocketAddr, Bytes)>, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) -> Result<(), Error> { @@ -264,6 +300,8 @@ async fn handle_connecting( connection, sender, receiver, + bank_forks, + prune_cache_pending, router, cache, ) @@ -271,6 +309,7 @@ async fn handle_connecting( Ok(()) } +#[allow(clippy::too_many_arguments)] async fn handle_connection( endpoint: Endpoint, remote_address: SocketAddr, @@ -278,10 +317,20 @@ async fn handle_connection( connection: Connection, sender: Sender<(Pubkey, SocketAddr, Bytes)>, receiver: AsyncReceiver, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { - cache_connection(remote_pubkey, connection.clone(), &cache).await; + cache_connection( + remote_pubkey, + connection.clone(), + bank_forks, + prune_cache_pending, + router.clone(), + cache.clone(), + ) + .await; let send_datagram_task = tokio::task::spawn(send_datagram_task(connection.clone(), receiver)); let read_datagram_task = tokio::task::spawn(read_datagram_task( endpoint, @@ -351,11 +400,22 @@ async fn make_connection_task( remote_address: SocketAddr, sender: Sender<(Pubkey, SocketAddr, Bytes)>, receiver: AsyncReceiver, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) { - if let Err(err) = - make_connection(endpoint, remote_address, sender, receiver, router, cache).await + if let Err(err) = make_connection( + endpoint, + remote_address, + sender, + receiver, + bank_forks, + prune_cache_pending, + router, + cache, + ) + .await { error!("make_connection: {remote_address}, {err:?}"); } @@ -366,6 +426,8 @@ async fn make_connection( remote_address: SocketAddr, sender: Sender<(Pubkey, SocketAddr, Bytes)>, receiver: AsyncReceiver, + bank_forks: Arc>, + prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, ) -> Result<(), Error> { @@ -379,6 +441,8 @@ async fn make_connection( connection, sender, receiver, + bank_forks, + prune_cache_pending, router, cache, ) @@ -402,15 +466,32 @@ fn get_remote_pubkey(connection: &Connection) -> Result { async fn cache_connection( remote_pubkey: Pubkey, connection: Connection, - cache: &Mutex>, + bank_forks: Arc>, + prune_cache_pending: Arc, + router: Arc>>>, + cache: Arc>>, ) { - let Some(old) = cache.lock().await.insert(remote_pubkey, connection) else { - return; + let (old, should_prune_cache) = { + let mut cache = cache.lock().await; + ( + cache.insert(remote_pubkey, connection), + cache.len() >= CONNECTION_CACHE_CAPACITY.saturating_mul(2), + ) }; - old.close( - CONNECTION_CLOSE_ERROR_CODE_REPLACED, - CONNECTION_CLOSE_REASON_REPLACED, - ); + if let Some(old) = old { + old.close( + CONNECTION_CLOSE_ERROR_CODE_REPLACED, + CONNECTION_CLOSE_REASON_REPLACED, + ); + } + if should_prune_cache && !prune_cache_pending.swap(true, Ordering::Relaxed) { + tokio::task::spawn(prune_connection_cache( + bank_forks, + prune_cache_pending, + router, + cache, + )); + } } async fn drop_connection( @@ -429,6 +510,50 @@ async fn drop_connection( } } +async fn prune_connection_cache( + bank_forks: Arc>, + prune_cache_pending: Arc, + router: Arc>>>, + cache: Arc>>, +) { + debug_assert!(prune_cache_pending.load(Ordering::Relaxed)); + let staked_nodes = { + let root_bank = bank_forks.read().unwrap().root_bank(); + root_bank.staked_nodes() + }; + { + let mut cache = cache.lock().await; + if cache.len() < CONNECTION_CACHE_CAPACITY.saturating_mul(2) { + prune_cache_pending.store(false, Ordering::Relaxed); + return; + } + let mut connections: Vec<_> = cache + .drain() + .filter(|(_, connection)| connection.close_reason().is_none()) + .map(|entry @ (pubkey, _)| { + let stake = staked_nodes.get(&pubkey).copied().unwrap_or_default(); + (stake, entry) + }) + .collect(); + connections + .select_nth_unstable_by_key(CONNECTION_CACHE_CAPACITY, |&(stake, _)| Reverse(stake)); + for (_, (_, connection)) in &connections[CONNECTION_CACHE_CAPACITY..] { + connection.close( + CONNECTION_CLOSE_ERROR_CODE_PRUNED, + CONNECTION_CLOSE_REASON_PRUNED, + ); + } + cache.extend( + connections + .into_iter() + .take(CONNECTION_CACHE_CAPACITY) + .map(|(_, entry)| entry), + ); + prune_cache_pending.store(false, Ordering::Relaxed); + } + router.write().await.retain(|_, sender| !sender.is_closed()); +} + impl From> for Error { fn from(_: crossbeam_channel::SendError) -> Self { Error::ChannelSendError @@ -440,6 +565,8 @@ mod tests { use { super::*, itertools::{izip, multiunzip}, + solana_ledger::genesis_utils::{create_genesis_config, GenesisConfigInfo}, + solana_runtime::bank::Bank, solana_sdk::signature::Signer, std::{iter::repeat_with, net::Ipv4Addr, time::Duration}, }; @@ -467,6 +594,12 @@ mod tests { repeat_with(crossbeam_channel::unbounded::<(Pubkey, SocketAddr, Bytes)>) .take(NUM_ENDPOINTS) .unzip(); + let bank_forks = { + let GenesisConfigInfo { genesis_config, .. } = + create_genesis_config(/*mint_lamports:*/ 100_000); + let bank = Bank::new_for_tests(&genesis_config); + Arc::new(RwLock::new(BankForks::new(bank))) + }; let (endpoints, senders, tasks): (Vec<_>, Vec<_>, Vec<_>) = multiunzip(keypairs.iter().zip(sockets).zip(senders).map( |((keypair, socket), sender)| { @@ -476,6 +609,7 @@ mod tests { socket, IpAddr::V4(Ipv4Addr::LOCALHOST), sender, + bank_forks.clone(), ) .unwrap() }, From 22f44d051869756b0f683e1e35bee5141943f436 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 18:28:40 +0000 Subject: [PATCH 046/213] v1.17: Initialize fork graph in program cache during bank_forks creation (backport of #33810) (#33817) * Initialize fork graph in program cache during bank_forks creation (#33810) * Initialize fork graph in program cache during bank_forks creation * rename BankForks::new to BankForks::new_rw_arc * fix compilation * no need to set fork_graph on insert() * fix partition tests (cherry picked from commit 9d42cd7efe869223040f68c0a9b2bdfa99f1018a) # Conflicts: # core/src/repair/repair_service.rs # core/tests/epoch_accounts_hash.rs # ledger/src/blockstore_processor.rs # rpc/src/rpc_service.rs # runtime/src/bank/tests.rs * fix merge conflicts --------- Co-authored-by: Pankaj Garg --- Cargo.lock | 377 +++++++++--------- banking-bench/src/main.rs | 2 +- banks-client/src/lib.rs | 4 +- client-test/tests/client.rs | 12 +- core/benches/banking_stage.rs | 4 +- core/benches/consensus.rs | 10 +- core/src/banking_stage.rs | 10 +- core/src/banking_stage/consume_worker.rs | 2 +- core/src/banking_stage/forward_worker.rs | 2 +- core/src/banking_stage/forwarder.rs | 2 +- core/src/cluster_info_vote_listener.rs | 10 +- core/src/commitment_service.rs | 3 +- .../consensus/heaviest_subtree_fork_choice.rs | 3 +- core/src/repair/ancestor_hashes_service.rs | 2 +- core/src/repair/quic_endpoint.rs | 2 +- core/src/repair/repair_service.rs | 4 +- core/src/repair/serve_repair.rs | 10 +- core/src/replay_stage.rs | 38 +- core/src/tvu.rs | 5 +- core/src/validator.rs | 6 +- core/src/vote_simulator.rs | 16 +- core/tests/epoch_accounts_hash.rs | 25 +- core/tests/snapshots.rs | 82 ++-- gossip/src/duplicate_shred_handler.rs | 18 +- gossip/tests/gossip.rs | 2 +- ledger/src/bank_forks_utils.rs | 14 +- ledger/src/blockstore_processor.rs | 15 +- program-runtime/src/loaded_programs.rs | 2 +- program-test/src/lib.rs | 2 +- .../optimistically_confirmed_bank_tracker.rs | 2 +- rpc/src/rpc.rs | 9 +- rpc/src/rpc_health.rs | 2 +- rpc/src/rpc_pubsub.rs | 26 +- rpc/src/rpc_pubsub_service.rs | 2 +- rpc/src/rpc_service.rs | 4 +- rpc/src/rpc_subscription_tracker.rs | 4 +- rpc/src/rpc_subscriptions.rs | 38 +- runtime/benches/prioritization_fee_cache.rs | 4 +- runtime/src/bank/tests.rs | 17 +- runtime/src/bank_forks.rs | 106 +++-- runtime/src/prioritization_fee_cache.rs | 8 +- runtime/src/root_bank_cache.rs | 2 +- .../src/send_transaction_service.rs | 8 +- turbine/benches/cluster_info.rs | 9 +- turbine/benches/retransmit_stage.rs | 7 +- turbine/src/broadcast_stage.rs | 2 +- .../broadcast_stage/standard_broadcast_run.rs | 2 +- turbine/src/quic_endpoint.rs | 2 +- turbine/src/sigverify_shreds.rs | 2 +- validator/src/admin_rpc_service.rs | 5 +- 50 files changed, 501 insertions(+), 444 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 55974005a539bf..a4c713f1984c57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,14 +76,15 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "72832d73be48bac96a5d7944568f305d829ed55b0ce3b483647089dfaf6cf704" dependencies = [ "cfg-if 1.0.0", "getrandom 0.2.10", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -430,13 +431,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -590,7 +591,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -864,9 +865,9 @@ dependencies = [ [[package]] name = "bytecount" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" +checksum = "ad152d03a2c813c80bb94fedbf3a3f02b28f793e39e7c214c8a0bcc196343de7" [[package]] name = "bytemuck" @@ -890,9 +891,9 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -963,7 +964,7 @@ checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", - "semver 1.0.19", + "semver 1.0.20", "serde", "serde_json", "thiserror", @@ -1228,18 +1229,18 @@ checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" [[package]] name = "const_format" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c990efc7a285731f9a4378d81aff2f0e85a2c8781a05ef0f8baa8dac54d0ff48" +checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e026b6ce194a874cb9cf32cd5772d1ef9767cc8fcb5765948d74f37a9d8b2bf6" +checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" dependencies = [ "proc-macro2", "quote", @@ -1423,9 +1424,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ "csv-core", "itoa", @@ -1435,9 +1436,9 @@ dependencies = [ [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ "memchr", ] @@ -1496,7 +1497,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -1507,7 +1508,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -1523,13 +1524,15 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.2.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if 1.0.0", - "num_cpus", - "parking_lot 0.12.1", + "hashbrown 0.14.1", + "lock_api", + "once_cell", + "parking_lot_core 0.9.8", ] [[package]] @@ -1699,7 +1702,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -1746,7 +1749,7 @@ dependencies = [ "derivation-path", "ed25519-dalek", "hmac 0.12.1", - "sha2 0.10.7", + "sha2 0.10.8", ] [[package]] @@ -1799,7 +1802,7 @@ checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -1946,9 +1949,9 @@ checksum = "398ea4fabe40b9b0d885340a2a991a44c8a645624075ad966d21f88688e2b69e" [[package]] name = "flate2" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -2074,7 +2077,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -2316,14 +2319,14 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.4", ] [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" [[package]] name = "headers" @@ -2626,12 +2629,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad227c3af19d4914570ad36d30409928b75967c298feb9ea1969db3a610bb14e" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.1", "rayon", ] @@ -2868,9 +2871,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.148" +version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "libloading" @@ -2987,10 +2990,11 @@ checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ + "autocfg", "scopeguard", ] @@ -3301,13 +3305,13 @@ dependencies = [ [[package]] name = "num-derive" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -3345,9 +3349,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", "libm", @@ -3411,7 +3415,7 @@ dependencies = [ "proc-macro-crate 1.1.0", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -3423,7 +3427,7 @@ dependencies = [ "proc-macro-crate 1.1.0", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -3617,7 +3621,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.1", + "parking_lot_core 0.9.8", ] [[package]] @@ -3636,15 +3640,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.10", + "redox_syscall 0.3.5", "smallvec", - "windows-sys 0.32.0", + "windows-targets 0.48.0", ] [[package]] @@ -3930,7 +3934,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ceca8aaf45b5c46ec7ed39fff75f57290368c1846d33d24a122ca81416ab058" dependencies = [ "proc-macro2", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -3978,28 +3982,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +checksum = "7c003ac8c77cb07bb74f5f198bce836a689bcd5a42574612bf14d17bfd08c20e" dependencies = [ "bit-set", - "bitflags 1.3.2", - "byteorder", + "bit-vec", + "bitflags 2.3.3", "lazy_static", "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.6.29", + "regex-syntax 0.7.5", "rusty-fork", "tempfile", "unarray", @@ -4093,7 +4097,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -4145,7 +4149,7 @@ checksum = "6df19e284d93757a9fb91d63672f7741b129246a669db09d1c0063071debc0c0" dependencies = [ "bytes", "libc", - "socket2 0.5.4", + "socket2 0.5.5", "tracing", "windows-sys 0.48.0", ] @@ -4284,9 +4288,9 @@ checksum = "655b020bbf5c89791160a30f0d4706d8ec7aa5718d6a198f6df19c400e4f4470" [[package]] name = "rayon" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ "either", "rayon-core", @@ -4294,14 +4298,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] @@ -4374,14 +4376,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.6" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick 1.0.1", "memchr", - "regex-automata 0.3.9", - "regex-syntax 0.7.5", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -4392,32 +4394,32 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-automata" -version = "0.3.9" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick 1.0.1", "memchr", - "regex-syntax 0.7.5", + "regex-syntax 0.8.2", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.20" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "async-compression", "base64 0.21.4", @@ -4444,6 +4446,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -4539,7 +4542,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.19", + "semver 1.0.20", ] [[package]] @@ -4729,9 +4732,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" dependencies = [ "serde", ] @@ -4747,9 +4750,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.188" +version = "1.0.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" dependencies = [ "serde_derive", ] @@ -4765,13 +4768,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -4816,7 +4819,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -4837,7 +4840,7 @@ version = "0.9.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" dependencies = [ - "indexmap 2.0.1", + "indexmap 2.0.2", "itoa", "ryu", "serde", @@ -4850,7 +4853,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" dependencies = [ - "dashmap 5.2.0", + "dashmap 5.5.3", "futures 0.3.28", "lazy_static", "log", @@ -4866,7 +4869,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -4931,9 +4934,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if 1.0.0", "cpufeatures", @@ -5038,9 +5041,9 @@ checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" [[package]] name = "smallvec" -version = "1.7.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "smpl_jwt" @@ -5070,9 +5073,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys 0.48.0", @@ -5463,7 +5466,7 @@ dependencies = [ "predicates", "regex", "reqwest", - "semver 1.0.19", + "semver 1.0.20", "serial_test", "solana-download-utils", "solana-logger", @@ -5540,7 +5543,7 @@ dependencies = [ "num-traits", "pretty-hex", "reqwest", - "semver 1.0.19", + "semver 1.0.20", "serde", "serde_derive", "serde_json", @@ -5602,7 +5605,7 @@ dependencies = [ "humantime", "indicatif", "pretty-hex", - "semver 1.0.19", + "semver 1.0.20", "serde", "serde_json", "solana-account-decoder", @@ -5625,7 +5628,7 @@ dependencies = [ "dashmap 4.0.2", "futures 0.3.28", "futures-util", - "indexmap 2.0.1", + "indexmap 2.0.2", "indicatif", "log", "quinn", @@ -5706,7 +5709,7 @@ dependencies = [ "bincode", "crossbeam-channel", "futures-util", - "indexmap 2.0.1", + "indexmap 2.0.2", "indicatif", "log", "rand 0.8.5", @@ -5931,7 +5934,7 @@ dependencies = [ name = "solana-frozen-abi" version = "1.17.4" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.4", "bitflags 2.3.3", "blake3", "block-buffer 0.10.4", @@ -5950,7 +5953,7 @@ dependencies = [ "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "solana-frozen-abi-macro", "solana-logger", "subtle", @@ -5964,7 +5967,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.0", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -6048,7 +6051,7 @@ dependencies = [ "clap 2.33.3", "crossbeam-channel", "flate2", - "indexmap 2.0.1", + "indexmap 2.0.2", "itertools", "log", "lru", @@ -6107,7 +6110,7 @@ dependencies = [ "nix 0.26.4", "reqwest", "scopeguard", - "semver 1.0.19", + "semver 1.0.20", "serde", "serde_yaml 0.8.26", "serde_yaml 0.9.25", @@ -6173,7 +6176,7 @@ dependencies = [ "scopeguard", "serde", "serde_bytes", - "sha2 0.10.7", + "sha2 0.10.8", "solana-account-decoder", "solana-accounts-db", "solana-bpf-loader-program", @@ -6403,7 +6406,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_derive", - "socket2 0.5.4", + "socket2 0.5.5", "solana-logger", "solana-sdk", "solana-version", @@ -6425,7 +6428,7 @@ dependencies = [ name = "solana-perf" version = "1.17.4" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.4", "assert_matches", "bincode", "bv", @@ -6532,7 +6535,7 @@ dependencies = [ "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "sha3 0.10.4", "solana-frozen-abi", "solana-frozen-abi-macro", @@ -6612,7 +6615,7 @@ dependencies = [ "futures-util", "log", "reqwest", - "semver 1.0.19", + "semver 1.0.20", "serde", "serde_derive", "serde_json", @@ -6676,7 +6679,7 @@ dependencies = [ "num-traits", "parking_lot 0.12.1", "qstring", - "semver 1.0.19", + "semver 1.0.20", "solana-sdk", "thiserror", "uriparse", @@ -6757,7 +6760,7 @@ dependencies = [ "jsonrpc-http-server", "log", "reqwest", - "semver 1.0.19", + "semver 1.0.20", "serde", "serde_derive", "serde_json", @@ -6778,7 +6781,7 @@ dependencies = [ "bs58", "jsonrpc-core", "reqwest", - "semver 1.0.19", + "semver 1.0.20", "serde", "serde_derive", "serde_json", @@ -6960,7 +6963,7 @@ dependencies = [ "serde_derive", "serde_json", "serde_with", - "sha2 0.10.7", + "sha2 0.10.8", "sha3 0.10.4", "solana-frozen-abi", "solana-frozen-abi-macro", @@ -6983,7 +6986,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -7104,7 +7107,7 @@ dependencies = [ "crossbeam-channel", "futures-util", "histogram", - "indexmap 2.0.1", + "indexmap 2.0.2", "itertools", "libc", "log", @@ -7195,7 +7198,7 @@ dependencies = [ "console", "csv", "ctrlc", - "indexmap 2.0.1", + "indexmap 2.0.2", "indicatif", "pickledb", "serde", @@ -7224,7 +7227,7 @@ dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 2.0.1", + "indexmap 2.0.2", "indicatif", "log", "rayon", @@ -7417,7 +7420,7 @@ version = "1.17.4" dependencies = [ "log", "rustc_version 0.4.0", - "semver 1.0.19", + "semver 1.0.20", "serde", "serde_derive", "solana-frozen-abi", @@ -7609,7 +7612,7 @@ checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3" dependencies = [ "assert_matches", "borsh 0.10.3", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "solana-program", "spl-token", @@ -7636,7 +7639,7 @@ checksum = "fadbefec4f3c678215ca72bd71862697bb06b41fd77c0088902dd3203354387b" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -7647,8 +7650,8 @@ checksum = "0e5f2044ca42c8938d54d1255ce599c79a1ffd86b677dfab695caa20f9ffc3f2" dependencies = [ "proc-macro2", "quote", - "sha2 0.10.7", - "syn 2.0.37", + "sha2 0.10.8", + "syn 2.0.38", "thiserror", ] @@ -7690,7 +7693,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" dependencies = [ - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "solana-program", "spl-program-error-derive", @@ -7705,8 +7708,8 @@ checksum = "ab5269c8e868da17b6552ef35a51355a017bd8e0eae269c201fef830d35fa52c" dependencies = [ "proc-macro2", "quote", - "sha2 0.10.7", - "syn 2.0.37", + "sha2 0.10.8", + "syn 2.0.38", ] [[package]] @@ -7746,7 +7749,7 @@ checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "num_enum 0.7.0", "solana-program", @@ -7879,9 +7882,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.37" +version = "2.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" dependencies = [ "proc-macro2", "quote", @@ -7929,6 +7932,27 @@ dependencies = [ "walkdir", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "systemstat" version = "0.2.3" @@ -8036,7 +8060,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -8048,7 +8072,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", "test-case-core", ] @@ -8069,22 +8093,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -8223,7 +8247,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -8714,7 +8738,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", "wasm-bindgen-shared", ] @@ -8748,7 +8772,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -8838,19 +8862,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" -dependencies = [ - "windows_aarch64_msvc 0.32.0", - "windows_i686_gnu 0.32.0", - "windows_i686_msvc 0.32.0", - "windows_x86_64_gnu 0.32.0", - "windows_x86_64_msvc 0.32.0", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -8911,12 +8922,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -8929,12 +8934,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -8947,12 +8946,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -8965,12 +8958,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -8995,12 +8982,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -9068,6 +9049,26 @@ dependencies = [ "time", ] +[[package]] +name = "zerocopy" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c19fae0c8a9efc6a8281f2e623db8af1db9e57852e04cde3e754dd2dc29340f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc56589e9ddd1f1c28d4b4b5c773ce232910a6bb67a70133d61c9e347585efe9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "zeroize" version = "1.3.0" @@ -9085,7 +9086,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] diff --git a/banking-bench/src/main.rs b/banking-bench/src/main.rs index bb5149f47c85b9..524928aee7c06d 100644 --- a/banking-bench/src/main.rs +++ b/banking-bench/src/main.rs @@ -334,7 +334,7 @@ fn main() { let (replay_vote_sender, _replay_vote_receiver) = unbounded(); let bank0 = Bank::new_for_benches(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank0))); + let bank_forks = BankForks::new_rw_arc(bank0); let mut bank = bank_forks.read().unwrap().working_bank(); // set cost tracker limits to MAX so it will not filter out TXs diff --git a/banks-client/src/lib.rs b/banks-client/src/lib.rs index f0c2f17d8c01e7..61105575e2ca2e 100644 --- a/banks-client/src/lib.rs +++ b/banks-client/src/lib.rs @@ -587,7 +587,7 @@ mod tests { let block_commitment_cache = Arc::new(RwLock::new( BlockCommitmentCache::new_for_tests_with_slots(slot, slot), )); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bob_pubkey = solana_sdk::pubkey::new_rand(); let mint_pubkey = genesis.mint_keypair.pubkey(); @@ -626,7 +626,7 @@ mod tests { let block_commitment_cache = Arc::new(RwLock::new( BlockCommitmentCache::new_for_tests_with_slots(slot, slot), )); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let mint_pubkey = &genesis.mint_keypair.pubkey(); let bob_pubkey = solana_sdk::pubkey::new_rand(); diff --git a/client-test/tests/client.rs b/client-test/tests/client.rs index 65acd1adaae39d..d74361a76d100e 100644 --- a/client-test/tests/client.rs +++ b/client-test/tests/client.rs @@ -132,7 +132,7 @@ fn test_account_subscription() { } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); @@ -230,7 +230,7 @@ fn test_block_subscription() { } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); let rent_exempt_amount = bank.get_minimum_balance_for_rent_exemption(0); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); // setup Blockstore let ledger_path = get_tmp_ledger_path!(); @@ -338,7 +338,7 @@ fn test_program_subscription() { } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); @@ -425,7 +425,7 @@ fn test_root_subscription() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); @@ -477,7 +477,7 @@ fn test_slot_subscription() { let exit = Arc::new(AtomicBool::new(false)); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); @@ -553,7 +553,7 @@ async fn test_slot_subscription_async() { let exit = Arc::new(AtomicBool::new(false)); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); diff --git a/core/benches/banking_stage.rs b/core/benches/banking_stage.rs index 2526c2a6369c5a..b399abba0a9e5b 100644 --- a/core/benches/banking_stage.rs +++ b/core/benches/banking_stage.rs @@ -55,7 +55,7 @@ use { }, std::{ iter::repeat_with, - sync::{atomic::Ordering, Arc, RwLock}, + sync::{atomic::Ordering, Arc}, time::{Duration, Instant}, }, test::Bencher, @@ -219,7 +219,7 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) { let mut bank = Bank::new_for_benches(&genesis_config); // Allow arbitrary transaction processing time for the purposes of this bench bank.ns_per_slot = u128::MAX; - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().get(0).unwrap(); // set cost tracker limits to MAX so it will not filter out TXs diff --git a/core/benches/consensus.rs b/core/benches/consensus.rs index a3dd97755e9bb4..cff71502df977e 100644 --- a/core/benches/consensus.rs +++ b/core/benches/consensus.rs @@ -28,7 +28,10 @@ fn bench_save_tower(bench: &mut Bencher) { let vote_account_pubkey = &Pubkey::default(); let node_keypair = Arc::new(Keypair::new()); - let heaviest_bank = BankForks::new(Bank::default_for_tests()).working_bank(); + let heaviest_bank = BankForks::new_rw_arc(Bank::default_for_tests()) + .read() + .unwrap() + .working_bank(); let tower_storage = FileTowerStorage::new(dir.path().to_path_buf()); let tower = Tower::new( &node_keypair.pubkey(), @@ -47,7 +50,10 @@ fn bench_save_tower(bench: &mut Bencher) { fn bench_generate_ancestors_descendants(bench: &mut Bencher) { let vote_account_pubkey = &Pubkey::default(); let node_keypair = Arc::new(Keypair::new()); - let heaviest_bank = BankForks::new(Bank::default_for_tests()).working_bank(); + let heaviest_bank = BankForks::new_rw_arc(Bank::default_for_tests()) + .read() + .unwrap() + .working_bank(); let mut tower = Tower::new( &node_keypair.pubkey(), vote_account_pubkey, diff --git a/core/src/banking_stage.rs b/core/src/banking_stage.rs index e8b61de94dce2d..ad52db88ac42fc 100644 --- a/core/src/banking_stage.rs +++ b/core/src/banking_stage.rs @@ -670,7 +670,7 @@ mod tests { fn test_banking_stage_shutdown1() { let genesis_config = create_genesis_config(2).genesis_config; let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().get(0).unwrap(); let banking_tracer = BankingTracer::new_disabled(); let (non_vote_sender, non_vote_receiver) = banking_tracer.create_channel_non_vote(); @@ -722,7 +722,7 @@ mod tests { genesis_config.ticks_per_slot = 4; let num_extra_ticks = 2; let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().get(0).unwrap(); let start_hash = bank.last_blockhash(); let banking_tracer = BankingTracer::new_disabled(); @@ -802,7 +802,7 @@ mod tests { .. } = create_slow_genesis_config(10); let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().get(0).unwrap(); let start_hash = bank.last_blockhash(); let banking_tracer = BankingTracer::new_disabled(); @@ -974,7 +974,7 @@ mod tests { let entry_receiver = { // start a banking_stage to eat verified receiver let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().get(0).unwrap(); let blockstore = Arc::new( Blockstore::open(ledger_path.path()) @@ -1155,7 +1155,7 @@ mod tests { .. } = create_slow_genesis_config(10000); let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().get(0).unwrap(); let start_hash = bank.last_blockhash(); let banking_tracer = BankingTracer::new_disabled(); diff --git a/core/src/banking_stage/consume_worker.rs b/core/src/banking_stage/consume_worker.rs index 1795db97439a50..d2451efa1c4c66 100644 --- a/core/src/banking_stage/consume_worker.rs +++ b/core/src/banking_stage/consume_worker.rs @@ -174,7 +174,7 @@ mod tests { .. } = create_slow_genesis_config(10_000); let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().working_bank(); let ledger_path = get_tmp_ledger_path_auto_delete!(); diff --git a/core/src/banking_stage/forward_worker.rs b/core/src/banking_stage/forward_worker.rs index cabd891e761c87..c13b8c426378be 100644 --- a/core/src/banking_stage/forward_worker.rs +++ b/core/src/banking_stage/forward_worker.rs @@ -129,7 +129,7 @@ mod tests { .. } = create_slow_genesis_config(10_000); let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().working_bank(); let ledger_path = get_tmp_ledger_path_auto_delete!(); diff --git a/core/src/banking_stage/forwarder.rs b/core/src/banking_stage/forwarder.rs index 777ea12d95bc58..1cb656f0ddc701 100644 --- a/core/src/banking_stage/forwarder.rs +++ b/core/src/banking_stage/forwarder.rs @@ -307,7 +307,7 @@ mod tests { let GenesisConfigInfo { genesis_config, .. } = &genesis_config_info; let bank: Bank = Bank::new_no_wallclock_throttle_for_tests(genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().working_bank(); let ledger_path = TempDir::new().unwrap(); diff --git a/core/src/cluster_info_vote_listener.rs b/core/src/cluster_info_vote_listener.rs index 183cabcf04dbce..782f10d976b60e 100644 --- a/core/src/cluster_info_vote_listener.rs +++ b/core/src/cluster_info_vote_listener.rs @@ -1439,7 +1439,7 @@ mod tests { ); let bank = Bank::new_for_tests(&genesis_config); let exit = Arc::new(AtomicBool::new(false)); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().get(0).unwrap(); let vote_tracker = VoteTracker::default(); let optimistically_confirmed_bank = @@ -1556,7 +1556,7 @@ mod tests { let bank = Bank::new_for_tests(&genesis_config); let vote_tracker = VoteTracker::default(); let exit = Arc::new(AtomicBool::new(false)); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().get(0).unwrap(); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); @@ -1584,7 +1584,7 @@ mod tests { solana_logger::setup(); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = RwLock::new(BankForks::new(bank)); + let bank_forks = BankForks::new_rw_arc(bank); let votes = vec![]; let (vote_txs, packets) = ClusterInfoVoteListener::verify_votes(votes, &bank_forks); assert!(vote_txs.is_empty()); @@ -1629,7 +1629,7 @@ mod tests { vec![100; voting_keypairs.len()], // stakes ); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = RwLock::new(BankForks::new(bank)); + let bank_forks = BankForks::new_rw_arc(bank); let vote_tx = test_vote_tx(voting_keypairs.first(), hash); let votes = vec![vote_tx]; let (vote_txs, packets) = ClusterInfoVoteListener::verify_votes(votes, &bank_forks); @@ -1654,7 +1654,7 @@ mod tests { vec![100; voting_keypairs.len()], // stakes ); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = RwLock::new(BankForks::new(bank)); + let bank_forks = BankForks::new_rw_arc(bank); let vote_tx = test_vote_tx(voting_keypairs.first(), hash); let mut bad_vote = vote_tx.clone(); bad_vote.signatures[0] = Signature::default(); diff --git a/core/src/commitment_service.rs b/core/src/commitment_service.rs index bdadb1ff72f54f..b15c6d2fec5fe0 100644 --- a/core/src/commitment_service.rs +++ b/core/src/commitment_service.rs @@ -509,7 +509,8 @@ mod tests { ); let bank0 = Bank::new_for_tests(&genesis_config); - let mut bank_forks = BankForks::new(bank0); + let bank_forks = BankForks::new_rw_arc(bank0); + let mut bank_forks = bank_forks.write().unwrap(); // Fill bank_forks with banks with votes landing in the next slot // Create enough banks such that vote account will root slots 0 and 1 diff --git a/core/src/consensus/heaviest_subtree_fork_choice.rs b/core/src/consensus/heaviest_subtree_fork_choice.rs index 639272e1048b17..4b58ee78b99da7 100644 --- a/core/src/consensus/heaviest_subtree_fork_choice.rs +++ b/core/src/consensus/heaviest_subtree_fork_choice.rs @@ -244,7 +244,8 @@ impl HeaviestSubtreeForkChoice { heaviest_subtree_fork_choice } - pub fn new_from_bank_forks(bank_forks: &BankForks) -> Self { + pub fn new_from_bank_forks(bank_forks: Arc>) -> Self { + let bank_forks = bank_forks.read().unwrap(); let mut frozen_banks: Vec<_> = bank_forks.frozen_banks().values().cloned().collect(); frozen_banks.sort_by_key(|bank| bank.slot()); diff --git a/core/src/repair/ancestor_hashes_service.rs b/core/src/repair/ancestor_hashes_service.rs index 3214c89e14ea15..fc70dbab16c825 100644 --- a/core/src/repair/ancestor_hashes_service.rs +++ b/core/src/repair/ancestor_hashes_service.rs @@ -1928,7 +1928,7 @@ mod test { #[test] fn test_verify_and_process_ancestor_responses_invalid_packet() { let bank0 = Bank::default_for_tests(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank0))); + let bank_forks = BankForks::new_rw_arc(bank0); let ManageAncestorHashesState { ancestor_hashes_request_statuses, diff --git a/core/src/repair/quic_endpoint.rs b/core/src/repair/quic_endpoint.rs index 7d1cd29a32589f..031de37f94b5a0 100644 --- a/core/src/repair/quic_endpoint.rs +++ b/core/src/repair/quic_endpoint.rs @@ -736,7 +736,7 @@ mod tests { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(/*mint_lamports:*/ 100_000); let bank = Bank::new_for_tests(&genesis_config); - Arc::new(RwLock::new(BankForks::new(bank))) + BankForks::new_rw_arc(bank) }; let (endpoints, senders, tasks): (Vec<_>, Vec<_>, Vec<_>) = multiunzip( keypairs diff --git a/core/src/repair/repair_service.rs b/core/src/repair/repair_service.rs index c7cfab03f8f8ed..ad8bc413b68362 100644 --- a/core/src/repair/repair_service.rs +++ b/core/src/repair/repair_service.rs @@ -1202,7 +1202,7 @@ mod test { pub fn test_generate_and_send_duplicate_repairs() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let blockstore_path = get_tmp_ledger_path!(); let blockstore = Blockstore::open(&blockstore_path).unwrap(); let cluster_slots = ClusterSlots::default(); @@ -1301,7 +1301,7 @@ mod test { pub fn test_update_duplicate_slot_repair_addr() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let dummy_addr = Some(( Pubkey::default(), UdpSocket::bind("0.0.0.0:0").unwrap().local_addr().unwrap(), diff --git a/core/src/repair/serve_repair.rs b/core/src/repair/serve_repair.rs index 8ab42c28829f1d..fb9256be7eb91e 100644 --- a/core/src/repair/serve_repair.rs +++ b/core/src/repair/serve_repair.rs @@ -1561,7 +1561,7 @@ mod tests { fn test_serialize_deserialize_signed_request() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let cluster_info = Arc::new(new_test_cluster_info()); let serve_repair = ServeRepair::new( cluster_info.clone(), @@ -1611,7 +1611,7 @@ mod tests { let mut bank = Bank::new_for_tests(&genesis_config); bank.feature_set = Arc::new(FeatureSet::all_enabled()); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let serve_repair = ServeRepair::new( cluster_info, bank_forks, @@ -1647,7 +1647,7 @@ mod tests { fn test_map_requests_signed() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let cluster_info = Arc::new(new_test_cluster_info()); let serve_repair = ServeRepair::new( cluster_info.clone(), @@ -1976,7 +1976,7 @@ mod tests { fn window_index_request() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let cluster_slots = ClusterSlots::default(); let cluster_info = Arc::new(new_test_cluster_info()); let serve_repair = ServeRepair::new( @@ -2318,7 +2318,7 @@ mod tests { fn test_repair_with_repair_validators() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let cluster_slots = ClusterSlots::default(); let cluster_info = Arc::new(new_test_cluster_info()); let me = cluster_info.my_contact_info(); diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index f27f3e3d00f959..19edf8b18d0f54 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -4360,7 +4360,7 @@ pub(crate) mod tests { fn test_handle_new_root() { let genesis_config = create_genesis_config(10_000).genesis_config; let bank0 = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank0))); + let bank_forks = BankForks::new_rw_arc(bank0); let root = 3; let root_bank = Bank::new_from_parent( @@ -4446,7 +4446,7 @@ pub(crate) mod tests { fn test_handle_new_root_ahead_of_highest_super_majority_root() { let genesis_config = create_genesis_config(10_000).genesis_config; let bank0 = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank0))); + let bank_forks = BankForks::new_rw_arc(bank0); let confirmed_root = 1; let fork = 2; let bank1 = Bank::new_from_parent( @@ -4849,7 +4849,7 @@ pub(crate) mod tests { } bank0.freeze(); let arc_bank0 = Arc::new(bank0); - let bank_forks = Arc::new(RwLock::new(BankForks::new_from_banks(&[arc_bank0], 0))); + let bank_forks = BankForks::new_from_banks(&[arc_bank0], 0); let exit = Arc::new(AtomicBool::new(false)); let block_commitment_cache = Arc::new(RwLock::new(BlockCommitmentCache::default())); @@ -5028,7 +5028,7 @@ pub(crate) mod tests { vote_simulator::initialize_state(&keypairs, 10_000); let mut latest_validator_votes_for_frozen_banks = LatestValidatorVotesForFrozenBanks::default(); - let bank0 = bank_forks.get(0).unwrap(); + let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let my_keypairs = keypairs.get(&my_node_pubkey).unwrap(); let vote_tx = vote_transaction::new_vote_transaction( vec![0], @@ -5040,7 +5040,6 @@ pub(crate) mod tests { None, ); - let bank_forks = RwLock::new(bank_forks); let bank1 = Bank::new_from_parent(bank0.clone(), &my_node_pubkey, 1); bank1.process_transaction(&vote_tx).unwrap(); bank1.freeze(); @@ -5373,7 +5372,7 @@ pub(crate) mod tests { ) { let stake = 10_000; let (bank_forks, _, _) = vote_simulator::initialize_state(all_keypairs, stake); - let root_bank = bank_forks.root_bank(); + let root_bank = bank_forks.read().unwrap().root_bank(); let mut propagated_stats = PropagatedStats { total_epoch_stake: stake * all_keypairs.len() as u64, ..PropagatedStats::default() @@ -5487,8 +5486,9 @@ pub(crate) mod tests { let vote_pubkey = vote_keypairs.vote_keypair.pubkey(); let keypairs: HashMap<_, _> = vec![(node_pubkey, vote_keypairs)].into_iter().collect(); let stake = 10_000; - let (mut bank_forks, mut progress_map, _) = + let (bank_forks_arc, mut progress_map, _) = vote_simulator::initialize_state(&keypairs, stake); + let mut bank_forks = bank_forks_arc.write().unwrap(); let bank0 = bank_forks.get(0).unwrap(); bank_forks.insert(Bank::new_from_parent(bank0.clone(), &Pubkey::default(), 9)); @@ -5530,12 +5530,14 @@ pub(crate) mod tests { // runs in `update_propagation_status` assert!(!progress_map.get_leader_propagation_slot_must_exist(10).0); + drop(bank_forks); + let vote_tracker = VoteTracker::default(); vote_tracker.insert_vote(10, vote_pubkey); ReplayStage::update_propagation_status( &mut progress_map, 10, - &RwLock::new(bank_forks), + &bank_forks_arc, &vote_tracker, &ClusterSlots::default(), ); @@ -5579,8 +5581,9 @@ pub(crate) mod tests { .collect(); let stake_per_validator = 10_000; - let (mut bank_forks, mut progress_map, _) = + let (bank_forks_arc, mut progress_map, _) = vote_simulator::initialize_state(&keypairs, stake_per_validator); + let mut bank_forks = bank_forks_arc.write().unwrap(); progress_map .get_propagated_stats_mut(0) .unwrap() @@ -5621,12 +5624,14 @@ pub(crate) mod tests { vote_tracker.insert_vote(10, *vote_pubkey); } + drop(bank_forks); + // The last bank should reach propagation threshold, and propagate it all // the way back through earlier leader banks ReplayStage::update_propagation_status( &mut progress_map, 10, - &RwLock::new(bank_forks), + &bank_forks_arc, &vote_tracker, &ClusterSlots::default(), ); @@ -5659,8 +5664,9 @@ pub(crate) mod tests { .collect(); let stake_per_validator = 10_000; - let (mut bank_forks, mut progress_map, _) = + let (bank_forks_arc, mut progress_map, _) = vote_simulator::initialize_state(&keypairs, stake_per_validator); + let mut bank_forks = bank_forks_arc.write().unwrap(); progress_map .get_propagated_stats_mut(0) .unwrap() @@ -5706,12 +5712,13 @@ pub(crate) mod tests { // Insert a new vote vote_tracker.insert_vote(10, vote_pubkeys[2]); + drop(bank_forks); // The last bank should reach propagation threshold, and propagate it all // the way back through earlier leader banks ReplayStage::update_propagation_status( &mut progress_map, 10, - &RwLock::new(bank_forks), + &bank_forks_arc, &vote_tracker, &ClusterSlots::default(), ); @@ -5817,7 +5824,8 @@ pub(crate) mod tests { let bank0 = Bank::new_for_tests(&genesis_config::create_genesis_config(10000).0); let parent_slot_bank = Bank::new_from_parent(Arc::new(bank0), &Pubkey::default(), parent_slot); - let mut bank_forks = BankForks::new(parent_slot_bank); + let bank_forks = BankForks::new_rw_arc(parent_slot_bank); + let mut bank_forks = bank_forks.write().unwrap(); let bank5 = Bank::new_from_parent(bank_forks.get(parent_slot).unwrap(), &Pubkey::default(), 5); bank_forks.insert(bank5); @@ -6367,7 +6375,7 @@ pub(crate) mod tests { &vote_tracker, &ClusterSlots::default(), &bank_forks, - &mut HeaviestSubtreeForkChoice::new_from_bank_forks(&bank_forks.read().unwrap()), + &mut HeaviestSubtreeForkChoice::new_from_bank_forks(bank_forks.clone()), &mut LatestValidatorVotesForFrozenBanks::default(), ); @@ -8133,7 +8141,7 @@ pub(crate) mod tests { let in_vote_only_mode = AtomicBool::new(false); let genesis_config = create_genesis_config(10_000).genesis_config; let bank0 = Bank::new_for_tests(&genesis_config); - let bank_forks = RwLock::new(BankForks::new(bank0)); + let bank_forks = BankForks::new_rw_arc(bank0); ReplayStage::check_for_vote_only_mode(1000, 0, &in_vote_only_mode, &bank_forks); assert!(in_vote_only_mode.load(Ordering::Relaxed)); ReplayStage::check_for_vote_only_mode(10, 0, &in_vote_only_mode, &bank_forks); diff --git a/core/src/tvu.rs b/core/src/tvu.rs index 0b8358863fbceb..0fa619033ae3db 100644 --- a/core/src/tvu.rs +++ b/core/src/tvu.rs @@ -401,7 +401,7 @@ pub mod tests { let starting_balance = 10_000; let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(starting_balance); - let bank_forks = BankForks::new(Bank::new_for_tests(&genesis_config)); + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests(&genesis_config)); let keypair = Arc::new(Keypair::new()); let (turbine_quic_endpoint_sender, _turbine_quic_endpoint_receiver) = @@ -423,7 +423,7 @@ pub mod tests { } = Blockstore::open_with_signal(&blockstore_path, BlockstoreOptions::default()) .expect("Expected to successfully open ledger"); let blockstore = Arc::new(blockstore); - let bank = bank_forks.working_bank(); + let bank = bank_forks.read().unwrap().working_bank(); let (exit, poh_recorder, poh_service, _entry_receiver) = create_test_recorder(bank.clone(), blockstore.clone(), None, None); let vote_keypair = Keypair::new(); @@ -435,7 +435,6 @@ pub mod tests { let (replay_vote_sender, _replay_vote_receiver) = unbounded(); let (completed_data_sets_sender, _completed_data_sets_receiver) = unbounded(); let (_, gossip_confirmed_slots_receiver) = unbounded(); - let bank_forks = Arc::new(RwLock::new(bank_forks)); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); let max_complete_rewards_slot = Arc::new(AtomicU64::default()); let ignored_prioritization_fee_cache = Arc::new(PrioritizationFeeCache::new(0u64)); diff --git a/core/src/validator.rs b/core/src/validator.rs index 5eca0ccaad28ef..fac592aedb8620 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -2584,7 +2584,7 @@ mod tests { ); let (genesis_config, _mint_keypair) = create_genesis_config(1); - let bank_forks = RwLock::new(BankForks::new(Bank::new_for_tests(&genesis_config))); + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests(&genesis_config)); let mut config = ValidatorConfig::default_for_test(); let rpc_override_health_check = Arc::new(AtomicBool::new(false)); let start_progress = Arc::new(RwLock::new(ValidatorStartProgress::default())); @@ -2614,11 +2614,11 @@ mod tests { ); // bank=1, wait=0, should pass, bank is past the wait slot - let bank_forks = RwLock::new(BankForks::new(Bank::new_from_parent( + let bank_forks = BankForks::new_rw_arc(Bank::new_from_parent( bank_forks.read().unwrap().root_bank(), &Pubkey::default(), 1, - ))); + )); config.wait_for_supermajority = Some(0); assert!(!wait_for_supermajority( &config, diff --git a/core/src/vote_simulator.rs b/core/src/vote_simulator.rs index 79c418bcc7892f..77cf818f620ed0 100644 --- a/core/src/vote_simulator.rs +++ b/core/src/vote_simulator.rs @@ -57,7 +57,7 @@ impl VoteSimulator { validator_keypairs, node_pubkeys, vote_pubkeys, - bank_forks: Arc::new(RwLock::new(bank_forks)), + bank_forks, progress, heaviest_subtree_fork_choice, latest_validator_votes_for_frozen_banks: LatestValidatorVotesForFrozenBanks::default(), @@ -296,13 +296,14 @@ impl VoteSimulator { false } + #[allow(clippy::type_complexity)] fn init_state( num_keypairs: usize, ) -> ( HashMap, Vec, Vec, - BankForks, + Arc>, ProgressMap, HeaviestSubtreeForkChoice, ) { @@ -338,7 +339,11 @@ impl VoteSimulator { pub fn initialize_state( validator_keypairs_map: &HashMap, stake: u64, -) -> (BankForks, ProgressMap, HeaviestSubtreeForkChoice) { +) -> ( + Arc>, + ProgressMap, + HeaviestSubtreeForkChoice, +) { let validator_keypairs: Vec<_> = validator_keypairs_map.values().collect(); let GenesisConfigInfo { mut genesis_config, @@ -366,7 +371,8 @@ pub fn initialize_state( 0, ForkProgress::new_from_bank(&bank0, bank0.collector_id(), &Pubkey::default(), None, 0, 0), ); - let bank_forks = BankForks::new(bank0); - let heaviest_subtree_fork_choice = HeaviestSubtreeForkChoice::new_from_bank_forks(&bank_forks); + let bank_forks = BankForks::new_rw_arc(bank0); + let heaviest_subtree_fork_choice = + HeaviestSubtreeForkChoice::new_from_bank_forks(bank_forks.clone()); (bank_forks, progress, heaviest_subtree_fork_choice) } diff --git a/core/tests/epoch_accounts_hash.rs b/core/tests/epoch_accounts_hash.rs index 8fa6919e99db1f..5cc507b1551946 100755 --- a/core/tests/epoch_accounts_hash.rs +++ b/core/tests/epoch_accounts_hash.rs @@ -116,13 +116,18 @@ impl TestEnvironment { ..snapshot_config }; - let mut bank_forks = BankForks::new(Bank::new_for_tests_with_config( + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests_with_config( &genesis_config_info.genesis_config, BankTestConfig::default(), )); - bank_forks.set_snapshot_config(Some(snapshot_config.clone())); - bank_forks.set_accounts_hash_interval_slots(Self::ACCOUNTS_HASH_INTERVAL); - let bank_forks = Arc::new(RwLock::new(bank_forks)); + bank_forks + .write() + .unwrap() + .set_snapshot_config(Some(snapshot_config.clone())); + bank_forks + .write() + .unwrap() + .set_accounts_hash_interval_slots(Self::ACCOUNTS_HASH_INTERVAL); let exit = Arc::new(AtomicBool::new(false)); let node_id = Arc::new(Keypair::new()); @@ -264,7 +269,7 @@ fn test_epoch_accounts_hash_basic(test_environment: TestEnvironment) { const NUM_EPOCHS_TO_TEST: u64 = 2; const SET_ROOT_INTERVAL: Slot = 3; - let bank_forks = &test_environment.bank_forks; + let bank_forks = test_environment.bank_forks.clone(); let mut expected_epoch_accounts_hash = None; @@ -299,6 +304,7 @@ fn test_epoch_accounts_hash_basic(test_environment: TestEnvironment) { // Set roots so that ABS requests are sent (this is what requests EAH calculations) if bank.slot().checked_rem(SET_ROOT_INTERVAL).unwrap() == 0 { trace!("rooting bank {}", bank.slot()); + bank_forks.read().unwrap().prune_program_cache(bank.slot()); bank_forks.write().unwrap().set_root( bank.slot(), &test_environment @@ -379,7 +385,7 @@ fn test_snapshots_have_expected_epoch_accounts_hash() { let test_environment = TestEnvironment::new_with_snapshots(FULL_SNAPSHOT_INTERVAL, FULL_SNAPSHOT_INTERVAL); - let bank_forks = &test_environment.bank_forks; + let bank_forks = test_environment.bank_forks.clone(); let slots_per_epoch = test_environment .genesis_config_info @@ -411,6 +417,7 @@ fn test_snapshots_have_expected_epoch_accounts_hash() { // Root every bank. This is what a normal validator does as well. // `set_root()` is also what requests snapshots and EAH calculations. + bank_forks.read().unwrap().prune_program_cache(bank.slot()); bank_forks.write().unwrap().set_root( bank.slot(), &test_environment @@ -496,7 +503,7 @@ fn test_background_services_request_handling_for_epoch_accounts_hash() { let test_environment = TestEnvironment::new_with_snapshots(FULL_SNAPSHOT_INTERVAL, FULL_SNAPSHOT_INTERVAL); - let bank_forks = &test_environment.bank_forks; + let bank_forks = test_environment.bank_forks.clone(); let snapshot_config = &test_environment.snapshot_config; let slots_per_epoch = test_environment @@ -534,6 +541,7 @@ fn test_background_services_request_handling_for_epoch_accounts_hash() { if bank.block_height() == set_root_slot { info!("Calling set_root() on bank {}...", bank.slot()); + bank_forks.read().unwrap().prune_program_cache(bank.slot()); bank_forks.write().unwrap().set_root( bank.slot(), &test_environment @@ -577,7 +585,7 @@ fn test_epoch_accounts_hash_and_warping() { solana_logger::setup(); let test_environment = TestEnvironment::new(); - let bank_forks = &test_environment.bank_forks; + let bank_forks = test_environment.bank_forks.clone(); let bank = bank_forks.read().unwrap().working_bank(); let epoch_schedule = test_environment .genesis_config_info @@ -590,6 +598,7 @@ fn test_epoch_accounts_hash_and_warping() { let eah_stop_slot_in_next_epoch = epoch_schedule.get_first_slot_in_epoch(bank.epoch() + 1) + eah_stop_offset; // have to set root here so that we can flush the write cache + bank_forks.read().unwrap().prune_program_cache(bank.slot()); bank_forks.write().unwrap().set_root( bank.slot(), &test_environment diff --git a/core/tests/snapshots.rs b/core/tests/snapshots.rs index 674c039bee2353..e7156f435eea25 100644 --- a/core/tests/snapshots.rs +++ b/core/tests/snapshots.rs @@ -66,7 +66,7 @@ use { }; struct SnapshotTestConfig { - bank_forks: BankForks, + bank_forks: Arc>, genesis_config_info: GenesisConfigInfo, snapshot_config: SnapshotConfig, incremental_snapshot_archives_dir: TempDir, @@ -109,7 +109,8 @@ impl SnapshotTestConfig { ); bank0.freeze(); bank0.set_startup_verification_complete(); - let mut bank_forks = BankForks::new(bank0); + let bank_forks_arc = BankForks::new_rw_arc(bank0); + let mut bank_forks = bank_forks_arc.write().unwrap(); bank_forks.accounts_hash_interval_slots = accounts_hash_interval_slots; let snapshot_config = SnapshotConfig { @@ -125,7 +126,7 @@ impl SnapshotTestConfig { }; bank_forks.set_snapshot_config(Some(snapshot_config.clone())); SnapshotTestConfig { - bank_forks, + bank_forks: bank_forks_arc.clone(), genesis_config_info, snapshot_config, incremental_snapshot_archives_dir, @@ -138,11 +139,12 @@ impl SnapshotTestConfig { } fn restore_from_snapshot( - old_bank_forks: &BankForks, + old_bank_forks: Arc>, old_last_slot: Slot, old_genesis_config: &GenesisConfig, account_paths: &[PathBuf], ) { + let old_bank_forks = old_bank_forks.read().unwrap(); let snapshot_config = old_bank_forks.snapshot_config.as_ref().unwrap(); let old_last_bank = old_bank_forks.get(old_last_slot).unwrap(); @@ -198,7 +200,7 @@ fn run_bank_forks_snapshot_n( { solana_logger::setup(); // Set up snapshotting config - let mut snapshot_test_config = SnapshotTestConfig::new( + let snapshot_test_config = SnapshotTestConfig::new( snapshot_version, cluster_type, set_root_interval, @@ -206,7 +208,7 @@ fn run_bank_forks_snapshot_n( DISABLED_SNAPSHOT_ARCHIVE_INTERVAL, ); - let bank_forks = &mut snapshot_test_config.bank_forks; + let bank_forks = snapshot_test_config.bank_forks.clone(); let mint_keypair = &snapshot_test_config.genesis_config_info.mint_keypair; let (accounts_package_sender, _accounts_package_receiver) = crossbeam_channel::unbounded(); @@ -219,16 +221,22 @@ fn run_bank_forks_snapshot_n( accounts_package_sender, }; for slot in 1..=last_slot { + let mut bank_forks_w = bank_forks.write().unwrap(); let mut bank = - Bank::new_from_parent(bank_forks[slot - 1].clone(), &Pubkey::default(), slot); + Bank::new_from_parent(bank_forks_w[slot - 1].clone(), &Pubkey::default(), slot); f(&mut bank, mint_keypair); - let bank = bank_forks.insert(bank); + let bank = bank_forks_w.insert(bank); + drop(bank_forks_w); // Set root to make sure we don't end up with too many account storage entries // and to allow snapshotting of bank and the purging logic on status_cache to // kick in if slot % set_root_interval == 0 || slot == last_slot { // set_root should send a snapshot request - bank_forks.set_root(bank.slot(), &request_sender, None); + bank_forks.read().unwrap().prune_program_cache(bank.slot()); + bank_forks + .write() + .unwrap() + .set_root(bank.slot(), &request_sender, None); snapshot_request_handler.handle_snapshot_requests( false, 0, @@ -239,7 +247,7 @@ fn run_bank_forks_snapshot_n( } // Generate a snapshot package for last bank - let last_bank = bank_forks.get(last_slot).unwrap(); + let last_bank = bank_forks.read().unwrap().get(last_slot).unwrap(); let snapshot_config = &snapshot_test_config.snapshot_config; let bank_snapshots_dir = &snapshot_config.bank_snapshots_dir; let last_bank_snapshot_info = snapshot_utils::get_highest_bank_snapshot_pre(bank_snapshots_dir) @@ -278,7 +286,12 @@ fn run_bank_forks_snapshot_n( let (_tmp_dir, temporary_accounts_dir) = create_tmp_accounts_dir_for_tests(); let account_paths = &[temporary_accounts_dir]; let genesis_config = &snapshot_test_config.genesis_config_info.genesis_config; - restore_from_snapshot(bank_forks, last_slot, genesis_config, account_paths); + restore_from_snapshot( + snapshot_test_config.bank_forks.clone(), + last_slot, + genesis_config, + account_paths, + ); } #[test_case(V1_2_0, Development)] @@ -331,7 +344,7 @@ fn test_concurrent_snapshot_packaging( const MAX_BANK_SNAPSHOTS_TO_RETAIN: usize = 8; // Set up snapshotting config - let mut snapshot_test_config = SnapshotTestConfig::new( + let snapshot_test_config = SnapshotTestConfig::new( snapshot_version, cluster_type, 1, @@ -339,7 +352,7 @@ fn test_concurrent_snapshot_packaging( DISABLED_SNAPSHOT_ARCHIVE_INTERVAL, ); - let bank_forks = &mut snapshot_test_config.bank_forks; + let mut bank_forks = snapshot_test_config.bank_forks.write().unwrap(); let snapshot_config = &snapshot_test_config.snapshot_config; let bank_snapshots_dir = &snapshot_config.bank_snapshots_dir; let full_snapshot_archives_dir = &snapshot_config.full_snapshot_archives_dir; @@ -586,24 +599,31 @@ fn test_slots_to_snapshot(snapshot_version: SnapshotVersion, cluster_type: Clust for add_root_interval in &[1, 3, 9] { let (snapshot_sender, _snapshot_receiver) = unbounded(); // Make sure this test never clears bank.slots_since_snapshot - let mut snapshot_test_config = SnapshotTestConfig::new( + let snapshot_test_config = SnapshotTestConfig::new( snapshot_version, cluster_type, (*add_root_interval * num_set_roots * 2) as Slot, (*add_root_interval * num_set_roots * 2) as Slot, DISABLED_SNAPSHOT_ARCHIVE_INTERVAL, ); - let mut current_bank = snapshot_test_config.bank_forks[0].clone(); + let bank_forks = snapshot_test_config.bank_forks.clone(); + let bank_forks_r = bank_forks.read().unwrap(); + let mut current_bank = bank_forks_r[0].clone(); + drop(bank_forks_r); let request_sender = AbsRequestSender::new(snapshot_sender); for _ in 0..num_set_roots { for _ in 0..*add_root_interval { let new_slot = current_bank.slot() + 1; let new_bank = Bank::new_from_parent(current_bank, &Pubkey::default(), new_slot); - snapshot_test_config.bank_forks.insert(new_bank); - current_bank = snapshot_test_config.bank_forks[new_slot].clone(); + current_bank = bank_forks.write().unwrap().insert(new_bank).clone(); } - snapshot_test_config - .bank_forks + bank_forks + .read() + .unwrap() + .prune_program_cache(current_bank.slot()); + bank_forks + .write() + .unwrap() .set_root(current_bank.slot(), &request_sender, None); // Since the accounts background services are not runnning, EpochAccountsHash @@ -629,10 +649,10 @@ fn test_slots_to_snapshot(snapshot_version: SnapshotVersion, cluster_type: Clust let expected_slots_to_snapshot = num_old_slots as u64..=num_set_roots as u64 * *add_root_interval as u64; - let slots_to_snapshot = snapshot_test_config - .bank_forks - .get(snapshot_test_config.bank_forks.root()) + let slots_to_snapshot = bank_forks + .read() .unwrap() + .root_bank() .status_cache .read() .unwrap() @@ -704,7 +724,7 @@ fn test_bank_forks_incremental_snapshot( info!("Running bank forks incremental snapshot test, full snapshot interval: {} slots, incremental snapshot interval: {} slots, last slot: {}, set root interval: {} slots", FULL_SNAPSHOT_ARCHIVE_INTERVAL_SLOTS, INCREMENTAL_SNAPSHOT_ARCHIVE_INTERVAL_SLOTS, LAST_SLOT, SET_ROOT_INTERVAL); - let mut snapshot_test_config = SnapshotTestConfig::new( + let snapshot_test_config = SnapshotTestConfig::new( snapshot_version, cluster_type, SET_ROOT_INTERVAL, @@ -714,7 +734,7 @@ fn test_bank_forks_incremental_snapshot( trace!("SnapshotTestConfig:\naccounts_dir: {}\nbank_snapshots_dir: {}\nfull_snapshot_archives_dir: {}\nincremental_snapshot_archives_dir: {}", snapshot_test_config.accounts_dir.display(), snapshot_test_config.bank_snapshots_dir.path().display(), snapshot_test_config.full_snapshot_archives_dir.path().display(), snapshot_test_config.incremental_snapshot_archives_dir.path().display()); - let bank_forks = &mut snapshot_test_config.bank_forks; + let bank_forks = snapshot_test_config.bank_forks.clone(); let mint_keypair = &snapshot_test_config.genesis_config_info.mint_keypair; let (accounts_package_sender, _accounts_package_receiver) = crossbeam_channel::unbounded(); @@ -731,8 +751,8 @@ fn test_bank_forks_incremental_snapshot( for slot in 1..=LAST_SLOT { // Make a new bank and perform some transactions let bank = { - let bank = - Bank::new_from_parent(bank_forks[slot - 1].clone(), &Pubkey::default(), slot); + let parent = bank_forks.read().unwrap().get(slot - 1).unwrap(); + let bank = Bank::new_from_parent(parent, &Pubkey::default(), slot); let key = solana_sdk::pubkey::new_rand(); let tx = system_transaction::transfer(mint_keypair, &key, 1, bank.last_blockhash()); @@ -746,7 +766,7 @@ fn test_bank_forks_incremental_snapshot( bank.register_tick(&Hash::new_unique()); } - bank_forks.insert(bank) + bank_forks.write().unwrap().insert(bank) }; // Set root to make sure we don't end up with too many account storage entries @@ -754,7 +774,11 @@ fn test_bank_forks_incremental_snapshot( // kick in if slot % SET_ROOT_INTERVAL == 0 { // set_root sends a snapshot request - bank_forks.set_root(bank.slot(), &request_sender, None); + bank_forks.read().unwrap().prune_program_cache(bank.slot()); + bank_forks + .write() + .unwrap() + .set_root(bank.slot(), &request_sender, None); snapshot_request_handler.handle_snapshot_requests( false, 0, @@ -964,7 +988,7 @@ fn test_snapshots_with_background_services( let (accounts_package_sender, accounts_package_receiver) = unbounded(); let (snapshot_package_sender, snapshot_package_receiver) = unbounded(); - let bank_forks = Arc::new(RwLock::new(snapshot_test_config.bank_forks)); + let bank_forks = snapshot_test_config.bank_forks.clone(); bank_forks .read() .unwrap() diff --git a/gossip/src/duplicate_shred_handler.rs b/gossip/src/duplicate_shred_handler.rs index 366eef0913a463..ba95178bc88441 100644 --- a/gossip/src/duplicate_shred_handler.rs +++ b/gossip/src/duplicate_shred_handler.rs @@ -271,15 +271,12 @@ mod tests { let my_pubkey = my_keypair.pubkey(); let genesis_config_info = create_genesis_config_with_leader(10_000, &my_pubkey, 10_000); let GenesisConfigInfo { genesis_config, .. } = genesis_config_info; - let bank_forks = BankForks::new(Bank::new_for_tests(&genesis_config)); + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests(&genesis_config)); let leader_schedule_cache = Arc::new(LeaderScheduleCache::new_from_bank( - &bank_forks.working_bank(), + &bank_forks.read().unwrap().working_bank(), )); - let mut duplicate_shred_handler = DuplicateShredHandler::new( - blockstore.clone(), - leader_schedule_cache, - Arc::new(RwLock::new(bank_forks)), - ); + let mut duplicate_shred_handler = + DuplicateShredHandler::new(blockstore.clone(), leader_schedule_cache, bank_forks); let chunks = create_duplicate_proof( my_keypair.clone(), None, @@ -340,13 +337,12 @@ mod tests { let my_pubkey = my_keypair.pubkey(); let genesis_config_info = create_genesis_config_with_leader(10_000, &my_pubkey, 10_000); let GenesisConfigInfo { genesis_config, .. } = genesis_config_info; - let bank_forks = BankForks::new(Bank::new_for_tests(&genesis_config)); + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests(&genesis_config)); let leader_schedule_cache = Arc::new(LeaderScheduleCache::new_from_bank( - &bank_forks.working_bank(), + &bank_forks.read().unwrap().working_bank(), )); - let bank_forks_ptr = Arc::new(RwLock::new(bank_forks)); let mut duplicate_shred_handler = - DuplicateShredHandler::new(blockstore.clone(), leader_schedule_cache, bank_forks_ptr); + DuplicateShredHandler::new(blockstore.clone(), leader_schedule_cache, bank_forks); let start_slot: Slot = 1; // This proof will not be accepted because num_chunks is too large. diff --git a/gossip/tests/gossip.rs b/gossip/tests/gossip.rs index d9abeec31b5569..569f7c480dfa1e 100644 --- a/gossip/tests/gossip.rs +++ b/gossip/tests/gossip.rs @@ -309,7 +309,7 @@ pub fn cluster_info_scale() { vec![100; vote_keypairs.len()], ); let bank0 = Bank::new_for_tests(&genesis_config_info.genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank0))); + let bank_forks = BankForks::new_rw_arc(bank0); let nodes: Vec<_> = vote_keypairs .into_iter() diff --git a/ledger/src/bank_forks_utils.rs b/ledger/src/bank_forks_utils.rs index 8552a59033326f..c75380581fc16d 100644 --- a/ledger/src/bank_forks_utils.rs +++ b/ledger/src/bank_forks_utils.rs @@ -189,15 +189,6 @@ pub fn load_bank_forks( (bank_forks, None) }; - bank_forks - .read() - .expect("Failed to read lock the bank forks") - .root_bank() - .loaded_programs_cache - .write() - .expect("Failed to write lock the program cache") - .set_fork_graph(bank_forks.clone()); - let mut leader_schedule_cache = LeaderScheduleCache::new_from_bank(&bank_forks.read().unwrap().root_bank()); if process_options.full_leader_cache { @@ -367,8 +358,5 @@ fn bank_forks_from_snapshot( incremental: incremental_snapshot_hash, }; - ( - Arc::new(RwLock::new(BankForks::new(bank))), - starting_snapshot_hashes, - ) + (BankForks::new_rw_arc(bank), starting_snapshot_hashes) } diff --git a/ledger/src/blockstore_processor.rs b/ledger/src/blockstore_processor.rs index 647666806c91f1..ff30c87b7e27d2 100644 --- a/ledger/src/blockstore_processor.rs +++ b/ledger/src/blockstore_processor.rs @@ -715,7 +715,7 @@ pub(crate) fn process_blockstore_for_bank_0( accounts_update_notifier, exit, ); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank0))); + let bank_forks = BankForks::new_rw_arc(bank0); info!("Processing ledger for slot 0..."); process_bank_0( @@ -3559,8 +3559,8 @@ pub mod tests { blockstore.set_roots([3, 5].iter()).unwrap(); // Set up bank1 - let mut bank_forks = BankForks::new(Bank::new_for_tests(&genesis_config)); - let bank0 = bank_forks.get(0).unwrap(); + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests(&genesis_config)); + let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let opts = ProcessOptions { run_verification: true, accounts_db_test_hash_calculation: true, @@ -3569,7 +3569,11 @@ pub mod tests { let recyclers = VerifyRecyclers::default(); process_bank_0(&bank0, &blockstore, &opts, &recyclers, None, None); let bank0_last_blockhash = bank0.last_blockhash(); - let bank1 = bank_forks.insert(Bank::new_from_parent(bank0, &Pubkey::default(), 1)); + let bank1 = + bank_forks + .write() + .unwrap() + .insert(Bank::new_from_parent(bank0, &Pubkey::default(), 1)); confirm_full_slot( &blockstore, &bank1, @@ -3582,7 +3586,7 @@ pub mod tests { &mut ExecuteTimings::default(), ) .unwrap(); - bank_forks.set_root( + bank_forks.write().unwrap().set_root( 1, &solana_runtime::accounts_background_service::AbsRequestSender::default(), None, @@ -3591,7 +3595,6 @@ pub mod tests { let leader_schedule_cache = LeaderScheduleCache::new_from_bank(&bank1); // Test process_blockstore_from_root() from slot 1 onwards - let bank_forks = RwLock::new(bank_forks); process_blockstore_from_root( &blockstore, &bank_forks, diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 8b2b165136bf42..a65593491b10d3 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -456,7 +456,7 @@ pub struct LoadedPrograms { /// Environments of the current epoch pub environments: ProgramRuntimeEnvironments, pub stats: Stats, - fork_graph: Option>>, + pub fork_graph: Option>>, } impl Default for LoadedPrograms { diff --git a/program-test/src/lib.rs b/program-test/src/lib.rs index 1f8d7d18c013d8..c3252d05e40caa 100644 --- a/program-test/src/lib.rs +++ b/program-test/src/lib.rs @@ -847,7 +847,7 @@ impl ProgramTest { }; let slot = bank.slot(); let last_blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let block_commitment_cache = Arc::new(RwLock::new( BlockCommitmentCache::new_for_tests_with_slots(slot, slot), )); diff --git a/rpc/src/optimistically_confirmed_bank_tracker.rs b/rpc/src/optimistically_confirmed_bank_tracker.rs index 0cd37fb8a3f3ce..6a9e0e2a8a5ea7 100644 --- a/rpc/src/optimistically_confirmed_bank_tracker.rs +++ b/rpc/src/optimistically_confirmed_bank_tracker.rs @@ -424,7 +424,7 @@ mod tests { let exit = Arc::new(AtomicBool::new(false)); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(100); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); diff --git a/rpc/src/rpc.rs b/rpc/src/rpc.rs index 709c186889995e..2d55d2bb2f2c02 100644 --- a/rpc/src/rpc.rs +++ b/rpc/src/rpc.rs @@ -346,10 +346,7 @@ impl JsonRpcRequestProcessor { connection_cache: Arc, ) -> Self { let genesis_hash = bank.hash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new_from_banks( - &[bank.clone()], - bank.slot(), - ))); + let bank_forks = BankForks::new_from_banks(&[bank.clone()], bank.slot()); let blockstore = Arc::new(Blockstore::open(&get_tmp_ledger_path!()).unwrap()); let exit = Arc::new(AtomicBool::new(false)); let cluster_info = Arc::new({ @@ -6627,7 +6624,7 @@ pub mod tests { let bank = Bank::new_for_tests_with_config(&genesis_config, config); ( - Arc::new(RwLock::new(BankForks::new(bank))), + BankForks::new_rw_arc(bank), mint_keypair, Arc::new(voting_keypair), ) @@ -8310,7 +8307,7 @@ pub mod tests { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(100); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); diff --git a/rpc/src/rpc_health.rs b/rpc/src/rpc_health.rs index 8a6347cc7a6bd0..aff4fa48f03633 100644 --- a/rpc/src/rpc_health.rs +++ b/rpc/src/rpc_health.rs @@ -150,7 +150,7 @@ pub mod tests { let blockstore = Arc::new(Blockstore::open(ledger_path.path()).unwrap()); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(100); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let bank0 = bank_forks.read().unwrap().root_bank(); diff --git a/rpc/src/rpc_pubsub.rs b/rpc/src/rpc_pubsub.rs index e45a5f8af68517..6bb6fd7854642c 100644 --- a/rpc/src/rpc_pubsub.rs +++ b/rpc/src/rpc_pubsub.rs @@ -684,7 +684,7 @@ mod tests { let bob_pubkey = bob.pubkey(); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); let max_complete_rewards_slot = Arc::new(AtomicU64::default()); let rpc_subscriptions = Arc::new(RpcSubscriptions::new_for_tests( @@ -813,7 +813,7 @@ mod tests { let bob_pubkey = solana_sdk::pubkey::new_rand(); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let mut io = IoHandler::<()>::default(); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); @@ -871,7 +871,7 @@ mod tests { let stake_program_id = stake::program::id(); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); @@ -999,7 +999,7 @@ mod tests { let nonce_account = Keypair::new(); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); @@ -1088,9 +1088,7 @@ mod tests { let bob_pubkey = solana_sdk::pubkey::new_rand(); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); - let bank_forks = Arc::new(RwLock::new(BankForks::new(Bank::new_for_tests( - &genesis_config, - )))); + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests(&genesis_config)); let mut io = IoHandler::<()>::default(); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); @@ -1138,7 +1136,7 @@ mod tests { } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bob = Keypair::new(); let exit = Arc::new(AtomicBool::new(false)); @@ -1190,7 +1188,7 @@ mod tests { } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); @@ -1272,7 +1270,7 @@ mod tests { fn test_slot_subscribe() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); let max_complete_rewards_slot = Arc::new(AtomicU64::default()); let rpc_subscriptions = Arc::new(RpcSubscriptions::default_with_bank_forks( @@ -1305,7 +1303,7 @@ mod tests { fn test_slot_unsubscribe() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); let max_complete_rewards_slot = Arc::new(AtomicU64::default()); let rpc_subscriptions = Arc::new(RpcSubscriptions::default_with_bank_forks( @@ -1348,7 +1346,7 @@ mod tests { ); let exit = Arc::new(AtomicBool::new(false)); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); // Setup Subscriptions let optimistically_confirmed_bank = @@ -1390,7 +1388,7 @@ mod tests { fn test_vote_unsubscribe() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); let max_complete_rewards_slot = Arc::new(AtomicU64::default()); let rpc_subscriptions = Arc::new(RpcSubscriptions::default_with_bank_forks( @@ -1409,7 +1407,7 @@ mod tests { fn test_get_version() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); let max_complete_rewards_slot = Arc::new(AtomicU64::default()); let rpc_subscriptions = Arc::new(RpcSubscriptions::default_with_bank_forks( diff --git a/rpc/src/rpc_pubsub_service.rs b/rpc/src/rpc_pubsub_service.rs index 99eab0a2353670..85b753815ab003 100644 --- a/rpc/src/rpc_pubsub_service.rs +++ b/rpc/src/rpc_pubsub_service.rs @@ -485,7 +485,7 @@ mod tests { let max_complete_rewards_slot = Arc::new(AtomicU64::default()); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let subscriptions = Arc::new(RpcSubscriptions::new_for_tests( diff --git a/rpc/src/rpc_service.rs b/rpc/src/rpc_service.rs index 2011578b70d3d8..9aac1f929bc29b 100644 --- a/rpc/src/rpc_service.rs +++ b/rpc/src/rpc_service.rs @@ -617,7 +617,7 @@ mod tests { ip_addr, solana_net_utils::find_available_port_in_range(ip_addr, (10000, 65535)).unwrap(), ); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let ledger_path = get_tmp_ledger_path!(); let blockstore = Arc::new(Blockstore::open(&ledger_path).unwrap()); let block_commitment_cache = Arc::new(RwLock::new(BlockCommitmentCache::default())); @@ -674,7 +674,7 @@ mod tests { } = create_genesis_config(10_000); genesis_config.cluster_type = ClusterType::MainnetBeta; let bank = Bank::new_for_tests(&genesis_config); - Arc::new(RwLock::new(BankForks::new(bank))) + BankForks::new_rw_arc(bank) } #[test] diff --git a/rpc/src/rpc_subscription_tracker.rs b/rpc/src/rpc_subscription_tracker.rs index 41a2f3506cb67c..97ceb576636465 100644 --- a/rpc/src/rpc_subscription_tracker.rs +++ b/rpc/src/rpc_subscription_tracker.rs @@ -700,7 +700,7 @@ mod tests { fn subscription_info() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let mut tracker = SubscriptionsTracker::new(bank_forks); tracker.subscribe(SubscriptionParams::Slot, 0.into(), || 0); @@ -746,7 +746,7 @@ mod tests { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let mut tracker = SubscriptionsTracker::new(bank_forks); tracker.subscribe(SubscriptionParams::Slot, 0.into(), || 0); diff --git a/rpc/src/rpc_subscriptions.rs b/rpc/src/rpc_subscriptions.rs index 6fca7d45035837..4b01e078f78a76 100644 --- a/rpc/src/rpc_subscriptions.rs +++ b/rpc/src/rpc_subscriptions.rs @@ -1324,7 +1324,7 @@ pub(crate) mod tests { } = create_genesis_config(100); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); @@ -1470,7 +1470,7 @@ pub(crate) mod tests { } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); let rent_exempt_amount = bank.get_minimum_balance_for_rent_exemption(0); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let ledger_path = get_tmp_ledger_path!(); @@ -1590,7 +1590,7 @@ pub(crate) mod tests { } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); let rent_exempt_amount = bank.get_minimum_balance_for_rent_exemption(0); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let ledger_path = get_tmp_ledger_path!(); @@ -1708,7 +1708,7 @@ pub(crate) mod tests { } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); let rent_exempt_amount = bank.get_minimum_balance_for_rent_exemption(0); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let ledger_path = get_tmp_ledger_path!(); @@ -1826,7 +1826,7 @@ pub(crate) mod tests { } = create_genesis_config(100); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let alice = Keypair::new(); let tx = system_transaction::create_account( &mint_keypair, @@ -1938,7 +1938,7 @@ pub(crate) mod tests { bank.lazy_rent_collection.store(true, Relaxed); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); @@ -2133,7 +2133,7 @@ pub(crate) mod tests { bank.lazy_rent_collection.store(true, Relaxed); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); @@ -2249,7 +2249,7 @@ pub(crate) mod tests { bank.lazy_rent_collection.store(true, Relaxed); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1); @@ -2435,7 +2435,8 @@ pub(crate) mod tests { } = create_genesis_config(100); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let mut bank_forks = BankForks::new(bank); + let bank_forks_arc = BankForks::new_rw_arc(bank); + let mut bank_forks = bank_forks_arc.write().unwrap(); let alice = Keypair::new(); let past_bank_tx = @@ -2465,8 +2466,6 @@ pub(crate) mod tests { .unwrap(); let bank1 = bank_forks[1].clone(); - let bank_forks = Arc::new(RwLock::new(bank_forks)); - let mut cache0 = BlockCommitment::default(); cache0.increase_confirmation_stake(1, 10); let cache1 = BlockCommitment::default(); @@ -2483,16 +2482,19 @@ pub(crate) mod tests { }, ); + // Drop the write locked bank_forks + drop(bank_forks); + let exit = Arc::new(AtomicBool::new(false)); let optimistically_confirmed_bank = - OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); + OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks_arc); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); let max_complete_rewards_slot = Arc::new(AtomicU64::default()); let subscriptions = Arc::new(RpcSubscriptions::new_for_tests( exit, max_complete_transaction_status_slot, max_complete_rewards_slot, - bank_forks, + bank_forks_arc, Arc::new(RwLock::new(block_commitment_cache)), optimistically_confirmed_bank, )); @@ -2659,7 +2661,7 @@ pub(crate) mod tests { let exit = Arc::new(AtomicBool::new(false)); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); @@ -2706,7 +2708,7 @@ pub(crate) mod tests { let exit = Arc::new(AtomicBool::new(false)); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let optimistically_confirmed_bank = OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); @@ -2755,7 +2757,7 @@ pub(crate) mod tests { } = create_genesis_config(100); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let bank1 = Bank::new_from_parent(bank0.clone(), &Pubkey::default(), 1); bank_forks.write().unwrap().insert(bank1); @@ -2969,7 +2971,7 @@ pub(crate) mod tests { } = create_genesis_config(100); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let alice = Keypair::new(); @@ -3053,7 +3055,7 @@ pub(crate) mod tests { let bank = Bank::new_for_tests(&genesis_config); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); let max_complete_rewards_slot = Arc::new(AtomicU64::default()); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let subscriptions = Arc::new(RpcSubscriptions::default_with_bank_forks( max_complete_transaction_status_slot, max_complete_rewards_slot, diff --git a/runtime/benches/prioritization_fee_cache.rs b/runtime/benches/prioritization_fee_cache.rs index 95efc8cefd29ea..506aac4fb729a3 100644 --- a/runtime/benches/prioritization_fee_cache.rs +++ b/runtime/benches/prioritization_fee_cache.rs @@ -100,8 +100,8 @@ fn bench_process_transactions_multiple_slots(bencher: &mut Bencher) { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank0 = Bank::new_for_benches(&genesis_config); - let bank_forks = BankForks::new(bank0); - let bank = bank_forks.working_bank(); + let bank_forks = BankForks::new_rw_arc(bank0); + let bank = bank_forks.read().unwrap().working_bank(); let collector = solana_sdk::pubkey::new_rand(); let banks = (1..=NUM_SLOTS) .map(|n| Arc::new(Bank::new_from_parent(bank.clone(), &collector, n as u64))) diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index df776061ce6ed5..10acc085916228 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -12505,8 +12505,8 @@ fn test_runtime_feature_enable_with_program_cache() { genesis_config .accounts .remove(&feature_set::reject_callx_r10::id()); - let mut bank_forks = BankForks::new(Bank::new_for_tests(&genesis_config)); - let root_bank = bank_forks.root_bank(); + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests(&genesis_config)); + let root_bank = bank_forks.read().unwrap().root_bank(); // Test a basic transfer let amount = genesis_config.rent.minimum_balance(0); @@ -12565,9 +12565,16 @@ fn test_runtime_feature_enable_with_program_cache() { // Reroot to call LoadedPrograms::prune() and end the current recompilation phase goto_end_of_slot(&bank); - bank_forks.insert(Arc::into_inner(bank).unwrap()); - let bank = bank_forks.working_bank(); - bank_forks.set_root(bank.slot, &AbsRequestSender::default(), None); + bank_forks + .write() + .unwrap() + .insert(Arc::into_inner(bank).unwrap()); + let bank = bank_forks.read().unwrap().working_bank(); + bank_forks.read().unwrap().prune_program_cache(bank.slot); + bank_forks + .write() + .unwrap() + .set_root(bank.slot, &AbsRequestSender::default(), None); // Advance to next epoch, which starts the next recompilation phase let bank = new_from_parent_next_epoch(bank, 1); diff --git a/runtime/src/bank_forks.rs b/runtime/src/bank_forks.rs index 8ed5dd084efd68..631afb536c0756 100644 --- a/runtime/src/bank_forks.rs +++ b/runtime/src/bank_forks.rs @@ -15,7 +15,7 @@ use { ops::Index, sync::{ atomic::{AtomicBool, AtomicU64, Ordering}, - Arc, + Arc, RwLock, }, time::Instant, }, @@ -77,7 +77,7 @@ impl Index for BankForks { } impl BankForks { - pub fn new(bank: Bank) -> Self { + pub fn new_rw_arc(bank: Bank) -> Arc> { let root = bank.slot(); Self::new_from_banks(&[Arc::new(bank)], root) } @@ -154,7 +154,7 @@ impl BankForks { self[self.root()].clone() } - pub fn new_from_banks(initial_forks: &[Arc], root: Slot) -> Self { + pub fn new_from_banks(initial_forks: &[Arc], root: Slot) -> Arc> { let mut banks = HashMap::new(); // Iterate through the heads of all the different forks @@ -175,7 +175,7 @@ impl BankForks { descendants.entry(parent).or_default().insert(*slot); } } - Self { + let bank_forks = Arc::new(RwLock::new(Self { root: Arc::new(AtomicSlot::new(root)), banks, descendants, @@ -184,7 +184,16 @@ impl BankForks { last_accounts_hash_slot: root, in_vote_only_mode: Arc::new(AtomicBool::new(false)), highest_slot_at_startup: 0, + })); + + for bank in bank_forks.read().unwrap().banks.values() { + bank.loaded_programs_cache + .write() + .unwrap() + .set_fork_graph(bank_forks.clone()); } + + bank_forks } pub fn insert(&mut self, mut bank: Bank) -> Arc { @@ -696,7 +705,8 @@ mod tests { fn test_bank_forks_new() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let mut bank_forks = BankForks::new(bank); + let bank_forks = BankForks::new_rw_arc(bank); + let mut bank_forks = bank_forks.write().unwrap(); let child_bank = Bank::new_from_parent(bank_forks[0].clone(), &Pubkey::default(), 1); child_bank.register_tick(&Hash::default()); bank_forks.insert(child_bank); @@ -711,19 +721,20 @@ mod tests { let child_bank = Arc::new(Bank::new_from_parent(bank.clone(), &Pubkey::default(), 1)); let bank_forks = BankForks::new_from_banks(&[bank.clone(), child_bank.clone()], 0); - assert_eq!(bank_forks.root(), 0); - assert_eq!(bank_forks.working_bank().slot(), 1); + assert_eq!(bank_forks.read().unwrap().root(), 0); + assert_eq!(bank_forks.read().unwrap().working_bank().slot(), 1); let bank_forks = BankForks::new_from_banks(&[child_bank, bank], 0); - assert_eq!(bank_forks.root(), 0); - assert_eq!(bank_forks.working_bank().slot(), 1); + assert_eq!(bank_forks.read().unwrap().root(), 0); + assert_eq!(bank_forks.read().unwrap().working_bank().slot(), 1); } #[test] fn test_bank_forks_descendants() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let mut bank_forks = BankForks::new(bank); + let bank_forks = BankForks::new_rw_arc(bank); + let mut bank_forks = bank_forks.write().unwrap(); let bank0 = bank_forks[0].clone(); let bank = Bank::new_from_parent(bank0.clone(), &Pubkey::default(), 1); bank_forks.insert(bank); @@ -740,7 +751,8 @@ mod tests { fn test_bank_forks_ancestors() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let mut bank_forks = BankForks::new(bank); + let bank_forks = BankForks::new_rw_arc(bank); + let mut bank_forks = bank_forks.write().unwrap(); let bank0 = bank_forks[0].clone(); let bank = Bank::new_from_parent(bank0.clone(), &Pubkey::default(), 1); bank_forks.insert(bank); @@ -758,7 +770,8 @@ mod tests { fn test_bank_forks_frozen_banks() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let mut bank_forks = BankForks::new(bank); + let bank_forks = BankForks::new_rw_arc(bank); + let mut bank_forks = bank_forks.write().unwrap(); let bank0 = bank_forks[0].clone(); let child_bank = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.insert(child_bank); @@ -770,7 +783,8 @@ mod tests { fn test_bank_forks_active_banks() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let mut bank_forks = BankForks::new(bank); + let bank_forks = BankForks::new_rw_arc(bank); + let mut bank_forks = bank_forks.write().unwrap(); let bank0 = bank_forks[0].clone(); let child_bank = Bank::new_from_parent(bank0, &Pubkey::default(), 1); bank_forks.insert(child_bank); @@ -822,11 +836,13 @@ mod tests { }; let bank0 = Bank::new_for_tests(&genesis_config); - let mut bank_forks0 = BankForks::new(bank0); + let bank_forks0 = BankForks::new_rw_arc(bank0); + let mut bank_forks0 = bank_forks0.write().unwrap(); bank_forks0.set_root(0, &abs_request_sender, None); let bank1 = Bank::new_for_tests(&genesis_config); - let mut bank_forks1 = BankForks::new(bank1); + let bank_forks1 = BankForks::new_rw_arc(bank1); + let mut bank_forks1 = bank_forks1.write().unwrap(); let additional_timestamp_secs = 2; @@ -882,10 +898,11 @@ mod tests { .collect() } - fn extend_bank_forks(bank_forks: &mut BankForks, parent_child_pairs: &[(Slot, Slot)]) { + fn extend_bank_forks(bank_forks: Arc>, parent_child_pairs: &[(Slot, Slot)]) { for (parent, child) in parent_child_pairs.iter() { - bank_forks.insert(Bank::new_from_parent( - bank_forks[*parent].clone(), + let parent: Arc = bank_forks.read().unwrap().banks[parent].clone(); + bank_forks.write().unwrap().insert(Bank::new_from_parent( + parent, &Pubkey::default(), *child, )); @@ -896,13 +913,13 @@ mod tests { fn test_bank_forks_with_set_root() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let mut bank_forks = BankForks::new(bank); + let bank_forks = BankForks::new_rw_arc(bank); let parent_child_pairs = vec![(0, 1), (1, 2), (0, 3), (3, 4)]; - extend_bank_forks(&mut bank_forks, &parent_child_pairs); + extend_bank_forks(bank_forks.clone(), &parent_child_pairs); assert_eq!( - bank_forks.ancestors(), + bank_forks.read().unwrap().ancestors(), make_hash_map(vec![ (0, vec![]), (1, vec![0]), @@ -912,7 +929,7 @@ mod tests { ]) ); assert_eq!( - bank_forks.descendants(), + bank_forks.read().unwrap().descendants(), make_hash_map(vec![ (0, vec![1, 2, 3, 4]), (1, vec![2]), @@ -921,26 +938,29 @@ mod tests { (4, vec![]), ]) ); - bank_forks.set_root( + bank_forks.write().unwrap().set_root( 2, &AbsRequestSender::default(), None, // highest confirmed root ); - bank_forks[2].squash(); - assert_eq!(bank_forks.ancestors(), make_hash_map(vec![(2, vec![]),])); + bank_forks.read().unwrap().get(2).unwrap().squash(); assert_eq!( - bank_forks.descendants(), + bank_forks.read().unwrap().ancestors(), + make_hash_map(vec![(2, vec![]),]) + ); + assert_eq!( + bank_forks.read().unwrap().descendants(), make_hash_map(vec![(0, vec![2]), (1, vec![2]), (2, vec![]),]) ); let parent_child_pairs = vec![(2, 5), (5, 6)]; - extend_bank_forks(&mut bank_forks, &parent_child_pairs); + extend_bank_forks(bank_forks.clone(), &parent_child_pairs); assert_eq!( - bank_forks.ancestors(), + bank_forks.read().unwrap().ancestors(), make_hash_map(vec![(2, vec![]), (5, vec![2]), (6, vec![2, 5])]) ); assert_eq!( - bank_forks.descendants(), + bank_forks.read().unwrap().descendants(), make_hash_map(vec![ (0, vec![2]), (1, vec![2]), @@ -956,13 +976,13 @@ mod tests { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); assert_eq!(bank.slot(), 0); - let mut bank_forks = BankForks::new(bank); + let bank_forks = BankForks::new_rw_arc(bank); let parent_child_pairs = vec![(0, 1), (1, 2), (0, 3), (3, 4)]; - extend_bank_forks(&mut bank_forks, &parent_child_pairs); + extend_bank_forks(bank_forks.clone(), &parent_child_pairs); assert_eq!( - bank_forks.ancestors(), + bank_forks.read().unwrap().ancestors(), make_hash_map(vec![ (0, vec![]), (1, vec![0]), @@ -972,7 +992,7 @@ mod tests { ]) ); assert_eq!( - bank_forks.descendants(), + bank_forks.read().unwrap().descendants(), make_hash_map(vec![ (0, vec![1, 2, 3, 4]), (1, vec![2]), @@ -981,25 +1001,25 @@ mod tests { (4, vec![]), ]) ); - bank_forks.set_root( + bank_forks.write().unwrap().set_root( 2, &AbsRequestSender::default(), Some(1), // highest confirmed root ); - bank_forks[2].squash(); + bank_forks.read().unwrap().get(2).unwrap().squash(); assert_eq!( - bank_forks.ancestors(), + bank_forks.read().unwrap().ancestors(), make_hash_map(vec![(1, vec![]), (2, vec![]),]) ); assert_eq!( - bank_forks.descendants(), + bank_forks.read().unwrap().descendants(), make_hash_map(vec![(0, vec![1, 2]), (1, vec![2]), (2, vec![]),]) ); let parent_child_pairs = vec![(2, 5), (5, 6)]; - extend_bank_forks(&mut bank_forks, &parent_child_pairs); + extend_bank_forks(bank_forks.clone(), &parent_child_pairs); assert_eq!( - bank_forks.ancestors(), + bank_forks.read().unwrap().ancestors(), make_hash_map(vec![ (1, vec![]), (2, vec![]), @@ -1008,7 +1028,7 @@ mod tests { ]) ); assert_eq!( - bank_forks.descendants(), + bank_forks.read().unwrap().descendants(), make_hash_map(vec![ (0, vec![1, 2]), (1, vec![2]), @@ -1023,7 +1043,7 @@ mod tests { fn test_fork_graph() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let mut bank_forks = BankForks::new(bank); + let bank_forks = BankForks::new_rw_arc(bank); let parent_child_pairs = vec![ (0, 1), @@ -1036,7 +1056,7 @@ mod tests { (4, 6), (6, 12), ]; - extend_bank_forks(&mut bank_forks, &parent_child_pairs); + extend_bank_forks(bank_forks.clone(), &parent_child_pairs); // Fork graph created for the test // 0 @@ -1048,7 +1068,7 @@ mod tests { // 8 5 6 // | | // 10 12 - + let mut bank_forks = bank_forks.write().unwrap(); assert_matches!(bank_forks.relationship(0, 3), BlockRelation::Ancestor); assert_matches!(bank_forks.relationship(0, 10), BlockRelation::Ancestor); assert_matches!(bank_forks.relationship(0, 12), BlockRelation::Ancestor); diff --git a/runtime/src/prioritization_fee_cache.rs b/runtime/src/prioritization_fee_cache.rs index 5f8e3d9220d459..c41d5a72bd397f 100644 --- a/runtime/src/prioritization_fee_cache.rs +++ b/runtime/src/prioritization_fee_cache.rs @@ -612,8 +612,8 @@ mod tests { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank0 = Bank::new_for_benches(&genesis_config); - let bank_forks = BankForks::new(bank0); - let bank = bank_forks.working_bank(); + let bank_forks = BankForks::new_rw_arc(bank0); + let bank = bank_forks.read().unwrap().working_bank(); let collector = solana_sdk::pubkey::new_rand(); let bank1 = Arc::new(Bank::new_from_parent(bank.clone(), &collector, 1)); let bank2 = Arc::new(Bank::new_from_parent(bank.clone(), &collector, 2)); @@ -864,8 +864,8 @@ mod tests { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank0 = Bank::new_for_benches(&genesis_config); - let bank_forks = BankForks::new(bank0); - let bank = bank_forks.working_bank(); + let bank_forks = BankForks::new_rw_arc(bank0); + let bank = bank_forks.read().unwrap().working_bank(); let collector = solana_sdk::pubkey::new_rand(); let slot: Slot = 999; let bank1 = Arc::new(Bank::new_from_parent(bank.clone(), &collector, slot)); diff --git a/runtime/src/root_bank_cache.rs b/runtime/src/root_bank_cache.rs index 8a9ff1b8b50fe2..09a8f2690c44ce 100644 --- a/runtime/src/root_bank_cache.rs +++ b/runtime/src/root_bank_cache.rs @@ -60,7 +60,7 @@ mod tests { fn test_root_bank_cache() { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let mut root_bank_cache = RootBankCache::new(bank_forks.clone()); diff --git a/send-transaction-service/src/send_transaction_service.rs b/send-transaction-service/src/send_transaction_service.rs index 137160844da6c7..27aa1bea400ac4 100644 --- a/send-transaction-service/src/send_transaction_service.rs +++ b/send-transaction-service/src/send_transaction_service.rs @@ -826,7 +826,7 @@ mod test { fn service_exit() { let tpu_address = "127.0.0.1:0".parse().unwrap(); let bank = Bank::default_for_tests(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let (sender, receiver) = unbounded(); let connection_cache = Arc::new(ConnectionCache::new("connection_cache_test")); @@ -849,7 +849,7 @@ mod test { fn validator_exit() { let tpu_address = "127.0.0.1:0".parse().unwrap(); let bank = Bank::default_for_tests(); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let (sender, receiver) = bounded(0); let dummy_tx_info = || TransactionInfo { @@ -893,7 +893,7 @@ mod test { let (genesis_config, mint_keypair) = create_genesis_config(4); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let tpu_address = "127.0.0.1:0".parse().unwrap(); let config = Config { leader_forward_count: 1, @@ -1159,7 +1159,7 @@ mod test { let (genesis_config, mint_keypair) = create_genesis_config(4); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let tpu_address = "127.0.0.1:0".parse().unwrap(); let config = Config { leader_forward_count: 1, diff --git a/turbine/benches/cluster_info.rs b/turbine/benches/cluster_info.rs index 954e32903c3e2f..1f15137175acdb 100644 --- a/turbine/benches/cluster_info.rs +++ b/turbine/benches/cluster_info.rs @@ -25,12 +25,7 @@ use { }, cluster_nodes::ClusterNodesCache, }, - std::{ - collections::HashMap, - net::UdpSocket, - sync::{Arc, RwLock}, - time::Duration, - }, + std::{collections::HashMap, net::UdpSocket, sync::Arc, time::Duration}, test::Bencher, }; @@ -49,7 +44,7 @@ fn broadcast_shreds_bench(bencher: &mut Bencher) { let socket = UdpSocket::bind("0.0.0.0:0").unwrap(); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_benches(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); const NUM_SHREDS: usize = 32; let shred = Shred::new_from_data(0, 0, 0, &[], ShredFlags::empty(), 0, 0, 0); diff --git a/turbine/benches/retransmit_stage.rs b/turbine/benches/retransmit_stage.rs index b0dd67db8225ec..bfd68239feedab 100644 --- a/turbine/benches/retransmit_stage.rs +++ b/turbine/benches/retransmit_stage.rs @@ -32,7 +32,7 @@ use { net::{Ipv4Addr, UdpSocket}, sync::{ atomic::{AtomicUsize, Ordering}, - Arc, RwLock, + Arc, }, thread::{sleep, Builder}, time::Duration, @@ -74,9 +74,8 @@ fn bench_retransmitter(bencher: &mut Bencher) { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(100_000); let bank0 = Bank::new_for_benches(&genesis_config); - let bank_forks = BankForks::new(bank0); - let bank = bank_forks.working_bank(); - let bank_forks = Arc::new(RwLock::new(bank_forks)); + let bank_forks = BankForks::new_rw_arc(bank0); + let bank = bank_forks.read().unwrap().working_bank(); let (shreds_sender, shreds_receiver) = unbounded(); const NUM_THREADS: usize = 2; let sockets = (0..NUM_THREADS) diff --git a/turbine/src/broadcast_stage.rs b/turbine/src/broadcast_stage.rs index 07be0d0bfd6daa..cccda977b1637a 100644 --- a/turbine/src/broadcast_stage.rs +++ b/turbine/src/broadcast_stage.rs @@ -668,7 +668,7 @@ pub mod test { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank = bank_forks.read().unwrap().root_bank(); // Start up the broadcast stage diff --git a/turbine/src/broadcast_stage/standard_broadcast_run.rs b/turbine/src/broadcast_stage/standard_broadcast_run.rs index 031e72012340e7..37850d6ba9998a 100644 --- a/turbine/src/broadcast_stage/standard_broadcast_run.rs +++ b/turbine/src/broadcast_stage/standard_broadcast_run.rs @@ -544,7 +544,7 @@ mod test { genesis_config.ticks_per_slot = max_ticks_per_n_shreds(num_shreds_per_slot, None) + 1; let bank = Bank::new_for_tests(&genesis_config); - let bank_forks = Arc::new(RwLock::new(BankForks::new(bank))); + let bank_forks = BankForks::new_rw_arc(bank); let bank0 = bank_forks.read().unwrap().root_bank(); ( blockstore, diff --git a/turbine/src/quic_endpoint.rs b/turbine/src/quic_endpoint.rs index 0f362fd1a34c69..e9789357c015d6 100644 --- a/turbine/src/quic_endpoint.rs +++ b/turbine/src/quic_endpoint.rs @@ -598,7 +598,7 @@ mod tests { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(/*mint_lamports:*/ 100_000); let bank = Bank::new_for_tests(&genesis_config); - Arc::new(RwLock::new(BankForks::new(bank))) + BankForks::new_rw_arc(bank) }; let (endpoints, senders, tasks): (Vec<_>, Vec<_>, Vec<_>) = multiunzip(keypairs.iter().zip(sockets).zip(senders).map( diff --git a/turbine/src/sigverify_shreds.rs b/turbine/src/sigverify_shreds.rs index 35e4977de850c5..76088a8115a837 100644 --- a/turbine/src/sigverify_shreds.rs +++ b/turbine/src/sigverify_shreds.rs @@ -284,7 +284,7 @@ mod tests { &create_genesis_config_with_leader(100, &leader_pubkey, 10).genesis_config, ); let leader_schedule_cache = LeaderScheduleCache::new_from_bank(&bank); - let bank_forks = RwLock::new(BankForks::new(bank)); + let bank_forks = BankForks::new_rw_arc(bank); let batch_size = 2; let mut batch = PacketBatch::with_capacity(batch_size); batch.resize(batch_size, Packet::default()); diff --git a/validator/src/admin_rpc_service.rs b/validator/src/admin_rpc_service.rs index e10ab05ea01577..69584822097c45 100644 --- a/validator/src/admin_rpc_service.rs +++ b/validator/src/admin_rpc_service.rs @@ -917,10 +917,7 @@ mod tests { } = create_genesis_config(1_000_000_000); let bank = Bank::new_for_tests_with_config(&genesis_config, config); - ( - Arc::new(RwLock::new(BankForks::new(bank))), - Arc::new(voting_keypair), - ) + (BankForks::new_rw_arc(bank), Arc::new(voting_keypair)) } #[test] From 8512595d6269cd3b57f91220f8e0dbb674e78d26 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 15:13:50 +0100 Subject: [PATCH 047/213] v1.17: Update Solang Solidity compiler to v0.3.3 (backport of #33830) (#33835) Update Solang Solidity compiler to v0.3.3 (#33830) Signed-off-by: Sean Young (cherry picked from commit 8e0acf481cfc69a51f6f0ab29ee9348a9c797f9c) Co-authored-by: Sean Young --- scripts/cargo-install-all.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cargo-install-all.sh b/scripts/cargo-install-all.sh index e1cbe9fc13d4a3..583ba6508f917d 100755 --- a/scripts/cargo-install-all.sh +++ b/scripts/cargo-install-all.sh @@ -171,7 +171,7 @@ fi # Add Solidity Compiler if [[ -z "$validatorOnly" ]]; then base="https://github.com/hyperledger/solang/releases/download" - version="v0.3.2" + version="v0.3.3" curlopt="-sSfL --retry 5 --retry-delay 2 --retry-connrefused" case $(uname -s) in From 0471732f1e66772559a2e6d9599636189073e44a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 16:07:15 +0000 Subject: [PATCH 048/213] v1.17: adds metrics to turbine QUIC endpoint (backport of #33819) (#33838) adds metrics to turbine QUIC endpoint (#33819) (cherry picked from commit 6470544ea22300f8939a3bf59183ab0472380fc5) Co-authored-by: behzad nouri --- turbine/src/quic_endpoint.rs | 231 +++++++++++++++++++++++++++++++++-- 1 file changed, 218 insertions(+), 13 deletions(-) diff --git a/turbine/src/quic_endpoint.rs b/turbine/src/quic_endpoint.rs index e9789357c015d6..326f409ae32405 100644 --- a/turbine/src/quic_endpoint.rs +++ b/turbine/src/quic_endpoint.rs @@ -21,9 +21,10 @@ use { io::Error as IoError, net::{IpAddr, SocketAddr, UdpSocket}, sync::{ - atomic::{AtomicBool, Ordering}, + atomic::{AtomicBool, AtomicU64, Ordering}, Arc, RwLock, }, + time::Duration, }, thiserror::Error, tokio::{ @@ -60,12 +61,12 @@ pub type AsyncTryJoinHandle = TryJoin, JoinHandle<()>>; pub enum Error { #[error(transparent)] CertificateError(#[from] RcgenError), + #[error("Channel Send Error")] + ChannelSendError, #[error(transparent)] ConnectError(#[from] ConnectError), #[error(transparent)] ConnectionError(#[from] ConnectionError), - #[error("Channel Send Error")] - ChannelSendError, #[error("Invalid Identity: {0:?}")] InvalidIdentity(SocketAddr), #[error(transparent)] @@ -76,6 +77,12 @@ pub enum Error { TlsError(#[from] rustls::Error), } +macro_rules! add_metric { + ($metric: expr) => {{ + $metric.fetch_add(1, Ordering::Relaxed); + }}; +} + #[allow(clippy::type_complexity)] pub fn new_quic_endpoint( runtime: &tokio::runtime::Handle, @@ -182,8 +189,11 @@ async fn run_server( router: Arc>>>, cache: Arc>>, ) { + let stats = Arc::::default(); + let report_metrics_task = + tokio::task::spawn(report_metrics_task("repair_quic_server", stats.clone())); while let Some(connecting) = endpoint.accept().await { - tokio::task::spawn(handle_connecting_error( + tokio::task::spawn(handle_connecting_task( endpoint.clone(), connecting, sender.clone(), @@ -191,8 +201,10 @@ async fn run_server( prune_cache_pending.clone(), router.clone(), cache.clone(), + stats.clone(), )); } + report_metrics_task.abort(); } async fn run_client( @@ -204,13 +216,17 @@ async fn run_client( router: Arc>>>, cache: Arc>>, ) { + let stats = Arc::::default(); + let report_metrics_task = + tokio::task::spawn(report_metrics_task("repair_quic_client", stats.clone())); while let Some((remote_address, bytes)) = receiver.recv().await { - let Some(bytes) = try_route_bytes(&remote_address, bytes, &*router.read().await) else { + let Some(bytes) = try_route_bytes(&remote_address, bytes, &*router.read().await, &stats) + else { continue; }; let receiver = { let mut router = router.write().await; - let Some(bytes) = try_route_bytes(&remote_address, bytes, &router) else { + let Some(bytes) = try_route_bytes(&remote_address, bytes, &router, &stats) else { continue; }; let (sender, receiver) = tokio::sync::mpsc::channel(ROUTER_CHANNEL_BUFFER); @@ -227,24 +243,28 @@ async fn run_client( prune_cache_pending.clone(), router.clone(), cache.clone(), + stats.clone(), )); } close_quic_endpoint(&endpoint); // Drop sender channels to unblock threads waiting on the receiving end. router.write().await.clear(); + report_metrics_task.abort(); } fn try_route_bytes( remote_address: &SocketAddr, bytes: Bytes, router: &HashMap>, + stats: &TurbineQuicStats, ) -> Option { match router.get(remote_address) { None => Some(bytes), Some(sender) => match sender.try_send(bytes) { Ok(()) => None, Err(TrySendError::Full(_)) => { - error!("TrySendError::Full {remote_address}"); + debug!("TrySendError::Full {remote_address}"); + add_metric!(stats.router_try_send_error_full); None } Err(TrySendError::Closed(bytes)) => Some(bytes), @@ -252,7 +272,7 @@ fn try_route_bytes( } } -async fn handle_connecting_error( +async fn handle_connecting_task( endpoint: Endpoint, connecting: Connecting, sender: Sender<(Pubkey, SocketAddr, Bytes)>, @@ -260,6 +280,7 @@ async fn handle_connecting_error( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) { if let Err(err) = handle_connecting( endpoint, @@ -269,10 +290,12 @@ async fn handle_connecting_error( prune_cache_pending, router, cache, + stats.clone(), ) .await { - error!("handle_connecting: {err:?}"); + debug!("handle_connecting: {err:?}"); + record_error(&err, &stats); } } @@ -284,6 +307,7 @@ async fn handle_connecting( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) -> Result<(), Error> { let connection = connecting.await?; let remote_address = connection.remote_address(); @@ -304,6 +328,7 @@ async fn handle_connecting( prune_cache_pending, router, cache, + stats, ) .await; Ok(()) @@ -321,6 +346,7 @@ async fn handle_connection( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) { cache_connection( remote_pubkey, @@ -338,15 +364,18 @@ async fn handle_connection( remote_pubkey, connection.clone(), sender, + stats.clone(), )); match futures::future::try_join(send_datagram_task, read_datagram_task).await { Err(err) => error!("handle_connection: {remote_pubkey}, {remote_address}, {err:?}"), Ok(out) => { if let (Err(ref err), _) = out { - error!("send_datagram_task: {remote_pubkey}, {remote_address}, {err:?}"); + debug!("send_datagram_task: {remote_pubkey}, {remote_address}, {err:?}"); + record_error(err, &stats); } if let (_, Err(ref err)) = out { - error!("read_datagram_task: {remote_pubkey}, {remote_address}, {err:?}"); + debug!("read_datagram_task: {remote_pubkey}, {remote_address}, {err:?}"); + record_error(err, &stats); } } } @@ -364,6 +393,7 @@ async fn read_datagram_task( remote_pubkey: Pubkey, connection: Connection, sender: Sender<(Pubkey, SocketAddr, Bytes)>, + stats: Arc, ) -> Result<(), Error> { // Assert that send won't block. debug_assert_eq!(sender.capacity(), None); @@ -379,7 +409,8 @@ async fn read_datagram_task( if let Some(err) = connection.close_reason() { return Err(Error::from(err)); } - error!("connection.read_datagram: {remote_pubkey}, {remote_address}, {err:?}"); + debug!("connection.read_datagram: {remote_pubkey}, {remote_address}, {err:?}"); + record_error(&Error::from(err), &stats); } }; } @@ -404,6 +435,7 @@ async fn make_connection_task( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) { if let Err(err) = make_connection( endpoint, @@ -414,10 +446,12 @@ async fn make_connection_task( prune_cache_pending, router, cache, + stats.clone(), ) .await { - error!("make_connection: {remote_address}, {err:?}"); + debug!("make_connection: {remote_address}, {err:?}"); + record_error(&err, &stats); } } @@ -430,6 +464,7 @@ async fn make_connection( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) -> Result<(), Error> { let connection = endpoint .connect(remote_address, CONNECT_SERVER_NAME)? @@ -445,6 +480,7 @@ async fn make_connection( prune_cache_pending, router, cache, + stats, ) .await; Ok(()) @@ -560,6 +596,175 @@ impl From> for Error { } } +#[derive(Default)] +struct TurbineQuicStats { + connect_error_invalid_remote_address: AtomicU64, + connect_error_other: AtomicU64, + connect_error_too_many_connections: AtomicU64, + connection_error_application_closed: AtomicU64, + connection_error_connection_closed: AtomicU64, + connection_error_locally_closed: AtomicU64, + connection_error_reset: AtomicU64, + connection_error_timed_out: AtomicU64, + connection_error_transport_error: AtomicU64, + connection_error_version_mismatch: AtomicU64, + invalid_identity: AtomicU64, + router_try_send_error_full: AtomicU64, + send_datagram_error_connection_lost: AtomicU64, + send_datagram_error_too_large: AtomicU64, + send_datagram_error_unsupported_by_peer: AtomicU64, +} + +async fn report_metrics_task(name: &'static str, stats: Arc) { + loop { + tokio::time::sleep(Duration::from_secs(2)).await; + report_metrics(name, &stats); + } +} + +fn record_error(err: &Error, stats: &TurbineQuicStats) { + match err { + Error::CertificateError(_) => (), + Error::ChannelSendError => (), + Error::ConnectError(ConnectError::EndpointStopping) => { + add_metric!(stats.connect_error_other) + } + Error::ConnectError(ConnectError::TooManyConnections) => { + add_metric!(stats.connect_error_too_many_connections) + } + Error::ConnectError(ConnectError::InvalidDnsName(_)) => { + add_metric!(stats.connect_error_other) + } + Error::ConnectError(ConnectError::InvalidRemoteAddress(_)) => { + add_metric!(stats.connect_error_invalid_remote_address) + } + Error::ConnectError(ConnectError::NoDefaultClientConfig) => { + add_metric!(stats.connect_error_other) + } + Error::ConnectError(ConnectError::UnsupportedVersion) => { + add_metric!(stats.connect_error_other) + } + Error::ConnectionError(ConnectionError::VersionMismatch) => { + add_metric!(stats.connection_error_version_mismatch) + } + Error::ConnectionError(ConnectionError::TransportError(_)) => { + add_metric!(stats.connection_error_transport_error) + } + Error::ConnectionError(ConnectionError::ConnectionClosed(_)) => { + add_metric!(stats.connection_error_connection_closed) + } + Error::ConnectionError(ConnectionError::ApplicationClosed(_)) => { + add_metric!(stats.connection_error_application_closed) + } + Error::ConnectionError(ConnectionError::Reset) => add_metric!(stats.connection_error_reset), + Error::ConnectionError(ConnectionError::TimedOut) => { + add_metric!(stats.connection_error_timed_out) + } + Error::ConnectionError(ConnectionError::LocallyClosed) => { + add_metric!(stats.connection_error_locally_closed) + } + Error::InvalidIdentity(_) => add_metric!(stats.invalid_identity), + Error::IoError(_) => (), + Error::SendDatagramError(SendDatagramError::UnsupportedByPeer) => { + add_metric!(stats.send_datagram_error_unsupported_by_peer) + } + Error::SendDatagramError(SendDatagramError::Disabled) => (), + Error::SendDatagramError(SendDatagramError::TooLarge) => { + add_metric!(stats.send_datagram_error_too_large) + } + Error::SendDatagramError(SendDatagramError::ConnectionLost(_)) => { + add_metric!(stats.send_datagram_error_connection_lost) + } + Error::TlsError(_) => (), + } +} + +fn report_metrics(name: &'static str, stats: &TurbineQuicStats) { + macro_rules! reset_metric { + ($metric: expr) => { + $metric.swap(0, Ordering::Relaxed) + }; + } + datapoint_info!( + name, + ( + "connect_error_invalid_remote_address", + reset_metric!(stats.connect_error_invalid_remote_address), + i64 + ), + ( + "connect_error_other", + reset_metric!(stats.connect_error_other), + i64 + ), + ( + "connect_error_too_many_connections", + reset_metric!(stats.connect_error_too_many_connections), + i64 + ), + ( + "connection_error_application_closed", + reset_metric!(stats.connection_error_application_closed), + i64 + ), + ( + "connection_error_connection_closed", + reset_metric!(stats.connection_error_connection_closed), + i64 + ), + ( + "connection_error_locally_closed", + reset_metric!(stats.connection_error_locally_closed), + i64 + ), + ( + "connection_error_reset", + reset_metric!(stats.connection_error_reset), + i64 + ), + ( + "connection_error_timed_out", + reset_metric!(stats.connection_error_timed_out), + i64 + ), + ( + "connection_error_transport_error", + reset_metric!(stats.connection_error_transport_error), + i64 + ), + ( + "connection_error_version_mismatch", + reset_metric!(stats.connection_error_version_mismatch), + i64 + ), + ( + "invalid_identity", + reset_metric!(stats.invalid_identity), + i64 + ), + ( + "router_try_send_error_full", + reset_metric!(stats.router_try_send_error_full), + i64 + ), + ( + "send_datagram_error_connection_lost", + reset_metric!(stats.send_datagram_error_connection_lost), + i64 + ), + ( + "send_datagram_error_too_large", + reset_metric!(stats.send_datagram_error_too_large), + i64 + ), + ( + "send_datagram_error_unsupported_by_peer", + reset_metric!(stats.send_datagram_error_unsupported_by_peer), + i64 + ), + ); +} + #[cfg(test)] mod tests { use { From 5bd9969d8238f1a2e70ce34921eafd8374307377 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 12:34:35 -0700 Subject: [PATCH 049/213] v1.17: [zk-token-sdk] Check that discrete log compression batch size is greater than 0 (backport of #33699) (#33844) [zk-token-sdk] Check that discrete log compression batch size is greater than 0 (#33699) check that discrete log compression batch size is greater than 0 (cherry picked from commit 381d2254ebbc69a92a73ff55285a0bed1aa18c3d) Co-authored-by: samkim-crypto --- zk-token-sdk/src/encryption/discrete_log.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zk-token-sdk/src/encryption/discrete_log.rs b/zk-token-sdk/src/encryption/discrete_log.rs index 7f98918823225a..b3e02a74625b61 100644 --- a/zk-token-sdk/src/encryption/discrete_log.rs +++ b/zk-token-sdk/src/encryption/discrete_log.rs @@ -130,7 +130,7 @@ impl DiscreteLog { &mut self, compression_batch_size: usize, ) -> Result<(), DiscreteLogError> { - if compression_batch_size >= TWO16 as usize { + if compression_batch_size >= TWO16 as usize || compression_batch_size == 0 { return Err(DiscreteLogError::DiscreteLogBatchSize); } self.compression_batch_size = compression_batch_size; From 0559bc1cc780dc80f79347d0d40eecdb444cb018 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 00:58:41 -0400 Subject: [PATCH 050/213] v1.17: docs: outline requirement of stake in order to vote (backport of #33842) (#33854) docs: outline requirement of stake in order to vote (#33842) * docs: outline requirement of stake in order to vote * pr feedback: move stake section up (cherry picked from commit a3b0348649db5788e59237b5778405b2554704b2) Co-authored-by: Ashwin Sekar --- docs/src/running-validator/validator-stake.md | 38 ++++++++++--------- docs/src/running-validator/validator-start.md | 6 +++ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/docs/src/running-validator/validator-stake.md b/docs/src/running-validator/validator-stake.md index ae430ae9675c8f..71c9cd213016e8 100644 --- a/docs/src/running-validator/validator-stake.md +++ b/docs/src/running-validator/validator-stake.md @@ -3,7 +3,7 @@ title: Staking --- **By default your validator will have no stake.** This means it will be -ineligible to become leader. +ineligible to become leader, and unable to land votes. ## Monitoring Catch Up @@ -55,8 +55,25 @@ but only one re-delegation is permitted per epoch: solana delegate-stake ~/validator-stake-keypair.json ~/some-other-vote-account-keypair.json ``` -Assuming the node is voting, now you're up and running and generating validator -rewards. Rewards are paid automatically on epoch boundaries. +## Validator Stake Warm-up + +To combat various attacks on consensus, new stake delegations are subject to +a [warm-up](/staking/stake-accounts#delegation-warmup-and-cooldown) +period. + +Monitor a validator's stake during warmup by: + +- View your vote account:`solana vote-account ~/vote-account-keypair.json` This displays the current state of all the votes the validator has submitted to the network. +- View your stake account, the delegation preference and details of your stake:`solana stake-account ~/validator-stake-keypair.json` +- `solana validators` displays the current active stake of all validators, including yours +- `solana stake-history` shows the history of stake warming up and cooling down over recent epochs +- Look for log messages on your validator indicating your next leader slot: `[2019-09-27T20:16:00.319721164Z INFO solana_core::replay_stage] voted and reset PoH at tick height ####. My next leader slot is ####` +- Once your stake is warmed up, you will see a stake balance listed for your validator by running `solana validators` + +## Validator Rewards + +Once your stake is warmed up, and assuming the node is voting, you will now be +generating validator rewards. Rewards are paid automatically on epoch boundaries. The rewards lamports earned are split between your stake account and the vote account according to the commission rate set in the vote account. Rewards can @@ -76,21 +93,6 @@ before submitting a transaction. Learn more about [transaction fees here](../implemented-proposals/transaction-fees.md). -## Validator Stake Warm-up - -To combat various attacks on consensus, new stake delegations are subject to -a [warm-up](/staking/stake-accounts#delegation-warmup-and-cooldown) -period. - -Monitor a validator's stake during warmup by: - -- View your vote account:`solana vote-account ~/vote-account-keypair.json` This displays the current state of all the votes the validator has submitted to the network. -- View your stake account, the delegation preference and details of your stake:`solana stake-account ~/validator-stake-keypair.json` -- `solana validators` displays the current active stake of all validators, including yours -- `solana stake-history` shows the history of stake warming up and cooling down over recent epochs -- Look for log messages on your validator indicating your next leader slot: `[2019-09-27T20:16:00.319721164Z INFO solana_core::replay_stage] voted and reset PoH at tick height ####. My next leader slot is ####` -- Once your stake is warmed up, you will see a stake balance listed for your validator by running `solana validators` - ## Monitor Your Staked Validator Confirm your validator becomes a [leader](../terminology.md#leader) diff --git a/docs/src/running-validator/validator-start.md b/docs/src/running-validator/validator-start.md index cfa3aa152f15a6..ccd012aa79997c 100644 --- a/docs/src/running-validator/validator-start.md +++ b/docs/src/running-validator/validator-start.md @@ -255,6 +255,12 @@ Remember to move your authorized withdrawer keypair into a very secure location Read more about [creating and managing a vote account](vote-accounts.md). +## Stake your validator + +Until your validator is staked, it will be unable to vote, propose leader blocks, or collect rewards. + +Follow the instructions to [stake your validator](validator-stake.md) + ## Known validators If you know and respect other validator operators, you can specify this on the command line with the `--known-validator ` From bfab9bb3ae4346a98c7b8e13d81b171dc762b2d4 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 16:03:39 +0000 Subject: [PATCH 051/213] v1.17: Use program cache fork graph in extract() (backport of #33806) (#33862) Use program cache fork graph in extract() (#33806) * Use program cache fork graph instead of WorkingSlot trait * Fix deadlocked tests * keep WorkingSlot trait for now (cherry picked from commit 78c31aa6b807c8a0c9b0d3acbb063ed024ac5b60) Co-authored-by: Pankaj Garg --- client-test/tests/client.rs | 4 +- core/src/commitment_service.rs | 43 ++++--- core/tests/snapshots.rs | 25 ++-- program-runtime/src/loaded_programs.rs | 153 ++++++++++--------------- rpc/src/rpc_pubsub.rs | 6 +- rpc/src/rpc_subscriptions.rs | 24 ++-- runtime/src/bank.rs | 1 - runtime/src/bank_forks.rs | 21 +++- 8 files changed, 131 insertions(+), 146 deletions(-) diff --git a/client-test/tests/client.rs b/client-test/tests/client.rs index d74361a76d100e..71db9e0f5e6e8a 100644 --- a/client-test/tests/client.rs +++ b/client-test/tests/client.rs @@ -168,7 +168,7 @@ fn test_account_subscription() { // Transfer 100 lamports from alice to bob let tx = system_transaction::transfer(&alice, &bob.pubkey(), 100, blockhash); bank_forks - .write() + .read() .unwrap() .get(1) .unwrap() @@ -373,7 +373,7 @@ fn test_program_subscription() { // Create new program account at bob's address let tx = system_transaction::create_account(&alice, &bob, blockhash, 100, 0, &program_id); bank_forks - .write() + .read() .unwrap() .get(1) .unwrap() diff --git a/core/src/commitment_service.rs b/core/src/commitment_service.rs index b15c6d2fec5fe0..84242b44c6433a 100644 --- a/core/src/commitment_service.rs +++ b/core/src/commitment_service.rs @@ -510,12 +510,11 @@ mod tests { let bank0 = Bank::new_for_tests(&genesis_config); let bank_forks = BankForks::new_rw_arc(bank0); - let mut bank_forks = bank_forks.write().unwrap(); // Fill bank_forks with banks with votes landing in the next slot // Create enough banks such that vote account will root slots 0 and 1 for x in 0..33 { - let previous_bank = bank_forks.get(x).unwrap(); + let previous_bank = bank_forks.read().unwrap().get(x).unwrap(); let bank = Bank::new_from_parent(previous_bank.clone(), &Pubkey::default(), x + 1); let vote = vote_transaction::new_vote_transaction( vec![x], @@ -527,20 +526,23 @@ mod tests { None, ); bank.process_transaction(&vote).unwrap(); - bank_forks.insert(bank); + bank_forks.write().unwrap().insert(bank); } - let working_bank = bank_forks.working_bank(); + let working_bank = bank_forks.read().unwrap().working_bank(); let root = get_vote_account_root_slot( validator_vote_keypairs.vote_keypair.pubkey(), &working_bank, ); for x in 0..root { - bank_forks.set_root(x, &AbsRequestSender::default(), None); + bank_forks + .write() + .unwrap() + .set_root(x, &AbsRequestSender::default(), None); } // Add an additional bank/vote that will root slot 2 - let bank33 = bank_forks.get(33).unwrap(); + let bank33 = bank_forks.read().unwrap().get(33).unwrap(); let bank34 = Bank::new_from_parent(bank33.clone(), &Pubkey::default(), 34); let vote33 = vote_transaction::new_vote_transaction( vec![33], @@ -552,9 +554,9 @@ mod tests { None, ); bank34.process_transaction(&vote33).unwrap(); - bank_forks.insert(bank34); + bank_forks.write().unwrap().insert(bank34); - let working_bank = bank_forks.working_bank(); + let working_bank = bank_forks.read().unwrap().working_bank(); let root = get_vote_account_root_slot( validator_vote_keypairs.vote_keypair.pubkey(), &working_bank, @@ -573,21 +575,22 @@ mod tests { .read() .unwrap() .highest_super_majority_root(); - bank_forks.set_root( + bank_forks.write().unwrap().set_root( root, &AbsRequestSender::default(), Some(highest_super_majority_root), ); - let highest_super_majority_root_bank = bank_forks.get(highest_super_majority_root); + let highest_super_majority_root_bank = + bank_forks.read().unwrap().get(highest_super_majority_root); assert!(highest_super_majority_root_bank.is_some()); // Add a forked bank. Because the vote for bank 33 landed in the non-ancestor, the vote // account's root (and thus the highest_super_majority_root) rolls back to slot 1 - let bank33 = bank_forks.get(33).unwrap(); + let bank33 = bank_forks.read().unwrap().get(33).unwrap(); let bank35 = Bank::new_from_parent(bank33, &Pubkey::default(), 35); - bank_forks.insert(bank35); + bank_forks.write().unwrap().insert(bank35); - let working_bank = bank_forks.working_bank(); + let working_bank = bank_forks.read().unwrap().working_bank(); let ancestors = working_bank.status_cache_ancestors(); let _ = AggregateCommitmentService::update_commitment_cache( &block_commitment_cache, @@ -602,13 +605,14 @@ mod tests { .read() .unwrap() .highest_super_majority_root(); - let highest_super_majority_root_bank = bank_forks.get(highest_super_majority_root); + let highest_super_majority_root_bank = + bank_forks.read().unwrap().get(highest_super_majority_root); assert!(highest_super_majority_root_bank.is_some()); // Add additional banks beyond lockout built on the new fork to ensure that behavior // continues normally for x in 35..=37 { - let previous_bank = bank_forks.get(x).unwrap(); + let previous_bank = bank_forks.read().unwrap().get(x).unwrap(); let bank = Bank::new_from_parent(previous_bank.clone(), &Pubkey::default(), x + 1); let vote = vote_transaction::new_vote_transaction( vec![x], @@ -620,10 +624,10 @@ mod tests { None, ); bank.process_transaction(&vote).unwrap(); - bank_forks.insert(bank); + bank_forks.write().unwrap().insert(bank); } - let working_bank = bank_forks.working_bank(); + let working_bank = bank_forks.read().unwrap().working_bank(); let root = get_vote_account_root_slot( validator_vote_keypairs.vote_keypair.pubkey(), &working_bank, @@ -642,12 +646,13 @@ mod tests { .read() .unwrap() .highest_super_majority_root(); - bank_forks.set_root( + bank_forks.write().unwrap().set_root( root, &AbsRequestSender::default(), Some(highest_super_majority_root), ); - let highest_super_majority_root_bank = bank_forks.get(highest_super_majority_root); + let highest_super_majority_root_bank = + bank_forks.read().unwrap().get(highest_super_majority_root); assert!(highest_super_majority_root_bank.is_some()); } } diff --git a/core/tests/snapshots.rs b/core/tests/snapshots.rs index e7156f435eea25..9a862138a228b6 100644 --- a/core/tests/snapshots.rs +++ b/core/tests/snapshots.rs @@ -221,12 +221,13 @@ fn run_bank_forks_snapshot_n( accounts_package_sender, }; for slot in 1..=last_slot { - let mut bank_forks_w = bank_forks.write().unwrap(); - let mut bank = - Bank::new_from_parent(bank_forks_w[slot - 1].clone(), &Pubkey::default(), slot); + let mut bank = Bank::new_from_parent( + bank_forks.read().unwrap().get(slot - 1).unwrap().clone(), + &Pubkey::default(), + slot, + ); f(&mut bank, mint_keypair); - let bank = bank_forks_w.insert(bank); - drop(bank_forks_w); + let bank = bank_forks.write().unwrap().insert(bank); // Set root to make sure we don't end up with too many account storage entries // and to allow snapshotting of bank and the purging logic on status_cache to // kick in @@ -352,7 +353,7 @@ fn test_concurrent_snapshot_packaging( DISABLED_SNAPSHOT_ARCHIVE_INTERVAL, ); - let mut bank_forks = snapshot_test_config.bank_forks.write().unwrap(); + let bank_forks = snapshot_test_config.bank_forks.clone(); let snapshot_config = &snapshot_test_config.snapshot_config; let bank_snapshots_dir = &snapshot_config.bank_snapshots_dir; let full_snapshot_archives_dir = &snapshot_config.full_snapshot_archives_dir; @@ -361,7 +362,7 @@ fn test_concurrent_snapshot_packaging( let genesis_config = &snapshot_test_config.genesis_config_info.genesis_config; // Take snapshot of zeroth bank - let bank0 = bank_forks.get(0).unwrap(); + let bank0 = bank_forks.read().unwrap().get(0).unwrap(); let storages = bank0.get_snapshot_storages(None); let slot_deltas = bank0.status_cache.read().unwrap().root_slot_deltas(); snapshot_bank_utils::add_bank_snapshot( @@ -394,7 +395,7 @@ fn test_concurrent_snapshot_packaging( for i in 0..MAX_BANK_SNAPSHOTS_TO_RETAIN + 2 { let parent_slot = i as Slot; let bank = Bank::new_from_parent( - bank_forks[parent_slot].clone(), + bank_forks.read().unwrap().get(parent_slot).unwrap().clone(), &Pubkey::default(), parent_slot + 1, ); @@ -438,10 +439,14 @@ fn test_concurrent_snapshot_packaging( ); accounts_package_sender.send(accounts_package).unwrap(); - bank_forks.insert(bank); + bank_forks.write().unwrap().insert(bank); if slot == saved_slot { // Find the relevant snapshot storages - let snapshot_storage_files: HashSet<_> = bank_forks[slot] + let snapshot_storage_files: HashSet<_> = bank_forks + .read() + .unwrap() + .get(slot) + .unwrap() .get_snapshot_storages(None) .into_iter() .map(|s| s.get_path()) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index a65593491b10d3..b6772ecd5735e5 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -53,6 +53,11 @@ pub enum BlockRelation { pub trait ForkGraph { /// Returns the BlockRelation of A to B fn relationship(&self, a: Slot, b: Slot) -> BlockRelation; + + /// Returns the epoch of the given slot + fn slot_epoch(&self, _slot: Slot) -> Option { + Some(0) + } } /// Provides information about current working slot, and its ancestors @@ -749,14 +754,29 @@ impl LoadedPrograms { let environments = self.get_environments_for_epoch(working_slot.current_epoch()); let mut missing = Vec::new(); let mut unloaded = Vec::new(); + let current_slot = working_slot.current_slot(); let found = keys .filter_map(|(key, (match_criteria, count))| { if let Some(second_level) = self.entries.get(&key) { for entry in second_level.iter().rev() { - let current_slot = working_slot.current_slot(); + let is_ancestor = if let Some(fork_graph) = &self.fork_graph { + fork_graph + .read() + .map(|fork_graph_r| { + matches!( + fork_graph_r + .relationship(entry.deployment_slot, current_slot), + BlockRelation::Ancestor + ) + }) + .unwrap_or(false) + } else { + working_slot.is_ancestor(entry.deployment_slot) + }; + if entry.deployment_slot <= self.latest_root_slot || entry.deployment_slot == current_slot - || working_slot.is_ancestor(entry.deployment_slot) + || is_ancestor { if current_slot >= entry.effective_slot { if !Self::is_entry_usable(entry, current_slot, &match_criteria) { @@ -808,7 +828,7 @@ impl LoadedPrograms { ExtractedPrograms { loaded: LoadedProgramsForTxBatch { entries: found, - slot: working_slot.current_slot(), + slot: current_slot, environments: environments.clone(), }, missing, @@ -1478,52 +1498,19 @@ mod tests { } } - struct TestWorkingSlot { - slot: Slot, - fork: Vec, - slot_pos: usize, - } - - impl TestWorkingSlot { - fn new(slot: Slot, fork: &[Slot]) -> Self { - let mut fork = fork.to_vec(); - fork.sort(); - let slot_pos = fork - .iter() - .position(|current| *current == slot) - .expect("The fork didn't have the slot in it"); - TestWorkingSlot { - slot, - fork, - slot_pos, - } - } - - fn update_slot(&mut self, slot: Slot) { - self.slot = slot; - self.slot_pos = self - .fork - .iter() - .position(|current| *current == slot) - .expect("The fork didn't have the slot in it"); - } - } + struct TestWorkingSlot(pub Slot); impl WorkingSlot for TestWorkingSlot { fn current_slot(&self) -> Slot { - self.slot + self.0 } fn current_epoch(&self) -> Epoch { 0 } - fn is_ancestor(&self, other: Slot) -> bool { - self.fork - .iter() - .position(|current| *current == other) - .map(|other_pos| other_pos < self.slot_pos) - .unwrap_or(false) + fn is_ancestor(&self, _other: Slot) -> bool { + false } } @@ -1561,7 +1548,7 @@ mod tests { let mut fork_graph = TestForkGraphSpecific::default(); fork_graph.insert_fork(&[0, 10, 20, 22]); - fork_graph.insert_fork(&[0, 5, 11, 15, 16, 19, 21, 23]); + fork_graph.insert_fork(&[0, 5, 11, 15, 16, 18, 19, 21, 23]); fork_graph.insert_fork(&[0, 5, 11, 25, 27]); let fork_graph = Arc::new(RwLock::new(fork_graph)); @@ -1618,13 +1605,12 @@ mod tests { // 23 // Testing fork 0 - 10 - 12 - 22 with current slot at 22 - let working_slot = TestWorkingSlot::new(22, &[0, 10, 20, 22]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(22), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 2)), @@ -1641,14 +1627,13 @@ mod tests { assert!(missing.contains(&(program3, 3))); assert!(unloaded.is_empty()); - // Testing fork 0 - 5 - 11 - 15 - 16 with current slot at 16 - let mut working_slot = TestWorkingSlot::new(15, &[0, 5, 11, 15, 16, 18, 19, 23]); + // Testing fork 0 - 5 - 11 - 15 - 16 with current slot at 15 let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(15), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1671,13 +1656,12 @@ mod tests { assert!(unloaded.is_empty()); // Testing the same fork above, but current slot is now 18 (equal to effective slot of program4). - working_slot.update_slot(18); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(18), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1697,13 +1681,12 @@ mod tests { assert!(unloaded.is_empty()); // Testing the same fork above, but current slot is now 23 (future slot than effective slot of program4). - working_slot.update_slot(23); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(23), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1723,13 +1706,12 @@ mod tests { assert!(unloaded.is_empty()); // Testing fork 0 - 5 - 11 - 15 - 16 with current slot at 11 - let working_slot = TestWorkingSlot::new(11, &[0, 5, 11, 15, 16]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(11), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1762,13 +1744,12 @@ mod tests { assert!(!cache.replenish(program4, test_program).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let working_slot = TestWorkingSlot::new(19, &[0, 5, 11, 15, 16, 18, 19, 21, 23]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(19), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1788,13 +1769,12 @@ mod tests { // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 21 // This would cause program4 deployed at slot 19 to be expired. - let working_slot = TestWorkingSlot::new(21, &[0, 5, 11, 15, 16, 18, 19, 21, 23]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(21), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1833,14 +1813,13 @@ mod tests { // | // 23 - // Testing fork 11 - 15 - 16- 19 - 22 with root at 5 and current slot at 22 - let working_slot = TestWorkingSlot::new(22, &[5, 11, 15, 16, 19, 22, 23]); + // Testing fork 11 - 15 - 16- 19 - 22 with root at 5 and current slot at 21 let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(21), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1851,21 +1830,20 @@ mod tests { ); // Since the fork was pruned, we should not find the entry deployed at slot 20. - assert!(match_slot(&found, &program1, 0, 22)); - assert!(match_slot(&found, &program2, 11, 22)); - assert!(match_slot(&found, &program4, 15, 22)); + assert!(match_slot(&found, &program1, 0, 21)); + assert!(match_slot(&found, &program2, 11, 21)); + assert!(match_slot(&found, &program4, 15, 21)); assert!(missing.contains(&(program3, 1))); assert!(unloaded.is_empty()); // Testing fork 0 - 5 - 11 - 25 - 27 with current slot at 27 - let working_slot = TestWorkingSlot::new(27, &[11, 25, 27]); let ExtractedPrograms { loaded: found, missing: _, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(27), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1899,13 +1877,12 @@ mod tests { // 23 // Testing fork 16, 19, 23, with root at 15, current slot at 23 - let working_slot = TestWorkingSlot::new(23, &[16, 19, 23]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(23), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1945,7 +1922,7 @@ mod tests { let mut fork_graph = TestForkGraphSpecific::default(); fork_graph.insert_fork(&[0, 10, 20, 22]); - fork_graph.insert_fork(&[0, 5, 11, 15, 16, 19, 21, 23]); + fork_graph.insert_fork(&[0, 5, 11, 12, 15, 16, 18, 19, 21, 23]); fork_graph.insert_fork(&[0, 5, 11, 25, 27]); let fork_graph = Arc::new(RwLock::new(fork_graph)); @@ -1963,13 +1940,12 @@ mod tests { assert!(!cache.replenish(program3, new_test_loaded_program(25, 26)).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let working_slot = TestWorkingSlot::new(12, &[0, 5, 11, 12, 15, 16, 18, 19, 21, 23]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(12), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1990,7 +1966,7 @@ mod tests { missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(12), vec![ ( program1, @@ -2068,13 +2044,12 @@ mod tests { ); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let working_slot = TestWorkingSlot::new(19, &[0, 5, 11, 12, 15, 16, 18, 19, 21, 23]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(19), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2090,13 +2065,12 @@ mod tests { assert!(unloaded.is_empty()); // Testing fork 0 - 5 - 11 - 25 - 27 with current slot at 27 - let working_slot = TestWorkingSlot::new(27, &[0, 5, 11, 25, 27]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(27), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2112,13 +2086,12 @@ mod tests { assert!(missing.is_empty()); // Testing fork 0 - 10 - 20 - 22 with current slot at 22 - let working_slot = TestWorkingSlot::new(22, &[0, 10, 20, 22]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(22), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2154,7 +2127,7 @@ mod tests { let mut fork_graph = TestForkGraphSpecific::default(); fork_graph.insert_fork(&[0, 10, 20, 22]); - fork_graph.insert_fork(&[0, 5, 11, 15, 16, 19, 21, 23]); + fork_graph.insert_fork(&[0, 5, 11, 12, 15, 16, 18, 19, 21, 23]); fork_graph.insert_fork(&[0, 5, 11, 25, 27]); let fork_graph = Arc::new(RwLock::new(fork_graph)); cache.set_fork_graph(fork_graph); @@ -2183,13 +2156,12 @@ mod tests { assert!(!cache.replenish(program1, test_program).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let working_slot = TestWorkingSlot::new(12, &[0, 5, 11, 12, 15, 16, 18, 19, 21, 23]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(12), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2207,13 +2179,12 @@ mod tests { // Testing fork 0 - 5 - 11 - 12 - 15 - 16 - 19 - 21 - 23 with current slot at 15 // This would cause program4 deployed at slot 15 to be expired. - let working_slot = TestWorkingSlot::new(15, &[0, 5, 11, 15, 16, 18, 19, 21, 23]); let ExtractedPrograms { loaded: found, missing, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(15), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2280,13 +2251,12 @@ mod tests { cache.prune(10, 0); - let working_slot = TestWorkingSlot::new(20, &[0, 10, 20]); let ExtractedPrograms { loaded: found, missing: _, unloaded, } = cache.extract( - &working_slot, + &TestWorkingSlot(20), vec![(program1, (LoadedProgramMatchCriteria::NoCriteria, 1))].into_iter(), ); assert!(unloaded.is_empty()); @@ -2318,7 +2288,7 @@ mod tests { // deployed at slot 0. let mut fork_graph = TestForkGraphSpecific::default(); fork_graph.insert_fork(&[0, 10, 20]); - fork_graph.insert_fork(&[0, 5]); + fork_graph.insert_fork(&[0, 5, 6]); let fork_graph = Arc::new(RwLock::new(fork_graph)); cache.set_fork_graph(fork_graph); @@ -2329,13 +2299,12 @@ mod tests { let program2 = Pubkey::new_unique(); assert!(!cache.replenish(program2, new_test_loaded_program(10, 11)).0); - let working_slot = TestWorkingSlot::new(20, &[0, 10, 20]); let ExtractedPrograms { loaded: found, missing: _, unloaded: _, } = cache.extract( - &working_slot, + &TestWorkingSlot(20), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2346,13 +2315,12 @@ mod tests { assert!(match_slot(&found, &program1, 0, 20)); assert!(match_slot(&found, &program2, 10, 20)); - let working_slot = TestWorkingSlot::new(6, &[0, 5, 6]); let ExtractedPrograms { loaded: found, missing, unloaded: _, } = cache.extract( - &working_slot, + &TestWorkingSlot(6), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2367,13 +2335,12 @@ mod tests { // On fork chaining from slot 5, the entry deployed at slot 0 will become visible. cache.prune_by_deployment_slot(5); - let working_slot = TestWorkingSlot::new(20, &[0, 10, 20]); let ExtractedPrograms { loaded: found, missing: _, unloaded: _, } = cache.extract( - &working_slot, + &TestWorkingSlot(20), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2384,13 +2351,12 @@ mod tests { assert!(match_slot(&found, &program1, 0, 20)); assert!(match_slot(&found, &program2, 10, 20)); - let working_slot = TestWorkingSlot::new(6, &[0, 5, 6]); let ExtractedPrograms { loaded: found, missing, unloaded: _, } = cache.extract( - &working_slot, + &TestWorkingSlot(6), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2405,13 +2371,12 @@ mod tests { // As there is no other entry for program2, extract() will return it as missing. cache.prune_by_deployment_slot(10); - let working_slot = TestWorkingSlot::new(20, &[0, 10, 20]); let ExtractedPrograms { loaded: found, missing: _, unloaded: _, } = cache.extract( - &working_slot, + &TestWorkingSlot(20), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), diff --git a/rpc/src/rpc_pubsub.rs b/rpc/src/rpc_pubsub.rs index 6bb6fd7854642c..19244415bd61ac 100644 --- a/rpc/src/rpc_pubsub.rs +++ b/rpc/src/rpc_pubsub.rs @@ -659,7 +659,7 @@ mod tests { current_slot: Slot, ) -> transaction::Result<()> { bank_forks - .write() + .read() .unwrap() .get(current_slot) .unwrap() @@ -1166,7 +1166,7 @@ mod tests { let tx = system_transaction::transfer(&alice, &bob.pubkey(), 100, blockhash); bank_forks - .write() + .read() .unwrap() .get(1) .unwrap() @@ -1221,7 +1221,7 @@ mod tests { let tx = system_transaction::transfer(&alice, &bob.pubkey(), 100, blockhash); bank_forks - .write() + .read() .unwrap() .get(1) .unwrap() diff --git a/rpc/src/rpc_subscriptions.rs b/rpc/src/rpc_subscriptions.rs index 4b01e078f78a76..04f551bfe0b9ff 100644 --- a/rpc/src/rpc_subscriptions.rs +++ b/rpc/src/rpc_subscriptions.rs @@ -1837,7 +1837,7 @@ pub(crate) mod tests { &stake::program::id(), ); bank_forks - .write() + .read() .unwrap() .get(0) .unwrap() @@ -2435,8 +2435,7 @@ pub(crate) mod tests { } = create_genesis_config(100); let bank = Bank::new_for_tests(&genesis_config); let blockhash = bank.last_blockhash(); - let bank_forks_arc = BankForks::new_rw_arc(bank); - let mut bank_forks = bank_forks_arc.write().unwrap(); + let bank_forks = BankForks::new_rw_arc(bank); let alice = Keypair::new(); let past_bank_tx = @@ -2447,24 +2446,28 @@ pub(crate) mod tests { system_transaction::transfer(&mint_keypair, &alice.pubkey(), 3, blockhash); bank_forks + .read() + .unwrap() .get(0) .unwrap() .process_transaction(&past_bank_tx) .unwrap(); let next_bank = Bank::new_from_parent( - bank_forks.get(0).unwrap(), + bank_forks.read().unwrap().get(0).unwrap(), &solana_sdk::pubkey::new_rand(), 1, ); - bank_forks.insert(next_bank); + bank_forks.write().unwrap().insert(next_bank); bank_forks + .read() + .unwrap() .get(1) .unwrap() .process_transaction(&processed_tx) .unwrap(); - let bank1 = bank_forks[1].clone(); + let bank1 = bank_forks.read().unwrap().get(1).unwrap().clone(); let mut cache0 = BlockCommitment::default(); cache0.increase_confirmation_stake(1, 10); @@ -2482,19 +2485,16 @@ pub(crate) mod tests { }, ); - // Drop the write locked bank_forks - drop(bank_forks); - let exit = Arc::new(AtomicBool::new(false)); let optimistically_confirmed_bank = - OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks_arc); + OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks); let max_complete_transaction_status_slot = Arc::new(AtomicU64::default()); let max_complete_rewards_slot = Arc::new(AtomicU64::default()); let subscriptions = Arc::new(RpcSubscriptions::new_for_tests( exit, max_complete_transaction_status_slot, max_complete_rewards_slot, - bank_forks_arc, + bank_forks, Arc::new(RwLock::new(block_commitment_cache)), optimistically_confirmed_bank, )); @@ -2817,7 +2817,7 @@ pub(crate) mod tests { // Add the same transaction to the unfrozen 2nd bank bank_forks - .write() + .read() .unwrap() .get(2) .unwrap() diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index d4993942ea2705..7b83e46c36de39 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -943,7 +943,6 @@ impl WorkingSlot for Bank { self.ancestors.contains_key(&other) } } - #[derive(Debug, Default)] /// result of calculating the stake rewards at end of epoch struct StakeRewardCalculation { diff --git a/runtime/src/bank_forks.rs b/runtime/src/bank_forks.rs index 631afb536c0756..58e255a991da1e 100644 --- a/runtime/src/bank_forks.rs +++ b/runtime/src/bank_forks.rs @@ -8,8 +8,13 @@ use { }, log::*, solana_measure::measure::Measure, - solana_program_runtime::loaded_programs::{BlockRelation, ForkGraph, WorkingSlot}, - solana_sdk::{clock::Slot, feature_set, hash::Hash, timing}, + solana_program_runtime::loaded_programs::{BlockRelation, ForkGraph}, + solana_sdk::{ + clock::{Epoch, Slot}, + feature_set, + hash::Hash, + timing, + }, std::{ collections::{hash_map::Entry, HashMap, HashSet}, ops::Index, @@ -663,9 +668,11 @@ impl ForkGraph for BankForks { (a == b) .then_some(BlockRelation::Equal) .or_else(|| { - self.banks - .get(&b) - .and_then(|bank| bank.is_ancestor(a).then_some(BlockRelation::Ancestor)) + self.banks.get(&b).and_then(|bank| { + bank.ancestors + .contains_key(&a) + .then_some(BlockRelation::Ancestor) + }) }) .or_else(|| { self.descendants.get(&b).and_then(|slots| { @@ -676,6 +683,10 @@ impl ForkGraph for BankForks { }) .unwrap_or(BlockRelation::Unknown) } + + fn slot_epoch(&self, slot: Slot) -> Option { + self.banks.get(&slot).map(|bank| bank.epoch()) + } } #[cfg(test)] From 5fa23d9a56031bb9034d1f553f06a514c9d08415 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 22:15:45 +0000 Subject: [PATCH 052/213] v1.17: adds metrics to repair QUIC endpoint (backport of #33818) (#33868) adds metrics to repair QUIC endpoint (#33818) (cherry picked from commit e555a61c78e92e40eae9e883e5c72149b9ccfef5) Co-authored-by: behzad nouri --- core/src/repair/quic_endpoint.rs | 332 +++++++++++++++++++++++++++++-- 1 file changed, 311 insertions(+), 21 deletions(-) diff --git a/core/src/repair/quic_endpoint.rs b/core/src/repair/quic_endpoint.rs index 031de37f94b5a0..2c5e954a626c74 100644 --- a/core/src/repair/quic_endpoint.rs +++ b/core/src/repair/quic_endpoint.rs @@ -6,8 +6,8 @@ use { log::error, quinn::{ ClientConfig, ConnectError, Connecting, Connection, ConnectionError, Endpoint, - EndpointConfig, ReadToEndError, RecvStream, SendStream, ServerConfig, TokioRuntime, - TransportConfig, VarInt, WriteError, + EndpointConfig, ReadError, ReadToEndError, RecvStream, SendStream, ServerConfig, + TokioRuntime, TransportConfig, VarInt, WriteError, }, rcgen::RcgenError, rustls::{Certificate, PrivateKey}, @@ -24,7 +24,7 @@ use { io::{Cursor, Error as IoError}, net::{IpAddr, SocketAddr, UdpSocket}, sync::{ - atomic::{AtomicBool, Ordering}, + atomic::{AtomicBool, AtomicU64, Ordering}, Arc, RwLock, }, time::Duration, @@ -82,16 +82,14 @@ pub struct RemoteRequest { #[derive(Error, Debug)] #[allow(clippy::enum_variant_names)] pub(crate) enum Error { - #[error(transparent)] - BincodeError(#[from] bincode::Error), #[error(transparent)] CertificateError(#[from] RcgenError), + #[error("Channel Send Error")] + ChannelSendError, #[error(transparent)] ConnectError(#[from] ConnectError), #[error(transparent)] ConnectionError(#[from] ConnectionError), - #[error("Channel Send Error")] - ChannelSendError, #[error("Invalid Identity: {0:?}")] InvalidIdentity(SocketAddr), #[error(transparent)] @@ -103,9 +101,15 @@ pub(crate) enum Error { #[error("read_to_end Timeout")] ReadToEndTimeout, #[error(transparent)] - WriteError(#[from] WriteError), - #[error(transparent)] TlsError(#[from] rustls::Error), + #[error(transparent)] + WriteError(#[from] WriteError), +} + +macro_rules! add_metric { + ($metric: expr) => {{ + $metric.fetch_add(1, Ordering::Relaxed); + }}; } #[allow(clippy::type_complexity)] @@ -207,8 +211,11 @@ async fn run_server( router: Arc>>>, cache: Arc>>, ) { + let stats = Arc::::default(); + let report_metrics_task = + tokio::task::spawn(report_metrics_task("repair_quic_server", stats.clone())); while let Some(connecting) = endpoint.accept().await { - tokio::task::spawn(handle_connecting_error( + tokio::task::spawn(handle_connecting_task( endpoint.clone(), connecting, remote_request_sender.clone(), @@ -216,8 +223,10 @@ async fn run_server( prune_cache_pending.clone(), router.clone(), cache.clone(), + stats.clone(), )); } + report_metrics_task.abort(); } async fn run_client( @@ -229,14 +238,17 @@ async fn run_client( router: Arc>>>, cache: Arc>>, ) { + let stats = Arc::::default(); + let report_metrics_task = + tokio::task::spawn(report_metrics_task("repair_quic_client", stats.clone())); while let Some(request) = receiver.recv().await { - let Some(request) = try_route_request(request, &*router.read().await) else { + let Some(request) = try_route_request(request, &*router.read().await, &stats) else { continue; }; let remote_address = request.remote_address; let receiver = { let mut router = router.write().await; - let Some(request) = try_route_request(request, &router) else { + let Some(request) = try_route_request(request, &router, &stats) else { continue; }; let (sender, receiver) = tokio::sync::mpsc::channel(ROUTER_CHANNEL_BUFFER); @@ -253,11 +265,13 @@ async fn run_client( prune_cache_pending.clone(), router.clone(), cache.clone(), + stats.clone(), )); } close_quic_endpoint(&endpoint); // Drop sender channels to unblock threads waiting on the receiving end. router.write().await.clear(); + report_metrics_task.abort(); } // Routes the local request to respective channel. Drops the request if the @@ -266,13 +280,15 @@ async fn run_client( fn try_route_request( request: LocalRequest, router: &HashMap>, + stats: &RepairQuicStats, ) -> Option { match router.get(&request.remote_address) { None => Some(request), Some(sender) => match sender.try_send(request) { Ok(()) => None, Err(TrySendError::Full(request)) => { - error!("TrySendError::Full {}", request.remote_address); + debug!("TrySendError::Full {}", request.remote_address); + add_metric!(stats.router_try_send_error_full); None } Err(TrySendError::Closed(request)) => Some(request), @@ -280,7 +296,7 @@ fn try_route_request( } } -async fn handle_connecting_error( +async fn handle_connecting_task( endpoint: Endpoint, connecting: Connecting, remote_request_sender: Sender, @@ -288,6 +304,7 @@ async fn handle_connecting_error( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) { if let Err(err) = handle_connecting( endpoint, @@ -297,10 +314,12 @@ async fn handle_connecting_error( prune_cache_pending, router, cache, + stats.clone(), ) .await { - error!("handle_connecting: {err:?}"); + debug!("handle_connecting: {err:?}"); + record_error(&err, &stats); } } @@ -312,6 +331,7 @@ async fn handle_connecting( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) -> Result<(), Error> { let connection = connecting.await?; let remote_address = connection.remote_address(); @@ -332,6 +352,7 @@ async fn handle_connecting( prune_cache_pending, router, cache, + stats, ) .await; Ok(()) @@ -349,6 +370,7 @@ async fn handle_connection( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) { cache_connection( remote_pubkey, @@ -361,8 +383,10 @@ async fn handle_connection( .await; let send_requests_task = tokio::task::spawn(send_requests_task( endpoint.clone(), + remote_address, connection.clone(), receiver, + stats.clone(), )); let recv_requests_task = tokio::task::spawn(recv_requests_task( endpoint, @@ -370,11 +394,13 @@ async fn handle_connection( remote_pubkey, connection.clone(), remote_request_sender, + stats.clone(), )); match futures::future::try_join(send_requests_task, recv_requests_task).await { Err(err) => error!("handle_connection: {remote_pubkey}, {remote_address}, {err:?}"), - Ok(((), Err(ref err))) => { - error!("recv_requests_task: {remote_pubkey}, {remote_address}, {err:?}"); + Ok(((), Err(err))) => { + debug!("recv_requests_task: {remote_pubkey}, {remote_address}, {err:?}"); + record_error(&err, &stats); } Ok(((), Ok(()))) => (), } @@ -392,6 +418,7 @@ async fn recv_requests_task( remote_pubkey: Pubkey, connection: Connection, remote_request_sender: Sender, + stats: Arc, ) -> Result<(), Error> { loop { let (send_stream, recv_stream) = connection.accept_bi().await?; @@ -402,6 +429,7 @@ async fn recv_requests_task( send_stream, recv_stream, remote_request_sender.clone(), + stats.clone(), )); } } @@ -413,6 +441,7 @@ async fn handle_streams_task( send_stream: SendStream, recv_stream: RecvStream, remote_request_sender: Sender, + stats: Arc, ) { if let Err(err) = handle_streams( &endpoint, @@ -424,7 +453,8 @@ async fn handle_streams_task( ) .await { - error!("handle_stream: {remote_address}, {remote_pubkey}, {err:?}"); + debug!("handle_stream: {remote_address}, {remote_pubkey}, {err:?}"); + record_error(&err, &stats); } } @@ -469,21 +499,32 @@ async fn handle_streams( async fn send_requests_task( endpoint: Endpoint, + remote_address: SocketAddr, connection: Connection, mut receiver: AsyncReceiver, + stats: Arc, ) { while let Some(request) = receiver.recv().await { tokio::task::spawn(send_request_task( endpoint.clone(), + remote_address, connection.clone(), request, + stats.clone(), )); } } -async fn send_request_task(endpoint: Endpoint, connection: Connection, request: LocalRequest) { +async fn send_request_task( + endpoint: Endpoint, + remote_address: SocketAddr, + connection: Connection, + request: LocalRequest, + stats: Arc, +) { if let Err(err) = send_request(endpoint, connection, request).await { - error!("send_request: {err:?}") + debug!("send_request: {remote_address}, {err:?}"); + record_error(&err, &stats); } } @@ -542,6 +583,7 @@ async fn make_connection_task( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) { if let Err(err) = make_connection( endpoint, @@ -552,10 +594,12 @@ async fn make_connection_task( prune_cache_pending, router, cache, + stats.clone(), ) .await { - error!("make_connection: {remote_address}, {err:?}"); + debug!("make_connection: {remote_address}, {err:?}"); + record_error(&err, &stats); } } @@ -568,6 +612,7 @@ async fn make_connection( prune_cache_pending: Arc, router: Arc>>>, cache: Arc>>, + stats: Arc, ) -> Result<(), Error> { let connection = endpoint .connect(remote_address, CONNECT_SERVER_NAME)? @@ -583,6 +628,7 @@ async fn make_connection( prune_cache_pending, router, cache, + stats, ) .await; Ok(()) @@ -698,6 +744,250 @@ impl From> for Error { } } +#[derive(Default)] +struct RepairQuicStats { + connect_error_invalid_remote_address: AtomicU64, + connect_error_other: AtomicU64, + connect_error_too_many_connections: AtomicU64, + connection_error_application_closed: AtomicU64, + connection_error_connection_closed: AtomicU64, + connection_error_locally_closed: AtomicU64, + connection_error_reset: AtomicU64, + connection_error_timed_out: AtomicU64, + connection_error_transport_error: AtomicU64, + connection_error_version_mismatch: AtomicU64, + invalid_identity: AtomicU64, + no_response_received: AtomicU64, + read_to_end_error_connection_lost: AtomicU64, + read_to_end_error_illegal_ordered_read: AtomicU64, + read_to_end_error_reset: AtomicU64, + read_to_end_error_too_long: AtomicU64, + read_to_end_error_unknown_stream: AtomicU64, + read_to_end_error_zero_rtt_rejected: AtomicU64, + read_to_end_timeout: AtomicU64, + router_try_send_error_full: AtomicU64, + write_error_connection_lost: AtomicU64, + write_error_stopped: AtomicU64, + write_error_unknown_stream: AtomicU64, + write_error_zero_rtt_rejected: AtomicU64, +} + +async fn report_metrics_task(name: &'static str, stats: Arc) { + const METRICS_SUBMIT_CADENCE: Duration = Duration::from_secs(2); + loop { + tokio::time::sleep(METRICS_SUBMIT_CADENCE).await; + report_metrics(name, &stats); + } +} + +fn record_error(err: &Error, stats: &RepairQuicStats) { + match err { + Error::CertificateError(_) => (), + Error::ChannelSendError => (), + Error::ConnectError(ConnectError::EndpointStopping) => { + add_metric!(stats.connect_error_other) + } + Error::ConnectError(ConnectError::TooManyConnections) => { + add_metric!(stats.connect_error_too_many_connections) + } + Error::ConnectError(ConnectError::InvalidDnsName(_)) => { + add_metric!(stats.connect_error_other) + } + Error::ConnectError(ConnectError::InvalidRemoteAddress(_)) => { + add_metric!(stats.connect_error_invalid_remote_address) + } + Error::ConnectError(ConnectError::NoDefaultClientConfig) => { + add_metric!(stats.connect_error_other) + } + Error::ConnectError(ConnectError::UnsupportedVersion) => { + add_metric!(stats.connect_error_other) + } + Error::ConnectionError(ConnectionError::VersionMismatch) => { + add_metric!(stats.connection_error_version_mismatch) + } + Error::ConnectionError(ConnectionError::TransportError(_)) => { + add_metric!(stats.connection_error_transport_error) + } + Error::ConnectionError(ConnectionError::ConnectionClosed(_)) => { + add_metric!(stats.connection_error_connection_closed) + } + Error::ConnectionError(ConnectionError::ApplicationClosed(_)) => { + add_metric!(stats.connection_error_application_closed) + } + Error::ConnectionError(ConnectionError::Reset) => add_metric!(stats.connection_error_reset), + Error::ConnectionError(ConnectionError::TimedOut) => { + add_metric!(stats.connection_error_timed_out) + } + Error::ConnectionError(ConnectionError::LocallyClosed) => { + add_metric!(stats.connection_error_locally_closed) + } + Error::InvalidIdentity(_) => add_metric!(stats.invalid_identity), + Error::IoError(_) => (), + Error::NoResponseReceived => add_metric!(stats.no_response_received), + Error::ReadToEndError(ReadToEndError::Read(ReadError::Reset(_))) => { + add_metric!(stats.read_to_end_error_reset) + } + Error::ReadToEndError(ReadToEndError::Read(ReadError::ConnectionLost(_))) => { + add_metric!(stats.read_to_end_error_connection_lost) + } + Error::ReadToEndError(ReadToEndError::Read(ReadError::UnknownStream)) => { + add_metric!(stats.read_to_end_error_unknown_stream) + } + Error::ReadToEndError(ReadToEndError::Read(ReadError::IllegalOrderedRead)) => { + add_metric!(stats.read_to_end_error_illegal_ordered_read) + } + Error::ReadToEndError(ReadToEndError::Read(ReadError::ZeroRttRejected)) => { + add_metric!(stats.read_to_end_error_zero_rtt_rejected) + } + Error::ReadToEndError(ReadToEndError::TooLong) => { + add_metric!(stats.read_to_end_error_too_long) + } + Error::ReadToEndTimeout => add_metric!(stats.read_to_end_timeout), + Error::TlsError(_) => (), + Error::WriteError(WriteError::Stopped(_)) => add_metric!(stats.write_error_stopped), + Error::WriteError(WriteError::ConnectionLost(_)) => { + add_metric!(stats.write_error_connection_lost) + } + Error::WriteError(WriteError::UnknownStream) => { + add_metric!(stats.write_error_unknown_stream) + } + Error::WriteError(WriteError::ZeroRttRejected) => { + add_metric!(stats.write_error_zero_rtt_rejected) + } + } +} + +fn report_metrics(name: &'static str, stats: &RepairQuicStats) { + macro_rules! reset_metric { + ($metric: expr) => { + $metric.swap(0, Ordering::Relaxed) + }; + } + datapoint_info!( + name, + ( + "connect_error_invalid_remote_address", + reset_metric!(stats.connect_error_invalid_remote_address), + i64 + ), + ( + "connect_error_other", + reset_metric!(stats.connect_error_other), + i64 + ), + ( + "connect_error_too_many_connections", + reset_metric!(stats.connect_error_too_many_connections), + i64 + ), + ( + "connection_error_application_closed", + reset_metric!(stats.connection_error_application_closed), + i64 + ), + ( + "connection_error_connection_closed", + reset_metric!(stats.connection_error_connection_closed), + i64 + ), + ( + "connection_error_locally_closed", + reset_metric!(stats.connection_error_locally_closed), + i64 + ), + ( + "connection_error_reset", + reset_metric!(stats.connection_error_reset), + i64 + ), + ( + "connection_error_timed_out", + reset_metric!(stats.connection_error_timed_out), + i64 + ), + ( + "connection_error_transport_error", + reset_metric!(stats.connection_error_transport_error), + i64 + ), + ( + "connection_error_version_mismatch", + reset_metric!(stats.connection_error_version_mismatch), + i64 + ), + ( + "invalid_identity", + reset_metric!(stats.invalid_identity), + i64 + ), + ( + "no_response_received", + reset_metric!(stats.no_response_received), + i64 + ), + ( + "read_to_end_error_connection_lost", + reset_metric!(stats.read_to_end_error_connection_lost), + i64 + ), + ( + "read_to_end_error_illegal_ordered_read", + reset_metric!(stats.read_to_end_error_illegal_ordered_read), + i64 + ), + ( + "read_to_end_error_reset", + reset_metric!(stats.read_to_end_error_reset), + i64 + ), + ( + "read_to_end_error_too_long", + reset_metric!(stats.read_to_end_error_too_long), + i64 + ), + ( + "read_to_end_error_unknown_stream", + reset_metric!(stats.read_to_end_error_unknown_stream), + i64 + ), + ( + "read_to_end_error_zero_rtt_rejected", + reset_metric!(stats.read_to_end_error_zero_rtt_rejected), + i64 + ), + ( + "read_to_end_timeout", + reset_metric!(stats.read_to_end_timeout), + i64 + ), + ( + "router_try_send_error_full", + reset_metric!(stats.router_try_send_error_full), + i64 + ), + ( + "write_error_connection_lost", + reset_metric!(stats.write_error_connection_lost), + i64 + ), + ( + "write_error_stopped", + reset_metric!(stats.write_error_stopped), + i64 + ), + ( + "write_error_unknown_stream", + reset_metric!(stats.write_error_unknown_stream), + i64 + ), + ( + "write_error_zero_rtt_rejected", + reset_metric!(stats.write_error_zero_rtt_rejected), + i64 + ), + ); +} + #[cfg(test)] mod tests { use { From 84d5fff048dbb8dab47c901d4fac61ecf043a7c6 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 26 Oct 2023 20:11:29 +0200 Subject: [PATCH 053/213] v1.17: Update upload_confirmed_blocks() return value when no blocks to upload (backport of #33861) (#33882) --- ledger/src/bigtable_upload.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/src/bigtable_upload.rs b/ledger/src/bigtable_upload.rs index 3db5f8eebbe863..be28ee8a0703d8 100644 --- a/ledger/src/bigtable_upload.rs +++ b/ledger/src/bigtable_upload.rs @@ -138,7 +138,7 @@ pub async fn upload_confirmed_blocks( "No blocks between {} and {} need to be uploaded to bigtable", starting_slot, ending_slot ); - return Ok(last_blockstore_slot); + return Ok(ending_slot); } let last_slot = *blocks_to_upload.last().unwrap(); info!( From 42fcac81ae99f38cb9cea4348e8a71cbe2442e46 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:16:53 -0600 Subject: [PATCH 054/213] v1.17: BigtableUploadService: increment start_slot to prevent rechecks (backport of #33870) (#33886) BigtableUploadService: increment start_slot to prevent rechecks (#33870) Increment start_slot (cherry picked from commit 22503f0ae9f9de9071f05d9049d3de1bf9c88dff) Co-authored-by: Tyera --- ledger/src/bigtable_upload_service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/src/bigtable_upload_service.rs b/ledger/src/bigtable_upload_service.rs index 3149eb96a32d8e..0ffb02aac2475c 100644 --- a/ledger/src/bigtable_upload_service.rs +++ b/ledger/src/bigtable_upload_service.rs @@ -117,7 +117,7 @@ impl BigTableUploadService { )); match result { - Ok(last_slot_uploaded) => start_slot = last_slot_uploaded, + Ok(last_slot_uploaded) => start_slot = last_slot_uploaded.saturating_add(1), Err(err) => { warn!("bigtable: upload_confirmed_blocks: {}", err); std::thread::sleep(std::time::Duration::from_secs(2)); From ed4dcf9d1eb2b1b4e4d8db2c2afca57714fbe5e3 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 27 Oct 2023 17:23:57 +0000 Subject: [PATCH 055/213] v1.17: ci: fixed sccache version for sccache-action (backport of #33904) (#33907) ci: fixed sccache version for sccache-action (#33904) (cherry picked from commit 1ce91a56a5db16b15d2f6c6db4963d587cac5150) Co-authored-by: Yihau Chen --- .github/workflows/downstream-project-spl.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/downstream-project-spl.yml b/.github/workflows/downstream-project-spl.yml index f0ecfb20accb4e..6afd398f43accb 100644 --- a/.github/workflows/downstream-project-spl.yml +++ b/.github/workflows/downstream-project-spl.yml @@ -43,6 +43,8 @@ jobs: .github/scripts/purge-ubuntu-runner.sh - uses: mozilla-actions/sccache-action@v0.0.3 + with: + version: "v0.5.4" - shell: bash run: | @@ -90,6 +92,8 @@ jobs: .github/scripts/purge-ubuntu-runner.sh - uses: mozilla-actions/sccache-action@v0.0.3 + with: + version: "v0.5.4" - shell: bash run: | @@ -139,6 +143,8 @@ jobs: .github/scripts/purge-ubuntu-runner.sh - uses: mozilla-actions/sccache-action@v0.0.3 + with: + version: "v0.5.4" - shell: bash run: | From ae7d7427beb25caa9c6c4b38cb6d0fdf8415297d Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 28 Oct 2023 00:24:31 +0200 Subject: [PATCH 056/213] v1.17: revert programify feature gate (backport of #33897) (#33905) revert programify feature gate (#33897) (cherry picked from commit ecd674bd92be2ed86550649b21077fed6e5fdcf2) Co-authored-by: Joe C --- runtime/src/bank.rs | 56 ++- runtime/src/bank/replace_account.rs | 191 ---------- runtime/src/bank/tests.rs | 417 ++------------------- runtime/src/inline_feature_gate_program.rs | 5 - runtime/src/lib.rs | 1 - sdk/src/feature_set.rs | 5 - 6 files changed, 62 insertions(+), 613 deletions(-) delete mode 100644 runtime/src/bank/replace_account.rs delete mode 100644 runtime/src/inline_feature_gate_program.rs diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 7b83e46c36de39..8412dbb1cbb334 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -43,7 +43,6 @@ use { builtins::{BuiltinPrototype, BUILTINS}, epoch_rewards_hasher::hash_rewards_into_partitions, epoch_stakes::{EpochStakes, NodeVoteAccounts}, - inline_feature_gate_program, runtime_config::RuntimeConfig, serde_snapshot::BankIncrementalSnapshotPersistence, snapshot_hash::SnapshotHash, @@ -218,7 +217,6 @@ pub mod bank_hash_details; mod builtin_programs; pub mod epoch_accounts_hash_utils; mod metrics; -mod replace_account; mod serde_snapshot; mod sysvar_cache; #[cfg(test)] @@ -8084,24 +8082,6 @@ impl Bank { if new_feature_activations.contains(&feature_set::update_hashes_per_tick6::id()) { self.apply_updated_hashes_per_tick(UPDATED_HASHES_PER_TICK6); } - - if new_feature_activations.contains(&feature_set::programify_feature_gate_program::id()) { - let datapoint_name = "bank-progamify_feature_gate_program"; - if let Err(e) = replace_account::replace_empty_account_with_upgradeable_program( - self, - &feature::id(), - &inline_feature_gate_program::noop_program::id(), - datapoint_name, - ) { - warn!( - "{}: Failed to replace empty account {} with upgradeable program: {}", - datapoint_name, - feature::id(), - e - ); - datapoint_warn!(datapoint_name, ("slot", self.slot(), i64),); - } - } } fn apply_updated_hashes_per_tick(&mut self, hashes_per_tick: u64) { @@ -8243,6 +8223,42 @@ impl Bank { } } + /// Use to replace programs by feature activation + #[allow(dead_code)] + fn replace_program_account( + &mut self, + old_address: &Pubkey, + new_address: &Pubkey, + datapoint_name: &'static str, + ) { + if let Some(old_account) = self.get_account_with_fixed_root(old_address) { + if let Some(new_account) = self.get_account_with_fixed_root(new_address) { + datapoint_info!(datapoint_name, ("slot", self.slot, i64)); + + // Burn lamports in the old account + self.capitalization + .fetch_sub(old_account.lamports(), Relaxed); + + // Transfer new account to old account + self.store_account(old_address, &new_account); + + // Clear new account + self.store_account(new_address, &AccountSharedData::default()); + + // Unload a program from the bank's cache + self.loaded_programs_cache + .write() + .unwrap() + .remove_programs([*old_address].into_iter()); + + self.calculate_and_update_accounts_data_size_delta_off_chain( + old_account.data().len(), + new_account.data().len(), + ); + } + } + } + /// Get all the accounts for this bank and calculate stats pub fn get_total_accounts_stats(&self) -> ScanResult { let accounts = self.get_all_accounts()?; diff --git a/runtime/src/bank/replace_account.rs b/runtime/src/bank/replace_account.rs deleted file mode 100644 index 8d650aeebe7e87..00000000000000 --- a/runtime/src/bank/replace_account.rs +++ /dev/null @@ -1,191 +0,0 @@ -use { - super::Bank, - log::*, - solana_accounts_db::accounts_index::ZeroLamport, - solana_sdk::{ - account::{Account, AccountSharedData, ReadableAccount}, - bpf_loader_upgradeable::{self, UpgradeableLoaderState}, - pubkey::Pubkey, - }, - std::sync::atomic::Ordering::Relaxed, - thiserror::Error, -}; - -/// Errors returned by `replace_account` methods -#[derive(Debug, Error)] -pub enum ReplaceAccountError { - /// Account not found - #[error("Account not found: {0:?}")] - AccountNotFound(Pubkey), - /// Account exists - #[error("Account exists: {0:?}")] - AccountExists(Pubkey), - #[error("Bincode Error: {0}")] - BincodeError(#[from] bincode::Error), - /// Not an upgradeable program - #[error("Not an upgradeable program")] - NotAnUpgradeableProgram, -} - -/// Moves one account in place of another -/// `source`: the account to replace with -/// `destination`: the account to be replaced -fn move_account( - bank: &Bank, - source_address: &Pubkey, - source_account: &V, - destination_address: &Pubkey, - destination_account: Option<&U>, -) where - U: ReadableAccount + Sync + ZeroLamport, - V: ReadableAccount + Sync + ZeroLamport, -{ - let (destination_lamports, destination_len) = match destination_account { - Some(destination_account) => ( - destination_account.lamports(), - destination_account.data().len(), - ), - None => (0, 0), - }; - - // Burn lamports in the destination account - bank.capitalization.fetch_sub(destination_lamports, Relaxed); - - // Transfer source account to destination account - bank.store_account(destination_address, source_account); - - // Clear source account - bank.store_account(source_address, &AccountSharedData::default()); - - bank.calculate_and_update_accounts_data_size_delta_off_chain( - destination_len, - source_account.data().len(), - ); -} - -/// Use to replace non-upgradeable programs by feature activation -/// `source`: the non-upgradeable program account to replace with -/// `destination`: the non-upgradeable program account to be replaced -#[allow(dead_code)] -pub(crate) fn replace_non_upgradeable_program_account( - bank: &Bank, - source_address: &Pubkey, - destination_address: &Pubkey, - datapoint_name: &'static str, -) -> Result<(), ReplaceAccountError> { - let destination_account = bank - .get_account_with_fixed_root(destination_address) - .ok_or(ReplaceAccountError::AccountNotFound(*destination_address))?; - let source_account = bank - .get_account_with_fixed_root(source_address) - .ok_or(ReplaceAccountError::AccountNotFound(*source_address))?; - - datapoint_info!(datapoint_name, ("slot", bank.slot, i64)); - - move_account( - bank, - source_address, - &source_account, - destination_address, - Some(&destination_account), - ); - - // Unload a program from the bank's cache - bank.loaded_programs_cache - .write() - .unwrap() - .remove_programs([*destination_address].into_iter()); - - Ok(()) -} - -/// Use to replace an empty account with a program by feature activation -/// Note: The upgradeable program should have both: -/// - Program account -/// - Program data account -/// `source`: the upgradeable program account to replace with -/// `destination`: the empty account to be replaced -pub(crate) fn replace_empty_account_with_upgradeable_program( - bank: &Bank, - source_address: &Pubkey, - destination_address: &Pubkey, - datapoint_name: &'static str, -) -> Result<(), ReplaceAccountError> { - // Must be attempting to replace an empty account with a program - // account _and_ data account - let source_account = bank - .get_account_with_fixed_root(source_address) - .ok_or(ReplaceAccountError::AccountNotFound(*source_address))?; - - let (destination_data_address, _) = Pubkey::find_program_address( - &[destination_address.as_ref()], - &bpf_loader_upgradeable::id(), - ); - let (source_data_address, _) = - Pubkey::find_program_address(&[source_address.as_ref()], &bpf_loader_upgradeable::id()); - - // Make sure the data within the source account is the PDA of its - // data account. This also means it has at least the necessary - // lamports for rent. - let source_state = bincode::deserialize::(source_account.data())?; - if !matches!(source_state, UpgradeableLoaderState::Program { .. }) { - return Err(ReplaceAccountError::NotAnUpgradeableProgram); - } - - let source_data_account = bank - .get_account_with_fixed_root(&source_data_address) - .ok_or(ReplaceAccountError::AccountNotFound(source_data_address))?; - - // Make sure the destination account is empty - // We aren't going to check that there isn't a data account at - // the known program-derived address (ie. `destination_data_address`), - // because if it exists, it will be overwritten - if bank - .get_account_with_fixed_root(destination_address) - .is_some() - { - return Err(ReplaceAccountError::AccountExists(*destination_address)); - } - let state = UpgradeableLoaderState::Program { - programdata_address: destination_data_address, - }; - let data = bincode::serialize(&state)?; - let lamports = bank.get_minimum_balance_for_rent_exemption(data.len()); - let created_program_account = Account { - lamports, - data, - owner: bpf_loader_upgradeable::id(), - executable: true, - rent_epoch: source_account.rent_epoch(), - }; - - datapoint_info!(datapoint_name, ("slot", bank.slot, i64)); - let change_in_capitalization = source_account.lamports().saturating_sub(lamports); - - // Replace the destination data account with the source one - // If the destination data account does not exist, it will be created - // If it does exist, it will be overwritten - move_account( - bank, - &source_data_address, - &source_data_account, - &destination_data_address, - bank.get_account_with_fixed_root(&destination_data_address) - .as_ref(), - ); - - // Write the source data account's PDA into the destination program account - move_account( - bank, - source_address, - &created_program_account, - destination_address, - None::<&AccountSharedData>, - ); - - // Any remaining lamports in the source program account are burnt - bank.capitalization - .fetch_sub(change_in_capitalization, Relaxed); - - Ok(()) -} diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 10acc085916228..410d5afc3d61d1 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -10,10 +10,6 @@ use { accounts_background_service::{ AbsRequestSender, PrunedBanksRequestHandler, SendDroppedBankCallback, }, - bank::replace_account::{ - replace_empty_account_with_upgradeable_program, - replace_non_upgradeable_program_account, ReplaceAccountError, - }, bank_client::BankClient, bank_forks::BankForks, epoch_rewards_hasher::hash_rewards_into_partitions, @@ -8012,403 +8008,42 @@ fn test_compute_active_feature_set() { assert!(feature_set.is_active(&test_feature)); } -fn test_program_replace_set_up_account( - bank: &Bank, - pubkey: &Pubkey, - lamports: u64, - state: &T, - owner: &Pubkey, - executable: bool, -) -> AccountSharedData { - let data_len = bincode::serialized_size(state).unwrap() as usize; - let mut account = AccountSharedData::from(Account { - lamports, - owner: *owner, - executable, - data: vec![0u8; data_len], - ..Account::default() - }); - account.serialize_data(state).unwrap(); - bank.store_account_and_update_capitalization(pubkey, &account); - assert_eq!(bank.get_balance(pubkey), lamports); - account -} - #[test] -fn test_replace_non_upgradeable_program_account() { - // Non-upgradeable program - // - Destination: [Destination program data] - // - Source: [*Source program data] - // - // Should replace the destination program account with the source program account: - // - Destination: [*Source program data] - let bpf_id = bpf_loader::id(); - let bank = create_simple_test_bank(0); - - let destination = Pubkey::new_unique(); - let destination_state = vec![0u8; 4]; - let destination_lamports = bank.get_minimum_balance_for_rent_exemption(destination_state.len()); - test_program_replace_set_up_account( - &bank, - &destination, - destination_lamports, - &destination_state, - &bpf_id, - true, - ); - - let source = Pubkey::new_unique(); - let source_state = vec![6; 30]; - let source_lamports = bank.get_minimum_balance_for_rent_exemption(source_state.len()); - let check_source_account = test_program_replace_set_up_account( - &bank, - &source, - source_lamports, - &source_state, - &bpf_id, - true, - ); - let check_data_account_data = check_source_account.data().to_vec(); - - let original_capitalization = bank.capitalization(); - - replace_non_upgradeable_program_account( - &bank, - &source, - &destination, - "bank-apply_program_replacement", - ) - .unwrap(); - - // Destination program account balance is now the source program account's balance - assert_eq!(bank.get_balance(&destination), source_lamports); - - // Source program account is now empty - assert_eq!(bank.get_balance(&source), 0); - - // Destination program account now holds the source program data, ie: - // - Destination: [*Source program data] - let destination_account = bank.get_account(&destination).unwrap(); - assert_eq!(destination_account.data(), &check_data_account_data); - - // Ownership & executable match the source program account - assert_eq!(destination_account.owner(), &bpf_id); - assert!(destination_account.executable()); - - // The destination account's original lamports balance was burnt - assert_eq!( - bank.capitalization(), - original_capitalization - destination_lamports - ); -} - -#[test_case( - Pubkey::new_unique(), - None; - "Empty destination account _without_ corresponding data account" -)] -#[test_case( - Pubkey::new_unique(), - Some(vec![4; 40]); - "Empty destination account _with_ corresponding data account" -)] -#[test_case( - feature::id(), // `Feature11111111` - None; - "Native destination account _without_ corresponding data account" -)] -#[test_case( - feature::id(), // `Feature11111111` - Some(vec![4; 40]); - "Native destination account _with_ corresponding data account" -)] -fn test_replace_empty_account_with_upgradeable_program_success( - destination: Pubkey, - maybe_destination_data_state: Option>, // Inner data of the destination program _data_ account -) { - // Ensures a program account and data account are created when replacing an - // empty account, ie: - // - Destination: PDA(DestinationData) - // - DestinationData: [Destination program data] - // - // If the destination data account exists, it will be overwritten - let bpf_upgradeable_id = bpf_loader_upgradeable::id(); - let bank = create_simple_test_bank(0); - - // Create the test source accounts, one for program and one for data - let source = Pubkey::new_unique(); - let (source_data, _) = Pubkey::find_program_address(&[source.as_ref()], &bpf_upgradeable_id); - let source_state = UpgradeableLoaderState::Program { - programdata_address: source_data, - }; - let source_lamports = - bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()); - let source_data_state = vec![6; 30]; - let source_data_lamports = bank.get_minimum_balance_for_rent_exemption(source_data_state.len()); - test_program_replace_set_up_account( - &bank, - &source, - source_lamports, - &source_state, - &bpf_upgradeable_id, - true, - ); - let check_source_data_account = test_program_replace_set_up_account( - &bank, - &source_data, - source_data_lamports, - &source_data_state, - &bpf_upgradeable_id, - false, - ); - let check_data_account_data = check_source_data_account.data().to_vec(); - - // Derive the well-known PDA address for the destination data account - let (destination_data, _) = - Pubkey::find_program_address(&[destination.as_ref()], &bpf_upgradeable_id); - - // Determine the lamports that will be burnt after the replacement - let burnt_after_rent = if let Some(destination_data_state) = maybe_destination_data_state { - // Create the data account if necessary - let destination_data_lamports = - bank.get_minimum_balance_for_rent_exemption(destination_data_state.len()); - test_program_replace_set_up_account( - &bank, - &destination_data, - destination_data_lamports, - &destination_data_state, - &bpf_upgradeable_id, - false, - ); - destination_data_lamports + source_lamports - - bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()) - } else { - source_lamports - - bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()) - }; - - let original_capitalization = bank.capitalization(); - - // Do the replacement - replace_empty_account_with_upgradeable_program( - &bank, - &source, - &destination, - "bank-apply_empty_account_replacement_for_program", - ) - .unwrap(); - - // Destination program account was created and funded to pay for minimum rent - // for the PDA - assert_eq!( - bank.get_balance(&destination), - bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()), - ); - - // Destination data account was created, now holds the source data account's balance - assert_eq!(bank.get_balance(&destination_data), source_data_lamports); +fn test_program_replacement() { + let mut bank = create_simple_test_bank(0); - // Source program accounts are now empty - assert_eq!(bank.get_balance(&source), 0); - assert_eq!(bank.get_balance(&source_data), 0); - - // Destination program account holds the PDA, ie: - // - Destination: PDA(DestinationData) - let destination_account = bank.get_account(&destination).unwrap(); - assert_eq!( - destination_account.data(), - &bincode::serialize(&UpgradeableLoaderState::Program { - programdata_address: destination_data - }) - .unwrap(), - ); - - // Destination data account holds the source data, ie: - // - DestinationData: [*Source program data] - let destination_data_account = bank.get_account(&destination_data).unwrap(); - assert_eq!(destination_data_account.data(), &check_data_account_data); - - // Ownership & executable match the source program accounts - assert_eq!(destination_account.owner(), &bpf_upgradeable_id); - assert!(destination_account.executable()); - assert_eq!(destination_data_account.owner(), &bpf_upgradeable_id); - assert!(!destination_data_account.executable()); - - // The remaining lamports from both program accounts minus the rent-exempt - // minimum were burnt - assert_eq!( - bank.capitalization(), - original_capitalization - burnt_after_rent - ); -} - -#[test_case( - None; - "Existing destination account _without_ corresponding data account" -)] -#[test_case( - Some(vec![4; 40]); - "Existing destination account _with_ corresponding data account" -)] -fn test_replace_empty_account_with_upgradeable_program_fail_when_account_exists( - maybe_destination_data_state: Option>, // Inner data of the destination program _data_ account -) { - // Should not be allowed to execute replacement - let bpf_upgradeable_id = bpf_loader_upgradeable::id(); - let bank = create_simple_test_bank(0); - - // Create the test destination account with some arbitrary data and lamports balance - let destination = Pubkey::new_unique(); - let destination_state = vec![0, 0, 0, 0]; // Arbitrary bytes, doesn't matter - let destination_lamports = bank.get_minimum_balance_for_rent_exemption(destination_state.len()); - let destination_account = test_program_replace_set_up_account( - &bank, - &destination, - destination_lamports, - &destination_state, - &bpf_upgradeable_id, - true, - ); - - // Create the test source accounts, one for program and one for data - let source = Pubkey::new_unique(); - let (source_data, _) = Pubkey::find_program_address(&[source.as_ref()], &bpf_upgradeable_id); - let source_state = UpgradeableLoaderState::Program { - programdata_address: source_data, - }; - let source_lamports = - bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()); - let source_data_state = vec![6; 30]; - let source_data_lamports = bank.get_minimum_balance_for_rent_exemption(source_data_state.len()); - let source_account = test_program_replace_set_up_account( - &bank, - &source, - source_lamports, - &source_state, - &bpf_upgradeable_id, - true, - ); - let source_data_account = test_program_replace_set_up_account( - &bank, - &source_data, - source_data_lamports, - &source_data_state, - &bpf_upgradeable_id, - false, + // Setup original program account + let old_address = Pubkey::new_unique(); + let new_address = Pubkey::new_unique(); + bank.store_account_and_update_capitalization( + &old_address, + &AccountSharedData::from(Account { + lamports: 100, + ..Account::default() + }), ); + assert_eq!(bank.get_balance(&old_address), 100); - // Derive the well-known PDA address for the destination data account - let (destination_data, _) = - Pubkey::find_program_address(&[destination.as_ref()], &bpf_upgradeable_id); - - // Create the data account if necessary - let destination_data_account = - if let Some(destination_data_state) = maybe_destination_data_state { - let destination_data_lamports = - bank.get_minimum_balance_for_rent_exemption(destination_data_state.len()); - let destination_data_account = test_program_replace_set_up_account( - &bank, - &destination_data, - destination_data_lamports, - &destination_data_state, - &bpf_upgradeable_id, - false, - ); - Some(destination_data_account) - } else { - None - }; + // Setup new program account + let new_program_account = AccountSharedData::from(Account { + lamports: 123, + ..Account::default() + }); + bank.store_account_and_update_capitalization(&new_address, &new_program_account); + assert_eq!(bank.get_balance(&new_address), 123); let original_capitalization = bank.capitalization(); - // Attempt the replacement - assert_matches!( - replace_empty_account_with_upgradeable_program( - &bank, - &source, - &destination, - "bank-apply_empty_account_replacement_for_program", - ) - .unwrap_err(), - ReplaceAccountError::AccountExists(..) - ); - - // Everything should be unchanged - assert_eq!(bank.get_account(&destination).unwrap(), destination_account); - if let Some(destination_data_account) = destination_data_account { - assert_eq!( - bank.get_account(&destination_data).unwrap(), - destination_data_account - ); - } - assert_eq!(bank.get_account(&source).unwrap(), source_account); - assert_eq!(bank.get_account(&source_data).unwrap(), source_data_account); - assert_eq!(bank.capitalization(), original_capitalization); -} - -#[test] -fn test_replace_empty_account_with_upgradeable_program_fail_when_not_upgradeable_program() { - // Should not be allowed to execute replacement - let bpf_upgradeable_id = bpf_loader_upgradeable::id(); - let bank = create_simple_test_bank(0); - - // Create the test destination account with some arbitrary data and lamports balance - let destination = Pubkey::new_unique(); - let destination_state = vec![0, 0, 0, 0]; // Arbitrary bytes, doesn't matter - let destination_lamports = bank.get_minimum_balance_for_rent_exemption(destination_state.len()); - let destination_account = test_program_replace_set_up_account( - &bank, - &destination, - destination_lamports, - &destination_state, - &bpf_upgradeable_id, - true, - ); - - // Create the test source accounts, one for program and one for data - let source = Pubkey::new_unique(); - let (source_data, _) = Pubkey::find_program_address(&[source.as_ref()], &bpf_upgradeable_id); - let source_state = [0, 0, 0, 0]; // Arbitrary bytes, NOT an upgradeable program - let source_lamports = - bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program()); - let source_data_state = vec![6; 30]; - let source_data_lamports = bank.get_minimum_balance_for_rent_exemption(source_data_state.len()); - let source_account = test_program_replace_set_up_account( - &bank, - &source, - source_lamports, - &source_state, - &bpf_upgradeable_id, - true, - ); - let source_data_account = test_program_replace_set_up_account( - &bank, - &source_data, - source_data_lamports, - &source_data_state, - &bpf_upgradeable_id, - false, - ); + bank.replace_program_account(&old_address, &new_address, "bank-apply_program_replacement"); - let original_capitalization = bank.capitalization(); + // New program account is now empty + assert_eq!(bank.get_balance(&new_address), 0); - // Attempt the replacement - assert_matches!( - replace_empty_account_with_upgradeable_program( - &bank, - &source, - &destination, - "bank-apply_empty_account_replacement_for_program", - ) - .unwrap_err(), - ReplaceAccountError::NotAnUpgradeableProgram - ); + // Old program account holds the new program account + assert_eq!(bank.get_account(&old_address), Some(new_program_account)); - // Everything should be unchanged - assert_eq!(bank.get_account(&destination).unwrap(), destination_account); - assert_eq!(bank.get_account(&source).unwrap(), source_account); - assert_eq!(bank.get_account(&source_data).unwrap(), source_data_account); - assert_eq!(bank.capitalization(), original_capitalization); + // Lamports in the old token account were burnt + assert_eq!(bank.capitalization(), original_capitalization - 100); } fn min_rent_exempt_balance_for_sysvars(bank: &Bank, sysvar_ids: &[Pubkey]) -> u64 { diff --git a/runtime/src/inline_feature_gate_program.rs b/runtime/src/inline_feature_gate_program.rs deleted file mode 100644 index a2c647bbda22a0..00000000000000 --- a/runtime/src/inline_feature_gate_program.rs +++ /dev/null @@ -1,5 +0,0 @@ -//! Contains replacement program IDs for the feature gate program - -pub(crate) mod noop_program { - solana_sdk::declare_id!("37Yr1mVPdfUuy6oC2yPjWtg8xyyVi33TYYqyNQocsAkT"); -} diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 503d24410e8cdc..ff94a68c69fa1e 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -14,7 +14,6 @@ pub mod commitment; mod epoch_rewards_hasher; pub mod epoch_stakes; pub mod genesis_utils; -pub mod inline_feature_gate_program; pub mod inline_spl_associated_token_account; pub mod loader_utils; pub mod non_circulating_supply; diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index bc81d781a7c176..688f5915f3873b 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -700,10 +700,6 @@ pub mod better_error_codes_for_tx_lamport_check { solana_sdk::declare_id!("Ffswd3egL3tccB6Rv3XY6oqfdzn913vUcjCSnpvCKpfx"); } -pub mod programify_feature_gate_program { - solana_sdk::declare_id!("8GdovDzVwWU5edz2G697bbB7GZjrUc6aQZLWyNNAtHdg"); -} - pub mod update_hashes_per_tick2 { solana_sdk::declare_id!("EWme9uFqfy1ikK1jhJs8fM5hxWnK336QJpbscNtizkTU"); } @@ -894,7 +890,6 @@ lazy_static! { (require_rent_exempt_split_destination::id(), "Require stake split destination account to be rent exempt"), (better_error_codes_for_tx_lamport_check::id(), "better error codes for tx lamport check #33353"), (enable_alt_bn128_compression_syscall::id(), "add alt_bn128 compression syscalls"), - (programify_feature_gate_program::id(), "move feature gate activation logic to an on-chain program #32783"), (update_hashes_per_tick2::id(), "Update desired hashes per tick to 2.8M"), (update_hashes_per_tick3::id(), "Update desired hashes per tick to 4.4M"), (update_hashes_per_tick4::id(), "Update desired hashes per tick to 7.6M"), From b948b2be5175e184de955f37ace413765aa6eaba Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 27 Oct 2023 18:26:36 -0700 Subject: [PATCH 057/213] v1.17: [zk-token-proof] Round compute units to nice numbers (backport of #33910) (#33915) [zk-token-proof] Round compute units to nice numbers (#33910) round zk-token-proof compute units to nice numbers (cherry picked from commit b0bf24b6fc3b5b57032416643e2db169e8bd79ca) Co-authored-by: samkim-crypto --- programs/zk-token-proof/src/lib.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/programs/zk-token-proof/src/lib.rs b/programs/zk-token-proof/src/lib.rs index 3e43c564e70cef..0aa75c4ef5cff5 100644 --- a/programs/zk-token-proof/src/lib.rs +++ b/programs/zk-token-proof/src/lib.rs @@ -17,20 +17,20 @@ use { }; pub const CLOSE_CONTEXT_STATE_COMPUTE_UNITS: u64 = 3_300; -pub const VERIFY_ZERO_BALANCE_COMPUTE_UNITS: u64 = 6012; -pub const VERIFY_WITHDRAW_COMPUTE_UNITS: u64 = 112_454; -pub const VERIFY_CIPHERTEXT_CIPHERTEXT_EQUALITY_COMPUTE_UNITS: u64 = 7_943; -pub const VERIFY_TRANSFER_COMPUTE_UNITS: u64 = 219_290; -pub const VERIFY_TRANSFER_WITH_FEE_COMPUTE_UNITS: u64 = 407_121; -pub const VERIFY_PUBKEY_VALIDITY_COMPUTE_UNITS: u64 = 2_619; -pub const VERIFY_RANGE_PROOF_U64_COMPUTE_UNITS: u64 = 105_066; -pub const VERIFY_BATCHED_RANGE_PROOF_U64_COMPUTE_UNITS: u64 = 111_478; -pub const VERIFY_BATCHED_RANGE_PROOF_U128_COMPUTE_UNITS: u64 = 204_512; +pub const VERIFY_ZERO_BALANCE_COMPUTE_UNITS: u64 = 6_000; +pub const VERIFY_WITHDRAW_COMPUTE_UNITS: u64 = 110_000; +pub const VERIFY_CIPHERTEXT_CIPHERTEXT_EQUALITY_COMPUTE_UNITS: u64 = 8_000; +pub const VERIFY_TRANSFER_COMPUTE_UNITS: u64 = 219_000; +pub const VERIFY_TRANSFER_WITH_FEE_COMPUTE_UNITS: u64 = 407_000; +pub const VERIFY_PUBKEY_VALIDITY_COMPUTE_UNITS: u64 = 2_600; +pub const VERIFY_RANGE_PROOF_U64_COMPUTE_UNITS: u64 = 105_000; +pub const VERIFY_BATCHED_RANGE_PROOF_U64_COMPUTE_UNITS: u64 = 111_000; +pub const VERIFY_BATCHED_RANGE_PROOF_U128_COMPUTE_UNITS: u64 = 200_000; pub const VERIFY_BATCHED_RANGE_PROOF_U256_COMPUTE_UNITS: u64 = 368_000; -pub const VERIFY_CIPHERTEXT_COMMITMENT_EQUALITY_COMPUTE_UNITS: u64 = 6_424; -pub const VERIFY_GROUPED_CIPHERTEXT_2_HANDLES_VALIDITY_COMPUTE_UNITS: u64 = 6_440; -pub const VERIFY_BATCHED_GROUPED_CIPHERTEXT_2_HANDLES_VALIDITY_COMPUTE_UNITS: u64 = 12_575; -pub const VERIFY_FEE_SIGMA_COMPUTE_UNITS: u64 = 6_547; +pub const VERIFY_CIPHERTEXT_COMMITMENT_EQUALITY_COMPUTE_UNITS: u64 = 6_400; +pub const VERIFY_GROUPED_CIPHERTEXT_2_HANDLES_VALIDITY_COMPUTE_UNITS: u64 = 6_400; +pub const VERIFY_BATCHED_GROUPED_CIPHERTEXT_2_HANDLES_VALIDITY_COMPUTE_UNITS: u64 = 13_000; +pub const VERIFY_FEE_SIGMA_COMPUTE_UNITS: u64 = 6_500; fn process_verify_proof(invoke_context: &mut InvokeContext) -> Result<(), InstructionError> where From 2e5a20f729ab34ad6a38c4ca49370c5a68d75418 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:44:23 -0500 Subject: [PATCH 058/213] v1.17: Retry hash file allocation (backport of #33565) (#33918) * Retry hash file allocation (#33565) * retry hash file allocation * add sleep * submit a datapoint for retry * typo * more typos * Update accounts-db/src/accounts_hash.rs Co-authored-by: Brooks * fmt --------- Co-authored-by: HaoranYi Co-authored-by: Brooks (cherry picked from commit 167dac204fe64e4c9c68e6de5ae8a097eb595dea) # Conflicts: # accounts-db/src/accounts_hash.rs * fix conflicts --------- Co-authored-by: HaoranYi Co-authored-by: HaoranYi --- accounts-db/src/accounts_hash.rs | 67 +++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/accounts-db/src/accounts_hash.rs b/accounts-db/src/accounts_hash.rs index 66a77c81883300..ff832cb5612358 100644 --- a/accounts-db/src/accounts_hash.rs +++ b/accounts-db/src/accounts_hash.rs @@ -26,6 +26,7 @@ use { atomic::{AtomicU64, AtomicUsize, Ordering}, Arc, }, + thread, time, }, tempfile::tempfile_in, }; @@ -87,21 +88,59 @@ impl AccountHashesFile { if self.writer.is_none() { // we have hashes to write but no file yet, so create a file that will auto-delete on drop - let mut data = tempfile_in(&self.dir_for_temp_cache_files).unwrap_or_else(|err| { - panic!( - "Unable to create file within {}: {err}", - self.dir_for_temp_cache_files.display() - ) - }); + let get_file = || -> Result<_, std::io::Error> { + let mut data = tempfile_in(&self.dir_for_temp_cache_files).unwrap_or_else(|err| { + panic!( + "Unable to create file within {}: {err}", + self.dir_for_temp_cache_files.display() + ) + }); + + // Theoretical performance optimization: write a zero to the end of + // the file so that we won't have to resize it later, which may be + // expensive. + assert!(self.capacity > 0); + data.seek(SeekFrom::Start((self.capacity - 1) as u64))?; + data.write_all(&[0])?; + data.rewind()?; + data.flush()?; + Ok(data) + }; + + // Retry 5 times to allocate the AccountHashesFile. The memory might be fragmented and + // causes memory allocation failure. Therefore, let's retry after failure. Hoping that the + // kernel has the chance to defrag the memory between the retries, and retries succeed. + let mut num_retries = 0; + let data = loop { + num_retries += 1; + + match get_file() { + Ok(data) => { + break data; + } + Err(err) => { + info!( + "Unable to create account hashes file within {}: {}, retry counter {}", + self.dir_for_temp_cache_files.display(), + err, + num_retries + ); - // Theoretical performance optimization: write a zero to the end of - // the file so that we won't have to resize it later, which may be - // expensive. - data.seek(SeekFrom::Start((self.capacity - 1) as u64)) - .unwrap(); - data.write_all(&[0]).unwrap(); - data.rewind().unwrap(); - data.flush().unwrap(); + if num_retries > 5 { + panic!( + "Unable to create account hashes file within {}: after {} retries", + self.dir_for_temp_cache_files.display(), + num_retries + ); + } + datapoint_info!( + "retry_account_hashes_file_allocation", + ("retry", num_retries, i64) + ); + thread::sleep(time::Duration::from_millis(num_retries * 100)); + } + } + }; //UNSAFE: Required to create a Mmap let map = unsafe { MmapMut::map_mut(&data) }; From 1d2609e9f002356d4c88d856d537848d29afcf47 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Tue, 31 Oct 2023 14:13:22 -0500 Subject: [PATCH 059/213] Update version to v1.17.5 (#33931) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a4c713f1984c57..cbcc732ddf2148 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.4" +version = "1.17.5" dependencies = [ "regex", ] @@ -4065,7 +4065,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.4" +version = "1.17.5" dependencies = [ "protobuf-src", "tonic-build", @@ -4308,7 +4308,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.4" +version = "1.17.5" [[package]] name = "rcgen" @@ -5098,7 +5098,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.4" +version = "1.17.5" dependencies = [ "Inflector", "assert_matches", @@ -5122,7 +5122,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 2.33.3", "log", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 2.33.3", "log", @@ -5166,7 +5166,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.4" +version = "1.17.5" dependencies = [ "arrayref", "assert_matches", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "bytemuck", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -5260,7 +5260,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5284,7 +5284,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5301,7 +5301,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.4" +version = "1.17.5" dependencies = [ "serde", "solana-sdk", @@ -5310,7 +5310,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "crossbeam-channel", @@ -5328,7 +5328,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5339,7 +5339,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5380,7 +5380,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bv", "fnv", @@ -5397,7 +5397,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -5417,7 +5417,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -5428,7 +5428,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bv", "bytemuck", @@ -5447,7 +5447,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "solana-logger", @@ -5455,7 +5455,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_cmd", "bzip2", @@ -5476,11 +5476,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.4" +version = "1.17.5" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.4" +version = "1.17.5" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5491,7 +5491,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "chrono", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "chrono", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -5579,7 +5579,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.4" +version = "1.17.5" dependencies = [ "anyhow", "dirs-next", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.4" +version = "1.17.5" dependencies = [ "Inflector", "base64 0.21.4", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-trait", "bincode", @@ -5652,7 +5652,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.4" +version = "1.17.5" dependencies = [ "futures-util", "rand 0.8.5", @@ -5682,7 +5682,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5690,7 +5690,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "chrono", @@ -5703,7 +5703,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-trait", "bincode", @@ -5727,7 +5727,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5810,7 +5810,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.4" +version = "1.17.5" dependencies = [ "lazy_static", "log", @@ -5835,7 +5835,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "clap 3.2.23", @@ -5865,7 +5865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "console", "indicatif", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5888,7 +5888,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -5910,7 +5910,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "byteorder", @@ -5932,7 +5932,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.4" +version = "1.17.5" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5962,7 +5962,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.4" +version = "1.17.5" dependencies = [ "proc-macro2", "quote", @@ -5972,7 +5972,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.4" +version = "1.17.5" dependencies = [ "base64 0.21.4", "bincode", @@ -5997,7 +5997,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "solana-accounts-db", @@ -6008,7 +6008,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "solana-sdk", @@ -6018,7 +6018,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bs58", "crossbeam-channel", @@ -6043,7 +6043,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -6094,7 +6094,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.4" +version = "1.17.5" dependencies = [ "atty", "bincode", @@ -6129,7 +6129,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bs58", "clap 3.2.23", @@ -6146,7 +6146,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -6214,7 +6214,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_cmd", "bs58", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "log", @@ -6275,7 +6275,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6314,7 +6314,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.4" +version = "1.17.5" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6326,7 +6326,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.4" +version = "1.17.5" dependencies = [ "env_logger", "lazy_static", @@ -6335,7 +6335,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "solana-sdk", @@ -6343,11 +6343,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.4" +version = "1.17.5" [[package]] name = "solana-merkle-root-bench" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 2.33.3", "log", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.4" +version = "1.17.5" dependencies = [ "fast-math", "hex", @@ -6369,7 +6369,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.4" +version = "1.17.5" dependencies = [ "crossbeam-channel", "env_logger", @@ -6385,7 +6385,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6396,7 +6396,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "clap 3.2.23", @@ -6416,7 +6416,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "reqwest", @@ -6426,7 +6426,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.4" +version = "1.17.5" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6457,7 +6457,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -6478,7 +6478,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 3.2.23", "log", @@ -6493,7 +6493,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "anyhow", "ark-bn254", @@ -6550,7 +6550,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "async-trait", @@ -6608,7 +6608,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "anyhow", "crossbeam-channel", @@ -6632,7 +6632,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-mutex", "async-trait", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.4" +version = "1.17.5" dependencies = [ "lazy_static", "num_cpus", @@ -6668,7 +6668,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "console", @@ -6687,7 +6687,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.4" +version = "1.17.5" dependencies = [ "base64 0.21.4", "bincode", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "async-trait", @@ -6775,7 +6775,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.4" +version = "1.17.5" dependencies = [ "base64 0.21.4", "bs58", @@ -6795,7 +6795,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "anyhow", "clap 2.33.3", @@ -6812,7 +6812,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "bs58", @@ -6839,7 +6839,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.4" +version = "1.17.5" dependencies = [ "arrayref", "assert_matches", @@ -6922,7 +6922,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.4" +version = "1.17.5" dependencies = [ "anyhow", "assert_matches", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bs58", "proc-macro2", @@ -6991,7 +6991,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.4" +version = "1.17.5" dependencies = [ "crossbeam-channel", "log", @@ -7006,7 +7006,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7022,7 +7022,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -7039,7 +7039,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.4" +version = "1.17.5" dependencies = [ "backoff", "bincode", @@ -7071,7 +7071,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "bs58", @@ -7087,7 +7087,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 2.33.3", "log", @@ -7099,7 +7099,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "async-channel", @@ -7131,7 +7131,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -7145,7 +7145,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.4" +version = "1.17.5" dependencies = [ "base64 0.21.4", "bincode", @@ -7175,7 +7175,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "log", @@ -7189,7 +7189,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -7222,7 +7222,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-trait", "bincode", @@ -7244,7 +7244,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "clap 2.33.3", @@ -7271,7 +7271,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.4" +version = "1.17.5" dependencies = [ "Inflector", "base64 0.21.4", @@ -7294,7 +7294,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -7331,7 +7331,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-trait", "solana-connection-cache", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.4" +version = "1.17.5" dependencies = [ "serde_json", "solana-metrics", @@ -7352,7 +7352,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.4" +version = "1.17.5" dependencies = [ "chrono", "clap 2.33.3", @@ -7416,7 +7416,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "rustc_version 0.4.0", @@ -7430,7 +7430,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "crossbeam-channel", @@ -7449,7 +7449,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -7472,7 +7472,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 2.33.3", "humantime", @@ -7491,7 +7491,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bs58", "clap 3.2.23", @@ -7510,7 +7510,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bytemuck", "criterion", @@ -7524,7 +7524,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7536,7 +7536,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.4" +version = "1.17.5" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 218fcc4ab82d38..1b3a1f01cd8de2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.4" +version = "1.17.5" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.4" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.4" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.4" } -solana-banks-client = { path = "banks-client", version = "=1.17.4" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.4" } -solana-banks-server = { path = "banks-server", version = "=1.17.4" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.4" } -solana-bloom = { path = "bloom", version = "=1.17.4" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.4" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.4" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.4", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.4" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.4" } -solana-cli = { path = "cli", version = "=1.17.4" } -solana-cli-config = { path = "cli-config", version = "=1.17.4" } -solana-cli-output = { path = "cli-output", version = "=1.17.4" } -solana-client = { path = "client", version = "=1.17.4" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.4" } -solana-config-program = { path = "programs/config", version = "=1.17.4" } -solana-core = { path = "core", version = "=1.17.4" } -solana-cost-model = { path = "cost-model", version = "=1.17.4" } -solana-download-utils = { path = "download-utils", version = "=1.17.4" } -solana-entry = { path = "entry", version = "=1.17.4" } -solana-faucet = { path = "faucet", version = "=1.17.4" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.4" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.4" } -solana-genesis = { path = "genesis", version = "=1.17.4" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.4" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.4" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.4" } -solana-gossip = { path = "gossip", version = "=1.17.4" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.4" } -solana-ledger = { path = "ledger", version = "=1.17.4" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.4" } -solana-logger = { path = "logger", version = "=1.17.4" } -solana-measure = { path = "measure", version = "=1.17.4" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.4" } -solana-metrics = { path = "metrics", version = "=1.17.4" } -solana-net-utils = { path = "net-utils", version = "=1.17.4" } -solana-notifier = { path = "notifier", version = "=1.17.4" } -solana-perf = { path = "perf", version = "=1.17.4" } -solana-poh = { path = "poh", version = "=1.17.4" } -solana-program = { path = "sdk/program", version = "=1.17.4" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.4" } -solana-program-test = { path = "program-test", version = "=1.17.4" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.4" } -solana-quic-client = { path = "quic-client", version = "=1.17.4" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.4" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.4", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.4" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.4", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.4" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.4" } -solana-runtime = { path = "runtime", version = "=1.17.4" } -solana-sdk = { path = "sdk", version = "=1.17.4" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.4" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.4" } -solana-stake-program = { path = "programs/stake", version = "=1.17.4" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.4" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.4" } -solana-streamer = { path = "streamer", version = "=1.17.4" } -solana-system-program = { path = "programs/system", version = "=1.17.4" } -solana-test-validator = { path = "test-validator", version = "=1.17.4" } -solana-thin-client = { path = "thin-client", version = "=1.17.4" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.4", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.4" } -solana-turbine = { path = "turbine", version = "=1.17.4" } -solana-udp-client = { path = "udp-client", version = "=1.17.4" } -solana-version = { path = "version", version = "=1.17.4" } -solana-vote = { path = "vote", version = "=1.17.4" } -solana-vote-program = { path = "programs/vote", version = "=1.17.4" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.4" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.4" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.4" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.5" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.5" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.5" } +solana-banks-client = { path = "banks-client", version = "=1.17.5" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.5" } +solana-banks-server = { path = "banks-server", version = "=1.17.5" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.5" } +solana-bloom = { path = "bloom", version = "=1.17.5" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.5" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.5" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.5", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.5" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.5" } +solana-cli = { path = "cli", version = "=1.17.5" } +solana-cli-config = { path = "cli-config", version = "=1.17.5" } +solana-cli-output = { path = "cli-output", version = "=1.17.5" } +solana-client = { path = "client", version = "=1.17.5" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.5" } +solana-config-program = { path = "programs/config", version = "=1.17.5" } +solana-core = { path = "core", version = "=1.17.5" } +solana-cost-model = { path = "cost-model", version = "=1.17.5" } +solana-download-utils = { path = "download-utils", version = "=1.17.5" } +solana-entry = { path = "entry", version = "=1.17.5" } +solana-faucet = { path = "faucet", version = "=1.17.5" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.5" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.5" } +solana-genesis = { path = "genesis", version = "=1.17.5" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.5" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.5" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.5" } +solana-gossip = { path = "gossip", version = "=1.17.5" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.5" } +solana-ledger = { path = "ledger", version = "=1.17.5" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.5" } +solana-logger = { path = "logger", version = "=1.17.5" } +solana-measure = { path = "measure", version = "=1.17.5" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.5" } +solana-metrics = { path = "metrics", version = "=1.17.5" } +solana-net-utils = { path = "net-utils", version = "=1.17.5" } +solana-notifier = { path = "notifier", version = "=1.17.5" } +solana-perf = { path = "perf", version = "=1.17.5" } +solana-poh = { path = "poh", version = "=1.17.5" } +solana-program = { path = "sdk/program", version = "=1.17.5" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.5" } +solana-program-test = { path = "program-test", version = "=1.17.5" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.5" } +solana-quic-client = { path = "quic-client", version = "=1.17.5" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.5" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.5", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.5" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.5", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.5" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.5" } +solana-runtime = { path = "runtime", version = "=1.17.5" } +solana-sdk = { path = "sdk", version = "=1.17.5" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.5" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.5" } +solana-stake-program = { path = "programs/stake", version = "=1.17.5" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.5" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.5" } +solana-streamer = { path = "streamer", version = "=1.17.5" } +solana-system-program = { path = "programs/system", version = "=1.17.5" } +solana-test-validator = { path = "test-validator", version = "=1.17.5" } +solana-thin-client = { path = "thin-client", version = "=1.17.5" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.5", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.5" } +solana-turbine = { path = "turbine", version = "=1.17.5" } +solana-udp-client = { path = "udp-client", version = "=1.17.5" } +solana-version = { path = "version", version = "=1.17.5" } +solana-vote = { path = "vote", version = "=1.17.5" } +solana-vote-program = { path = "programs/vote", version = "=1.17.5" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.5" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.5" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.5" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 17f4d199f478d3..81ba8df4cb28bc 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.4" +version = "1.17.5" dependencies = [ "Inflector", "base64 0.21.4", @@ -4468,7 +4468,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.4" +version = "1.17.5" dependencies = [ "arrayref", "bincode", @@ -4525,7 +4525,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "bytemuck", @@ -4544,7 +4544,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4559,7 +4559,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.4" +version = "1.17.5" dependencies = [ "serde", "solana-sdk", @@ -4568,7 +4568,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "crossbeam-channel", @@ -4586,7 +4586,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bv", "fnv", @@ -4603,7 +4603,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.4" +version = "1.17.5" dependencies = [ "array-bytes", "serde", @@ -4630,7 +4630,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bv", "bytemuck", @@ -4646,7 +4646,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "chrono", "clap 2.33.3", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.4" +version = "1.17.5" dependencies = [ "dirs-next", "lazy_static", @@ -4675,7 +4675,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.4" +version = "1.17.5" dependencies = [ "Inflector", "base64 0.21.4", @@ -4700,7 +4700,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-trait", "bincode", @@ -4731,7 +4731,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4739,7 +4739,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "chrono", @@ -4751,7 +4751,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-trait", "bincode", @@ -4771,7 +4771,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.4" +version = "1.17.5" dependencies = [ "base64 0.21.4", "bincode", @@ -4843,7 +4843,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.4" +version = "1.17.5" dependencies = [ "lazy_static", "log", @@ -4865,7 +4865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "console", "indicatif", @@ -4877,7 +4877,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "crossbeam-channel", @@ -4897,7 +4897,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.4" +version = "1.17.5" dependencies = [ "ahash 0.8.3", "blake3", @@ -4947,7 +4947,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.4" +version = "1.17.5" dependencies = [ "proc-macro2", "quote", @@ -4957,7 +4957,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "solana-accounts-db", @@ -4968,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "solana-sdk", @@ -4978,7 +4978,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bs58", "crossbeam-channel", @@ -5003,7 +5003,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -5051,7 +5051,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "bincode", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "solana-measure", @@ -5126,7 +5126,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.4" +version = "1.17.5" dependencies = [ "env_logger", "lazy_static", @@ -5135,7 +5135,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "solana-sdk", @@ -5143,7 +5143,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.4" +version = "1.17.5" dependencies = [ "fast-math", "solana-program", @@ -5151,7 +5151,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.4" +version = "1.17.5" dependencies = [ "crossbeam-channel", "gethostname", @@ -5164,7 +5164,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "clap 3.1.6", @@ -5184,7 +5184,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.4" +version = "1.17.5" dependencies = [ "ahash 0.8.3", "bincode", @@ -5211,7 +5211,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.4" +version = "1.17.5" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5227,7 +5227,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "ark-bn254", "ark-ec", @@ -5279,7 +5279,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.4" +version = "1.17.5" dependencies = [ "base64 0.21.4", "bincode", @@ -5305,7 +5305,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "async-trait", @@ -5333,7 +5333,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "crossbeam-channel", "futures-util", @@ -5356,7 +5356,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-mutex", "async-trait", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.4" +version = "1.17.5" dependencies = [ "lazy_static", "num_cpus", @@ -5389,7 +5389,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.4" +version = "1.17.5" dependencies = [ "console", "dialoguer", @@ -5406,7 +5406,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.4" +version = "1.17.5" dependencies = [ "base64 0.21.4", "bincode", @@ -5461,7 +5461,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-trait", "base64 0.21.4", @@ -5485,7 +5485,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.4" +version = "1.17.5" dependencies = [ "base64 0.21.4", "bs58", @@ -5505,7 +5505,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.4" +version = "1.17.5" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5516,7 +5516,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.4" +version = "1.17.5" dependencies = [ "arrayref", "base64 0.21.4", @@ -5591,7 +5591,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5628,21 +5628,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.4" +version = "1.17.5" dependencies = [ "array-bytes", "solana-program", @@ -5650,7 +5650,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.4" +version = "1.17.5" dependencies = [ "array-bytes", "solana-program", @@ -5658,21 +5658,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5680,14 +5680,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.4" +version = "1.17.5" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5695,21 +5695,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.4" +version = "1.17.5" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5719,42 +5719,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.4" +version = "1.17.5" dependencies = [ "rustversion", "solana-program", @@ -5764,49 +5764,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5814,14 +5814,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-program-runtime", @@ -5831,7 +5831,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5839,21 +5839,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5861,14 +5861,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.4" +version = "1.17.5" dependencies = [ "array-bytes", "solana-program", @@ -5876,7 +5876,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.4" +version = "1.17.5" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5885,14 +5885,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5900,7 +5900,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-program-runtime", @@ -5910,21 +5910,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-program-runtime", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.4" +version = "1.17.5" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.4" +version = "1.17.5" dependencies = [ "blake3", "solana-program", @@ -5950,21 +5950,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-logger", "solana-program", @@ -5975,21 +5975,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", "solana-program-runtime", @@ -5999,21 +5999,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.4" +version = "1.17.5" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.4" +version = "1.17.5" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6065,7 +6065,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bs58", "proc-macro2", @@ -6076,7 +6076,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.4" +version = "1.17.5" dependencies = [ "crossbeam-channel", "log", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "log", @@ -6103,7 +6103,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.4" +version = "1.17.5" dependencies = [ "backoff", "bincode", @@ -6135,7 +6135,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "bs58", @@ -6150,7 +6150,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-channel", "bytes", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "log", @@ -6192,7 +6192,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.4" +version = "1.17.5" dependencies = [ "base64 0.21.4", "bincode", @@ -6222,7 +6222,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "log", @@ -6235,7 +6235,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-trait", "bincode", @@ -6257,7 +6257,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.4" +version = "1.17.5" dependencies = [ "Inflector", "base64 0.21.4", @@ -6280,7 +6280,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "bytes", @@ -6315,7 +6315,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.4" +version = "1.17.5" dependencies = [ "async-trait", "solana-connection-cache", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.4" +version = "1.17.5" dependencies = [ "chrono", "clap 2.33.3", @@ -6390,7 +6390,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.4" +version = "1.17.5" dependencies = [ "log", "rustc_version", @@ -6404,7 +6404,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.4" +version = "1.17.5" dependencies = [ "crossbeam-channel", "itertools", @@ -6421,7 +6421,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bincode", "log", @@ -6441,7 +6441,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.4" +version = "1.17.5" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6453,7 +6453,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.4" +version = "1.17.5" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 9e485ccec2d9b5..090f701b3cd395 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.4" +version = "1.17.5" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.4" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.4" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.4" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.4" } -solana-ledger = { path = "../../ledger", version = "=1.17.4" } -solana-logger = { path = "../../logger", version = "=1.17.4" } -solana-measure = { path = "../../measure", version = "=1.17.4" } -solana-program = { path = "../../sdk/program", version = "=1.17.4" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.4" } -solana-program-test = { path = "../../program-test", version = "=1.17.4" } -solana-runtime = { path = "../../runtime", version = "=1.17.4" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.4" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.4" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.4", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.4" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.4" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.4" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.4", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.4" } -solana-sdk = { path = "../../sdk", version = "=1.17.4" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.4" } -solana-validator = { path = "../../validator", version = "=1.17.4" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.4" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.5" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.5" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.5" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.5" } +solana-ledger = { path = "../../ledger", version = "=1.17.5" } +solana-logger = { path = "../../logger", version = "=1.17.5" } +solana-measure = { path = "../../measure", version = "=1.17.5" } +solana-program = { path = "../../sdk/program", version = "=1.17.5" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.5" } +solana-program-test = { path = "../../program-test", version = "=1.17.5" } +solana-runtime = { path = "../../runtime", version = "=1.17.5" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.5" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.5" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.5", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.5" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.5" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.5" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.5", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.5" } +solana-sdk = { path = "../../sdk", version = "=1.17.5" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.5" } +solana-validator = { path = "../../validator", version = "=1.17.5" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.5" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 20c13366f9c0c2..6a27ce939fa503 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.4" +version = "1.17.5" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.4" } +solana-program = { path = "../../../../program", version = "=1.17.5" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index ad11a14fe504e2..59f946a7a7dae1 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.4" +version = "1.17.5" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.4" } +solana-program = { path = "../../../../program", version = "=1.17.5" } [lib] crate-type = ["cdylib"] From e206ea95ca5b3c5aa32b9ae9a710feafc7de816c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:00:45 +0000 Subject: [PATCH 060/213] v1.17: rekey stake redelegate feature (backport of #33957) (#33958) rekey stake redelegate feature (#33957) Co-authored-by: HaoranYi (cherry picked from commit 75e598ece3ccf18c4fe2748e0d57db40aa3c69ac) Co-authored-by: HaoranYi --- sdk/src/feature_set.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 688f5915f3873b..4eeeb87e43420f 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -283,7 +283,7 @@ pub mod stake_deactivate_delinquent_instruction { } pub mod stake_redelegate_instruction { - solana_sdk::declare_id!("GUrp5BKMyDazsAp9mBoVD6orE5ihXNRPC3jkBRfx6Lq7"); + solana_sdk::declare_id!("2KKG3C6RBnxQo9jVVrbzsoSh41TDXLK7gBc9gduyxSzW"); } pub mod vote_withdraw_authority_may_change_authorized_voter { From 561c95c951cc60f986f08276c198a30498a67df4 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:15:21 +0000 Subject: [PATCH 061/213] v1.17: Geyser: return real parent blockhash, or default (backport of #33873) (#33959) Geyser: return real parent blockhash, or default (#33873) Return real parent blockhash, or default (cherry picked from commit d6ac9bea84ec16e9d8ceee4fa4f2f29def8a8ffb) Co-authored-by: Tyera --- core/src/replay_stage.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index 19edf8b18d0f54..5f5caf34cb365a 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -2918,9 +2918,13 @@ impl ReplayStage { Self::record_rewards(bank, rewards_recorder_sender); if let Some(ref block_metadata_notifier) = block_metadata_notifier { let block_metadata_notifier = block_metadata_notifier.read().unwrap(); + let parent_blockhash = bank + .parent() + .map(|bank| bank.last_blockhash()) + .unwrap_or_default(); block_metadata_notifier.notify_block_metadata( bank.parent_slot(), - &bank.parent_hash().to_string(), + &parent_blockhash.to_string(), bank.slot(), &bank.last_blockhash().to_string(), &bank.rewards, From 97795881ce4f2f844dc1f478fd692ac9a613a56a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 00:49:34 +0100 Subject: [PATCH 062/213] v1.17: Burn fees collected into invalid accounts (backport of #33887) (#33951) * Burn fees collected into invalid accounts (#33887) * refactor: create bank::fee_distribution module * feature: add checks to fee distribution * refactor: move Bank::deposit fn into test_utils * feedback * feedback 2 * add datapoints * change to datapoint_warn * typo (cherry picked from commit ebe8afb0c34f3a3d3d83a481b65848e86bdae746) # Conflicts: # runtime/src/bank.rs # runtime/src/bank/tests.rs * resolve conflicts --------- Co-authored-by: Justin Starry Co-authored-by: Justin Starry --- runtime/benches/accounts.rs | 4 +- runtime/src/bank.rs | 286 +-------- runtime/src/bank/fee_distribution.rs | 908 +++++++++++++++++++++++++++ runtime/src/bank/serde_snapshot.rs | 10 +- runtime/src/bank/tests.rs | 266 +------- sdk/src/feature_set.rs | 5 + 6 files changed, 964 insertions(+), 515 deletions(-) create mode 100644 runtime/src/bank/fee_distribution.rs diff --git a/runtime/benches/accounts.rs b/runtime/benches/accounts.rs index fcd784a21e1bc2..afb75300685311 100644 --- a/runtime/benches/accounts.rs +++ b/runtime/benches/accounts.rs @@ -42,7 +42,7 @@ fn deposit_many(bank: &Bank, pubkeys: &mut Vec, num: usize) -> Result<() AccountSharedData::new((t + 1) as u64, 0, AccountSharedData::default().owner()); pubkeys.push(pubkey); assert!(bank.get_account(&pubkey).is_none()); - bank.deposit(&pubkey, (t + 1) as u64)?; + test_utils::deposit(bank, &pubkey, (t + 1) as u64)?; assert_eq!(bank.get_account(&pubkey).unwrap(), account); } Ok(()) @@ -80,7 +80,7 @@ fn test_accounts_squash(bencher: &mut Bencher) { &Pubkey::default(), slot, )); - next_bank.deposit(&pubkeys[0], 1).unwrap(); + test_utils::deposit(&next_bank, &pubkeys[0], 1).unwrap(); next_bank.squash(); slot += 1; prev_bank = next_bank; diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 8412dbb1cbb334..7a4a7e8311ff2a 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -68,7 +68,6 @@ use { }, solana_accounts_db::{ account_overrides::AccountOverrides, - account_rent_state::RentState, accounts::{ AccountAddressFilter, Accounts, LoadedTransaction, PubkeyAccountSlot, RewardInterval, TransactionLoadResult, @@ -149,7 +148,6 @@ use { incinerator, inflation::Inflation, instruction::InstructionError, - lamports::LamportsError, loader_v4::{self, LoaderV4State, LoaderV4Status}, message::{AccountKeys, SanitizedMessage}, native_loader, @@ -185,7 +183,7 @@ use { borrow::Cow, cell::RefCell, collections::{HashMap, HashSet}, - convert::{TryFrom, TryInto}, + convert::TryFrom, fmt, mem, ops::{AddAssign, RangeInclusive}, path::PathBuf, @@ -216,6 +214,7 @@ mod address_lookup_table; pub mod bank_hash_details; mod builtin_programs; pub mod epoch_accounts_hash_utils; +mod fee_distribution; mod metrics; mod serde_snapshot; mod sysvar_cache; @@ -3676,62 +3675,6 @@ impl Bank { stake_weighted_timestamp } - // Distribute collected transaction fees for this slot to collector_id (= current leader). - // - // Each validator is incentivized to process more transactions to earn more transaction fees. - // Transaction fees are rewarded for the computing resource utilization cost, directly - // proportional to their actual processing power. - // - // collector_id is rotated according to stake-weighted leader schedule. So the opportunity of - // earning transaction fees are fairly distributed by stake. And missing the opportunity - // (not producing a block as a leader) earns nothing. So, being online is incentivized as a - // form of transaction fees as well. - // - // On the other hand, rent fees are distributed under slightly different philosophy, while - // still being stake-weighted. - // Ref: distribute_rent_to_validators - fn collect_fees(&self) { - let collector_fees = self.collector_fees.load(Relaxed); - - if collector_fees != 0 { - let (deposit, mut burn) = self.fee_rate_governor.burn(collector_fees); - // burn a portion of fees - debug!( - "distributed fee: {} (rounded from: {}, burned: {})", - deposit, collector_fees, burn - ); - - match self.deposit(&self.collector_id, deposit) { - Ok(post_balance) => { - if deposit != 0 { - self.rewards.write().unwrap().push(( - self.collector_id, - RewardInfo { - reward_type: RewardType::Fee, - lamports: deposit as i64, - post_balance, - commission: None, - }, - )); - } - } - Err(_) => { - error!( - "Burning {} fee instead of crediting {}", - deposit, self.collector_id - ); - datapoint_error!( - "bank-burned_fee", - ("slot", self.slot(), i64), - ("num_lamports", deposit, i64) - ); - burn += deposit; - } - } - self.capitalization.fetch_sub(burn, Relaxed); - } - } - pub fn rehash(&self) { let mut hash = self.hash.write().unwrap(); let new = self.hash_internal_state(); @@ -3757,8 +3700,8 @@ impl Bank { if *hash == Hash::default() { // finish up any deferred changes to account state self.collect_rent_eagerly(); - self.collect_fees(); - self.distribute_rent(); + self.distribute_transaction_fees(); + self.distribute_rent_fees(); self.update_slot_history(); self.run_incinerator(); @@ -3871,12 +3814,14 @@ impl Bank { self.accounts_data_size_initial += account.data().len() as u64; } - // highest staked node is the first collector + // Highest staked node is the first collector but if a genesis config + // doesn't define any staked nodes, we assume this genesis config is for + // testing and set the collector id to a unique pubkey. self.collector_id = self .stakes_cache .stakes() .highest_staked_node() - .unwrap_or_default(); + .unwrap_or_else(Pubkey::new_unique); self.blockhash_queue.write().unwrap().genesis_hash( &genesis_config.hash(), @@ -5674,183 +5619,6 @@ impl Bank { } } - // Distribute collected rent fees for this slot to staked validators (excluding stakers) - // according to stake. - // - // The nature of rent fee is the cost of doing business, every validator has to hold (or have - // access to) the same list of accounts, so we pay according to stake, which is a rough proxy for - // value to the network. - // - // Currently, rent distribution doesn't consider given validator's uptime at all (this might - // change). That's because rent should be rewarded for the storage resource utilization cost. - // It's treated differently from transaction fees, which is for the computing resource - // utilization cost. - // - // We can't use collector_id (which is rotated according to stake-weighted leader schedule) - // as an approximation to the ideal rent distribution to simplify and avoid this per-slot - // computation for the distribution (time: N log N, space: N acct. stores; N = # of - // validators). - // The reason is that rent fee doesn't need to be incentivized for throughput unlike transaction - // fees - // - // Ref: collect_fees - #[allow(clippy::needless_collect)] - fn distribute_rent_to_validators( - &self, - vote_accounts: &VoteAccountsHashMap, - rent_to_be_distributed: u64, - ) { - let mut total_staked = 0; - - // Collect the stake associated with each validator. - // Note that a validator may be present in this vector multiple times if it happens to have - // more than one staked vote account somehow - let mut validator_stakes = vote_accounts - .iter() - .filter_map(|(_vote_pubkey, (staked, account))| { - if *staked == 0 { - None - } else { - total_staked += *staked; - Some((account.node_pubkey()?, *staked)) - } - }) - .collect::>(); - - #[cfg(test)] - if validator_stakes.is_empty() { - // some tests bank.freezes() with bad staking state - self.capitalization - .fetch_sub(rent_to_be_distributed, Relaxed); - return; - } - #[cfg(not(test))] - assert!(!validator_stakes.is_empty()); - - // Sort first by stake and then by validator identity pubkey for determinism. - // If two items are still equal, their relative order does not matter since - // both refer to the same validator. - validator_stakes.sort_unstable_by(|(pubkey1, staked1), (pubkey2, staked2)| { - (staked1, pubkey1).cmp(&(staked2, pubkey2)).reverse() - }); - - let enforce_fix = self.no_overflow_rent_distribution_enabled(); - - let mut rent_distributed_in_initial_round = 0; - let validator_rent_shares = validator_stakes - .into_iter() - .map(|(pubkey, staked)| { - let rent_share = if !enforce_fix { - (((staked * rent_to_be_distributed) as f64) / (total_staked as f64)) as u64 - } else { - (((staked as u128) * (rent_to_be_distributed as u128)) / (total_staked as u128)) - .try_into() - .unwrap() - }; - rent_distributed_in_initial_round += rent_share; - (pubkey, rent_share) - }) - .collect::>(); - - // Leftover lamports after fraction calculation, will be paid to validators starting from highest stake - // holder - let mut leftover_lamports = rent_to_be_distributed - rent_distributed_in_initial_round; - - let mut rewards = vec![]; - validator_rent_shares - .into_iter() - .for_each(|(pubkey, rent_share)| { - let rent_to_be_paid = if leftover_lamports > 0 { - leftover_lamports -= 1; - rent_share + 1 - } else { - rent_share - }; - if !enforce_fix || rent_to_be_paid > 0 { - let mut account = self - .get_account_with_fixed_root(&pubkey) - .unwrap_or_default(); - let rent = self.rent_collector().rent; - let recipient_pre_rent_state = RentState::from_account(&account, &rent); - let distribution = account.checked_add_lamports(rent_to_be_paid); - let recipient_post_rent_state = RentState::from_account(&account, &rent); - let rent_state_transition_allowed = recipient_post_rent_state - .transition_allowed_from(&recipient_pre_rent_state); - if !rent_state_transition_allowed { - warn!( - "Rent distribution of {rent_to_be_paid} to {pubkey} results in \ - invalid RentState: {recipient_post_rent_state:?}" - ); - datapoint_warn!( - "bank-rent_distribution_invalid_state", - ("slot", self.slot(), i64), - ("pubkey", pubkey.to_string(), String), - ("rent_to_be_paid", rent_to_be_paid, i64) - ); - } - if distribution.is_err() - || (self.prevent_rent_paying_rent_recipients() - && !rent_state_transition_allowed) - { - // overflow adding lamports or resulting account is not rent-exempt - self.capitalization.fetch_sub(rent_to_be_paid, Relaxed); - error!( - "Burned {} rent lamports instead of sending to {}", - rent_to_be_paid, pubkey - ); - datapoint_error!( - "bank-burned_rent", - ("slot", self.slot(), i64), - ("num_lamports", rent_to_be_paid, i64) - ); - } else { - self.store_account(&pubkey, &account); - rewards.push(( - pubkey, - RewardInfo { - reward_type: RewardType::Rent, - lamports: rent_to_be_paid as i64, - post_balance: account.lamports(), - commission: None, - }, - )); - } - } - }); - self.rewards.write().unwrap().append(&mut rewards); - - if enforce_fix { - assert_eq!(leftover_lamports, 0); - } else if leftover_lamports != 0 { - warn!( - "There was leftover from rent distribution: {}", - leftover_lamports - ); - self.capitalization.fetch_sub(leftover_lamports, Relaxed); - } - } - - fn distribute_rent(&self) { - let total_rent_collected = self.collected_rent.load(Relaxed); - - let (burned_portion, rent_to_be_distributed) = self - .rent_collector - .rent - .calculate_burn(total_rent_collected); - - debug!( - "distributed rent: {} (rounded from: {}, burned: {})", - rent_to_be_distributed, total_rent_collected, burned_portion - ); - self.capitalization.fetch_sub(burned_portion, Relaxed); - - if rent_to_be_distributed == 0 { - return; - } - - self.distribute_rent_to_validators(&self.vote_accounts(), rent_to_be_distributed); - } - fn collect_rent( &self, execution_results: &[TransactionExecutionResult], @@ -6759,19 +6527,6 @@ impl Bank { } } - pub fn deposit( - &self, - pubkey: &Pubkey, - lamports: u64, - ) -> std::result::Result { - // This doesn't collect rents intentionally. - // Rents should only be applied to actual TXes - let mut account = self.get_account_with_fixed_root(pubkey).unwrap_or_default(); - account.checked_add_lamports(lamports)?; - self.store_account(pubkey, &account); - Ok(account.lamports()) - } - pub fn accounts(&self) -> Arc { self.rc.accounts.clone() } @@ -7974,6 +7729,11 @@ impl Bank { .is_active(&feature_set::prevent_rent_paying_rent_recipients::id()) } + pub fn validate_fee_collector_account(&self) -> bool { + self.feature_set + .is_active(&feature_set::validate_fee_collector_account::id()) + } + pub fn read_cost_tracker(&self) -> LockResult> { self.cost_tracker.read() } @@ -8531,7 +8291,12 @@ impl Drop for Bank { pub mod test_utils { use { super::Bank, - solana_sdk::{hash::hashv, pubkey::Pubkey}, + solana_sdk::{ + account::{ReadableAccount, WritableAccount}, + hash::hashv, + lamports::LamportsError, + pubkey::Pubkey, + }, solana_vote_program::vote_state::{self, BlockTimestamp, VoteStateVersions}, }; pub fn goto_end_of_slot(bank: &Bank) { @@ -8558,4 +8323,17 @@ pub mod test_utils { vote_state::to(&versioned, &mut vote_account).unwrap(); bank.store_account(vote_pubkey, &vote_account); } + + pub fn deposit( + bank: &Bank, + pubkey: &Pubkey, + lamports: u64, + ) -> std::result::Result { + // This doesn't collect rents intentionally. + // Rents should only be applied to actual TXes + let mut account = bank.get_account_with_fixed_root(pubkey).unwrap_or_default(); + account.checked_add_lamports(lamports)?; + bank.store_account(pubkey, &account); + Ok(account.lamports()) + } } diff --git a/runtime/src/bank/fee_distribution.rs b/runtime/src/bank/fee_distribution.rs new file mode 100644 index 00000000000000..e1d251c0bf478c --- /dev/null +++ b/runtime/src/bank/fee_distribution.rs @@ -0,0 +1,908 @@ +use { + super::Bank, + log::{debug, warn}, + solana_accounts_db::{account_rent_state::RentState, stake_rewards::RewardInfo}, + solana_sdk::{ + account::{ReadableAccount, WritableAccount}, + pubkey::Pubkey, + reward_type::RewardType, + system_program, + }, + solana_vote::vote_account::VoteAccountsHashMap, + std::{result::Result, sync::atomic::Ordering::Relaxed}, + thiserror::Error, +}; + +#[derive(Debug)] +struct DepositFeeOptions { + check_account_owner: bool, + check_rent_paying: bool, +} + +#[derive(Error, Debug, PartialEq)] +enum DepositFeeError { + #[error("fee account became rent paying")] + InvalidRentPayingAccount, + #[error("lamport overflow")] + LamportOverflow, + #[error("invalid fee account owner")] + InvalidAccountOwner, +} + +impl Bank { + // Distribute collected transaction fees for this slot to collector_id (= current leader). + // + // Each validator is incentivized to process more transactions to earn more transaction fees. + // Transaction fees are rewarded for the computing resource utilization cost, directly + // proportional to their actual processing power. + // + // collector_id is rotated according to stake-weighted leader schedule. So the opportunity of + // earning transaction fees are fairly distributed by stake. And missing the opportunity + // (not producing a block as a leader) earns nothing. So, being online is incentivized as a + // form of transaction fees as well. + // + // On the other hand, rent fees are distributed under slightly different philosophy, while + // still being stake-weighted. + // Ref: distribute_rent_to_validators + pub(super) fn distribute_transaction_fees(&self) { + let collector_fees = self.collector_fees.load(Relaxed); + if collector_fees != 0 { + let (deposit, mut burn) = self.fee_rate_governor.burn(collector_fees); + if deposit > 0 { + let validate_fee_collector = self.validate_fee_collector_account(); + match self.deposit_fees( + &self.collector_id, + deposit, + DepositFeeOptions { + check_account_owner: validate_fee_collector, + check_rent_paying: validate_fee_collector, + }, + ) { + Ok(post_balance) => { + self.rewards.write().unwrap().push(( + self.collector_id, + RewardInfo { + reward_type: RewardType::Fee, + lamports: deposit as i64, + post_balance, + commission: None, + }, + )); + } + Err(err) => { + debug!( + "Burned {} lamport tx fee instead of sending to {} due to {}", + deposit, self.collector_id, err + ); + datapoint_warn!( + "bank-burned_fee", + ("slot", self.slot(), i64), + ("num_lamports", deposit, i64), + ("error", err.to_string(), String), + ); + burn += deposit; + } + } + } + self.capitalization.fetch_sub(burn, Relaxed); + } + } + + // Deposits fees into a specified account and if successful, returns the new balance of that account + fn deposit_fees( + &self, + pubkey: &Pubkey, + fees: u64, + options: DepositFeeOptions, + ) -> Result { + let mut account = self.get_account_with_fixed_root(pubkey).unwrap_or_default(); + + if options.check_account_owner && !system_program::check_id(account.owner()) { + return Err(DepositFeeError::InvalidAccountOwner); + } + + let rent = self.rent_collector().rent; + let recipient_pre_rent_state = RentState::from_account(&account, &rent); + let distribution = account.checked_add_lamports(fees); + if distribution.is_err() { + return Err(DepositFeeError::LamportOverflow); + } + if options.check_rent_paying { + let recipient_post_rent_state = RentState::from_account(&account, &rent); + let rent_state_transition_allowed = + recipient_post_rent_state.transition_allowed_from(&recipient_pre_rent_state); + if !rent_state_transition_allowed { + return Err(DepositFeeError::InvalidRentPayingAccount); + } + } + + self.store_account(pubkey, &account); + Ok(account.lamports()) + } + + // Distribute collected rent fees for this slot to staked validators (excluding stakers) + // according to stake. + // + // The nature of rent fee is the cost of doing business, every validator has to hold (or have + // access to) the same list of accounts, so we pay according to stake, which is a rough proxy for + // value to the network. + // + // Currently, rent distribution doesn't consider given validator's uptime at all (this might + // change). That's because rent should be rewarded for the storage resource utilization cost. + // It's treated differently from transaction fees, which is for the computing resource + // utilization cost. + // + // We can't use collector_id (which is rotated according to stake-weighted leader schedule) + // as an approximation to the ideal rent distribution to simplify and avoid this per-slot + // computation for the distribution (time: N log N, space: N acct. stores; N = # of + // validators). + // The reason is that rent fee doesn't need to be incentivized for throughput unlike transaction + // fees + // + // Ref: distribute_transaction_fees + #[allow(clippy::needless_collect)] + fn distribute_rent_to_validators( + &self, + vote_accounts: &VoteAccountsHashMap, + rent_to_be_distributed: u64, + ) { + let mut total_staked = 0; + + // Collect the stake associated with each validator. + // Note that a validator may be present in this vector multiple times if it happens to have + // more than one staked vote account somehow + let mut validator_stakes = vote_accounts + .iter() + .filter_map(|(_vote_pubkey, (staked, account))| { + if *staked == 0 { + None + } else { + total_staked += *staked; + Some((account.node_pubkey()?, *staked)) + } + }) + .collect::>(); + + #[cfg(test)] + if validator_stakes.is_empty() { + // some tests bank.freezes() with bad staking state + self.capitalization + .fetch_sub(rent_to_be_distributed, Relaxed); + return; + } + #[cfg(not(test))] + assert!(!validator_stakes.is_empty()); + + // Sort first by stake and then by validator identity pubkey for determinism. + // If two items are still equal, their relative order does not matter since + // both refer to the same validator. + validator_stakes.sort_unstable_by(|(pubkey1, staked1), (pubkey2, staked2)| { + (staked1, pubkey1).cmp(&(staked2, pubkey2)).reverse() + }); + + let enforce_fix = self.no_overflow_rent_distribution_enabled(); + + let mut rent_distributed_in_initial_round = 0; + let validator_rent_shares = validator_stakes + .into_iter() + .map(|(pubkey, staked)| { + let rent_share = if !enforce_fix { + (((staked * rent_to_be_distributed) as f64) / (total_staked as f64)) as u64 + } else { + (((staked as u128) * (rent_to_be_distributed as u128)) / (total_staked as u128)) + .try_into() + .unwrap() + }; + rent_distributed_in_initial_round += rent_share; + (pubkey, rent_share) + }) + .collect::>(); + + // Leftover lamports after fraction calculation, will be paid to validators starting from highest stake + // holder + let mut leftover_lamports = rent_to_be_distributed - rent_distributed_in_initial_round; + + let mut rent_to_burn: u64 = 0; + let mut rewards = vec![]; + validator_rent_shares + .into_iter() + .for_each(|(pubkey, rent_share)| { + let rent_to_be_paid = if leftover_lamports > 0 { + leftover_lamports -= 1; + rent_share + 1 + } else { + rent_share + }; + if !enforce_fix || rent_to_be_paid > 0 { + let check_account_owner = self.validate_fee_collector_account(); + let check_rent_paying = self.prevent_rent_paying_rent_recipients(); + match self.deposit_fees( + &pubkey, + rent_to_be_paid, + DepositFeeOptions { + check_account_owner, + check_rent_paying, + }, + ) { + Ok(post_balance) => { + rewards.push(( + pubkey, + RewardInfo { + reward_type: RewardType::Rent, + lamports: rent_to_be_paid as i64, + post_balance, + commission: None, + }, + )); + } + Err(err) => { + debug!( + "Burned {} lamport rent fee instead of sending to {} due to {}", + rent_to_be_paid, pubkey, err + ); + + // overflow adding lamports or resulting account is invalid + // so burn lamports and track lamports burned per slot + rent_to_burn = rent_to_burn.saturating_add(rent_to_be_paid); + } + } + } + }); + self.rewards.write().unwrap().append(&mut rewards); + + if rent_to_burn > 0 { + self.capitalization.fetch_sub(rent_to_burn, Relaxed); + datapoint_warn!( + "bank-burned_rent", + ("slot", self.slot(), i64), + ("num_lamports", rent_to_burn, i64) + ); + } + + if enforce_fix { + assert_eq!(leftover_lamports, 0); + } else if leftover_lamports != 0 { + warn!( + "There was leftover from rent distribution: {}", + leftover_lamports + ); + self.capitalization.fetch_sub(leftover_lamports, Relaxed); + } + } + + pub(super) fn distribute_rent_fees(&self) { + let total_rent_collected = self.collected_rent.load(Relaxed); + + let (burned_portion, rent_to_be_distributed) = self + .rent_collector + .rent + .calculate_burn(total_rent_collected); + + debug!( + "distributed rent: {} (rounded from: {}, burned: {})", + rent_to_be_distributed, total_rent_collected, burned_portion + ); + self.capitalization.fetch_sub(burned_portion, Relaxed); + + if rent_to_be_distributed == 0 { + return; + } + + self.distribute_rent_to_validators(&self.vote_accounts(), rent_to_be_distributed); + } +} + +#[cfg(test)] +pub mod tests { + use { + super::*, + crate::genesis_utils::{ + create_genesis_config, create_genesis_config_with_leader, + create_genesis_config_with_vote_accounts, ValidatorVoteKeypairs, + }, + log::info, + solana_sdk::{ + account::AccountSharedData, feature_set, native_token::sol_to_lamports, pubkey, + rent::Rent, signature::Signer, + }, + }; + + #[test] + fn test_distribute_transaction_fees() { + #[derive(PartialEq)] + enum Scenario { + Normal, + InvalidOwner, + RentPaying, + } + + struct TestCase { + scenario: Scenario, + disable_checks: bool, + } + + impl TestCase { + fn new(scenario: Scenario, disable_checks: bool) -> Self { + Self { + scenario, + disable_checks, + } + } + } + + for test_case in [ + TestCase::new(Scenario::Normal, false), + TestCase::new(Scenario::Normal, true), + TestCase::new(Scenario::InvalidOwner, false), + TestCase::new(Scenario::InvalidOwner, true), + TestCase::new(Scenario::RentPaying, false), + TestCase::new(Scenario::RentPaying, true), + ] { + let mut genesis = create_genesis_config(0); + if test_case.disable_checks { + genesis + .genesis_config + .accounts + .remove(&feature_set::validate_fee_collector_account::id()) + .unwrap(); + } + let rent = Rent::default(); + let min_rent_exempt_balance = rent.minimum_balance(0); + genesis.genesis_config.rent = rent; // Ensure rent is non-zero, as genesis_utils sets Rent::free by default + let bank = Bank::new_for_tests(&genesis.genesis_config); + let transaction_fees = 100; + bank.collector_fees.fetch_add(transaction_fees, Relaxed); + assert_eq!(transaction_fees, bank.collector_fees.load(Relaxed)); + let (expected_collected_fees, burn_amount) = + bank.fee_rate_governor.burn(transaction_fees); + assert!(burn_amount > 0); + + if test_case.scenario == Scenario::RentPaying { + // ensure that account balance + collected fees will make it rent-paying + let initial_balance = 100; + let account = AccountSharedData::new(initial_balance, 0, &system_program::id()); + bank.store_account(bank.collector_id(), &account); + assert!(initial_balance + transaction_fees < min_rent_exempt_balance); + } else if test_case.scenario == Scenario::InvalidOwner { + // ensure that account owner is invalid and fee distribution will fail + let account = + AccountSharedData::new(min_rent_exempt_balance, 0, &Pubkey::new_unique()); + bank.store_account(bank.collector_id(), &account); + } else { + let account = + AccountSharedData::new(min_rent_exempt_balance, 0, &system_program::id()); + bank.store_account(bank.collector_id(), &account); + } + + let initial_capitalization = bank.capitalization(); + let initial_collector_id_balance = bank.get_balance(bank.collector_id()); + bank.distribute_transaction_fees(); + let new_collector_id_balance = bank.get_balance(bank.collector_id()); + + if test_case.scenario != Scenario::Normal && !test_case.disable_checks { + assert_eq!(initial_collector_id_balance, new_collector_id_balance); + assert_eq!( + initial_capitalization - transaction_fees, + bank.capitalization() + ); + let locked_rewards = bank.rewards.read().unwrap(); + assert!( + locked_rewards.is_empty(), + "There should be no rewards distributed" + ); + } else { + assert_eq!( + initial_collector_id_balance + expected_collected_fees, + new_collector_id_balance + ); + + assert_eq!(initial_capitalization - burn_amount, bank.capitalization()); + + let locked_rewards = bank.rewards.read().unwrap(); + assert_eq!( + locked_rewards.len(), + 1, + "There should be one reward distributed" + ); + + let reward_info = &locked_rewards[0]; + assert_eq!( + reward_info.1.lamports, expected_collected_fees as i64, + "The reward amount should match the expected deposit" + ); + assert_eq!( + reward_info.1.reward_type, + RewardType::Fee, + "The reward type should be Fee" + ); + } + } + } + + #[test] + fn test_distribute_transaction_fees_zero() { + let genesis = create_genesis_config(0); + let bank = Bank::new_for_tests(&genesis.genesis_config); + assert_eq!(bank.collector_fees.load(Relaxed), 0); + + let initial_capitalization = bank.capitalization(); + let initial_collector_id_balance = bank.get_balance(bank.collector_id()); + bank.distribute_transaction_fees(); + let new_collector_id_balance = bank.get_balance(bank.collector_id()); + + assert_eq!(initial_collector_id_balance, new_collector_id_balance); + assert_eq!(initial_capitalization, bank.capitalization()); + let locked_rewards = bank.rewards.read().unwrap(); + assert!( + locked_rewards.is_empty(), + "There should be no rewards distributed" + ); + } + + #[test] + fn test_distribute_transaction_fees_burn_all() { + let mut genesis = create_genesis_config(0); + genesis.genesis_config.fee_rate_governor.burn_percent = 100; + let bank = Bank::new_for_tests(&genesis.genesis_config); + let transaction_fees = 100; + bank.collector_fees.fetch_add(transaction_fees, Relaxed); + assert_eq!(transaction_fees, bank.collector_fees.load(Relaxed)); + + let initial_capitalization = bank.capitalization(); + let initial_collector_id_balance = bank.get_balance(bank.collector_id()); + bank.distribute_transaction_fees(); + let new_collector_id_balance = bank.get_balance(bank.collector_id()); + + assert_eq!(initial_collector_id_balance, new_collector_id_balance); + assert_eq!( + initial_capitalization - transaction_fees, + bank.capitalization() + ); + let locked_rewards = bank.rewards.read().unwrap(); + assert!( + locked_rewards.is_empty(), + "There should be no rewards distributed" + ); + } + + #[test] + fn test_distribute_transaction_fees_overflow_failure() { + let genesis = create_genesis_config(0); + let bank = Bank::new_for_tests(&genesis.genesis_config); + let transaction_fees = 100; + bank.collector_fees.fetch_add(transaction_fees, Relaxed); + assert_eq!(transaction_fees, bank.collector_fees.load(Relaxed)); + + // ensure that account balance will overflow and fee distribution will fail + let account = AccountSharedData::new(u64::MAX, 0, &system_program::id()); + bank.store_account(bank.collector_id(), &account); + + let initial_capitalization = bank.capitalization(); + let initial_collector_id_balance = bank.get_balance(bank.collector_id()); + bank.distribute_transaction_fees(); + let new_collector_id_balance = bank.get_balance(bank.collector_id()); + + assert_eq!(initial_collector_id_balance, new_collector_id_balance); + assert_eq!( + initial_capitalization - transaction_fees, + bank.capitalization() + ); + let locked_rewards = bank.rewards.read().unwrap(); + assert!( + locked_rewards.is_empty(), + "There should be no rewards distributed" + ); + } + + #[test] + fn test_deposit_fees() { + let initial_balance = 1_000_000_000; + let genesis = create_genesis_config(initial_balance); + let bank = Bank::new_for_tests(&genesis.genesis_config); + let pubkey = genesis.mint_keypair.pubkey(); + + let deposit_amount = 500; + let options = DepositFeeOptions { + check_account_owner: true, + check_rent_paying: true, + }; + + assert_eq!( + bank.deposit_fees(&pubkey, deposit_amount, options), + Ok(initial_balance + deposit_amount), + "New balance should be the sum of the initial balance and deposit amount" + ); + } + + #[test] + fn test_deposit_fees_with_overflow() { + let initial_balance = u64::MAX; + let genesis = create_genesis_config(initial_balance); + let bank = Bank::new_for_tests(&genesis.genesis_config); + let pubkey = genesis.mint_keypair.pubkey(); + + let deposit_amount = 500; + let options = DepositFeeOptions { + check_account_owner: false, + check_rent_paying: false, + }; + + assert_eq!( + bank.deposit_fees(&pubkey, deposit_amount, options), + Err(DepositFeeError::LamportOverflow), + "Expected an error due to lamport overflow" + ); + } + + #[test] + fn test_deposit_fees_invalid_account_owner() { + let initial_balance = 1000; + let genesis = create_genesis_config_with_leader(0, &pubkey::new_rand(), initial_balance); + let bank = Bank::new_for_tests(&genesis.genesis_config); + let pubkey = genesis.voting_keypair.pubkey(); + + let deposit_amount = 500; + + // enable check_account_owner + { + let options = DepositFeeOptions { + check_account_owner: true, // Intentionally checking for account owner + check_rent_paying: false, + }; + + assert_eq!( + bank.deposit_fees(&pubkey, deposit_amount, options), + Err(DepositFeeError::InvalidAccountOwner), + "Expected an error due to invalid account owner" + ); + } + + // disable check_account_owner + { + let options = DepositFeeOptions { + check_account_owner: false, + check_rent_paying: false, + }; + + assert_eq!( + bank.deposit_fees(&pubkey, deposit_amount, options), + Ok(initial_balance + deposit_amount), + "New balance should be the sum of the initial balance and deposit amount" + ); + } + } + + #[test] + fn test_deposit_fees_invalid_rent_paying() { + let initial_balance = 0; + let genesis = create_genesis_config(initial_balance); + let pubkey = genesis.mint_keypair.pubkey(); + let mut genesis_config = genesis.genesis_config; + let rent = Rent::default(); + genesis_config.rent = rent; // Ensure rent is non-zero, as genesis_utils sets Rent::free by default + let bank = Bank::new_for_tests(&genesis_config); + let min_rent_exempt_balance = rent.minimum_balance(0); + + let deposit_amount = 500; + assert!(initial_balance + deposit_amount < min_rent_exempt_balance); + + // enable check_rent_paying + { + let options = DepositFeeOptions { + check_account_owner: false, + check_rent_paying: true, + }; + + assert_eq!( + bank.deposit_fees(&pubkey, deposit_amount, options), + Err(DepositFeeError::InvalidRentPayingAccount), + "Expected an error due to invalid rent paying account" + ); + } + + // disable check_rent_paying + { + let options = DepositFeeOptions { + check_account_owner: false, + check_rent_paying: false, + }; + + assert_eq!( + bank.deposit_fees(&pubkey, deposit_amount, options), + Ok(initial_balance + deposit_amount), + "New balance should be the sum of the initial balance and deposit amount" + ); + } + } + + #[test] + fn test_distribute_rent_to_validators_overflow() { + solana_logger::setup(); + + // These values are taken from the real cluster (testnet) + const RENT_TO_BE_DISTRIBUTED: u64 = 120_525; + const VALIDATOR_STAKE: u64 = 374_999_998_287_840; + + let validator_pubkey = solana_sdk::pubkey::new_rand(); + let mut genesis_config = + create_genesis_config_with_leader(10, &validator_pubkey, VALIDATOR_STAKE) + .genesis_config; + + let bank = Bank::new_for_tests(&genesis_config); + let old_validator_lamports = bank.get_balance(&validator_pubkey); + bank.distribute_rent_to_validators(&bank.vote_accounts(), RENT_TO_BE_DISTRIBUTED); + let new_validator_lamports = bank.get_balance(&validator_pubkey); + assert_eq!( + new_validator_lamports, + old_validator_lamports + RENT_TO_BE_DISTRIBUTED + ); + + genesis_config + .accounts + .remove(&feature_set::no_overflow_rent_distribution::id()) + .unwrap(); + let bank = std::panic::AssertUnwindSafe(Bank::new_for_tests(&genesis_config)); + let old_validator_lamports = bank.get_balance(&validator_pubkey); + let new_validator_lamports = std::panic::catch_unwind(|| { + bank.distribute_rent_to_validators(&bank.vote_accounts(), RENT_TO_BE_DISTRIBUTED); + bank.get_balance(&validator_pubkey) + }); + + if let Ok(new_validator_lamports) = new_validator_lamports { + info!("asserting overflowing incorrect rent distribution"); + assert_ne!( + new_validator_lamports, + old_validator_lamports + RENT_TO_BE_DISTRIBUTED + ); + } else { + info!("NOT-asserting overflowing incorrect rent distribution"); + } + } + + #[test] + fn test_distribute_rent_to_validators_rent_paying() { + solana_logger::setup(); + + const RENT_PER_VALIDATOR: u64 = 55; + const TOTAL_RENT: u64 = RENT_PER_VALIDATOR * 4; + + let empty_validator = ValidatorVoteKeypairs::new_rand(); + let rent_paying_validator = ValidatorVoteKeypairs::new_rand(); + let becomes_rent_exempt_validator = ValidatorVoteKeypairs::new_rand(); + let rent_exempt_validator = ValidatorVoteKeypairs::new_rand(); + let keypairs = vec![ + &empty_validator, + &rent_paying_validator, + &becomes_rent_exempt_validator, + &rent_exempt_validator, + ]; + let genesis_config_info = create_genesis_config_with_vote_accounts( + sol_to_lamports(1000.), + &keypairs, + vec![sol_to_lamports(1000.); 4], + ); + let mut genesis_config = genesis_config_info.genesis_config; + genesis_config.rent = Rent::default(); // Ensure rent is non-zero, as genesis_utils sets Rent::free by default + + for deactivate_feature in [false, true] { + if deactivate_feature { + genesis_config + .accounts + .remove(&feature_set::prevent_rent_paying_rent_recipients::id()) + .unwrap(); + } + let bank = Bank::new_for_tests(&genesis_config); + let rent = bank.rent_collector().rent; + let rent_exempt_minimum = rent.minimum_balance(0); + + // Make one validator have an empty identity account + let mut empty_validator_account = bank + .get_account_with_fixed_root(&empty_validator.node_keypair.pubkey()) + .unwrap(); + empty_validator_account.set_lamports(0); + bank.store_account( + &empty_validator.node_keypair.pubkey(), + &empty_validator_account, + ); + + // Make one validator almost rent-exempt, less RENT_PER_VALIDATOR + let mut becomes_rent_exempt_validator_account = bank + .get_account_with_fixed_root(&becomes_rent_exempt_validator.node_keypair.pubkey()) + .unwrap(); + becomes_rent_exempt_validator_account + .set_lamports(rent_exempt_minimum - RENT_PER_VALIDATOR); + bank.store_account( + &becomes_rent_exempt_validator.node_keypair.pubkey(), + &becomes_rent_exempt_validator_account, + ); + + // Make one validator rent-exempt + let mut rent_exempt_validator_account = bank + .get_account_with_fixed_root(&rent_exempt_validator.node_keypair.pubkey()) + .unwrap(); + rent_exempt_validator_account.set_lamports(rent_exempt_minimum); + bank.store_account( + &rent_exempt_validator.node_keypair.pubkey(), + &rent_exempt_validator_account, + ); + + let get_rent_state = |bank: &Bank, address: &Pubkey| -> RentState { + let account = bank + .get_account_with_fixed_root(address) + .unwrap_or_default(); + RentState::from_account(&account, &rent) + }; + + // Assert starting RentStates + assert_eq!( + get_rent_state(&bank, &empty_validator.node_keypair.pubkey()), + RentState::Uninitialized + ); + assert_eq!( + get_rent_state(&bank, &rent_paying_validator.node_keypair.pubkey()), + RentState::RentPaying { + lamports: 42, + data_size: 0, + } + ); + assert_eq!( + get_rent_state(&bank, &becomes_rent_exempt_validator.node_keypair.pubkey()), + RentState::RentPaying { + lamports: rent_exempt_minimum - RENT_PER_VALIDATOR, + data_size: 0, + } + ); + assert_eq!( + get_rent_state(&bank, &rent_exempt_validator.node_keypair.pubkey()), + RentState::RentExempt + ); + + let old_empty_validator_lamports = + bank.get_balance(&empty_validator.node_keypair.pubkey()); + let old_rent_paying_validator_lamports = + bank.get_balance(&rent_paying_validator.node_keypair.pubkey()); + let old_becomes_rent_exempt_validator_lamports = + bank.get_balance(&becomes_rent_exempt_validator.node_keypair.pubkey()); + let old_rent_exempt_validator_lamports = + bank.get_balance(&rent_exempt_validator.node_keypair.pubkey()); + + bank.distribute_rent_to_validators(&bank.vote_accounts(), TOTAL_RENT); + + let new_empty_validator_lamports = + bank.get_balance(&empty_validator.node_keypair.pubkey()); + let new_rent_paying_validator_lamports = + bank.get_balance(&rent_paying_validator.node_keypair.pubkey()); + let new_becomes_rent_exempt_validator_lamports = + bank.get_balance(&becomes_rent_exempt_validator.node_keypair.pubkey()); + let new_rent_exempt_validator_lamports = + bank.get_balance(&rent_exempt_validator.node_keypair.pubkey()); + + // Assert ending balances; rent should be withheld if test is active and ending RentState + // is RentPaying, ie. empty_validator and rent_paying_validator + assert_eq!( + if deactivate_feature { + old_empty_validator_lamports + RENT_PER_VALIDATOR + } else { + old_empty_validator_lamports + }, + new_empty_validator_lamports + ); + + assert_eq!( + if deactivate_feature { + old_rent_paying_validator_lamports + RENT_PER_VALIDATOR + } else { + old_rent_paying_validator_lamports + }, + new_rent_paying_validator_lamports + ); + + assert_eq!( + old_becomes_rent_exempt_validator_lamports + RENT_PER_VALIDATOR, + new_becomes_rent_exempt_validator_lamports + ); + + assert_eq!( + old_rent_exempt_validator_lamports + RENT_PER_VALIDATOR, + new_rent_exempt_validator_lamports + ); + + // Assert ending RentStates + assert_eq!( + if deactivate_feature { + RentState::RentPaying { + lamports: RENT_PER_VALIDATOR, + data_size: 0, + } + } else { + RentState::Uninitialized + }, + get_rent_state(&bank, &empty_validator.node_keypair.pubkey()), + ); + assert_eq!( + if deactivate_feature { + RentState::RentPaying { + lamports: old_rent_paying_validator_lamports + RENT_PER_VALIDATOR, + data_size: 0, + } + } else { + RentState::RentPaying { + lamports: old_rent_paying_validator_lamports, + data_size: 0, + } + }, + get_rent_state(&bank, &rent_paying_validator.node_keypair.pubkey()), + ); + assert_eq!( + RentState::RentExempt, + get_rent_state(&bank, &becomes_rent_exempt_validator.node_keypair.pubkey()), + ); + assert_eq!( + RentState::RentExempt, + get_rent_state(&bank, &rent_exempt_validator.node_keypair.pubkey()), + ); + } + } + + #[test] + fn test_distribute_rent_to_validators_invalid_owner() { + struct TestCase { + disable_owner_check: bool, + use_invalid_owner: bool, + } + + impl TestCase { + fn new(disable_owner_check: bool, use_invalid_owner: bool) -> Self { + Self { + disable_owner_check, + use_invalid_owner, + } + } + } + + for test_case in [ + TestCase::new(false, false), + TestCase::new(false, true), + TestCase::new(true, false), + TestCase::new(true, true), + ] { + let genesis_config_info = + create_genesis_config_with_leader(0, &Pubkey::new_unique(), 100); + let mut genesis_config = genesis_config_info.genesis_config; + genesis_config.rent = Rent::default(); // Ensure rent is non-zero, as genesis_utils sets Rent::free by default + + if test_case.disable_owner_check { + genesis_config + .accounts + .remove(&feature_set::validate_fee_collector_account::id()) + .unwrap(); + } + let bank = Bank::new_for_tests(&genesis_config); + + let initial_balance = 1_000_000; + let account_owner = if test_case.use_invalid_owner { + Pubkey::new_unique() + } else { + system_program::id() + }; + let account = AccountSharedData::new(initial_balance, 0, &account_owner); + bank.store_account(bank.collector_id(), &account); + + let initial_capitalization = bank.capitalization(); + let rent_fees = 100; + bank.distribute_rent_to_validators(&bank.vote_accounts(), rent_fees); + let new_capitalization = bank.capitalization(); + let new_balance = bank.get_balance(bank.collector_id()); + + if test_case.use_invalid_owner && !test_case.disable_owner_check { + assert_eq!(initial_balance, new_balance); + assert_eq!(initial_capitalization - rent_fees, new_capitalization); + assert_eq!(bank.rewards.read().unwrap().len(), 0); + } else { + assert_eq!(initial_balance + rent_fees, new_balance); + assert_eq!(initial_capitalization, new_capitalization); + assert_eq!(bank.rewards.read().unwrap().len(), 1); + } + } + } +} diff --git a/runtime/src/bank/serde_snapshot.rs b/runtime/src/bank/serde_snapshot.rs index 6208f03581234e..ce8fac9eb745c2 100644 --- a/runtime/src/bank/serde_snapshot.rs +++ b/runtime/src/bank/serde_snapshot.rs @@ -3,8 +3,8 @@ mod tests { use { crate::{ bank::{ - epoch_accounts_hash_utils, Bank, BankTestConfig, EpochRewardStatus, - StartBlockHeightAndRewards, + epoch_accounts_hash_utils, test_utils as bank_test_utils, Bank, BankTestConfig, + EpochRewardStatus, StartBlockHeightAndRewards, }, genesis_utils::{activate_all_features, activate_feature}, runtime_config::RuntimeConfig, @@ -109,7 +109,7 @@ mod tests { // Create an account on a non-root fork let key1 = Keypair::new(); - bank1.deposit(&key1.pubkey(), 5).unwrap(); + bank_test_utils::deposit(&bank1, &key1.pubkey(), 5).unwrap(); // If setting an initial EAH, then the bank being snapshotted must be in the EAH calculation // window. Otherwise `bank_to_stream()` below will *not* include the EAH in the bank snapshot, @@ -123,11 +123,11 @@ mod tests { // Test new account let key2 = Keypair::new(); - bank2.deposit(&key2.pubkey(), 10).unwrap(); + bank_test_utils::deposit(&bank2, &key2.pubkey(), 10).unwrap(); assert_eq!(bank2.get_balance(&key2.pubkey()), 10); let key3 = Keypair::new(); - bank2.deposit(&key3.pubkey(), 0).unwrap(); + bank_test_utils::deposit(&bank2, &key3.pubkey(), 0).unwrap(); bank2.freeze(); bank2.squash(); diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 410d5afc3d61d1..ef3de51676f445 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -975,232 +975,6 @@ fn test_rent_distribution() { ); } -#[test] -fn test_distribute_rent_to_validators_overflow() { - solana_logger::setup(); - - // These values are taken from the real cluster (testnet) - const RENT_TO_BE_DISTRIBUTED: u64 = 120_525; - const VALIDATOR_STAKE: u64 = 374_999_998_287_840; - - let validator_pubkey = solana_sdk::pubkey::new_rand(); - let mut genesis_config = - create_genesis_config_with_leader(10, &validator_pubkey, VALIDATOR_STAKE).genesis_config; - - let bank = Bank::new_for_tests(&genesis_config); - let old_validator_lamports = bank.get_balance(&validator_pubkey); - bank.distribute_rent_to_validators(&bank.vote_accounts(), RENT_TO_BE_DISTRIBUTED); - let new_validator_lamports = bank.get_balance(&validator_pubkey); - assert_eq!( - new_validator_lamports, - old_validator_lamports + RENT_TO_BE_DISTRIBUTED - ); - - genesis_config - .accounts - .remove(&feature_set::no_overflow_rent_distribution::id()) - .unwrap(); - let bank = std::panic::AssertUnwindSafe(Bank::new_for_tests(&genesis_config)); - let old_validator_lamports = bank.get_balance(&validator_pubkey); - let new_validator_lamports = std::panic::catch_unwind(|| { - bank.distribute_rent_to_validators(&bank.vote_accounts(), RENT_TO_BE_DISTRIBUTED); - bank.get_balance(&validator_pubkey) - }); - - if let Ok(new_validator_lamports) = new_validator_lamports { - info!("asserting overflowing incorrect rent distribution"); - assert_ne!( - new_validator_lamports, - old_validator_lamports + RENT_TO_BE_DISTRIBUTED - ); - } else { - info!("NOT-asserting overflowing incorrect rent distribution"); - } -} - -#[test] -fn test_distribute_rent_to_validators_rent_paying() { - solana_logger::setup(); - - const RENT_PER_VALIDATOR: u64 = 55; - const TOTAL_RENT: u64 = RENT_PER_VALIDATOR * 4; - - let empty_validator = ValidatorVoteKeypairs::new_rand(); - let rent_paying_validator = ValidatorVoteKeypairs::new_rand(); - let becomes_rent_exempt_validator = ValidatorVoteKeypairs::new_rand(); - let rent_exempt_validator = ValidatorVoteKeypairs::new_rand(); - let keypairs = vec![ - &empty_validator, - &rent_paying_validator, - &becomes_rent_exempt_validator, - &rent_exempt_validator, - ]; - let genesis_config_info = create_genesis_config_with_vote_accounts( - sol_to_lamports(1000.), - &keypairs, - vec![sol_to_lamports(1000.); 4], - ); - let mut genesis_config = genesis_config_info.genesis_config; - genesis_config.rent = Rent::default(); // Ensure rent is non-zero, as genesis_utils sets Rent::free by default - - for deactivate_feature in [false, true] { - if deactivate_feature { - genesis_config - .accounts - .remove(&feature_set::prevent_rent_paying_rent_recipients::id()) - .unwrap(); - } - let bank = Bank::new_for_tests(&genesis_config); - let rent = bank.rent_collector().rent; - let rent_exempt_minimum = rent.minimum_balance(0); - - // Make one validator have an empty identity account - let mut empty_validator_account = bank - .get_account_with_fixed_root(&empty_validator.node_keypair.pubkey()) - .unwrap(); - empty_validator_account.set_lamports(0); - bank.store_account( - &empty_validator.node_keypair.pubkey(), - &empty_validator_account, - ); - - // Make one validator almost rent-exempt, less RENT_PER_VALIDATOR - let mut becomes_rent_exempt_validator_account = bank - .get_account_with_fixed_root(&becomes_rent_exempt_validator.node_keypair.pubkey()) - .unwrap(); - becomes_rent_exempt_validator_account - .set_lamports(rent_exempt_minimum - RENT_PER_VALIDATOR); - bank.store_account( - &becomes_rent_exempt_validator.node_keypair.pubkey(), - &becomes_rent_exempt_validator_account, - ); - - // Make one validator rent-exempt - let mut rent_exempt_validator_account = bank - .get_account_with_fixed_root(&rent_exempt_validator.node_keypair.pubkey()) - .unwrap(); - rent_exempt_validator_account.set_lamports(rent_exempt_minimum); - bank.store_account( - &rent_exempt_validator.node_keypair.pubkey(), - &rent_exempt_validator_account, - ); - - let get_rent_state = |bank: &Bank, address: &Pubkey| -> RentState { - let account = bank - .get_account_with_fixed_root(address) - .unwrap_or_default(); - RentState::from_account(&account, &rent) - }; - - // Assert starting RentStates - assert_eq!( - get_rent_state(&bank, &empty_validator.node_keypair.pubkey()), - RentState::Uninitialized - ); - assert_eq!( - get_rent_state(&bank, &rent_paying_validator.node_keypair.pubkey()), - RentState::RentPaying { - lamports: 42, - data_size: 0, - } - ); - assert_eq!( - get_rent_state(&bank, &becomes_rent_exempt_validator.node_keypair.pubkey()), - RentState::RentPaying { - lamports: rent_exempt_minimum - RENT_PER_VALIDATOR, - data_size: 0, - } - ); - assert_eq!( - get_rent_state(&bank, &rent_exempt_validator.node_keypair.pubkey()), - RentState::RentExempt - ); - - let old_empty_validator_lamports = bank.get_balance(&empty_validator.node_keypair.pubkey()); - let old_rent_paying_validator_lamports = - bank.get_balance(&rent_paying_validator.node_keypair.pubkey()); - let old_becomes_rent_exempt_validator_lamports = - bank.get_balance(&becomes_rent_exempt_validator.node_keypair.pubkey()); - let old_rent_exempt_validator_lamports = - bank.get_balance(&rent_exempt_validator.node_keypair.pubkey()); - - bank.distribute_rent_to_validators(&bank.vote_accounts(), TOTAL_RENT); - - let new_empty_validator_lamports = bank.get_balance(&empty_validator.node_keypair.pubkey()); - let new_rent_paying_validator_lamports = - bank.get_balance(&rent_paying_validator.node_keypair.pubkey()); - let new_becomes_rent_exempt_validator_lamports = - bank.get_balance(&becomes_rent_exempt_validator.node_keypair.pubkey()); - let new_rent_exempt_validator_lamports = - bank.get_balance(&rent_exempt_validator.node_keypair.pubkey()); - - // Assert ending balances; rent should be withheld if test is active and ending RentState - // is RentPaying, ie. empty_validator and rent_paying_validator - assert_eq!( - if deactivate_feature { - old_empty_validator_lamports + RENT_PER_VALIDATOR - } else { - old_empty_validator_lamports - }, - new_empty_validator_lamports - ); - - assert_eq!( - if deactivate_feature { - old_rent_paying_validator_lamports + RENT_PER_VALIDATOR - } else { - old_rent_paying_validator_lamports - }, - new_rent_paying_validator_lamports - ); - - assert_eq!( - old_becomes_rent_exempt_validator_lamports + RENT_PER_VALIDATOR, - new_becomes_rent_exempt_validator_lamports - ); - - assert_eq!( - old_rent_exempt_validator_lamports + RENT_PER_VALIDATOR, - new_rent_exempt_validator_lamports - ); - - // Assert ending RentStates - assert_eq!( - if deactivate_feature { - RentState::RentPaying { - lamports: RENT_PER_VALIDATOR, - data_size: 0, - } - } else { - RentState::Uninitialized - }, - get_rent_state(&bank, &empty_validator.node_keypair.pubkey()), - ); - assert_eq!( - if deactivate_feature { - RentState::RentPaying { - lamports: old_rent_paying_validator_lamports + RENT_PER_VALIDATOR, - data_size: 0, - } - } else { - RentState::RentPaying { - lamports: old_rent_paying_validator_lamports, - data_size: 0, - } - }, - get_rent_state(&bank, &rent_paying_validator.node_keypair.pubkey()), - ); - assert_eq!( - RentState::RentExempt, - get_rent_state(&bank, &becomes_rent_exempt_validator.node_keypair.pubkey()), - ); - assert_eq!( - RentState::RentExempt, - get_rent_state(&bank, &rent_exempt_validator.node_keypair.pubkey()), - ); - } -} - #[test] fn test_rent_exempt_executable_account() { let (mut genesis_config, mint_keypair) = create_genesis_config(100_000); @@ -2629,22 +2403,6 @@ fn test_transfer_to_sysvar() { assert_eq!(bank.get_balance(&sysvar_pubkey), 1_169_280); } -#[test] -fn test_bank_deposit() { - let bank = create_simple_test_bank(100); - - // Test new account - let key = solana_sdk::pubkey::new_rand(); - let new_balance = bank.deposit(&key, 10).unwrap(); - assert_eq!(new_balance, 10); - assert_eq!(bank.get_balance(&key), 10); - - // Existing account - let new_balance = bank.deposit(&key, 3).unwrap(); - assert_eq!(new_balance, 13); - assert_eq!(bank.get_balance(&key), 13); -} - #[test] fn test_bank_withdraw() { let bank = create_simple_test_bank(100); @@ -2656,7 +2414,7 @@ fn test_bank_withdraw() { Err(TransactionError::AccountNotFound) ); - bank.deposit(&key, 3).unwrap(); + test_utils::deposit(&bank, &key, 3).unwrap(); assert_eq!(bank.get_balance(&key), 3); // Low balance @@ -6674,7 +6432,7 @@ fn test_clean_nonrooted() { // Store some lamports in bank 1 let some_lamports = 123; let mut bank1 = Arc::new(Bank::new_from_parent(bank0.clone(), &Pubkey::default(), 1)); - bank1.deposit(&pubkey0, some_lamports).unwrap(); + test_utils::deposit(&bank1, &pubkey0, some_lamports).unwrap(); goto_end_of_slot(Arc::::get_mut(&mut bank1).unwrap()); bank1.freeze(); bank1.flush_accounts_cache_slot_for_tests(); @@ -6684,7 +6442,7 @@ fn test_clean_nonrooted() { // Store some lamports for pubkey1 in bank 2, root bank 2 // bank2's parent is bank0 let mut bank2 = Arc::new(Bank::new_from_parent(bank0, &Pubkey::default(), 2)); - bank2.deposit(&pubkey1, some_lamports).unwrap(); + test_utils::deposit(&bank2, &pubkey1, some_lamports).unwrap(); bank2.store_account(&pubkey0, &account_zero); goto_end_of_slot(Arc::::get_mut(&mut bank2).unwrap()); bank2.freeze(); @@ -6699,7 +6457,7 @@ fn test_clean_nonrooted() { bank2.clean_accounts_for_tests(); let mut bank3 = Arc::new(Bank::new_from_parent(bank2, &Pubkey::default(), 3)); - bank3.deposit(&pubkey1, some_lamports + 1).unwrap(); + test_utils::deposit(&bank3, &pubkey1, some_lamports + 1).unwrap(); goto_end_of_slot(Arc::::get_mut(&mut bank3).unwrap()); bank3.freeze(); bank3.squash(); @@ -6753,8 +6511,8 @@ fn test_shrink_candidate_slots_cached() { // Store some lamports in bank 1 let some_lamports = 123; let mut bank1 = Arc::new(new_from_parent(bank0)); - bank1.deposit(&pubkey1, some_lamports).unwrap(); - bank1.deposit(&pubkey2, some_lamports).unwrap(); + test_utils::deposit(&bank1, &pubkey1, some_lamports).unwrap(); + test_utils::deposit(&bank1, &pubkey2, some_lamports).unwrap(); goto_end_of_slot(Arc::::get_mut(&mut bank1).unwrap()); bank1.freeze(); bank1.squash(); @@ -6764,7 +6522,7 @@ fn test_shrink_candidate_slots_cached() { // Store some lamports for pubkey1 in bank 2, root bank 2 let mut bank2 = Arc::new(new_from_parent(bank1)); - bank2.deposit(&pubkey1, some_lamports).unwrap(); + test_utils::deposit(&bank2, &pubkey1, some_lamports).unwrap(); bank2.store_account(&pubkey0, &account0); goto_end_of_slot(Arc::::get_mut(&mut bank2).unwrap()); bank2.freeze(); @@ -6961,7 +6719,7 @@ fn test_add_builtin_account_inherited_cap_while_replacing() { assert_ne!(bank.capitalization(), bank.calculate_capitalization(true)); continue; } - bank.deposit(&program_id, 10).unwrap(); + test_utils::deposit(&bank, &program_id, 10).unwrap(); if pass == 2 { add_root_and_flush_write_cache(&bank); assert_eq!(bank.capitalization(), bank.calculate_capitalization(true)); @@ -6988,7 +6746,7 @@ fn test_add_builtin_account_squatted_while_not_replacing() { assert_ne!(bank.capitalization(), bank.calculate_capitalization(true)); continue; } - bank.deposit(&program_id, 10).unwrap(); + test_utils::deposit(&bank, &program_id, 10).unwrap(); if pass == 1 { add_root_and_flush_write_cache(&bank); assert_eq!(bank.capitalization(), bank.calculate_capitalization(true)); @@ -7111,7 +6869,7 @@ fn test_add_precompiled_account_inherited_cap_while_replacing() { assert_ne!(bank.capitalization(), bank.calculate_capitalization(true)); continue; } - bank.deposit(&program_id, 10).unwrap(); + test_utils::deposit(&bank, &program_id, 10).unwrap(); if pass == 2 { add_root_and_flush_write_cache(&bank); assert_eq!(bank.capitalization(), bank.calculate_capitalization(true)); @@ -7139,7 +6897,7 @@ fn test_add_precompiled_account_squatted_while_not_replacing() { assert_ne!(bank.capitalization(), bank.calculate_capitalization(true)); continue; } - bank.deposit(&program_id, 10).unwrap(); + test_utils::deposit(&bank, &program_id, 10).unwrap(); if pass == 1 { add_root_and_flush_write_cache(&bank); assert_eq!(bank.capitalization(), bank.calculate_capitalization(true)); @@ -7975,7 +7733,7 @@ fn test_compute_active_feature_set() { assert!(!feature_set.is_active(&test_feature)); // Depositing into the `test_feature` account should do nothing - bank.deposit(&test_feature, 42).unwrap(); + test_utils::deposit(&bank, &test_feature, 42).unwrap(); let (feature_set, new_activations) = bank.compute_active_feature_set(true); assert!(new_activations.is_empty()); assert!(!feature_set.is_active(&test_feature)); diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 4eeeb87e43420f..bd091f87a304cb 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -720,6 +720,10 @@ pub mod update_hashes_per_tick6 { solana_sdk::declare_id!("FKu1qYwLQSiehz644H6Si65U5ZQ2cp9GxsyFUfYcuADv"); } +pub mod validate_fee_collector_account { + solana_sdk::declare_id!("prpFrMtgNmzaNzkPJg9o753fVvbHKqNrNTm76foJ2wm"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -895,6 +899,7 @@ lazy_static! { (update_hashes_per_tick4::id(), "Update desired hashes per tick to 7.6M"), (update_hashes_per_tick5::id(), "Update desired hashes per tick to 9.2M"), (update_hashes_per_tick6::id(), "Update desired hashes per tick to 10M"), + (validate_fee_collector_account::id(), "validate fee collector account #33888"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() From 4f5340e2c00c916c36ed9ba498caf16f73273616 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 22:48:46 +0000 Subject: [PATCH 063/213] v1.17: expands transport configs in turbine QUIC endpoint (backport of #33864) (#33993) expands transport configs in turbine QUIC endpoint (#33864) (cherry picked from commit 783f13621412536c4445e34b4820fd4b4d05059e) Co-authored-by: behzad nouri --- turbine/src/quic_endpoint.rs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/turbine/src/quic_endpoint.rs b/turbine/src/quic_endpoint.rs index 326f409ae32405..e8a316420b42d8 100644 --- a/turbine/src/quic_endpoint.rs +++ b/turbine/src/quic_endpoint.rs @@ -5,7 +5,8 @@ use { log::error, quinn::{ ClientConfig, ConnectError, Connecting, Connection, ConnectionError, Endpoint, - EndpointConfig, SendDatagramError, ServerConfig, TokioRuntime, TransportConfig, VarInt, + EndpointConfig, IdleTimeout, SendDatagramError, ServerConfig, TokioRuntime, + TransportConfig, VarInt, }, rcgen::RcgenError, rustls::{Certificate, PrivateKey}, @@ -39,10 +40,17 @@ use { const CLIENT_CHANNEL_BUFFER: usize = 1 << 14; const ROUTER_CHANNEL_BUFFER: usize = 64; const CONNECTION_CACHE_CAPACITY: usize = 3072; -const INITIAL_MAXIMUM_TRANSMISSION_UNIT: u16 = 1280; const ALPN_TURBINE_PROTOCOL_ID: &[u8] = b"solana-turbine"; const CONNECT_SERVER_NAME: &str = "solana-turbine"; +// Transport config. +const DATAGRAM_RECEIVE_BUFFER_SIZE: usize = 256 * 1024 * 1024; +const DATAGRAM_SEND_BUFFER_SIZE: usize = 128 * 1024 * 1024; +const INITIAL_MAXIMUM_TRANSMISSION_UNIT: u16 = MINIMUM_MAXIMUM_TRANSMISSION_UNIT; +const KEEP_ALIVE_INTERVAL: Duration = Duration::from_secs(4); +const MAX_IDLE_TIMEOUT: Duration = Duration::from_secs(10); +const MINIMUM_MAXIMUM_TRANSMISSION_UNIT: u16 = 1280; + const CONNECTION_CLOSE_ERROR_CODE_SHUTDOWN: VarInt = VarInt::from_u32(1); const CONNECTION_CLOSE_ERROR_CODE_DROPPED: VarInt = VarInt::from_u32(2); const CONNECTION_CLOSE_ERROR_CODE_INVALID_IDENTITY: VarInt = VarInt::from_u32(3); @@ -173,11 +181,18 @@ fn new_client_config(cert: Certificate, key: PrivateKey) -> Result TransportConfig { + let max_idle_timeout = IdleTimeout::try_from(MAX_IDLE_TIMEOUT).unwrap(); let mut config = TransportConfig::default(); config + .datagram_receive_buffer_size(Some(DATAGRAM_RECEIVE_BUFFER_SIZE)) + .datagram_send_buffer_size(DATAGRAM_SEND_BUFFER_SIZE) + .initial_mtu(INITIAL_MAXIMUM_TRANSMISSION_UNIT) + .keep_alive_interval(Some(KEEP_ALIVE_INTERVAL)) .max_concurrent_bidi_streams(VarInt::from(0u8)) .max_concurrent_uni_streams(VarInt::from(0u8)) - .initial_mtu(INITIAL_MAXIMUM_TRANSMISSION_UNIT); + .max_idle_timeout(Some(max_idle_timeout)) + .min_mtu(MINIMUM_MAXIMUM_TRANSMISSION_UNIT) + .mtu_discovery_config(None); config } From 6209b3beead78bb8ac6b33cfbb9afd046036cd22 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 03:08:55 +0000 Subject: [PATCH 064/213] v1.17: adds keep-alive-interval to repair QUIC transport config (backport of #33866) (#33992) adds keep-alive-interval to repair QUIC transport config (#33866) QUIC connections may timeout due to infrequent repair requests. The commit configures keep_alive_interval and max_idle_timeout to avoid timeouts. (cherry picked from commit 3ac2507d36715579401270bbcec246cf494c6d44) Co-authored-by: behzad nouri --- core/src/repair/quic_endpoint.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/repair/quic_endpoint.rs b/core/src/repair/quic_endpoint.rs index 2c5e954a626c74..c6f2e00df53a26 100644 --- a/core/src/repair/quic_endpoint.rs +++ b/core/src/repair/quic_endpoint.rs @@ -6,8 +6,8 @@ use { log::error, quinn::{ ClientConfig, ConnectError, Connecting, Connection, ConnectionError, Endpoint, - EndpointConfig, ReadError, ReadToEndError, RecvStream, SendStream, ServerConfig, - TokioRuntime, TransportConfig, VarInt, WriteError, + EndpointConfig, IdleTimeout, ReadError, ReadToEndError, RecvStream, SendStream, + ServerConfig, TokioRuntime, TransportConfig, VarInt, WriteError, }, rcgen::RcgenError, rustls::{Certificate, PrivateKey}, @@ -46,7 +46,13 @@ const CONNECT_SERVER_NAME: &str = "solana-repair"; const CLIENT_CHANNEL_BUFFER: usize = 1 << 14; const ROUTER_CHANNEL_BUFFER: usize = 64; const CONNECTION_CACHE_CAPACITY: usize = 3072; + +// Transport config. +// Repair randomly samples peers, uses bi-directional streams and generally has +// low to moderate load and so is configured separately from other protocols. +const KEEP_ALIVE_INTERVAL: Duration = Duration::from_secs(4); const MAX_CONCURRENT_BIDI_STREAMS: VarInt = VarInt::from_u32(512); +const MAX_IDLE_TIMEOUT: Duration = Duration::from_secs(10); const CONNECTION_CLOSE_ERROR_CODE_SHUTDOWN: VarInt = VarInt::from_u32(1); const CONNECTION_CLOSE_ERROR_CODE_DROPPED: VarInt = VarInt::from_u32(2); @@ -195,11 +201,15 @@ fn new_client_config(cert: Certificate, key: PrivateKey) -> Result TransportConfig { + let max_idle_timeout = IdleTimeout::try_from(MAX_IDLE_TIMEOUT).unwrap(); let mut config = TransportConfig::default(); + // Disable datagrams and uni streams. config + .datagram_receive_buffer_size(None) + .keep_alive_interval(Some(KEEP_ALIVE_INTERVAL)) .max_concurrent_bidi_streams(MAX_CONCURRENT_BIDI_STREAMS) .max_concurrent_uni_streams(VarInt::from(0u8)) - .datagram_receive_buffer_size(None); + .max_idle_timeout(Some(max_idle_timeout)); config } From 956eacb23e872636abb7e265f16e2ebca955527e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 18:37:05 +0100 Subject: [PATCH 065/213] v1.17: Feature - Epoch boundary recompilation phase (backport of #33477) (#34003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feature - Epoch boundary recompilation phase (#33477) * Adds LoadedPrograms::upcoming_environments. * Moves LoadedPrograms::prune_feature_set_transition() into LoadedPrograms::prune(). * Adds parameter recompile to Bank::load_program(). * Sets latest_root_slot/epoch and environments in Bank::finish_init(). * Removes FEATURES_AFFECTING_RBPF list. * Adjusts test_feature_activation_loaded_programs_recompilation_phase(). (cherry picked from commit a9509f56b7897b08bcdd16d3a056257a7d396681) Co-authored-by: Alexander Meißner --- ledger-tool/src/program.rs | 2 +- program-runtime/src/loaded_programs.rs | 54 +++++---- runtime/src/bank.rs | 160 +++++++++++++++++-------- runtime/src/bank/metrics.rs | 2 + runtime/src/bank/tests.rs | 22 +--- 5 files changed, 150 insertions(+), 90 deletions(-) diff --git a/ledger-tool/src/program.rs b/ledger-tool/src/program.rs index 4acad738160be0..ba86b1de99584c 100644 --- a/ledger-tool/src/program.rs +++ b/ledger-tool/src/program.rs @@ -552,7 +552,7 @@ pub fn program(ledger_path: &Path, matches: &ArgMatches<'_>) { .clone(), ); for key in cached_account_keys { - loaded_programs.replenish(key, bank.load_program(&key, false)); + loaded_programs.replenish(key, bank.load_program(&key, false, None)); debug!("Loaded program {}", key); } invoke_context.programs_loaded_for_tx_batch = &loaded_programs; diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index b6772ecd5735e5..351652274b9f18 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -460,6 +460,14 @@ pub struct LoadedPrograms { pub latest_root_epoch: Epoch, /// Environments of the current epoch pub environments: ProgramRuntimeEnvironments, + /// Anticipated replacement for `environments` at the next epoch + /// + /// This is `None` during most of an epoch, and only `Some` around the boundaries (at the end and beginning of an epoch). + /// More precisely, it starts with the recompilation phase a few hundred slots before the epoch boundary, + /// and it ends with the first rerooting after the epoch boundary. + pub upcoming_environments: Option, + /// List of loaded programs which should be recompiled before the next epoch (but don't have to). + pub programs_to_recompile: Vec<(Pubkey, Arc)>, pub stats: Stats, pub fork_graph: Option>>, } @@ -471,6 +479,8 @@ impl Default for LoadedPrograms { latest_root_slot: 0, latest_root_epoch: 0, environments: ProgramRuntimeEnvironments::default(), + upcoming_environments: None, + programs_to_recompile: Vec::default(), stats: Stats::default(), fork_graph: None, } @@ -557,7 +567,12 @@ impl LoadedPrograms { } /// Returns the current environments depending on the given epoch - pub fn get_environments_for_epoch(&self, _epoch: Epoch) -> &ProgramRuntimeEnvironments { + pub fn get_environments_for_epoch(&self, epoch: Epoch) -> &ProgramRuntimeEnvironments { + if epoch != self.latest_root_epoch { + if let Some(upcoming_environments) = self.upcoming_environments.as_ref() { + return upcoming_environments; + } + } &self.environments } @@ -620,22 +635,6 @@ impl LoadedPrograms { entry } - /// On the epoch boundary this removes all programs of the outdated feature set - pub fn prune_feature_set_transition(&mut self) { - for second_level in self.entries.values_mut() { - second_level.retain(|entry| { - if Self::matches_environment(entry, &self.environments) { - return true; - } - self.stats - .prunes_environment - .fetch_add(1, Ordering::Relaxed); - false - }); - } - self.remove_programs_with_no_entries(); - } - pub fn prune_by_deployment_slot(&mut self, slot: Slot) { self.entries.retain(|_key, second_level| { *second_level = second_level @@ -658,6 +657,15 @@ impl LoadedPrograms { error!("Failed to lock fork graph for reading."); return; }; + let mut recompilation_phase_ends = false; + if self.latest_root_epoch != new_root_epoch { + self.latest_root_epoch = new_root_epoch; + if let Some(upcoming_environments) = self.upcoming_environments.take() { + recompilation_phase_ends = true; + self.environments = upcoming_environments; + self.programs_to_recompile.clear(); + } + } for second_level in self.entries.values_mut() { // Remove entries un/re/deployed on orphan forks let mut first_ancestor_found = false; @@ -687,6 +695,15 @@ impl LoadedPrograms { return false; } } + // Remove outdated environment of previous feature set + if recompilation_phase_ends + && !Self::matches_environment(entry, &self.environments) + { + self.stats + .prunes_environment + .fetch_add(1, Ordering::Relaxed); + return false; + } true }) .cloned() @@ -696,9 +713,6 @@ impl LoadedPrograms { self.remove_programs_with_no_entries(); debug_assert!(self.latest_root_slot <= new_root_slot); self.latest_root_slot = new_root_slot; - if self.latest_root_epoch < new_root_epoch { - self.latest_root_epoch = new_root_epoch; - } } fn matches_environment( diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 7a4a7e8311ff2a..c0170ae113f94e 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -100,6 +100,7 @@ use { }, solana_bpf_loader_program::syscalls::create_program_runtime_environment_v1, solana_cost_model::cost_tracker::CostTracker, + solana_loader_v4_program::create_program_runtime_environment_v2, solana_measure::{measure, measure::Measure, measure_us}, solana_perf::perf_libs, solana_program_runtime::{ @@ -1434,11 +1435,10 @@ impl Bank { }); // Following code may touch AccountsDb, requiring proper ancestors - let parent_epoch = parent.epoch(); let (_, update_epoch_time_us) = measure_us!({ - if parent_epoch < new.epoch() { + if parent.epoch() < new.epoch() { new.process_new_epoch( - parent_epoch, + parent.epoch(), parent.slot(), parent.block_height(), reward_calc_tracer, @@ -1453,11 +1453,71 @@ impl Bank { } }); + let (_, recompilation_time_us) = measure_us!({ + // Recompile loaded programs one at a time before the next epoch hits + let (_epoch, slot_index) = new.get_epoch_and_slot_index(new.slot()); + let slots_in_epoch = new.get_slots_in_epoch(new.epoch()); + let slots_in_recompilation_phase = + (solana_program_runtime::loaded_programs::MAX_LOADED_ENTRY_COUNT as u64) + .min(slots_in_epoch) + .checked_div(2) + .unwrap(); + let mut loaded_programs_cache = new.loaded_programs_cache.write().unwrap(); + if loaded_programs_cache.upcoming_environments.is_some() { + if let Some((key, program_to_recompile)) = + loaded_programs_cache.programs_to_recompile.pop() + { + drop(loaded_programs_cache); + let recompiled = new.load_program(&key, false, Some(program_to_recompile)); + let mut loaded_programs_cache = new.loaded_programs_cache.write().unwrap(); + loaded_programs_cache.replenish(key, recompiled); + } + } else if new.epoch() != loaded_programs_cache.latest_root_epoch + || slot_index.saturating_add(slots_in_recompilation_phase) >= slots_in_epoch + { + // Anticipate the upcoming program runtime environment for the next epoch, + // so we can try to recompile loaded programs before the feature transition hits. + drop(loaded_programs_cache); + let (feature_set, _new_feature_activations) = new.compute_active_feature_set(true); + let mut loaded_programs_cache = new.loaded_programs_cache.write().unwrap(); + let program_runtime_environment_v1 = create_program_runtime_environment_v1( + &feature_set, + &new.runtime_config.compute_budget.unwrap_or_default(), + false, /* deployment */ + false, /* debugging_features */ + ) + .unwrap(); + let program_runtime_environment_v2 = create_program_runtime_environment_v2( + &new.runtime_config.compute_budget.unwrap_or_default(), + false, /* debugging_features */ + ); + let mut upcoming_environments = loaded_programs_cache.environments.clone(); + let changed_program_runtime_v1 = + *upcoming_environments.program_runtime_v1 != program_runtime_environment_v1; + let changed_program_runtime_v2 = + *upcoming_environments.program_runtime_v2 != program_runtime_environment_v2; + if changed_program_runtime_v1 { + upcoming_environments.program_runtime_v1 = + Arc::new(program_runtime_environment_v1); + } + if changed_program_runtime_v2 { + upcoming_environments.program_runtime_v2 = + Arc::new(program_runtime_environment_v2); + } + loaded_programs_cache.upcoming_environments = Some(upcoming_environments); + loaded_programs_cache.programs_to_recompile = loaded_programs_cache + .get_entries_sorted_by_tx_usage( + changed_program_runtime_v1, + changed_program_runtime_v2, + ); + } + }); + // Update sysvars before processing transactions let (_, update_sysvars_time_us) = measure_us!({ new.update_slot_hashes(); - new.update_stake_history(Some(parent_epoch)); - new.update_clock(Some(parent_epoch)); + new.update_stake_history(Some(parent.epoch())); + new.update_clock(Some(parent.epoch())); new.update_fees(); new.update_last_restart_slot() }); @@ -1485,6 +1545,7 @@ impl Bank { feature_set_time_us, ancestors_time_us, update_epoch_time_us, + recompilation_time_us, update_sysvars_time_us, fill_sysvar_cache_time_us, }, @@ -4619,16 +4680,25 @@ impl Bank { ProgramAccountLoadResult::InvalidAccountData } - pub fn load_program(&self, pubkey: &Pubkey, reload: bool) -> Arc { + pub fn load_program( + &self, + pubkey: &Pubkey, + reload: bool, + recompile: Option>, + ) -> Arc { let loaded_programs_cache = self.loaded_programs_cache.read().unwrap(); - let environments = loaded_programs_cache.get_environments_for_epoch(self.epoch); - + let effective_epoch = if recompile.is_some() { + loaded_programs_cache.latest_root_epoch.saturating_add(1) + } else { + self.epoch + }; + let environments = loaded_programs_cache.get_environments_for_epoch(effective_epoch); let mut load_program_metrics = LoadProgramMetrics { program_id: pubkey.to_string(), ..LoadProgramMetrics::default() }; - let loaded_program = match self.load_program_accounts(pubkey) { + let mut loaded_program = match self.load_program_accounts(pubkey) { ProgramAccountLoadResult::AccountNotFound => Ok(LoadedProgram::new_tombstone( self.slot, LoadedProgramType::Closed, @@ -4735,6 +4805,16 @@ impl Bank { let mut timings = ExecuteDetailsTimings::default(); load_program_metrics.submit_datapoint(&mut timings); + if let Some(recompile) = recompile { + loaded_program.effective_slot = loaded_program.effective_slot.max( + self.epoch_schedule() + .get_first_slot_in_epoch(effective_epoch), + ); + loaded_program.tx_usage_counter = + AtomicU64::new(recompile.tx_usage_counter.load(Ordering::Relaxed)); + loaded_program.ix_usage_counter = + AtomicU64::new(recompile.ix_usage_counter.load(Ordering::Relaxed)); + } Arc::new(loaded_program) } @@ -5003,7 +5083,7 @@ impl Bank { let missing_programs: Vec<(Pubkey, Arc)> = missing .iter() .map(|(key, count)| { - let program = self.load_program(key, false); + let program = self.load_program(key, false, None); program.tx_usage_counter.store(*count, Ordering::Relaxed); (*key, program) }) @@ -5013,7 +5093,7 @@ impl Bank { let unloaded_programs: Vec<(Pubkey, Arc)> = unloaded .iter() .map(|(key, count)| { - let program = self.load_program(key, true); + let program = self.load_program(key, true, None); program.tx_usage_counter.store(*count, Ordering::Relaxed); (*key, program) }) @@ -6565,6 +6645,24 @@ impl Bank { } } + let mut loaded_programs_cache = self.loaded_programs_cache.write().unwrap(); + loaded_programs_cache.latest_root_slot = self.slot(); + loaded_programs_cache.latest_root_epoch = self.epoch(); + loaded_programs_cache.environments.program_runtime_v1 = Arc::new( + create_program_runtime_environment_v1( + &self.feature_set, + &self.runtime_config.compute_budget.unwrap_or_default(), + false, /* deployment */ + false, /* debugging_features */ + ) + .unwrap(), + ); + loaded_programs_cache.environments.program_runtime_v2 = + Arc::new(create_program_runtime_environment_v2( + &self.runtime_config.compute_budget.unwrap_or_default(), + false, /* debugging_features */ + )); + if self .feature_set .is_active(&feature_set::cap_accounts_data_len::id()) @@ -7912,46 +8010,6 @@ impl Bank { only_apply_transitions_for_new_features: bool, new_feature_activations: &HashSet, ) { - const FEATURES_AFFECTING_RBPF: &[Pubkey] = &[ - feature_set::error_on_syscall_bpf_function_hash_collisions::id(), - feature_set::reject_callx_r10::id(), - feature_set::switch_to_new_elf_parser::id(), - feature_set::bpf_account_data_direct_mapping::id(), - feature_set::enable_alt_bn128_syscall::id(), - feature_set::enable_alt_bn128_compression_syscall::id(), - feature_set::enable_big_mod_exp_syscall::id(), - feature_set::blake3_syscall_enabled::id(), - feature_set::curve25519_syscall_enabled::id(), - feature_set::disable_fees_sysvar::id(), - feature_set::enable_partitioned_epoch_reward::id(), - feature_set::disable_deploy_of_alloc_free_syscall::id(), - feature_set::last_restart_slot_sysvar::id(), - feature_set::remaining_compute_units_syscall_enabled::id(), - ]; - if !only_apply_transitions_for_new_features - || FEATURES_AFFECTING_RBPF - .iter() - .any(|key| new_feature_activations.contains(key)) - { - let program_runtime_environment_v1 = create_program_runtime_environment_v1( - &self.feature_set, - &self.runtime_config.compute_budget.unwrap_or_default(), - false, /* deployment */ - false, /* debugging_features */ - ) - .unwrap(); - let mut loaded_programs_cache = self.loaded_programs_cache.write().unwrap(); - loaded_programs_cache.environments.program_runtime_v1 = - Arc::new(program_runtime_environment_v1); - let program_runtime_environment_v2 = - solana_loader_v4_program::create_program_runtime_environment_v2( - &self.runtime_config.compute_budget.unwrap_or_default(), - false, /* debugging_features */ - ); - loaded_programs_cache.environments.program_runtime_v2 = - Arc::new(program_runtime_environment_v2); - loaded_programs_cache.prune_feature_set_transition(); - } for builtin in BUILTINS.iter() { if let Some(feature_id) = builtin.feature_id { let should_apply_action_for_feature_transition = diff --git a/runtime/src/bank/metrics.rs b/runtime/src/bank/metrics.rs index 1fa33b2e7f92ee..ccf8c4837761db 100644 --- a/runtime/src/bank/metrics.rs +++ b/runtime/src/bank/metrics.rs @@ -39,6 +39,7 @@ pub(crate) struct NewBankTimings { pub(crate) feature_set_time_us: u64, pub(crate) ancestors_time_us: u64, pub(crate) update_epoch_time_us: u64, + pub(crate) recompilation_time_us: u64, pub(crate) update_sysvars_time_us: u64, pub(crate) fill_sysvar_cache_time_us: u64, } @@ -144,6 +145,7 @@ pub(crate) fn report_new_bank_metrics( ("feature_set_us", timings.feature_set_time_us, i64), ("ancestors_us", timings.ancestors_time_us, i64), ("update_epoch_us", timings.update_epoch_time_us, i64), + ("recompilation_time_us", timings.recompilation_time_us, i64), ("update_sysvars_us", timings.update_sysvars_time_us, i64), ( "fill_sysvar_cache_us", diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index ef3de51676f445..e8d9daf3e44339 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -7,9 +7,7 @@ use { *, }, crate::{ - accounts_background_service::{ - AbsRequestSender, PrunedBanksRequestHandler, SendDroppedBankCallback, - }, + accounts_background_service::{PrunedBanksRequestHandler, SendDroppedBankCallback}, bank_client::BankClient, bank_forks::BankForks, epoch_rewards_hasher::hash_rewards_into_partitions, @@ -6988,7 +6986,7 @@ fn test_bank_load_program() { programdata_account.set_rent_epoch(1); bank.store_account_and_update_capitalization(&key1, &program_account); bank.store_account_and_update_capitalization(&programdata_key, &programdata_account); - let program = bank.load_program(&key1, false); + let program = bank.load_program(&key1, false, None); assert_matches!(program.program, LoadedProgramType::LegacyV1(_)); assert_eq!( program.account_size, @@ -7143,7 +7141,7 @@ fn test_bpf_loader_upgradeable_deploy_with_max_len() { assert_eq!(*elf.get(i).unwrap(), *byte); } - let loaded_program = bank.load_program(&program_keypair.pubkey(), false); + let loaded_program = bank.load_program(&program_keypair.pubkey(), false, None); // Invoke deployed program mock_process_instruction( @@ -11890,7 +11888,7 @@ fn test_is_in_slot_hashes_history() { } #[test] -fn test_runtime_feature_enable_with_program_cache() { +fn test_feature_activation_loaded_programs_recompilation_phase() { solana_logger::setup(); // Bank Setup @@ -11956,19 +11954,7 @@ fn test_runtime_feature_enable_with_program_cache() { &feature::create_account(&Feature { activated_at: None }, feature_account_balance), ); - // Reroot to call LoadedPrograms::prune() and end the current recompilation phase goto_end_of_slot(&bank); - bank_forks - .write() - .unwrap() - .insert(Arc::into_inner(bank).unwrap()); - let bank = bank_forks.read().unwrap().working_bank(); - bank_forks.read().unwrap().prune_program_cache(bank.slot); - bank_forks - .write() - .unwrap() - .set_root(bank.slot, &AbsRequestSender::default(), None); - // Advance to next epoch, which starts the next recompilation phase let bank = new_from_parent_next_epoch(bank, 1); From 7089f1ed477c3d3d8d39d91b1c543302f947d57d Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 13:34:35 -0600 Subject: [PATCH 066/213] v1.17: Add --release-with-debug option to cargo-install-all.sh (backport of #33383) (#33978) Add --release-with-debug option to cargo-install-all.sh (#33383) * Add --canary option to cargo-install-all for building with separate debug symbols * lint * Remove debug-assertions * switch flag from --canary to --release-with-debug (cherry picked from commit 87b4dc64e3fc8026515e4186c92ff4325e2ab5a7) Co-authored-by: Will Hickey --- scripts/cargo-install-all.sh | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/scripts/cargo-install-all.sh b/scripts/cargo-install-all.sh index 583ba6508f917d..4aceef69a4fe73 100755 --- a/scripts/cargo-install-all.sh +++ b/scripts/cargo-install-all.sh @@ -28,22 +28,29 @@ usage() { echo "Error: $*" fi cat <] [--debug] [--validator-only] +usage: $0 [+] [--debug] [--validator-only] [--release-with-debug] EOF exit $exitcode } maybeRustVersion= installDir= -buildVariant=release -maybeReleaseFlag=--release +# buildProfileArg and buildProfile duplicate some information because cargo +# doesn't allow '--profile debug' but we still need to know that the binaries +# will be in target/debug +buildProfileArg='--profile release' +buildProfile='release' validatorOnly= while [[ -n $1 ]]; do if [[ ${1:0:1} = - ]]; then if [[ $1 = --debug ]]; then - maybeReleaseFlag= - buildVariant=debug + buildProfileArg= # the default cargo profile is 'debug' + buildProfile='debug' + shift + elif [[ $1 = --release-with-debug ]]; then + buildProfileArg='--profile release-with-debug' + buildProfile='release-with-debug' shift elif [[ $1 = --validator-only ]]; then validatorOnly=true @@ -68,7 +75,7 @@ fi installDir="$(mkdir -p "$installDir"; cd "$installDir"; pwd)" mkdir -p "$installDir/bin/deps" -echo "Install location: $installDir ($buildVariant)" +echo "Install location: $installDir ($buildProfile)" cd "$(dirname "$0")"/.. @@ -138,7 +145,7 @@ mkdir -p "$installDir/bin" ( set -x # shellcheck disable=SC2086 # Don't want to double quote $rust_version - "$cargo" $maybeRustVersion build $maybeReleaseFlag "${binArgs[@]}" + "$cargo" $maybeRustVersion build $buildProfileArg "${binArgs[@]}" # Exclude `spl-token` binary for net.sh builds if [[ -z "$validatorOnly" ]]; then @@ -152,7 +159,7 @@ mkdir -p "$installDir/bin" ) for bin in "${BINS[@]}"; do - cp -fv "target/$buildVariant/$bin" "$installDir"/bin + cp -fv "target/$buildProfile/$bin" "$installDir"/bin done if [[ -d target/perf-libs ]]; then @@ -206,7 +213,7 @@ fi set -x # deps dir can be empty shopt -s nullglob - for dep in target/"$buildVariant"/deps/libsolana*program.*; do + for dep in target/"$buildProfile"/deps/libsolana*program.*; do cp -fv "$dep" "$installDir/bin/deps" done ) From 99e83102d1921a45a284b9e23331441bae591e9b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 11 Nov 2023 23:03:13 +0800 Subject: [PATCH 067/213] v1.17: ci: add the ability to use GCS backend for sccache (backport of #33967) (#33984) ci: add the ability to use GCS backend for sccache (#33967) (cherry picked from commit 5efba1fb3a9fc6653c7c17142df1283747688889) Co-authored-by: Yihau Chen --- .buildkite/hooks/pre-command | 8 +++++++- ci/docker-run.sh | 30 ++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/.buildkite/hooks/pre-command b/.buildkite/hooks/pre-command index 025b228f8579de..4c798a83d36889 100644 --- a/.buildkite/hooks/pre-command +++ b/.buildkite/hooks/pre-command @@ -28,5 +28,11 @@ fi export SBF_TOOLS_VERSION -SCCACHE_S3_KEY_PREFIX="${rust_stable}_${rust_nightly}_${SBF_TOOLS_VERSION}" +SCCACHE_KEY_PREFIX="${rust_stable}_${rust_nightly}_${SBF_TOOLS_VERSION}" +export SCCACHE_KEY_PREFIX + +SCCACHE_S3_KEY_PREFIX="$SCCACHE_KEY_PREFIX" export SCCACHE_S3_KEY_PREFIX + +SCCACHE_GCS_KEY_PREFIX="$SCCACHE_KEY_PREFIX" +export SCCACHE_GCS_KEY_PREFIX diff --git a/ci/docker-run.sh b/ci/docker-run.sh index eb9d06836f692a..aa39a3c844e848 100755 --- a/ci/docker-run.sh +++ b/ci/docker-run.sh @@ -54,16 +54,34 @@ if [[ -n $CI ]]; then # sccache-related bugs echo "--- $0 ... (with sccache being DISABLED due to many (${BUILDKITE_RETRY_COUNT}) retries)" else - echo "--- $0 ... (with sccache enabled with prefix: $SCCACHE_S3_KEY_PREFIX)" + echo "--- $0 ... (with sccache enabled with prefix: $SCCACHE_KEY_PREFIX)" + # sccache ARGS+=( --env "RUSTC_WRAPPER=/usr/local/cargo/bin/sccache" - --env AWS_ACCESS_KEY_ID - --env AWS_SECRET_ACCESS_KEY - --env SCCACHE_BUCKET - --env SCCACHE_REGION - --env SCCACHE_S3_KEY_PREFIX ) + + # s3 + if [ -n "$AWS_ACCESS_KEY_ID" ]; then + ARGS+=( + --env AWS_ACCESS_KEY_ID + --env AWS_SECRET_ACCESS_KEY + --env SCCACHE_BUCKET + --env SCCACHE_REGION + --env SCCACHE_S3_KEY_PREFIX + ) + fi + + # gcs + if [ -n "$SCCACHE_GCS_KEY_PATH" ]; then + ARGS+=( + --env SCCACHE_GCS_KEY_PATH + --volume "$SCCACHE_GCS_KEY_PATH:$SCCACHE_GCS_KEY_PATH" + --env SCCACHE_GCS_BUCKET + --env SCCACHE_GCS_RW_MODE + --env SCCACHE_GCS_KEY_PREFIX + ) + fi fi fi else From 6418bf3097494aac24056e5f57ebcc876116268a Mon Sep 17 00:00:00 2001 From: Yihau Chen Date: Sun, 12 Nov 2023 23:47:59 +0800 Subject: [PATCH 068/213] Bump version to v1.17.6 (#34025) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cbcc732ddf2148..0107f4a7977910 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.5" +version = "1.17.6" dependencies = [ "regex", ] @@ -4065,7 +4065,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.5" +version = "1.17.6" dependencies = [ "protobuf-src", "tonic-build", @@ -4308,7 +4308,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.5" +version = "1.17.6" [[package]] name = "rcgen" @@ -5098,7 +5098,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.5" +version = "1.17.6" dependencies = [ "Inflector", "assert_matches", @@ -5122,7 +5122,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 2.33.3", "log", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 2.33.3", "log", @@ -5166,7 +5166,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.5" +version = "1.17.6" dependencies = [ "arrayref", "assert_matches", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "bytemuck", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -5260,7 +5260,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5284,7 +5284,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5301,7 +5301,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.5" +version = "1.17.6" dependencies = [ "serde", "solana-sdk", @@ -5310,7 +5310,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "crossbeam-channel", @@ -5328,7 +5328,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5339,7 +5339,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5380,7 +5380,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bv", "fnv", @@ -5397,7 +5397,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -5417,7 +5417,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -5428,7 +5428,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bv", "bytemuck", @@ -5447,7 +5447,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "solana-logger", @@ -5455,7 +5455,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_cmd", "bzip2", @@ -5476,11 +5476,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.5" +version = "1.17.6" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.5" +version = "1.17.6" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5491,7 +5491,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "chrono", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "chrono", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -5579,7 +5579,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.5" +version = "1.17.6" dependencies = [ "anyhow", "dirs-next", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.5" +version = "1.17.6" dependencies = [ "Inflector", "base64 0.21.4", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-trait", "bincode", @@ -5652,7 +5652,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.5" +version = "1.17.6" dependencies = [ "futures-util", "rand 0.8.5", @@ -5682,7 +5682,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5690,7 +5690,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "chrono", @@ -5703,7 +5703,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-trait", "bincode", @@ -5727,7 +5727,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5810,7 +5810,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.5" +version = "1.17.6" dependencies = [ "lazy_static", "log", @@ -5835,7 +5835,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "clap 3.2.23", @@ -5865,7 +5865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "console", "indicatif", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5888,7 +5888,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -5910,7 +5910,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "byteorder", @@ -5932,7 +5932,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.5" +version = "1.17.6" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5962,7 +5962,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.5" +version = "1.17.6" dependencies = [ "proc-macro2", "quote", @@ -5972,7 +5972,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.5" +version = "1.17.6" dependencies = [ "base64 0.21.4", "bincode", @@ -5997,7 +5997,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "solana-accounts-db", @@ -6008,7 +6008,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "solana-sdk", @@ -6018,7 +6018,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bs58", "crossbeam-channel", @@ -6043,7 +6043,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -6094,7 +6094,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.5" +version = "1.17.6" dependencies = [ "atty", "bincode", @@ -6129,7 +6129,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bs58", "clap 3.2.23", @@ -6146,7 +6146,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -6214,7 +6214,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_cmd", "bs58", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "log", @@ -6275,7 +6275,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6314,7 +6314,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.5" +version = "1.17.6" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6326,7 +6326,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.5" +version = "1.17.6" dependencies = [ "env_logger", "lazy_static", @@ -6335,7 +6335,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "solana-sdk", @@ -6343,11 +6343,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.5" +version = "1.17.6" [[package]] name = "solana-merkle-root-bench" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 2.33.3", "log", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.5" +version = "1.17.6" dependencies = [ "fast-math", "hex", @@ -6369,7 +6369,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.5" +version = "1.17.6" dependencies = [ "crossbeam-channel", "env_logger", @@ -6385,7 +6385,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6396,7 +6396,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "clap 3.2.23", @@ -6416,7 +6416,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "reqwest", @@ -6426,7 +6426,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.5" +version = "1.17.6" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6457,7 +6457,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -6478,7 +6478,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 3.2.23", "log", @@ -6493,7 +6493,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "anyhow", "ark-bn254", @@ -6550,7 +6550,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "async-trait", @@ -6608,7 +6608,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "anyhow", "crossbeam-channel", @@ -6632,7 +6632,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-mutex", "async-trait", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.5" +version = "1.17.6" dependencies = [ "lazy_static", "num_cpus", @@ -6668,7 +6668,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "console", @@ -6687,7 +6687,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.5" +version = "1.17.6" dependencies = [ "base64 0.21.4", "bincode", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "async-trait", @@ -6775,7 +6775,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.5" +version = "1.17.6" dependencies = [ "base64 0.21.4", "bs58", @@ -6795,7 +6795,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "anyhow", "clap 2.33.3", @@ -6812,7 +6812,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "bs58", @@ -6839,7 +6839,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.5" +version = "1.17.6" dependencies = [ "arrayref", "assert_matches", @@ -6922,7 +6922,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.5" +version = "1.17.6" dependencies = [ "anyhow", "assert_matches", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bs58", "proc-macro2", @@ -6991,7 +6991,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.5" +version = "1.17.6" dependencies = [ "crossbeam-channel", "log", @@ -7006,7 +7006,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7022,7 +7022,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -7039,7 +7039,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.5" +version = "1.17.6" dependencies = [ "backoff", "bincode", @@ -7071,7 +7071,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "bs58", @@ -7087,7 +7087,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 2.33.3", "log", @@ -7099,7 +7099,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "async-channel", @@ -7131,7 +7131,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -7145,7 +7145,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.5" +version = "1.17.6" dependencies = [ "base64 0.21.4", "bincode", @@ -7175,7 +7175,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "log", @@ -7189,7 +7189,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -7222,7 +7222,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-trait", "bincode", @@ -7244,7 +7244,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "clap 2.33.3", @@ -7271,7 +7271,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.5" +version = "1.17.6" dependencies = [ "Inflector", "base64 0.21.4", @@ -7294,7 +7294,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -7331,7 +7331,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-trait", "solana-connection-cache", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.5" +version = "1.17.6" dependencies = [ "serde_json", "solana-metrics", @@ -7352,7 +7352,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.5" +version = "1.17.6" dependencies = [ "chrono", "clap 2.33.3", @@ -7416,7 +7416,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "rustc_version 0.4.0", @@ -7430,7 +7430,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "crossbeam-channel", @@ -7449,7 +7449,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -7472,7 +7472,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 2.33.3", "humantime", @@ -7491,7 +7491,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bs58", "clap 3.2.23", @@ -7510,7 +7510,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bytemuck", "criterion", @@ -7524,7 +7524,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7536,7 +7536,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.5" +version = "1.17.6" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 1b3a1f01cd8de2..4bad24708056f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.5" +version = "1.17.6" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.5" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.5" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.5" } -solana-banks-client = { path = "banks-client", version = "=1.17.5" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.5" } -solana-banks-server = { path = "banks-server", version = "=1.17.5" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.5" } -solana-bloom = { path = "bloom", version = "=1.17.5" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.5" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.5" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.5", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.5" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.5" } -solana-cli = { path = "cli", version = "=1.17.5" } -solana-cli-config = { path = "cli-config", version = "=1.17.5" } -solana-cli-output = { path = "cli-output", version = "=1.17.5" } -solana-client = { path = "client", version = "=1.17.5" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.5" } -solana-config-program = { path = "programs/config", version = "=1.17.5" } -solana-core = { path = "core", version = "=1.17.5" } -solana-cost-model = { path = "cost-model", version = "=1.17.5" } -solana-download-utils = { path = "download-utils", version = "=1.17.5" } -solana-entry = { path = "entry", version = "=1.17.5" } -solana-faucet = { path = "faucet", version = "=1.17.5" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.5" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.5" } -solana-genesis = { path = "genesis", version = "=1.17.5" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.5" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.5" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.5" } -solana-gossip = { path = "gossip", version = "=1.17.5" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.5" } -solana-ledger = { path = "ledger", version = "=1.17.5" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.5" } -solana-logger = { path = "logger", version = "=1.17.5" } -solana-measure = { path = "measure", version = "=1.17.5" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.5" } -solana-metrics = { path = "metrics", version = "=1.17.5" } -solana-net-utils = { path = "net-utils", version = "=1.17.5" } -solana-notifier = { path = "notifier", version = "=1.17.5" } -solana-perf = { path = "perf", version = "=1.17.5" } -solana-poh = { path = "poh", version = "=1.17.5" } -solana-program = { path = "sdk/program", version = "=1.17.5" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.5" } -solana-program-test = { path = "program-test", version = "=1.17.5" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.5" } -solana-quic-client = { path = "quic-client", version = "=1.17.5" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.5" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.5", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.5" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.5", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.5" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.5" } -solana-runtime = { path = "runtime", version = "=1.17.5" } -solana-sdk = { path = "sdk", version = "=1.17.5" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.5" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.5" } -solana-stake-program = { path = "programs/stake", version = "=1.17.5" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.5" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.5" } -solana-streamer = { path = "streamer", version = "=1.17.5" } -solana-system-program = { path = "programs/system", version = "=1.17.5" } -solana-test-validator = { path = "test-validator", version = "=1.17.5" } -solana-thin-client = { path = "thin-client", version = "=1.17.5" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.5", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.5" } -solana-turbine = { path = "turbine", version = "=1.17.5" } -solana-udp-client = { path = "udp-client", version = "=1.17.5" } -solana-version = { path = "version", version = "=1.17.5" } -solana-vote = { path = "vote", version = "=1.17.5" } -solana-vote-program = { path = "programs/vote", version = "=1.17.5" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.5" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.5" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.5" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.6" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.6" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.6" } +solana-banks-client = { path = "banks-client", version = "=1.17.6" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.6" } +solana-banks-server = { path = "banks-server", version = "=1.17.6" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.6" } +solana-bloom = { path = "bloom", version = "=1.17.6" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.6" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.6" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.6", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.6" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.6" } +solana-cli = { path = "cli", version = "=1.17.6" } +solana-cli-config = { path = "cli-config", version = "=1.17.6" } +solana-cli-output = { path = "cli-output", version = "=1.17.6" } +solana-client = { path = "client", version = "=1.17.6" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.6" } +solana-config-program = { path = "programs/config", version = "=1.17.6" } +solana-core = { path = "core", version = "=1.17.6" } +solana-cost-model = { path = "cost-model", version = "=1.17.6" } +solana-download-utils = { path = "download-utils", version = "=1.17.6" } +solana-entry = { path = "entry", version = "=1.17.6" } +solana-faucet = { path = "faucet", version = "=1.17.6" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.6" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.6" } +solana-genesis = { path = "genesis", version = "=1.17.6" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.6" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.6" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.6" } +solana-gossip = { path = "gossip", version = "=1.17.6" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.6" } +solana-ledger = { path = "ledger", version = "=1.17.6" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.6" } +solana-logger = { path = "logger", version = "=1.17.6" } +solana-measure = { path = "measure", version = "=1.17.6" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.6" } +solana-metrics = { path = "metrics", version = "=1.17.6" } +solana-net-utils = { path = "net-utils", version = "=1.17.6" } +solana-notifier = { path = "notifier", version = "=1.17.6" } +solana-perf = { path = "perf", version = "=1.17.6" } +solana-poh = { path = "poh", version = "=1.17.6" } +solana-program = { path = "sdk/program", version = "=1.17.6" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.6" } +solana-program-test = { path = "program-test", version = "=1.17.6" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.6" } +solana-quic-client = { path = "quic-client", version = "=1.17.6" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.6" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.6", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.6" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.6", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.6" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.6" } +solana-runtime = { path = "runtime", version = "=1.17.6" } +solana-sdk = { path = "sdk", version = "=1.17.6" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.6" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.6" } +solana-stake-program = { path = "programs/stake", version = "=1.17.6" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.6" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.6" } +solana-streamer = { path = "streamer", version = "=1.17.6" } +solana-system-program = { path = "programs/system", version = "=1.17.6" } +solana-test-validator = { path = "test-validator", version = "=1.17.6" } +solana-thin-client = { path = "thin-client", version = "=1.17.6" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.6", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.6" } +solana-turbine = { path = "turbine", version = "=1.17.6" } +solana-udp-client = { path = "udp-client", version = "=1.17.6" } +solana-version = { path = "version", version = "=1.17.6" } +solana-vote = { path = "vote", version = "=1.17.6" } +solana-vote-program = { path = "programs/vote", version = "=1.17.6" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.6" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.6" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.6" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 81ba8df4cb28bc..6bb6f4c9212cf9 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.5" +version = "1.17.6" dependencies = [ "Inflector", "base64 0.21.4", @@ -4468,7 +4468,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.5" +version = "1.17.6" dependencies = [ "arrayref", "bincode", @@ -4525,7 +4525,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "bytemuck", @@ -4544,7 +4544,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4559,7 +4559,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.5" +version = "1.17.6" dependencies = [ "serde", "solana-sdk", @@ -4568,7 +4568,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "crossbeam-channel", @@ -4586,7 +4586,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bv", "fnv", @@ -4603,7 +4603,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.5" +version = "1.17.6" dependencies = [ "array-bytes", "serde", @@ -4630,7 +4630,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bv", "bytemuck", @@ -4646,7 +4646,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "chrono", "clap 2.33.3", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.5" +version = "1.17.6" dependencies = [ "dirs-next", "lazy_static", @@ -4675,7 +4675,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.5" +version = "1.17.6" dependencies = [ "Inflector", "base64 0.21.4", @@ -4700,7 +4700,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-trait", "bincode", @@ -4731,7 +4731,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4739,7 +4739,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "chrono", @@ -4751,7 +4751,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-trait", "bincode", @@ -4771,7 +4771,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.5" +version = "1.17.6" dependencies = [ "base64 0.21.4", "bincode", @@ -4843,7 +4843,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.5" +version = "1.17.6" dependencies = [ "lazy_static", "log", @@ -4865,7 +4865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "console", "indicatif", @@ -4877,7 +4877,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "crossbeam-channel", @@ -4897,7 +4897,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.5" +version = "1.17.6" dependencies = [ "ahash 0.8.3", "blake3", @@ -4947,7 +4947,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.5" +version = "1.17.6" dependencies = [ "proc-macro2", "quote", @@ -4957,7 +4957,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "solana-accounts-db", @@ -4968,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "solana-sdk", @@ -4978,7 +4978,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bs58", "crossbeam-channel", @@ -5003,7 +5003,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -5051,7 +5051,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "bincode", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "solana-measure", @@ -5126,7 +5126,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.5" +version = "1.17.6" dependencies = [ "env_logger", "lazy_static", @@ -5135,7 +5135,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "solana-sdk", @@ -5143,7 +5143,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.5" +version = "1.17.6" dependencies = [ "fast-math", "solana-program", @@ -5151,7 +5151,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.5" +version = "1.17.6" dependencies = [ "crossbeam-channel", "gethostname", @@ -5164,7 +5164,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "clap 3.1.6", @@ -5184,7 +5184,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.5" +version = "1.17.6" dependencies = [ "ahash 0.8.3", "bincode", @@ -5211,7 +5211,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.5" +version = "1.17.6" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5227,7 +5227,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "ark-bn254", "ark-ec", @@ -5279,7 +5279,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.5" +version = "1.17.6" dependencies = [ "base64 0.21.4", "bincode", @@ -5305,7 +5305,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "async-trait", @@ -5333,7 +5333,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "crossbeam-channel", "futures-util", @@ -5356,7 +5356,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-mutex", "async-trait", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.5" +version = "1.17.6" dependencies = [ "lazy_static", "num_cpus", @@ -5389,7 +5389,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.5" +version = "1.17.6" dependencies = [ "console", "dialoguer", @@ -5406,7 +5406,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.5" +version = "1.17.6" dependencies = [ "base64 0.21.4", "bincode", @@ -5461,7 +5461,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-trait", "base64 0.21.4", @@ -5485,7 +5485,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.5" +version = "1.17.6" dependencies = [ "base64 0.21.4", "bs58", @@ -5505,7 +5505,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.5" +version = "1.17.6" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5516,7 +5516,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.5" +version = "1.17.6" dependencies = [ "arrayref", "base64 0.21.4", @@ -5591,7 +5591,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5628,21 +5628,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.5" +version = "1.17.6" dependencies = [ "array-bytes", "solana-program", @@ -5650,7 +5650,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.5" +version = "1.17.6" dependencies = [ "array-bytes", "solana-program", @@ -5658,21 +5658,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5680,14 +5680,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.5" +version = "1.17.6" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5695,21 +5695,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.5" +version = "1.17.6" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5719,42 +5719,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.5" +version = "1.17.6" dependencies = [ "rustversion", "solana-program", @@ -5764,49 +5764,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5814,14 +5814,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-program-runtime", @@ -5831,7 +5831,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5839,21 +5839,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5861,14 +5861,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.5" +version = "1.17.6" dependencies = [ "array-bytes", "solana-program", @@ -5876,7 +5876,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.5" +version = "1.17.6" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5885,14 +5885,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5900,7 +5900,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-program-runtime", @@ -5910,21 +5910,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-program-runtime", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.5" +version = "1.17.6" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.5" +version = "1.17.6" dependencies = [ "blake3", "solana-program", @@ -5950,21 +5950,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-logger", "solana-program", @@ -5975,21 +5975,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", "solana-program-runtime", @@ -5999,21 +5999,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.5" +version = "1.17.6" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.5" +version = "1.17.6" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6065,7 +6065,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bs58", "proc-macro2", @@ -6076,7 +6076,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.5" +version = "1.17.6" dependencies = [ "crossbeam-channel", "log", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "log", @@ -6103,7 +6103,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.5" +version = "1.17.6" dependencies = [ "backoff", "bincode", @@ -6135,7 +6135,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "bs58", @@ -6150,7 +6150,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-channel", "bytes", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "log", @@ -6192,7 +6192,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.5" +version = "1.17.6" dependencies = [ "base64 0.21.4", "bincode", @@ -6222,7 +6222,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "log", @@ -6235,7 +6235,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-trait", "bincode", @@ -6257,7 +6257,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.5" +version = "1.17.6" dependencies = [ "Inflector", "base64 0.21.4", @@ -6280,7 +6280,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "bytes", @@ -6315,7 +6315,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.5" +version = "1.17.6" dependencies = [ "async-trait", "solana-connection-cache", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.5" +version = "1.17.6" dependencies = [ "chrono", "clap 2.33.3", @@ -6390,7 +6390,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.5" +version = "1.17.6" dependencies = [ "log", "rustc_version", @@ -6404,7 +6404,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.5" +version = "1.17.6" dependencies = [ "crossbeam-channel", "itertools", @@ -6421,7 +6421,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bincode", "log", @@ -6441,7 +6441,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.5" +version = "1.17.6" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6453,7 +6453,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.5" +version = "1.17.6" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 090f701b3cd395..3a40b85c019044 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.5" +version = "1.17.6" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.5" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.5" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.5" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.5" } -solana-ledger = { path = "../../ledger", version = "=1.17.5" } -solana-logger = { path = "../../logger", version = "=1.17.5" } -solana-measure = { path = "../../measure", version = "=1.17.5" } -solana-program = { path = "../../sdk/program", version = "=1.17.5" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.5" } -solana-program-test = { path = "../../program-test", version = "=1.17.5" } -solana-runtime = { path = "../../runtime", version = "=1.17.5" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.5" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.5" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.5", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.5" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.5" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.5" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.5", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.5" } -solana-sdk = { path = "../../sdk", version = "=1.17.5" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.5" } -solana-validator = { path = "../../validator", version = "=1.17.5" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.5" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.6" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.6" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.6" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.6" } +solana-ledger = { path = "../../ledger", version = "=1.17.6" } +solana-logger = { path = "../../logger", version = "=1.17.6" } +solana-measure = { path = "../../measure", version = "=1.17.6" } +solana-program = { path = "../../sdk/program", version = "=1.17.6" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.6" } +solana-program-test = { path = "../../program-test", version = "=1.17.6" } +solana-runtime = { path = "../../runtime", version = "=1.17.6" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.6" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.6" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.6", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.6" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.6" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.6" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.6", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.6" } +solana-sdk = { path = "../../sdk", version = "=1.17.6" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.6" } +solana-validator = { path = "../../validator", version = "=1.17.6" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.6" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 6a27ce939fa503..a833404db4a8f0 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.5" +version = "1.17.6" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.5" } +solana-program = { path = "../../../../program", version = "=1.17.6" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 59f946a7a7dae1..38d7afc61866a1 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.5" +version = "1.17.6" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.5" } +solana-program = { path = "../../../../program", version = "=1.17.6" } [lib] crate-type = ["cdylib"] From 353aa6423fa9b4e07c51408eddf62aaf4ce704d4 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 09:46:09 -0600 Subject: [PATCH 069/213] v1.17: CLI remove unwrap_or_default() on rpc calls (backport of #33782) (#34051) CLI remove unwrap_or_default() on rpc calls (#33782) (cherry picked from commit e1a9f8ef1794df51afc02d1e074ab2f831e81461) Co-authored-by: Pierre --- cli/src/cluster_query.rs | 26 ++++++++++---------------- cli/src/feature.rs | 3 +-- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 0470cf761ad95d..ee683081ed4790 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -1886,23 +1886,17 @@ pub fn process_show_validators( progress_bar.set_message("Fetching block production..."); let skip_rate: HashMap<_, _> = rpc_client - .get_block_production() - .ok() - .map(|result| { - result - .value - .by_identity - .into_iter() - .map(|(identity, (leader_slots, blocks_produced))| { - ( - identity, - 100. * (leader_slots.saturating_sub(blocks_produced)) as f64 - / leader_slots as f64, - ) - }) - .collect() + .get_block_production()? + .value + .by_identity + .into_iter() + .map(|(identity, (leader_slots, blocks_produced))| { + ( + identity, + 100. * (leader_slots.saturating_sub(blocks_produced)) as f64 / leader_slots as f64, + ) }) - .unwrap_or_default(); + .collect(); progress_bar.set_message("Fetching version information..."); let mut node_version = HashMap::new(); diff --git a/cli/src/feature.rs b/cli/src/feature.rs index 8c065d78feec91..f4fc225aa0fc68 100644 --- a/cli/src/feature.rs +++ b/cli/src/feature.rs @@ -850,8 +850,7 @@ fn process_status( let mut features = vec![]; for feature_ids in feature_ids.chunks(MAX_MULTIPLE_ACCOUNTS) { let mut feature_chunk = rpc_client - .get_multiple_accounts(feature_ids) - .unwrap_or_default() + .get_multiple_accounts(feature_ids)? .into_iter() .zip(feature_ids) .map(|(account, feature_id)| { From b76784774a45e2b82e8a4d7f4ae25a729e6d4906 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 06:29:46 +1100 Subject: [PATCH 070/213] v1.17: cpi: fix capacity check in update_caller_account (backport of #34064) (#34081) cpi: fix capacity check in update_caller_account (#34064) reserve(additional) reserves additional bytes on top of the current _length_ not capacity. Before this fix we could potentially reserve less capacity than required. (cherry picked from commit d009d7304a7c82bddc9809684ef27183b766de71) Co-authored-by: Alessandro Decina --- programs/bpf_loader/src/syscalls/cpi.rs | 3 ++- programs/sbf/rust/invoke/src/processor.rs | 27 +++++++++++++++++++++++ programs/sbf/tests/programs.rs | 16 +++++++++----- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/programs/bpf_loader/src/syscalls/cpi.rs b/programs/bpf_loader/src/syscalls/cpi.rs index 3f8190d26df143..c91e3705423151 100644 --- a/programs/bpf_loader/src/syscalls/cpi.rs +++ b/programs/bpf_loader/src/syscalls/cpi.rs @@ -1470,7 +1470,8 @@ fn update_caller_account( // invalid address. let min_capacity = caller_account.original_data_len; if callee_account.capacity() < min_capacity { - callee_account.reserve(min_capacity.saturating_sub(callee_account.capacity()))?; + callee_account + .reserve(min_capacity.saturating_sub(callee_account.get_data().len()))?; zero_all_mapped_spare_capacity = true; } diff --git a/programs/sbf/rust/invoke/src/processor.rs b/programs/sbf/rust/invoke/src/processor.rs index 7c689cfcf860ae..a14ee76c2e301b 100644 --- a/programs/sbf/rust/invoke/src/processor.rs +++ b/programs/sbf/rust/invoke/src/processor.rs @@ -1286,6 +1286,33 @@ fn process_instruction( }, &vec![0; original_data_len - new_len] ); + + // Realloc to [0xFC; 2] + invoke( + &create_instruction( + *callee_program_id, + &[ + (accounts[ARGUMENT_INDEX].key, true, false), + (callee_program_id, false, false), + ], + vec![0xFC; 2], + ), + accounts, + ) + .unwrap(); + + // Check that [2..20] is zeroed + let new_len = account.data_len(); + assert_eq!(&*account.data.borrow(), &[0xFC; 2]); + assert_eq!( + unsafe { + slice::from_raw_parts( + account.data.borrow().as_ptr().add(new_len), + original_data_len - new_len, + ) + }, + &vec![0; original_data_len - new_len] + ); } TEST_WRITE_ACCOUNT => { msg!("TEST_WRITE_ACCOUNT"); diff --git a/programs/sbf/tests/programs.rs b/programs/sbf/tests/programs.rs index 8a7cfb693afdd9..83c1ba00a77a22 100644 --- a/programs/sbf/tests/programs.rs +++ b/programs/sbf/tests/programs.rs @@ -4413,12 +4413,18 @@ fn test_cpi_change_account_data_memory_allocation() { // Test changing the account data both in place and by changing the // underlying vector. CPI will have to detect the vector change and - // update the corresponding memory region. In both cases CPI will have + // update the corresponding memory region. In all cases CPI will have // to zero the spare bytes correctly. - if instruction_data[0] == 0xFE { - account.set_data(instruction_data.to_vec()); - } else { - account.set_data_from_slice(instruction_data); + match instruction_data[0] { + 0xFE => account.set_data(instruction_data.to_vec()), + 0xFD => account.set_data_from_slice(instruction_data), + 0xFC => { + // Exercise the update_caller_account capacity check where account len != capacity. + let mut data = instruction_data.to_vec(); + data.reserve_exact(1); + account.set_data(data) + } + _ => panic!(), } Ok(()) From 7a198e8f3bda52de71683dd55a271a7c0198a8dd Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 19:58:26 +0000 Subject: [PATCH 071/213] v1.17: propagates the new contact-info through gossip (backport of #34092) (#34095) propagates the new contact-info through gossip (#34092) Working towards migrating from legacy contact-info to the new contact-info: https://github.com/solana-labs/solana/pull/29596 (cherry picked from commit ba0a49b436a68b3e6a9e21d17cff5a9310a2fae8) Co-authored-by: behzad nouri --- gossip/src/crds_gossip_pull.rs | 7 +------ gossip/src/crds_gossip_push.rs | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/gossip/src/crds_gossip_pull.rs b/gossip/src/crds_gossip_pull.rs index c3044dbba8cc43..191406dd6720d8 100644 --- a/gossip/src/crds_gossip_pull.rs +++ b/gossip/src/crds_gossip_pull.rs @@ -18,7 +18,7 @@ use { crds::{Crds, GossipRoute, VersionedCrdsValue}, crds_gossip, crds_gossip_error::CrdsGossipError, - crds_value::{CrdsData, CrdsValue}, + crds_value::CrdsValue, legacy_contact_info::LegacyContactInfo as ContactInfo, ping_pong::PingCache, }, @@ -488,11 +488,6 @@ impl CrdsGossipPull { let out: Vec<_> = crds .filter_bitmask(filter.mask, filter.mask_bits) .filter(pred) - .filter(|entry| { - // Exclude the new ContactInfo from the pull responses - // until the cluster has upgraded. - !matches!(&entry.value.data, CrdsData::ContactInfo(_)) - }) .map(|entry| entry.value.clone()) .take(output_size_limit.load(Ordering::Relaxed).max(0) as usize) .collect(); diff --git a/gossip/src/crds_gossip_push.rs b/gossip/src/crds_gossip_push.rs index 345c9eaf17287f..72ffc30a4863ca 100644 --- a/gossip/src/crds_gossip_push.rs +++ b/gossip/src/crds_gossip_push.rs @@ -16,7 +16,7 @@ use { cluster_info::{Ping, CRDS_UNIQUE_PUBKEY_CAPACITY}, crds::{Crds, CrdsError, Cursor, GossipRoute}, crds_gossip, - crds_value::{CrdsData, CrdsValue}, + crds_value::CrdsValue, ping_pong::PingCache, push_active_set::PushActiveSet, received_cache::ReceivedCache, @@ -191,11 +191,6 @@ impl CrdsGossipPush { let crds = crds.read().unwrap(); let entries = crds .get_entries(crds_cursor.deref_mut()) - .filter(|entry| { - // Exclude the new ContactInfo from outgoing push messages - // until the cluster has upgraded. - !matches!(&entry.value.data, CrdsData::ContactInfo(_)) - }) .map(|entry| &entry.value) .filter(|value| wallclock_window.contains(&value.wallclock())); for value in entries { From d64ae17d986d986fdd80abf65046ced49a117eb3 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:29:53 -0700 Subject: [PATCH 072/213] v1.17: validator: deprecates `--disable-accounts-disk-index` (backport of #33850) (#34070) validator: deprecates `--disable-accounts-disk-index` (#33850) * validator: deprecates `--disable-accounts-disk-index` * Fix checks failure * Move disable_accounts_disk_index arg to alphabetical order --------- Co-authored-by: Will Hickey (cherry picked from commit c55a6e55a10275a2a702042842372cf169890bbc) Co-authored-by: Trent Nelson --- validator/src/cli.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 6a064841695b34..0e8dcb9d7d4c10 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -1240,12 +1240,6 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .takes_value(true) .help("How much memory the accounts index can consume. If this is exceeded, some account index entries will be stored on disk."), ) - .arg( - Arg::with_name("disable_accounts_disk_index") - .long("disable-accounts-disk-index") - .help("Disable the disk-based accounts index if it is enabled by default.") - .conflicts_with("accounts_index_memory_limit_mb") - ) .arg( Arg::with_name("accounts_index_bins") .long("accounts-index-bins") @@ -1758,6 +1752,10 @@ fn deprecated_arguments() -> Vec { Ok(()) } })); + add_arg!(Arg::with_name("disable_accounts_disk_index") + .long("disable-accounts-disk-index") + .help("Disable the disk-based accounts index if it is enabled by default.") + .conflicts_with("accounts_index_memory_limit_mb")); add_arg!( Arg::with_name("disable_quic_servers") .long("disable-quic-servers") From a9d5a5ba0356655dfdd70e90a3fb0a96d072f1a9 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 13:55:41 -0500 Subject: [PATCH 073/213] v1.17: cli: Hides the filler accounts args (backport of #34113) (#34117) cli: Hides the filler accounts args (#34113) (cherry picked from commit b4c652ef6c367bc361b1578d36ce28308c9d2ff1) Co-authored-by: Brooks --- ledger-tool/src/main.rs | 6 ++++-- validator/src/cli.rs | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ledger-tool/src/main.rs b/ledger-tool/src/main.rs index 2fa26528497860..721c46a8ff0f5e 100644 --- a/ledger-tool/src/main.rs +++ b/ledger-tool/src/main.rs @@ -1132,7 +1132,8 @@ fn main() { .validator(is_parsable::) .takes_value(true) .default_value("0") - .help("How many accounts to add to stress the system. Accounts are ignored in operations related to correctness."); + .help("How many accounts to add to stress the system. Accounts are ignored in operations related to correctness.") + .hidden(hidden_unless_forced()); let accounts_filler_size = Arg::with_name("accounts_filler_size") .long("accounts-filler-size") .value_name("BYTES") @@ -1140,7 +1141,8 @@ fn main() { .takes_value(true) .default_value("0") .requires("accounts_filler_count") - .help("Size per filler account in bytes."); + .help("Size per filler account in bytes.") + .hidden(hidden_unless_forced()); let account_paths_arg = Arg::with_name("account_paths") .long("accounts") .value_name("PATHS") diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 0e8dcb9d7d4c10..0ce27ba6bea367 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -1279,7 +1279,8 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .validator(is_parsable::) .takes_value(true) .default_value(&default_args.accounts_filler_count) - .help("How many accounts to add to stress the system. Accounts are ignored in operations related to correctness.")) + .help("How many accounts to add to stress the system. Accounts are ignored in operations related to correctness.") + .hidden(hidden_unless_forced())) .arg(Arg::with_name("accounts_filler_size") .long("accounts-filler-size") .value_name("BYTES") @@ -1287,7 +1288,8 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .takes_value(true) .default_value(&default_args.accounts_filler_size) .requires("accounts_filler_count") - .help("Size per filler account in bytes.")) + .help("Size per filler account in bytes.") + .hidden(hidden_unless_forced())) .arg( Arg::with_name("accounts_db_test_hash_calculation") .long("accounts-db-test-hash-calculation") From cf1d9d4c457d162443521f55c21840496cb40112 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:59:55 +0100 Subject: [PATCH 074/213] v1.17: Fix - `Bank::compute_active_feature_set()` and `Bank::apply_feature_activations()` (backport of #34124) (#34136) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix - `Bank::compute_active_feature_set()` and `Bank::apply_feature_activations()` (#34124) * Moves modification of feature accounts from Bank::compute_active_feature_set() into Bank::apply_feature_activations(). * Renames allow_new_activations and newly_activated to include_pending and pending. * Fix test_compute_active_feature_set. (cherry picked from commit 6b8545061fffab0c1412aef4f63bcaa3acfdc64e) Co-authored-by: Alexander Meißner --- runtime/src/bank.rs | 50 ++++++++++++++++++++------------------- runtime/src/bank/tests.rs | 19 ++++++++------- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index c0170ae113f94e..694c4f062eb24b 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -7892,6 +7892,19 @@ impl Bank { self.compute_active_feature_set(allow_new_activations); self.feature_set = Arc::new(feature_set); + // Update activation slot of features in `new_feature_activations` + for feature_id in new_feature_activations.iter() { + if let Some(mut account) = self.get_account_with_fixed_root(feature_id) { + if let Some(mut feature) = feature::from_account(&account) { + feature.activated_at = Some(self.slot()); + if feature::to_account(&feature, &mut account).is_some() { + self.store_account(feature_id, &account); + } + info!("Feature {} activated at slot {}", feature_id, self.slot()); + } + } + } + if new_feature_activations.contains(&feature_set::pico_inflation::id()) { *self.inflation.write().unwrap() = Inflation::pico(); self.fee_rate_governor.burn_percent = 50; // 50% fee burn @@ -7960,38 +7973,27 @@ impl Bank { /// Compute the active feature set based on the current bank state, /// and return it together with the set of newly activated features. - fn compute_active_feature_set( - &mut self, - allow_new_activations: bool, - ) -> (FeatureSet, HashSet) { + fn compute_active_feature_set(&self, include_pending: bool) -> (FeatureSet, HashSet) { let mut active = self.feature_set.active.clone(); let mut inactive = HashSet::new(); - let mut newly_activated = HashSet::new(); + let mut pending = HashSet::new(); let slot = self.slot(); for feature_id in &self.feature_set.inactive { let mut activated = None; - if let Some(mut account) = self.get_account_with_fixed_root(feature_id) { - if let Some(mut feature) = feature::from_account(&account) { + if let Some(account) = self.get_account_with_fixed_root(feature_id) { + if let Some(feature) = feature::from_account(&account) { match feature.activated_at { - None => { - if allow_new_activations { - // Feature has been requested, activate it now - feature.activated_at = Some(slot); - if feature::to_account(&feature, &mut account).is_some() { - self.store_account(feature_id, &account); - } - newly_activated.insert(*feature_id); - activated = Some(slot); - info!("Feature {} activated at slot {}", feature_id, slot); - } + None if include_pending => { + // Feature activation is pending + pending.insert(*feature_id); + activated = Some(slot); } - Some(activation_slot) => { - if slot >= activation_slot { - // Feature is already active - activated = Some(activation_slot); - } + Some(activation_slot) if slot >= activation_slot => { + // Feature has been activated already + activated = Some(activation_slot); } + _ => {} } } } @@ -8002,7 +8004,7 @@ impl Bank { } } - (FeatureSet { active, inactive }, newly_activated) + (FeatureSet { active, inactive }, pending) } fn apply_builtin_program_feature_transitions( diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index e8d9daf3e44339..743341849520bd 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -7740,25 +7740,26 @@ fn test_compute_active_feature_set() { let feature = Feature::default(); assert_eq!(feature.activated_at, None); bank.store_account(&test_feature, &feature::create_account(&feature, 42)); + let feature = feature::from_account(&bank.get_account(&test_feature).expect("get_account")) + .expect("from_account"); + assert_eq!(feature.activated_at, None); - // Run `compute_active_feature_set` disallowing new activations + // Run `compute_active_feature_set` excluding pending activation let (feature_set, new_activations) = bank.compute_active_feature_set(false); assert!(new_activations.is_empty()); assert!(!feature_set.is_active(&test_feature)); - let feature = feature::from_account(&bank.get_account(&test_feature).expect("get_account")) - .expect("from_account"); - assert_eq!(feature.activated_at, None); - // Run `compute_active_feature_set` allowing new activations - let (feature_set, new_activations) = bank.compute_active_feature_set(true); + // Run `compute_active_feature_set` including pending activation + let (_feature_set, new_activations) = bank.compute_active_feature_set(true); assert_eq!(new_activations.len(), 1); - assert!(feature_set.is_active(&test_feature)); + assert!(new_activations.contains(&test_feature)); + + // Actually activate the pending activation + bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, true); let feature = feature::from_account(&bank.get_account(&test_feature).expect("get_account")) .expect("from_account"); assert_eq!(feature.activated_at, Some(1)); - // Running `compute_active_feature_set` will not cause new activations, but - // `test_feature` is now be active let (feature_set, new_activations) = bank.compute_active_feature_set(true); assert!(new_activations.is_empty()); assert!(feature_set.is_active(&test_feature)); From 0a195ad3d6b7110f6966b551fe2115bcb48404dd Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 18 Nov 2023 05:56:09 +0900 Subject: [PATCH 075/213] v1.17: [zk-token-proof] Feature gate transfer with fee related proofs (backport of #34103) (#34129) * [zk-token-proof] Feature gate transfer with fee related proofs (#34103) feature gate zk-token-proof transfer with fee (cherry picked from commit a8863bd9fed3d3a27f6448e36f2e101d00caaa80) # Conflicts: # sdk/src/feature_set.rs * resolve conflict --------- Co-authored-by: samkim-crypto --- programs/zk-token-proof/src/lib.rs | 15 +++++++++++++++ sdk/src/feature_set.rs | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/programs/zk-token-proof/src/lib.rs b/programs/zk-token-proof/src/lib.rs index 0aa75c4ef5cff5..9a9396b15f1fdb 100644 --- a/programs/zk-token-proof/src/lib.rs +++ b/programs/zk-token-proof/src/lib.rs @@ -135,6 +135,11 @@ declare_process_instruction!(Entrypoint, 0, |invoke_context| { let native_programs_consume_cu = invoke_context .feature_set .is_active(&feature_set::native_programs_consume_cu::id()); + + let enable_zk_transfer_with_fee = invoke_context + .feature_set + .is_active(&feature_set::enable_zk_transfer_with_fee::id()); + let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_data = instruction_context.get_instruction_data(); @@ -198,6 +203,11 @@ declare_process_instruction!(Entrypoint, 0, |invoke_context| { process_verify_proof::(invoke_context) } ProofInstruction::VerifyTransferWithFee => { + // transfer with fee related proofs are not enabled + if !enable_zk_transfer_with_fee { + return Err(InstructionError::InvalidInstructionData); + } + if native_programs_consume_cu { invoke_context .consume_checked(VERIFY_TRANSFER_WITH_FEE_COMPUTE_UNITS) @@ -291,6 +301,11 @@ declare_process_instruction!(Entrypoint, 0, |invoke_context| { >(invoke_context) } ProofInstruction::VerifyFeeSigma => { + // transfer with fee related proofs are not enabled + if !enable_zk_transfer_with_fee { + return Err(InstructionError::InvalidInstructionData); + } + invoke_context .consume_checked(VERIFY_FEE_SIGMA_COMPUTE_UNITS) .map_err(|_| InstructionError::ComputationalBudgetExceeded)?; diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index bd091f87a304cb..44d81f52d1d19c 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -724,6 +724,10 @@ pub mod validate_fee_collector_account { solana_sdk::declare_id!("prpFrMtgNmzaNzkPJg9o753fVvbHKqNrNTm76foJ2wm"); } +pub mod enable_zk_transfer_with_fee { + solana_sdk::declare_id!("zkNLP7EQALfC1TYeB3biDU7akDckj8iPkvh9y2Mt2K3"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -900,6 +904,7 @@ lazy_static! { (update_hashes_per_tick5::id(), "Update desired hashes per tick to 9.2M"), (update_hashes_per_tick6::id(), "Update desired hashes per tick to 10M"), (validate_fee_collector_account::id(), "validate fee collector account #33888"), + (enable_zk_transfer_with_fee::id(), "enable Zk Token proof program transfer with fee"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() From 61caae6b2b9d51195faf4714f7bb051608d0a78f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 16:09:13 -0600 Subject: [PATCH 076/213] v1.17: ancient shrink on its own cadence (backport of #33712) (#34060) ancient shrink on its own cadence (#33712) (cherry picked from commit d948e5bf69a0b8093b5e509273d6bb9ecb5acbaf) Co-authored-by: Jeff Washington (jwash) --- accounts-db/src/accounts_db.rs | 7 ++----- runtime/src/accounts_background_service.rs | 6 +++++- runtime/src/bank.rs | 7 +++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/accounts-db/src/accounts_db.rs b/accounts-db/src/accounts_db.rs index dad1f152f36de2..9750ebd78d09d8 100644 --- a/accounts-db/src/accounts_db.rs +++ b/accounts-db/src/accounts_db.rs @@ -4395,11 +4395,12 @@ impl AccountsDb { /// get a sorted list of slots older than an epoch /// squash those slots into ancient append vecs - fn shrink_ancient_slots(&self, oldest_non_ancient_slot: Slot) { + pub fn shrink_ancient_slots(&self, epoch_schedule: &EpochSchedule) { if self.ancient_append_vec_offset.is_none() { return; } + let oldest_non_ancient_slot = self.get_oldest_non_ancient_slot(epoch_schedule); let can_randomly_shrink = true; let sorted_slots = self.get_sorted_potential_ancient_slots(oldest_non_ancient_slot); if self.create_ancient_storage == CreateAncientStorage::Append { @@ -4744,10 +4745,6 @@ impl AccountsDb { pub fn shrink_candidate_slots(&self, epoch_schedule: &EpochSchedule) -> usize { let oldest_non_ancient_slot = self.get_oldest_non_ancient_slot(epoch_schedule); - if !self.shrink_candidate_slots.lock().unwrap().is_empty() { - // this can affect 'shrink_candidate_slots', so don't 'take' it until after this completes - self.shrink_ancient_slots(oldest_non_ancient_slot); - } let shrink_candidates_slots = std::mem::take(&mut *self.shrink_candidate_slots.lock().unwrap()); diff --git a/runtime/src/accounts_background_service.rs b/runtime/src/accounts_background_service.rs index 627ccbf76adaa5..b826f8eddc5724 100644 --- a/runtime/src/accounts_background_service.rs +++ b/runtime/src/accounts_background_service.rs @@ -21,7 +21,7 @@ use { solana_accounts_db::{ accounts_db::CalcAccountsHashDataSource, accounts_hash::CalcAccountsHashConfig, }, - solana_measure::measure::Measure, + solana_measure::{measure::Measure, measure_us}, solana_sdk::clock::{BankId, Slot}, stats::StatsManager, std::{ @@ -383,6 +383,8 @@ impl SnapshotRequestHandler { snapshot_root_bank.clean_accounts(*last_full_snapshot_slot); clean_time.stop(); + let (_, shrink_ancient_time_us) = measure_us!(snapshot_root_bank.shrink_ancient_slots()); + let mut shrink_time = Measure::start("shrink_time"); snapshot_root_bank.shrink_candidate_slots(); shrink_time.stop(); @@ -464,6 +466,7 @@ impl SnapshotRequestHandler { ("snapshot_time", snapshot_time.as_us(), i64), ("total_us", total_time.as_us(), i64), ("non_snapshot_time_us", non_snapshot_time_us, i64), + ("shrink_ancient_time_us", shrink_ancient_time_us, i64), ); Ok(snapshot_root_bank.block_height()) } @@ -705,6 +708,7 @@ impl AccountsBackgroundService { bank.force_flush_accounts_cache(); bank.clean_accounts(last_full_snapshot_slot); last_cleaned_block_height = bank.block_height(); + bank.shrink_ancient_slots(); } bank.shrink_candidate_slots(); } diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 694c4f062eb24b..9669553ec01fbd 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -7817,6 +7817,13 @@ impl Bank { .shrink_candidate_slots(self.epoch_schedule()) } + pub(crate) fn shrink_ancient_slots(&self) { + self.rc + .accounts + .accounts_db + .shrink_ancient_slots(self.epoch_schedule()) + } + pub fn no_overflow_rent_distribution_enabled(&self) -> bool { self.feature_set .is_active(&feature_set::no_overflow_rent_distribution::id()) From 89906d8d3b97d6404f40a2dbfc87de958a142cec Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sun, 19 Nov 2023 20:43:19 -0600 Subject: [PATCH 077/213] Update version to v1.17.7 (#34157) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0107f4a7977910..aa978b4de33ca4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.6" +version = "1.17.7" dependencies = [ "regex", ] @@ -4065,7 +4065,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.6" +version = "1.17.7" dependencies = [ "protobuf-src", "tonic-build", @@ -4308,7 +4308,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.6" +version = "1.17.7" [[package]] name = "rcgen" @@ -5098,7 +5098,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.6" +version = "1.17.7" dependencies = [ "Inflector", "assert_matches", @@ -5122,7 +5122,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 2.33.3", "log", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 2.33.3", "log", @@ -5166,7 +5166,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.6" +version = "1.17.7" dependencies = [ "arrayref", "assert_matches", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "bytemuck", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -5260,7 +5260,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5284,7 +5284,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5301,7 +5301,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.6" +version = "1.17.7" dependencies = [ "serde", "solana-sdk", @@ -5310,7 +5310,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "crossbeam-channel", @@ -5328,7 +5328,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5339,7 +5339,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5380,7 +5380,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bv", "fnv", @@ -5397,7 +5397,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -5417,7 +5417,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -5428,7 +5428,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bv", "bytemuck", @@ -5447,7 +5447,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "solana-logger", @@ -5455,7 +5455,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_cmd", "bzip2", @@ -5476,11 +5476,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.6" +version = "1.17.7" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.6" +version = "1.17.7" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5491,7 +5491,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "chrono", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "chrono", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -5579,7 +5579,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.6" +version = "1.17.7" dependencies = [ "anyhow", "dirs-next", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.6" +version = "1.17.7" dependencies = [ "Inflector", "base64 0.21.4", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-trait", "bincode", @@ -5652,7 +5652,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.6" +version = "1.17.7" dependencies = [ "futures-util", "rand 0.8.5", @@ -5682,7 +5682,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5690,7 +5690,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "chrono", @@ -5703,7 +5703,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-trait", "bincode", @@ -5727,7 +5727,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5810,7 +5810,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.6" +version = "1.17.7" dependencies = [ "lazy_static", "log", @@ -5835,7 +5835,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "clap 3.2.23", @@ -5865,7 +5865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "console", "indicatif", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5888,7 +5888,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -5910,7 +5910,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "byteorder", @@ -5932,7 +5932,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.6" +version = "1.17.7" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5962,7 +5962,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.6" +version = "1.17.7" dependencies = [ "proc-macro2", "quote", @@ -5972,7 +5972,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.6" +version = "1.17.7" dependencies = [ "base64 0.21.4", "bincode", @@ -5997,7 +5997,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "solana-accounts-db", @@ -6008,7 +6008,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "solana-sdk", @@ -6018,7 +6018,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bs58", "crossbeam-channel", @@ -6043,7 +6043,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -6094,7 +6094,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.6" +version = "1.17.7" dependencies = [ "atty", "bincode", @@ -6129,7 +6129,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bs58", "clap 3.2.23", @@ -6146,7 +6146,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -6214,7 +6214,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_cmd", "bs58", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "log", @@ -6275,7 +6275,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6314,7 +6314,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.6" +version = "1.17.7" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6326,7 +6326,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.6" +version = "1.17.7" dependencies = [ "env_logger", "lazy_static", @@ -6335,7 +6335,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "solana-sdk", @@ -6343,11 +6343,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.6" +version = "1.17.7" [[package]] name = "solana-merkle-root-bench" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 2.33.3", "log", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.6" +version = "1.17.7" dependencies = [ "fast-math", "hex", @@ -6369,7 +6369,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.6" +version = "1.17.7" dependencies = [ "crossbeam-channel", "env_logger", @@ -6385,7 +6385,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6396,7 +6396,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "clap 3.2.23", @@ -6416,7 +6416,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "reqwest", @@ -6426,7 +6426,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.6" +version = "1.17.7" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6457,7 +6457,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -6478,7 +6478,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 3.2.23", "log", @@ -6493,7 +6493,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "anyhow", "ark-bn254", @@ -6550,7 +6550,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "async-trait", @@ -6608,7 +6608,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "anyhow", "crossbeam-channel", @@ -6632,7 +6632,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-mutex", "async-trait", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.6" +version = "1.17.7" dependencies = [ "lazy_static", "num_cpus", @@ -6668,7 +6668,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "console", @@ -6687,7 +6687,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.6" +version = "1.17.7" dependencies = [ "base64 0.21.4", "bincode", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "async-trait", @@ -6775,7 +6775,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.6" +version = "1.17.7" dependencies = [ "base64 0.21.4", "bs58", @@ -6795,7 +6795,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "anyhow", "clap 2.33.3", @@ -6812,7 +6812,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "bs58", @@ -6839,7 +6839,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.6" +version = "1.17.7" dependencies = [ "arrayref", "assert_matches", @@ -6922,7 +6922,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.6" +version = "1.17.7" dependencies = [ "anyhow", "assert_matches", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bs58", "proc-macro2", @@ -6991,7 +6991,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.6" +version = "1.17.7" dependencies = [ "crossbeam-channel", "log", @@ -7006,7 +7006,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7022,7 +7022,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -7039,7 +7039,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.6" +version = "1.17.7" dependencies = [ "backoff", "bincode", @@ -7071,7 +7071,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "bs58", @@ -7087,7 +7087,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 2.33.3", "log", @@ -7099,7 +7099,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "async-channel", @@ -7131,7 +7131,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -7145,7 +7145,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.6" +version = "1.17.7" dependencies = [ "base64 0.21.4", "bincode", @@ -7175,7 +7175,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "log", @@ -7189,7 +7189,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -7222,7 +7222,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-trait", "bincode", @@ -7244,7 +7244,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "clap 2.33.3", @@ -7271,7 +7271,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.6" +version = "1.17.7" dependencies = [ "Inflector", "base64 0.21.4", @@ -7294,7 +7294,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -7331,7 +7331,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-trait", "solana-connection-cache", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.6" +version = "1.17.7" dependencies = [ "serde_json", "solana-metrics", @@ -7352,7 +7352,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.6" +version = "1.17.7" dependencies = [ "chrono", "clap 2.33.3", @@ -7416,7 +7416,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "rustc_version 0.4.0", @@ -7430,7 +7430,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "crossbeam-channel", @@ -7449,7 +7449,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -7472,7 +7472,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 2.33.3", "humantime", @@ -7491,7 +7491,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bs58", "clap 3.2.23", @@ -7510,7 +7510,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bytemuck", "criterion", @@ -7524,7 +7524,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7536,7 +7536,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.6" +version = "1.17.7" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 4bad24708056f3..d6bb9ba70f339f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.6" +version = "1.17.7" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.6" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.6" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.6" } -solana-banks-client = { path = "banks-client", version = "=1.17.6" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.6" } -solana-banks-server = { path = "banks-server", version = "=1.17.6" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.6" } -solana-bloom = { path = "bloom", version = "=1.17.6" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.6" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.6" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.6", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.6" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.6" } -solana-cli = { path = "cli", version = "=1.17.6" } -solana-cli-config = { path = "cli-config", version = "=1.17.6" } -solana-cli-output = { path = "cli-output", version = "=1.17.6" } -solana-client = { path = "client", version = "=1.17.6" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.6" } -solana-config-program = { path = "programs/config", version = "=1.17.6" } -solana-core = { path = "core", version = "=1.17.6" } -solana-cost-model = { path = "cost-model", version = "=1.17.6" } -solana-download-utils = { path = "download-utils", version = "=1.17.6" } -solana-entry = { path = "entry", version = "=1.17.6" } -solana-faucet = { path = "faucet", version = "=1.17.6" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.6" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.6" } -solana-genesis = { path = "genesis", version = "=1.17.6" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.6" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.6" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.6" } -solana-gossip = { path = "gossip", version = "=1.17.6" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.6" } -solana-ledger = { path = "ledger", version = "=1.17.6" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.6" } -solana-logger = { path = "logger", version = "=1.17.6" } -solana-measure = { path = "measure", version = "=1.17.6" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.6" } -solana-metrics = { path = "metrics", version = "=1.17.6" } -solana-net-utils = { path = "net-utils", version = "=1.17.6" } -solana-notifier = { path = "notifier", version = "=1.17.6" } -solana-perf = { path = "perf", version = "=1.17.6" } -solana-poh = { path = "poh", version = "=1.17.6" } -solana-program = { path = "sdk/program", version = "=1.17.6" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.6" } -solana-program-test = { path = "program-test", version = "=1.17.6" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.6" } -solana-quic-client = { path = "quic-client", version = "=1.17.6" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.6" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.6", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.6" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.6", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.6" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.6" } -solana-runtime = { path = "runtime", version = "=1.17.6" } -solana-sdk = { path = "sdk", version = "=1.17.6" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.6" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.6" } -solana-stake-program = { path = "programs/stake", version = "=1.17.6" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.6" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.6" } -solana-streamer = { path = "streamer", version = "=1.17.6" } -solana-system-program = { path = "programs/system", version = "=1.17.6" } -solana-test-validator = { path = "test-validator", version = "=1.17.6" } -solana-thin-client = { path = "thin-client", version = "=1.17.6" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.6", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.6" } -solana-turbine = { path = "turbine", version = "=1.17.6" } -solana-udp-client = { path = "udp-client", version = "=1.17.6" } -solana-version = { path = "version", version = "=1.17.6" } -solana-vote = { path = "vote", version = "=1.17.6" } -solana-vote-program = { path = "programs/vote", version = "=1.17.6" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.6" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.6" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.6" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.7" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.7" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.7" } +solana-banks-client = { path = "banks-client", version = "=1.17.7" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.7" } +solana-banks-server = { path = "banks-server", version = "=1.17.7" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.7" } +solana-bloom = { path = "bloom", version = "=1.17.7" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.7" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.7" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.7", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.7" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.7" } +solana-cli = { path = "cli", version = "=1.17.7" } +solana-cli-config = { path = "cli-config", version = "=1.17.7" } +solana-cli-output = { path = "cli-output", version = "=1.17.7" } +solana-client = { path = "client", version = "=1.17.7" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.7" } +solana-config-program = { path = "programs/config", version = "=1.17.7" } +solana-core = { path = "core", version = "=1.17.7" } +solana-cost-model = { path = "cost-model", version = "=1.17.7" } +solana-download-utils = { path = "download-utils", version = "=1.17.7" } +solana-entry = { path = "entry", version = "=1.17.7" } +solana-faucet = { path = "faucet", version = "=1.17.7" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.7" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.7" } +solana-genesis = { path = "genesis", version = "=1.17.7" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.7" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.7" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.7" } +solana-gossip = { path = "gossip", version = "=1.17.7" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.7" } +solana-ledger = { path = "ledger", version = "=1.17.7" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.7" } +solana-logger = { path = "logger", version = "=1.17.7" } +solana-measure = { path = "measure", version = "=1.17.7" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.7" } +solana-metrics = { path = "metrics", version = "=1.17.7" } +solana-net-utils = { path = "net-utils", version = "=1.17.7" } +solana-notifier = { path = "notifier", version = "=1.17.7" } +solana-perf = { path = "perf", version = "=1.17.7" } +solana-poh = { path = "poh", version = "=1.17.7" } +solana-program = { path = "sdk/program", version = "=1.17.7" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.7" } +solana-program-test = { path = "program-test", version = "=1.17.7" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.7" } +solana-quic-client = { path = "quic-client", version = "=1.17.7" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.7" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.7", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.7" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.7", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.7" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.7" } +solana-runtime = { path = "runtime", version = "=1.17.7" } +solana-sdk = { path = "sdk", version = "=1.17.7" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.7" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.7" } +solana-stake-program = { path = "programs/stake", version = "=1.17.7" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.7" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.7" } +solana-streamer = { path = "streamer", version = "=1.17.7" } +solana-system-program = { path = "programs/system", version = "=1.17.7" } +solana-test-validator = { path = "test-validator", version = "=1.17.7" } +solana-thin-client = { path = "thin-client", version = "=1.17.7" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.7", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.7" } +solana-turbine = { path = "turbine", version = "=1.17.7" } +solana-udp-client = { path = "udp-client", version = "=1.17.7" } +solana-version = { path = "version", version = "=1.17.7" } +solana-vote = { path = "vote", version = "=1.17.7" } +solana-vote-program = { path = "programs/vote", version = "=1.17.7" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.7" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.7" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.7" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 6bb6f4c9212cf9..4f3007e3ec3ee5 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.6" +version = "1.17.7" dependencies = [ "Inflector", "base64 0.21.4", @@ -4468,7 +4468,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.6" +version = "1.17.7" dependencies = [ "arrayref", "bincode", @@ -4525,7 +4525,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "bytemuck", @@ -4544,7 +4544,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4559,7 +4559,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.6" +version = "1.17.7" dependencies = [ "serde", "solana-sdk", @@ -4568,7 +4568,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "crossbeam-channel", @@ -4586,7 +4586,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bv", "fnv", @@ -4603,7 +4603,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.6" +version = "1.17.7" dependencies = [ "array-bytes", "serde", @@ -4630,7 +4630,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bv", "bytemuck", @@ -4646,7 +4646,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "chrono", "clap 2.33.3", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.6" +version = "1.17.7" dependencies = [ "dirs-next", "lazy_static", @@ -4675,7 +4675,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.6" +version = "1.17.7" dependencies = [ "Inflector", "base64 0.21.4", @@ -4700,7 +4700,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-trait", "bincode", @@ -4731,7 +4731,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4739,7 +4739,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "chrono", @@ -4751,7 +4751,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-trait", "bincode", @@ -4771,7 +4771,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.6" +version = "1.17.7" dependencies = [ "base64 0.21.4", "bincode", @@ -4843,7 +4843,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.6" +version = "1.17.7" dependencies = [ "lazy_static", "log", @@ -4865,7 +4865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "console", "indicatif", @@ -4877,7 +4877,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "crossbeam-channel", @@ -4897,7 +4897,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.6" +version = "1.17.7" dependencies = [ "ahash 0.8.3", "blake3", @@ -4947,7 +4947,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.6" +version = "1.17.7" dependencies = [ "proc-macro2", "quote", @@ -4957,7 +4957,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "solana-accounts-db", @@ -4968,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "solana-sdk", @@ -4978,7 +4978,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bs58", "crossbeam-channel", @@ -5003,7 +5003,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -5051,7 +5051,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "bincode", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "solana-measure", @@ -5126,7 +5126,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.6" +version = "1.17.7" dependencies = [ "env_logger", "lazy_static", @@ -5135,7 +5135,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "solana-sdk", @@ -5143,7 +5143,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.6" +version = "1.17.7" dependencies = [ "fast-math", "solana-program", @@ -5151,7 +5151,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.6" +version = "1.17.7" dependencies = [ "crossbeam-channel", "gethostname", @@ -5164,7 +5164,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "clap 3.1.6", @@ -5184,7 +5184,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.6" +version = "1.17.7" dependencies = [ "ahash 0.8.3", "bincode", @@ -5211,7 +5211,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.6" +version = "1.17.7" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5227,7 +5227,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "ark-bn254", "ark-ec", @@ -5279,7 +5279,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.6" +version = "1.17.7" dependencies = [ "base64 0.21.4", "bincode", @@ -5305,7 +5305,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "async-trait", @@ -5333,7 +5333,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "crossbeam-channel", "futures-util", @@ -5356,7 +5356,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-mutex", "async-trait", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.6" +version = "1.17.7" dependencies = [ "lazy_static", "num_cpus", @@ -5389,7 +5389,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.6" +version = "1.17.7" dependencies = [ "console", "dialoguer", @@ -5406,7 +5406,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.6" +version = "1.17.7" dependencies = [ "base64 0.21.4", "bincode", @@ -5461,7 +5461,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-trait", "base64 0.21.4", @@ -5485,7 +5485,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.6" +version = "1.17.7" dependencies = [ "base64 0.21.4", "bs58", @@ -5505,7 +5505,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.6" +version = "1.17.7" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5516,7 +5516,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.6" +version = "1.17.7" dependencies = [ "arrayref", "base64 0.21.4", @@ -5591,7 +5591,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5628,21 +5628,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.6" +version = "1.17.7" dependencies = [ "array-bytes", "solana-program", @@ -5650,7 +5650,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.6" +version = "1.17.7" dependencies = [ "array-bytes", "solana-program", @@ -5658,21 +5658,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5680,14 +5680,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.6" +version = "1.17.7" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5695,21 +5695,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.6" +version = "1.17.7" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5719,42 +5719,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.6" +version = "1.17.7" dependencies = [ "rustversion", "solana-program", @@ -5764,49 +5764,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5814,14 +5814,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-program-runtime", @@ -5831,7 +5831,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5839,21 +5839,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5861,14 +5861,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.6" +version = "1.17.7" dependencies = [ "array-bytes", "solana-program", @@ -5876,7 +5876,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.6" +version = "1.17.7" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5885,14 +5885,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5900,7 +5900,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-program-runtime", @@ -5910,21 +5910,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-program-runtime", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.6" +version = "1.17.7" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.6" +version = "1.17.7" dependencies = [ "blake3", "solana-program", @@ -5950,21 +5950,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-logger", "solana-program", @@ -5975,21 +5975,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", "solana-program-runtime", @@ -5999,21 +5999,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.6" +version = "1.17.7" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.6" +version = "1.17.7" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6065,7 +6065,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bs58", "proc-macro2", @@ -6076,7 +6076,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.6" +version = "1.17.7" dependencies = [ "crossbeam-channel", "log", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "log", @@ -6103,7 +6103,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.6" +version = "1.17.7" dependencies = [ "backoff", "bincode", @@ -6135,7 +6135,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "bs58", @@ -6150,7 +6150,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-channel", "bytes", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "log", @@ -6192,7 +6192,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.6" +version = "1.17.7" dependencies = [ "base64 0.21.4", "bincode", @@ -6222,7 +6222,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "log", @@ -6235,7 +6235,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-trait", "bincode", @@ -6257,7 +6257,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.6" +version = "1.17.7" dependencies = [ "Inflector", "base64 0.21.4", @@ -6280,7 +6280,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "bytes", @@ -6315,7 +6315,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.6" +version = "1.17.7" dependencies = [ "async-trait", "solana-connection-cache", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.6" +version = "1.17.7" dependencies = [ "chrono", "clap 2.33.3", @@ -6390,7 +6390,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.6" +version = "1.17.7" dependencies = [ "log", "rustc_version", @@ -6404,7 +6404,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.6" +version = "1.17.7" dependencies = [ "crossbeam-channel", "itertools", @@ -6421,7 +6421,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bincode", "log", @@ -6441,7 +6441,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.6" +version = "1.17.7" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6453,7 +6453,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.6" +version = "1.17.7" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 3a40b85c019044..60eea273eccb90 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.6" +version = "1.17.7" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.6" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.6" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.6" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.6" } -solana-ledger = { path = "../../ledger", version = "=1.17.6" } -solana-logger = { path = "../../logger", version = "=1.17.6" } -solana-measure = { path = "../../measure", version = "=1.17.6" } -solana-program = { path = "../../sdk/program", version = "=1.17.6" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.6" } -solana-program-test = { path = "../../program-test", version = "=1.17.6" } -solana-runtime = { path = "../../runtime", version = "=1.17.6" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.6" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.6" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.6", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.6" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.6" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.6" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.6", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.6" } -solana-sdk = { path = "../../sdk", version = "=1.17.6" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.6" } -solana-validator = { path = "../../validator", version = "=1.17.6" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.6" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.7" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.7" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.7" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.7" } +solana-ledger = { path = "../../ledger", version = "=1.17.7" } +solana-logger = { path = "../../logger", version = "=1.17.7" } +solana-measure = { path = "../../measure", version = "=1.17.7" } +solana-program = { path = "../../sdk/program", version = "=1.17.7" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.7" } +solana-program-test = { path = "../../program-test", version = "=1.17.7" } +solana-runtime = { path = "../../runtime", version = "=1.17.7" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.7" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.7" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.7", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.7" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.7" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.7" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.7", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.7" } +solana-sdk = { path = "../../sdk", version = "=1.17.7" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.7" } +solana-validator = { path = "../../validator", version = "=1.17.7" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.7" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index a833404db4a8f0..1e6110748a0acf 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.6" +version = "1.17.7" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.6" } +solana-program = { path = "../../../../program", version = "=1.17.7" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 38d7afc61866a1..2f01a53d4e6fe3 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.6" +version = "1.17.7" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.6" } +solana-program = { path = "../../../../program", version = "=1.17.7" } [lib] crate-type = ["cdylib"] From 37767757dc92e51260ce6eebb3bec5d8aa5bf4c0 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 11:28:20 -0800 Subject: [PATCH 078/213] v1.17: Do not prune cache entry if the runtime environment is different (backport of #34100) (#34163) Do not prune cache entry if the runtime environment is different (#34100) (cherry picked from commit 3368579eff80a4976a7f6f51d2d1f21fad0955d9) Co-authored-by: Pankaj Garg --- program-runtime/src/loaded_programs.rs | 103 +++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 6 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 351652274b9f18..297ba4aba308d5 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -115,6 +115,9 @@ impl LoadedProgramType { LoadedProgramType::LegacyV0(program) | LoadedProgramType::LegacyV1(program) | LoadedProgramType::Typed(program) => Some(program.get_loader()), + LoadedProgramType::FailedVerification(env) | LoadedProgramType::Unloaded(env) => { + Some(env) + } #[cfg(test)] LoadedProgramType::TestLoaded(environment) => Some(environment), _ => None, @@ -669,6 +672,7 @@ impl LoadedPrograms { for second_level in self.entries.values_mut() { // Remove entries un/re/deployed on orphan forks let mut first_ancestor_found = false; + let mut first_ancestor_env = None; *second_level = second_level .iter() .rev() @@ -676,12 +680,29 @@ impl LoadedPrograms { let relation = fork_graph.relationship(entry.deployment_slot, new_root_slot); if entry.deployment_slot >= new_root_slot { matches!(relation, BlockRelation::Equal | BlockRelation::Descendant) - } else if !first_ancestor_found - && (matches!(relation, BlockRelation::Ancestor) - || entry.deployment_slot <= self.latest_root_slot) + } else if matches!(relation, BlockRelation::Ancestor) + || entry.deployment_slot <= self.latest_root_slot { - first_ancestor_found = true; - first_ancestor_found + if !first_ancestor_found { + first_ancestor_found = true; + first_ancestor_env = entry.program.get_environment(); + return true; + } + // Do not prune the entry if the runtime environment of the entry is different + // than the entry that was previously found (stored in first_ancestor_env). + // Different environment indicates that this entry might belong to an older + // epoch that had a different environment (e.g. different feature set). + // Once the root moves to the new/current epoch, the entry will get pruned. + // But, until then the entry might still be getting used by an older slot. + if let Some(entry_env) = entry.program.get_environment() { + if let Some(env) = first_ancestor_env { + if !Arc::ptr_eq(entry_env, env) { + return true; + } + } + } + self.stats.prunes_orphan.fetch_add(1, Ordering::Relaxed); + false } else { self.stats.prunes_orphan.fetch_add(1, Ordering::Relaxed); false @@ -980,7 +1001,7 @@ mod tests { crate::loaded_programs::{ BlockRelation, ExtractedPrograms, ForkGraph, LoadedProgram, LoadedProgramMatchCriteria, LoadedProgramType, LoadedPrograms, LoadedProgramsForTxBatch, ProgramRuntimeEnvironment, - WorkingSlot, DELAY_VISIBILITY_SLOT_OFFSET, + ProgramRuntimeEnvironments, WorkingSlot, DELAY_VISIBILITY_SLOT_OFFSET, }, assert_matches::assert_matches, percentage::Percentage, @@ -1471,6 +1492,76 @@ mod tests { assert!(cache.entries.is_empty()); } + #[test] + fn test_prune_different_env() { + let mut cache = new_mock_cache::(); + + let fork_graph = Arc::new(RwLock::new(TestForkGraph { + relation: BlockRelation::Ancestor, + })); + + cache.set_fork_graph(fork_graph); + + let program1 = Pubkey::new_unique(); + let loaded_program = new_test_loaded_program(10, 10); + let (existing, program) = cache.replenish(program1, loaded_program.clone()); + assert!(!existing); + assert_eq!(program, loaded_program); + + let new_env = Arc::new(BuiltinProgram::new_mock()); + cache.upcoming_environments = Some(ProgramRuntimeEnvironments { + program_runtime_v1: new_env.clone(), + program_runtime_v2: new_env.clone(), + }); + let updated_program = Arc::new(LoadedProgram { + program: LoadedProgramType::TestLoaded(new_env.clone()), + account_size: 0, + deployment_slot: 20, + effective_slot: 20, + maybe_expiration_slot: None, + tx_usage_counter: AtomicU64::default(), + ix_usage_counter: AtomicU64::default(), + }); + let (existing, program) = cache.replenish(program1, updated_program.clone()); + assert!(!existing); + assert_eq!(program, updated_program); + + // Test that there are 2 entries for the program + assert_eq!( + cache + .entries + .get(&program1) + .expect("failed to find the program") + .len(), + 2 + ); + + cache.prune(21, cache.latest_root_epoch); + + // Test that prune didn't remove the entry, since environments are different. + assert_eq!( + cache + .entries + .get(&program1) + .expect("failed to find the program") + .len(), + 2 + ); + + cache.prune(22, cache.latest_root_epoch.saturating_add(1)); + + let entries = cache + .entries + .get(&program1) + .expect("failed to find the program"); + // Test that prune removed 1 entry, since epoch changed + assert_eq!(entries.len(), 1); + + let entry = entries.first().expect("Failed to get the program").clone(); + // Test that the correct entry remains in the cache + assert_eq!(entry, updated_program); + } + #[derive(Default)] struct TestForkGraphSpecific { forks: Vec>, From 7800f0ed8d21cb6c2a33865dc91b2cf3e0ec0901 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 06:49:26 +0900 Subject: [PATCH 079/213] v1.17: [zk-token-sdk] Add a length check on range proof commitment length (backport of #34165) (#34182) * [zk-token-sdk] Add a length check on range proof commitment length (#34165) add a length check on range proof commitment length (cherry picked from commit e251b8607c8fdbde1000fa8fd11677446f5beb22) # Conflicts: # zk-token-sdk/src/errors.rs # zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u128.rs # zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u256.rs # zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u64.rs * resolve conflict --------- Co-authored-by: samkim-crypto --- zk-token-sdk/src/errors.rs | 2 ++ .../batched_range_proof/batched_range_proof_u128.rs | 7 +++++++ .../batched_range_proof/batched_range_proof_u256.rs | 7 +++++++ .../batched_range_proof/batched_range_proof_u64.rs | 7 +++++++ 4 files changed, 23 insertions(+) diff --git a/zk-token-sdk/src/errors.rs b/zk-token-sdk/src/errors.rs index e9e36e43f73c18..a5cdaeb39d09d4 100644 --- a/zk-token-sdk/src/errors.rs +++ b/zk-token-sdk/src/errors.rs @@ -20,6 +20,8 @@ pub enum ProofError { PubkeyDeserialization, #[error("ciphertext does not exist in instruction data")] MissingCiphertext, + #[error("illegal commitment length")] + IllegalCommitmentLength, } #[derive(Clone, Debug, Eq, PartialEq)] diff --git a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u128.rs b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u128.rs index 8867823cfee393..c099401b51c8c6 100644 --- a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u128.rs +++ b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u128.rs @@ -5,6 +5,7 @@ use { crate::{ encryption::pedersen::{PedersenCommitment, PedersenOpening}, errors::ProofError, + instruction::batched_range_proof::MAX_COMMITMENTS, range_proof::RangeProof, }, std::convert::TryInto, @@ -74,6 +75,12 @@ impl ZkProofData for BatchedRangeProofU128Data { #[cfg(not(target_os = "solana"))] fn verify_proof(&self) -> Result<(), ProofError> { let (commitments, bit_lengths) = self.context.try_into()?; + let num_commitments = commitments.len(); + + if num_commitments > MAX_COMMITMENTS || num_commitments != bit_lengths.len() { + return Err(ProofError::IllegalCommitmentLength); + } + let mut transcript = self.context_data().new_transcript(); let proof: RangeProof = self.proof.try_into()?; diff --git a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u256.rs b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u256.rs index da25267cded33a..a9b1c3c13fae66 100644 --- a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u256.rs +++ b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u256.rs @@ -5,6 +5,7 @@ use { crate::{ encryption::pedersen::{PedersenCommitment, PedersenOpening}, errors::ProofError, + instruction::batched_range_proof::MAX_COMMITMENTS, range_proof::RangeProof, }, std::convert::TryInto, @@ -72,6 +73,12 @@ impl ZkProofData for BatchedRangeProofU256Data { #[cfg(not(target_os = "solana"))] fn verify_proof(&self) -> Result<(), ProofError> { let (commitments, bit_lengths) = self.context.try_into()?; + let num_commitments = commitments.len(); + + if num_commitments > MAX_COMMITMENTS || num_commitments != bit_lengths.len() { + return Err(ProofError::IllegalCommitmentLength); + } + let mut transcript = self.context_data().new_transcript(); let proof: RangeProof = self.proof.try_into()?; diff --git a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u64.rs b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u64.rs index ae34771aa5697a..6f7c773bfd8da5 100644 --- a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u64.rs +++ b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u64.rs @@ -5,6 +5,7 @@ use { crate::{ encryption::pedersen::{PedersenCommitment, PedersenOpening}, errors::ProofError, + instruction::batched_range_proof::MAX_COMMITMENTS, range_proof::RangeProof, }, std::convert::TryInto, @@ -74,6 +75,12 @@ impl ZkProofData for BatchedRangeProofU64Data { #[cfg(not(target_os = "solana"))] fn verify_proof(&self) -> Result<(), ProofError> { let (commitments, bit_lengths) = self.context.try_into()?; + let num_commitments = commitments.len(); + + if num_commitments > MAX_COMMITMENTS || num_commitments != bit_lengths.len() { + return Err(ProofError::IllegalCommitmentLength); + } + let mut transcript = self.context_data().new_transcript(); let proof: RangeProof = self.proof.try_into()?; From 6bc02d5d0de7c844904e98b365d67272c586e051 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 06:49:51 +0900 Subject: [PATCH 080/213] v1.17: [zk-token-sdk] Restrict range proof generator length and prevent 0-bit range proof (backport of #34166) (#34183) * [zk-token-sdk] Restrict range proof generator length and prevent 0-bit range proof (#34166) * limit range proof generator length * forbid 0-bit range proof verification (cherry picked from commit 0e6dd54f81af6af3c4e708a1c14e088cf0e574cf) # Conflicts: # zk-token-sdk/src/range_proof/errors.rs # zk-token-sdk/src/range_proof/generators.rs # zk-token-sdk/src/range_proof/mod.rs * resolve conflict --------- Co-authored-by: samkim-crypto --- .../batched_range_proof_u128.rs | 4 ++- .../batched_range_proof_u256.rs | 4 ++- .../batched_range_proof_u64.rs | 4 ++- zk-token-sdk/src/instruction/range_proof.rs | 1 + .../src/instruction/transfer/with_fee.rs | 3 +- .../src/instruction/transfer/without_fee.rs | 2 ++ zk-token-sdk/src/instruction/withdraw.rs | 3 +- zk-token-sdk/src/range_proof/errors.rs | 12 ++++++++ zk-token-sdk/src/range_proof/generators.rs | 28 +++++++++++++------ zk-token-sdk/src/range_proof/inner_product.rs | 4 +-- zk-token-sdk/src/range_proof/mod.rs | 24 +++++++++------- zk-token-sdk/src/zk_token_elgamal/convert.rs | 11 +++++--- 12 files changed, 70 insertions(+), 30 deletions(-) diff --git a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u128.rs b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u128.rs index c099401b51c8c6..b1d6dfbc91d736 100644 --- a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u128.rs +++ b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u128.rs @@ -59,7 +59,9 @@ impl BatchedRangeProofU128Data { BatchedRangeProofContext::new(&commitments, &amounts, &bit_lengths, &openings)?; let mut transcript = context.new_transcript(); - let proof = RangeProof::new(amounts, bit_lengths, openings, &mut transcript).try_into()?; + let proof = RangeProof::new(amounts, bit_lengths, openings, &mut transcript) + .map_err(|_| ProofError::Generation)? + .try_into()?; Ok(Self { context, proof }) } diff --git a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u256.rs b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u256.rs index a9b1c3c13fae66..7a135d7038712b 100644 --- a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u256.rs +++ b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u256.rs @@ -57,7 +57,9 @@ impl BatchedRangeProofU256Data { BatchedRangeProofContext::new(&commitments, &amounts, &bit_lengths, &openings)?; let mut transcript = context.new_transcript(); - let proof = RangeProof::new(amounts, bit_lengths, openings, &mut transcript).try_into()?; + let proof = RangeProof::new(amounts, bit_lengths, openings, &mut transcript) + .map_err(|_| ProofError::Generation)? + .try_into()?; Ok(Self { context, proof }) } diff --git a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u64.rs b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u64.rs index 6f7c773bfd8da5..943b4f748b8c3d 100644 --- a/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u64.rs +++ b/zk-token-sdk/src/instruction/batched_range_proof/batched_range_proof_u64.rs @@ -59,7 +59,9 @@ impl BatchedRangeProofU64Data { BatchedRangeProofContext::new(&commitments, &amounts, &bit_lengths, &openings)?; let mut transcript = context.new_transcript(); - let proof = RangeProof::new(amounts, bit_lengths, openings, &mut transcript).try_into()?; + let proof = RangeProof::new(amounts, bit_lengths, openings, &mut transcript) + .map_err(|_| ProofError::Generation)? + .try_into()?; Ok(Self { context, proof }) } diff --git a/zk-token-sdk/src/instruction/range_proof.rs b/zk-token-sdk/src/instruction/range_proof.rs index 3342f5c34fb8fb..abe42eeed8d29a 100644 --- a/zk-token-sdk/src/instruction/range_proof.rs +++ b/zk-token-sdk/src/instruction/range_proof.rs @@ -65,6 +65,7 @@ impl RangeProofU64Data { let bit_size = usize::try_from(u64::BITS).unwrap(); let proof = RangeProof::new(vec![amount], vec![bit_size], vec![opening], &mut transcript) + .map_err(|_| ProofError::Generation)? .try_into()?; Ok(Self { context, proof }) diff --git a/zk-token-sdk/src/instruction/transfer/with_fee.rs b/zk-token-sdk/src/instruction/transfer/with_fee.rs index 709b0b63797ce9..8d7367647a3618 100644 --- a/zk-token-sdk/src/instruction/transfer/with_fee.rs +++ b/zk-token-sdk/src/instruction/transfer/with_fee.rs @@ -559,7 +559,8 @@ impl TransferWithFeeProof { opening_fee_hi, ], transcript, - ); + ) + .expect("range proof: generator"); Self { new_source_commitment: pod_new_source_commitment, diff --git a/zk-token-sdk/src/instruction/transfer/without_fee.rs b/zk-token-sdk/src/instruction/transfer/without_fee.rs index ad4def104d3b40..02b8fa366f2746 100644 --- a/zk-token-sdk/src/instruction/transfer/without_fee.rs +++ b/zk-token-sdk/src/instruction/transfer/without_fee.rs @@ -333,6 +333,7 @@ impl TransferProof { vec![&source_opening, opening_lo, opening_hi], transcript, ) + .expect("range proof: generator") } else { let transfer_amount_lo_negated = (1 << TRANSFER_AMOUNT_LO_NEGATED_BITS) - 1 - transfer_amount_lo; @@ -354,6 +355,7 @@ impl TransferProof { vec![&source_opening, opening_lo, &opening_lo_negated, opening_hi], transcript, ) + .expect("range proof: generator") }; Self { diff --git a/zk-token-sdk/src/instruction/withdraw.rs b/zk-token-sdk/src/instruction/withdraw.rs index 6a493d541fbc54..0d9e4607bc5665 100644 --- a/zk-token-sdk/src/instruction/withdraw.rs +++ b/zk-token-sdk/src/instruction/withdraw.rs @@ -157,7 +157,8 @@ impl WithdrawProof { ); let range_proof = - RangeProof::new(vec![final_balance], vec![64], vec![&opening], transcript); + RangeProof::new(vec![final_balance], vec![64], vec![&opening], transcript) + .expect("range proof: generator"); Self { commitment: pod_commitment, diff --git a/zk-token-sdk/src/range_proof/errors.rs b/zk-token-sdk/src/range_proof/errors.rs index f832365fffc7ea..aff3cb8eed60fe 100644 --- a/zk-token-sdk/src/range_proof/errors.rs +++ b/zk-token-sdk/src/range_proof/errors.rs @@ -8,3 +8,15 @@ use { #[error("range proof verification failed: {0}")] pub struct RangeProofError(#[from] pub(crate) ProofVerificationError); impl_from_transcript_error!(RangeProofError); + +#[derive(Error, Clone, Debug, Eq, PartialEq)] +pub enum RangeProofGenerationError { + #[error("maximum generator length exceeded")] + MaximumGeneratorLengthExceeded, +} + +#[derive(Error, Clone, Debug, Eq, PartialEq)] +pub enum RangeProofGeneratorError { + #[error("maximum generator length exceeded")] + MaximumGeneratorLengthExceeded, +} diff --git a/zk-token-sdk/src/range_proof/generators.rs b/zk-token-sdk/src/range_proof/generators.rs index f41f6fcd049fa5..46facd50dcc15a 100644 --- a/zk-token-sdk/src/range_proof/generators.rs +++ b/zk-token-sdk/src/range_proof/generators.rs @@ -1,4 +1,5 @@ use { + crate::range_proof::errors::RangeProofGeneratorError, curve25519_dalek::{ digest::{ExtendableOutput, Update, XofReader}, ristretto::RistrettoPoint, @@ -6,10 +7,12 @@ use { sha3::{Sha3XofReader, Shake256}, }; +#[cfg(not(target_os = "solana"))] +const MAX_GENERATOR_LENGTH: usize = u32::MAX as usize; + /// Generators for Pedersen vector commitments. /// /// The code is copied from https://github.com/dalek-cryptography/bulletproofs for now... - struct GeneratorsChain { reader: Sha3XofReader, } @@ -70,14 +73,14 @@ pub struct BulletproofGens { } impl BulletproofGens { - pub fn new(gens_capacity: usize) -> Self { + pub fn new(gens_capacity: usize) -> Result { let mut gens = BulletproofGens { gens_capacity: 0, G_vec: Vec::new(), H_vec: Vec::new(), }; - gens.increase_capacity(gens_capacity); - gens + gens.increase_capacity(gens_capacity)?; + Ok(gens) } // pub fn new_aggregate(gens_capacities: Vec) -> Vec { @@ -90,25 +93,32 @@ impl BulletproofGens { /// Increases the generators' capacity to the amount specified. /// If less than or equal to the current capacity, does nothing. - pub fn increase_capacity(&mut self, new_capacity: usize) { + pub fn increase_capacity( + &mut self, + new_capacity: usize, + ) -> Result<(), RangeProofGeneratorError> { if self.gens_capacity >= new_capacity { - return; + return Ok(()); + } + + if new_capacity > MAX_GENERATOR_LENGTH { + return Err(RangeProofGeneratorError::MaximumGeneratorLengthExceeded); } - let label = [b'G']; self.G_vec.extend( - &mut GeneratorsChain::new(&[label, [b'G']].concat()) + &mut GeneratorsChain::new(&[b'G']) .fast_forward(self.gens_capacity) .take(new_capacity - self.gens_capacity), ); self.H_vec.extend( - &mut GeneratorsChain::new(&[label, [b'H']].concat()) + &mut GeneratorsChain::new(&[b'H']) .fast_forward(self.gens_capacity) .take(new_capacity - self.gens_capacity), ); self.gens_capacity = new_capacity; + Ok(()) } #[allow(non_snake_case)] diff --git a/zk-token-sdk/src/range_proof/inner_product.rs b/zk-token-sdk/src/range_proof/inner_product.rs index 2693e455a8f4d7..ca0f6911bd416b 100644 --- a/zk-token-sdk/src/range_proof/inner_product.rs +++ b/zk-token-sdk/src/range_proof/inner_product.rs @@ -206,7 +206,7 @@ impl InnerProductProof { transcript: &mut Transcript, ) -> Result<(Vec, Vec, Vec), RangeProofError> { let lg_n = self.L_vec.len(); - if lg_n >= 32 { + if lg_n == 0 || lg_n >= 32 { // 4 billion multiplications should be enough for anyone // and this check prevents overflow in 1< = bp_gens.G(n).cloned().collect(); let H: Vec = bp_gens.H(n).cloned().collect(); diff --git a/zk-token-sdk/src/range_proof/mod.rs b/zk-token-sdk/src/range_proof/mod.rs index b2221ff3707e90..75059c920fe854 100644 --- a/zk-token-sdk/src/range_proof/mod.rs +++ b/zk-token-sdk/src/range_proof/mod.rs @@ -10,7 +10,9 @@ use { encryption::pedersen::{G, H}, errors::ProofVerificationError, range_proof::{ - errors::RangeProofError, generators::BulletproofGens, inner_product::InnerProductProof, + errors::{RangeProofError, RangeProofGenerationError}, + generators::BulletproofGens, + inner_product::InnerProductProof, }, transcript::TranscriptProtocol, }, @@ -59,7 +61,7 @@ impl RangeProof { bit_lengths: Vec, openings: Vec<&PedersenOpening>, transcript: &mut Transcript, - ) -> Self { + ) -> Result { // amounts, bit-lengths, openings must be same length vectors let m = amounts.len(); assert_eq!(bit_lengths.len(), m); @@ -69,9 +71,8 @@ impl RangeProof { let nm: usize = bit_lengths.iter().sum(); assert!(nm.is_power_of_two()); - // TODO: precompute generators - // TODO: double check Pedersen generators and range proof generators does not interfere - let bp_gens = BulletproofGens::new(nm); + let bp_gens = BulletproofGens::new(nm) + .map_err(|_| RangeProofGenerationError::MaximumGeneratorLengthExceeded)?; // bit-decompose values and generate their Pedersen vector commitment let a_blinding = Scalar::random(&mut OsRng); @@ -206,7 +207,7 @@ impl RangeProof { transcript, ); - RangeProof { + Ok(RangeProof { A, S, T_1, @@ -215,7 +216,7 @@ impl RangeProof { t_x_blinding, e_blinding, ipp_proof, - } + }) } #[allow(clippy::many_single_char_names)] @@ -230,7 +231,8 @@ impl RangeProof { let m = bit_lengths.len(); let nm: usize = bit_lengths.iter().sum(); - let bp_gens = BulletproofGens::new(nm); + let bp_gens = BulletproofGens::new(nm) + .map_err(|_| ProofVerificationError::InvalidGeneratorsLength)?; if !nm.is_power_of_two() { return Err(ProofVerificationError::InvalidBitSize.into()); @@ -400,7 +402,8 @@ mod tests { let mut transcript_create = Transcript::new(b"Test"); let mut transcript_verify = Transcript::new(b"Test"); - let proof = RangeProof::new(vec![55], vec![32], vec![&open], &mut transcript_create); + let proof = + RangeProof::new(vec![55], vec![32], vec![&open], &mut transcript_create).unwrap(); assert!(proof .verify(vec![&comm], vec![32], &mut transcript_verify) @@ -421,7 +424,8 @@ mod tests { vec![64, 32, 32], vec![&open_1, &open_2, &open_3], &mut transcript_create, - ); + ) + .unwrap(); assert!(proof .verify( diff --git a/zk-token-sdk/src/zk_token_elgamal/convert.rs b/zk-token-sdk/src/zk_token_elgamal/convert.rs index 44ebdc27646581..5a9331c3375ab5 100644 --- a/zk-token-sdk/src/zk_token_elgamal/convert.rs +++ b/zk-token-sdk/src/zk_token_elgamal/convert.rs @@ -104,7 +104,7 @@ mod tests { let proof = RangeProof::new(vec![55], vec![64], vec![&open], &mut transcript_create); - let proof_serialized: pod::RangeProofU64 = proof.try_into().unwrap(); + let proof_serialized: pod::RangeProofU64 = proof.unwrap().try_into().unwrap(); let proof_deserialized: RangeProof = proof_serialized.try_into().unwrap(); assert!(proof_deserialized @@ -112,7 +112,8 @@ mod tests { .is_ok()); // should fail to serialize to pod::RangeProof128 - let proof = RangeProof::new(vec![55], vec![64], vec![&open], &mut transcript_create); + let proof = + RangeProof::new(vec![55], vec![64], vec![&open], &mut transcript_create).unwrap(); assert!(TryInto::::try_into(proof).is_err()); } @@ -131,7 +132,8 @@ mod tests { vec![64, 32, 32], vec![&open_1, &open_2, &open_3], &mut transcript_create, - ); + ) + .unwrap(); let proof_serialized: pod::RangeProofU128 = proof.try_into().unwrap(); let proof_deserialized: RangeProof = proof_serialized.try_into().unwrap(); @@ -150,7 +152,8 @@ mod tests { vec![64, 32, 32], vec![&open_1, &open_2, &open_3], &mut transcript_create, - ); + ) + .unwrap(); assert!(TryInto::::try_into(proof).is_err()); } From 75b59c1c071bc657499adb3ed23f4474d4e83ab2 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 08:50:13 -0800 Subject: [PATCH 081/213] v1.17: check vote costs against block limits in would_fit (backport of #34207) (#34210) Co-authored-by: Andrew Fitzgerald --- cost-model/src/cost_tracker.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cost-model/src/cost_tracker.rs b/cost-model/src/cost_tracker.rs index e4f1b917d74b26..0841849bf1d90c 100644 --- a/cost-model/src/cost_tracker.rs +++ b/cost-model/src/cost_tracker.rs @@ -186,7 +186,9 @@ impl CostTracker { if self.vote_cost.saturating_add(cost) > self.vote_cost_limit { return Err(CostTrackerError::WouldExceedVoteMaxLimit); } - } else if self.block_cost.saturating_add(cost) > self.block_cost_limit { + } + + if self.block_cost.saturating_add(cost) > self.block_cost_limit { // check against the total package cost return Err(CostTrackerError::WouldExceedBlockMaxLimit); } From b12ee21d4d5d5d3d0c0db359eba44b953f98bbf1 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 12:06:36 -0500 Subject: [PATCH 082/213] v1.17: Uses Display for error in VerifyAccountsHashInBackground's panic message (backport of #34219) (#34224) Uses Display for error in VerifyAccountsHashInBackground's panic message (#34219) (cherry picked from commit deee5f833c47f23a5e073c764884aa42d215e52a) Co-authored-by: Brooks --- accounts-db/src/verify_accounts_hash_in_background.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accounts-db/src/verify_accounts_hash_in_background.rs b/accounts-db/src/verify_accounts_hash_in_background.rs index d4676cfe128f81..f03e4e0482ce8e 100644 --- a/accounts-db/src/verify_accounts_hash_in_background.rs +++ b/accounts-db/src/verify_accounts_hash_in_background.rs @@ -67,7 +67,7 @@ impl VerifyAccountsHashInBackground { } let result = lock.take().unwrap().join().unwrap(); if !result { - panic!("initial hash verification failed: {result:?}"); + panic!("initial background accounts hash verification failed: {result}"); } // we never have to check again self.verification_complete(); @@ -139,7 +139,7 @@ pub mod tests { } #[test] - #[should_panic(expected = "initial hash verification failed")] + #[should_panic(expected = "initial background accounts hash verification failed")] fn test_panic() { let verify = Arc::new(VerifyAccountsHashInBackground::default()); start_thread_and_return(&verify, false, || {}); From 4d79fd7c6f122a75bfee76ad2ed67e8a39f2be2d Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 09:53:01 +1100 Subject: [PATCH 083/213] v1.17: direct_mapping: fix iter_memory_pair_chunks in reverse mode (backport of #34204) (#34236) direct_mapping: fix iter_memory_pair_chunks in reverse mode (#34204) iter_memory_pair_chunks was iterating regions in reverse, but not memory _within_ regions in reverse. This commit fixes the issue and simplifies the implementation by removing nested loops which made control flow hard to reason about. (cherry picked from commit 09088822e784a0bff840dad0b59edea5bd9cceb5) Co-authored-by: Alessandro Decina --- Cargo.lock | 1 + programs/bpf_loader/Cargo.toml | 1 + programs/bpf_loader/src/syscalls/mem_ops.rs | 254 ++++++++++++-------- 3 files changed, 157 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aa978b4de33ca4..ddc3432895c806 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5412,6 +5412,7 @@ dependencies = [ "solana-sdk", "solana-zk-token-sdk", "solana_rbpf", + "test-case", "thiserror", ] diff --git a/programs/bpf_loader/Cargo.toml b/programs/bpf_loader/Cargo.toml index 16a52c07928620..48d771b8656828 100644 --- a/programs/bpf_loader/Cargo.toml +++ b/programs/bpf_loader/Cargo.toml @@ -27,6 +27,7 @@ assert_matches = { workspace = true } memoffset = { workspace = true } rand = { workspace = true } solana-sdk = { workspace = true, features = ["dev-context-only-utils"] } +test-case = { workspace = true } [lib] crate-type = ["lib"] diff --git a/programs/bpf_loader/src/syscalls/mem_ops.rs b/programs/bpf_loader/src/syscalls/mem_ops.rs index 9354270ac2f0b7..848151dca91bf5 100644 --- a/programs/bpf_loader/src/syscalls/mem_ops.rs +++ b/programs/bpf_loader/src/syscalls/mem_ops.rs @@ -294,8 +294,8 @@ fn iter_memory_pair_chunks( src_access: AccessType, src_addr: u64, dst_access: AccessType, - mut dst_addr: u64, - n: u64, + dst_addr: u64, + n_bytes: u64, memory_mapping: &MemoryMapping, reverse: bool, mut fun: F, @@ -304,52 +304,90 @@ where T: Default, F: FnMut(*const u8, *const u8, usize) -> Result, { - let mut src_chunk_iter = MemoryChunkIterator::new(memory_mapping, src_access, src_addr, n) - .map_err(EbpfError::from)?; - loop { - // iterate source chunks - let (src_region, src_vm_addr, mut src_len) = match if reverse { - src_chunk_iter.next_back() - } else { - src_chunk_iter.next() - } { - Some(item) => item?, - None => break, - }; - - let mut src_host_addr = Result::from(src_region.vm_to_host(src_vm_addr, src_len as u64))?; - let mut dst_chunk_iter = MemoryChunkIterator::new(memory_mapping, dst_access, dst_addr, n) + let mut src_chunk_iter = + MemoryChunkIterator::new(memory_mapping, src_access, src_addr, n_bytes) + .map_err(EbpfError::from)?; + let mut dst_chunk_iter = + MemoryChunkIterator::new(memory_mapping, dst_access, dst_addr, n_bytes) .map_err(EbpfError::from)?; - // iterate over destination chunks until this source chunk has been completely copied - while src_len > 0 { - loop { - let (dst_region, dst_vm_addr, dst_len) = match if reverse { - dst_chunk_iter.next_back() + + let mut src_chunk = None; + let mut dst_chunk = None; + + macro_rules! memory_chunk { + ($chunk_iter:ident, $chunk:ident) => { + if let Some($chunk) = &mut $chunk { + // Keep processing the current chunk + $chunk + } else { + // This is either the first call or we've processed all the bytes in the current + // chunk. Move to the next one. + let chunk = match if reverse { + $chunk_iter.next_back() } else { - dst_chunk_iter.next() + $chunk_iter.next() } { Some(item) => item?, None => break, }; - let dst_host_addr = - Result::from(dst_region.vm_to_host(dst_vm_addr, dst_len as u64))?; - let chunk_len = src_len.min(dst_len); - fun( - src_host_addr as *const u8, - dst_host_addr as *const u8, - chunk_len, - )?; - src_len = src_len.saturating_sub(chunk_len); - if reverse { - dst_addr = dst_addr.saturating_sub(chunk_len as u64); - } else { - dst_addr = dst_addr.saturating_add(chunk_len as u64); - } - if src_len == 0 { - break; - } - src_host_addr = src_host_addr.saturating_add(chunk_len as u64); + $chunk.insert(chunk) } + }; + } + + loop { + let (src_region, src_chunk_addr, src_remaining) = memory_chunk!(src_chunk_iter, src_chunk); + let (dst_region, dst_chunk_addr, dst_remaining) = memory_chunk!(dst_chunk_iter, dst_chunk); + + // We always process same-length pairs + let chunk_len = *src_remaining.min(dst_remaining); + + let (src_host_addr, dst_host_addr) = { + let (src_addr, dst_addr) = if reverse { + // When scanning backwards not only we want to scan regions from the end, + // we want to process the memory within regions backwards as well. + ( + src_chunk_addr + .saturating_add(*src_remaining as u64) + .saturating_sub(chunk_len as u64), + dst_chunk_addr + .saturating_add(*dst_remaining as u64) + .saturating_sub(chunk_len as u64), + ) + } else { + (*src_chunk_addr, *dst_chunk_addr) + }; + + ( + Result::from(src_region.vm_to_host(src_addr, chunk_len as u64))?, + Result::from(dst_region.vm_to_host(dst_addr, chunk_len as u64))?, + ) + }; + + fun( + src_host_addr as *const u8, + dst_host_addr as *const u8, + chunk_len, + )?; + + // Update how many bytes we have left to scan in each chunk + *src_remaining = src_remaining.saturating_sub(chunk_len); + *dst_remaining = dst_remaining.saturating_sub(chunk_len); + + if !reverse { + // We've scanned `chunk_len` bytes so we move the vm address forward. In reverse + // mode we don't do this since we make progress by decreasing src_len and + // dst_len. + *src_chunk_addr = src_chunk_addr.saturating_add(chunk_len as u64); + *dst_chunk_addr = dst_chunk_addr.saturating_add(chunk_len as u64); + } + + if *src_remaining == 0 { + src_chunk = None; + } + + if *dst_remaining == 0 { + dst_chunk = None; } } @@ -476,11 +514,13 @@ impl<'a> DoubleEndedIterator for MemoryChunkIterator<'a> { #[cfg(test)] #[allow(clippy::indexing_slicing)] +#[allow(clippy::arithmetic_side_effects)] mod tests { use { super::*, assert_matches::assert_matches, solana_rbpf::{ebpf::MM_PROGRAM_START, program::SBPFVersion}, + test_case::test_case, }; fn to_chunk_vec<'a>( @@ -739,72 +779,59 @@ mod tests { memmove_non_contiguous(MM_PROGRAM_START, MM_PROGRAM_START + 8, 4, &memory_mapping).unwrap(); } - #[test] - fn test_overlapping_memmove_non_contiguous_right() { + #[test_case(&[], (0, 0, 0); "no regions")] + #[test_case(&[10], (1, 10, 0); "single region 0 len")] + #[test_case(&[10], (0, 5, 5); "single region no overlap")] + #[test_case(&[10], (0, 0, 10) ; "single region complete overlap")] + #[test_case(&[10], (2, 0, 5); "single region partial overlap start")] + #[test_case(&[10], (0, 1, 6); "single region partial overlap middle")] + #[test_case(&[10], (2, 5, 5); "single region partial overlap end")] + #[test_case(&[3, 5], (0, 5, 2) ; "two regions no overlap, single source region")] + #[test_case(&[4, 7], (0, 5, 5) ; "two regions no overlap, multiple source regions")] + #[test_case(&[3, 8], (0, 0, 11) ; "two regions complete overlap")] + #[test_case(&[2, 9], (3, 0, 5) ; "two regions partial overlap start")] + #[test_case(&[3, 9], (1, 2, 5) ; "two regions partial overlap middle")] + #[test_case(&[7, 3], (2, 6, 4) ; "two regions partial overlap end")] + #[test_case(&[2, 6, 3, 4], (0, 10, 2) ; "many regions no overlap, single source region")] + #[test_case(&[2, 1, 2, 5, 6], (2, 10, 4) ; "many regions no overlap, multiple source regions")] + #[test_case(&[8, 1, 3, 6], (0, 0, 18) ; "many regions complete overlap")] + #[test_case(&[7, 3, 1, 4, 5], (5, 0, 8) ; "many regions overlap start")] + #[test_case(&[1, 5, 2, 9, 3], (5, 4, 8) ; "many regions overlap middle")] + #[test_case(&[3, 9, 1, 1, 2, 1], (2, 9, 8) ; "many regions overlap end")] + fn test_memmove_non_contiguous( + regions: &[usize], + (src_offset, dst_offset, len): (usize, usize, usize), + ) { let config = Config { aligned_memory_mapping: false, ..Config::default() }; - let mem1 = vec![0x11; 1]; - let mut mem2 = vec![0x22; 2]; - let mut mem3 = vec![0x33; 3]; - let mut mem4 = vec![0x44; 4]; - let memory_mapping = MemoryMapping::new( - vec![ - MemoryRegion::new_readonly(&mem1, MM_PROGRAM_START), - MemoryRegion::new_writable(&mut mem2, MM_PROGRAM_START + 1), - MemoryRegion::new_writable(&mut mem3, MM_PROGRAM_START + 3), - MemoryRegion::new_writable(&mut mem4, MM_PROGRAM_START + 6), - ], - &config, - &SBPFVersion::V2, - ) - .unwrap(); - - // overlapping memmove right - the implementation will copy backwards - assert_eq!( - memmove_non_contiguous(MM_PROGRAM_START + 1, MM_PROGRAM_START, 7, &memory_mapping) - .unwrap(), - 0 - ); - assert_eq!(&mem1, &[0x11]); - assert_eq!(&mem2, &[0x11, 0x22]); - assert_eq!(&mem3, &[0x22, 0x33, 0x33]); - assert_eq!(&mem4, &[0x33, 0x44, 0x44, 0x44]); - } - - #[test] - fn test_overlapping_memmove_non_contiguous_left() { - let config = Config { - aligned_memory_mapping: false, - ..Config::default() + let (mem, memory_mapping) = build_memory_mapping(regions, &config); + + // flatten the memory so we can memmove it with ptr::copy + let mut expected_memory = flatten_memory(&mem); + unsafe { + std::ptr::copy( + expected_memory.as_ptr().add(src_offset), + expected_memory.as_mut_ptr().add(dst_offset), + len, + ) }; - let mut mem1 = vec![0x11; 1]; - let mut mem2 = vec![0x22; 2]; - let mut mem3 = vec![0x33; 3]; - let mut mem4 = vec![0x44; 4]; - let memory_mapping = MemoryMapping::new( - vec![ - MemoryRegion::new_writable(&mut mem1, MM_PROGRAM_START), - MemoryRegion::new_writable(&mut mem2, MM_PROGRAM_START + 1), - MemoryRegion::new_writable(&mut mem3, MM_PROGRAM_START + 3), - MemoryRegion::new_writable(&mut mem4, MM_PROGRAM_START + 6), - ], - &config, - &SBPFVersion::V2, + + // do our memmove + memmove_non_contiguous( + MM_PROGRAM_START + dst_offset as u64, + MM_PROGRAM_START + src_offset as u64, + len as u64, + &memory_mapping, ) .unwrap(); - // overlapping memmove left - the implementation will copy forward - assert_eq!( - memmove_non_contiguous(MM_PROGRAM_START, MM_PROGRAM_START + 1, 7, &memory_mapping) - .unwrap(), - 0 - ); - assert_eq!(&mem1, &[0x22]); - assert_eq!(&mem2, &[0x22, 0x33]); - assert_eq!(&mem3, &[0x33, 0x33, 0x44]); - assert_eq!(&mem4, &[0x44, 0x44, 0x44, 0x44]); + // flatten memory post our memmove + let memory = flatten_memory(&mem); + + // compare libc's memmove with ours + assert_eq!(expected_memory, memory); } #[test] @@ -915,4 +942,33 @@ mod tests { unsafe { memcmp(b"oobar", b"obarb", 5) } ); } + + fn build_memory_mapping<'a>( + regions: &[usize], + config: &'a Config, + ) -> (Vec>, MemoryMapping<'a>) { + let mut regs = vec![]; + let mut mem = Vec::new(); + let mut offset = 0; + for (i, region_len) in regions.iter().enumerate() { + mem.push( + (0..*region_len) + .map(|x| (i * 10 + x) as u8) + .collect::>(), + ); + regs.push(MemoryRegion::new_writable( + &mut mem[i], + MM_PROGRAM_START + offset as u64, + )); + offset += *region_len; + } + + let memory_mapping = MemoryMapping::new(regs, config, &SBPFVersion::V2).unwrap(); + + (mem, memory_mapping) + } + + fn flatten_memory(mem: &[Vec]) -> Vec { + mem.iter().flatten().copied().collect() + } } From 67bfb48472fa5f677500fc28adf1fe0f36544e0f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 18:46:56 -0700 Subject: [PATCH 084/213] v1.17: bigtable: fix AccessToken issues (backport of #34213) (#34238) bigtable: fix AccessToken issues (#34213) * bigtable: fix AccessToken issue * remove inner * less changes * fmt + drop lock (cherry picked from commit 873bef9fef6d7fe12995259c4cd66b6d4095f490) Co-authored-by: Kirill Fomichev --- storage-bigtable/src/access_token.rs | 68 ++++++++++++++++------------ storage-bigtable/src/bigtable.rs | 18 ++++---- 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/storage-bigtable/src/access_token.rs b/storage-bigtable/src/access_token.rs index f4d5e9ade98bee..8881f594acedcd 100644 --- a/storage-bigtable/src/access_token.rs +++ b/storage-bigtable/src/access_token.rs @@ -91,41 +91,49 @@ impl AccessToken { } /// Call this function regularly to ensure the access token does not expire - pub async fn refresh(&self) { + pub fn refresh(&self) { // Check if it's time to try a token refresh - { - let token_r = self.token.read().unwrap(); - if token_r.1.elapsed().as_secs() < token_r.0.expires_in() as u64 / 2 { - return; - } + let token_r = self.token.read().unwrap(); + if token_r.1.elapsed().as_secs() < token_r.0.expires_in() as u64 / 2 { + debug!("Token is not expired yet"); + return; + } + drop(token_r); - #[allow(deprecated)] - if self - .refresh_active - .compare_and_swap(false, true, Ordering::Relaxed) - { - // Refresh already pending - return; - } + // Refresh already is progress + let refresh_progress = + self.refresh_active + .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed); + if refresh_progress.is_err() { + debug!("Token update is already in progress"); + return; } - info!("Refreshing token"); - match time::timeout( - time::Duration::from_secs(5), - Self::get_token(&self.credentials, &self.scope), - ) - .await - { - Ok(new_token) => match (new_token, self.token.write()) { - (Ok(new_token), Ok(mut token_w)) => *token_w = new_token, - (Ok(_new_token), Err(err)) => warn!("{}", err), - (Err(err), _) => warn!("{}", err), - }, - Err(_) => { - warn!("Token refresh timeout") + let credentials = self.credentials.clone(); + let scope = self.scope.clone(); + let refresh_active = Arc::clone(&self.refresh_active); + let token = Arc::clone(&self.token); + tokio::spawn(async move { + match time::timeout( + time::Duration::from_secs(5), + Self::get_token(&credentials, &scope), + ) + .await + { + Ok(new_token) => match new_token { + Ok(new_token) => { + let mut token_w = token.write().unwrap(); + *token_w = new_token; + } + Err(err) => error!("Failed to fetch new token: {}", err), + }, + Err(_timeout) => { + warn!("Token refresh timeout") + } } - } - self.refresh_active.store(false, Ordering::Relaxed); + refresh_active.store(false, Ordering::Relaxed); + info!("Token refreshed"); + }); } /// Return an access token suitable for use in an HTTP authorization header diff --git a/storage-bigtable/src/bigtable.rs b/storage-bigtable/src/bigtable.rs index fd17cfa8dd2568..e777caaebb0906 100644 --- a/storage-bigtable/src/bigtable.rs +++ b/storage-bigtable/src/bigtable.rs @@ -399,9 +399,9 @@ impl) -> InterceptedRequestResult> BigTable { Ok(rows) } - async fn refresh_access_token(&self) { + fn refresh_access_token(&self) { if let Some(ref access_token) = self.access_token { - access_token.refresh().await; + access_token.refresh(); } } @@ -423,7 +423,7 @@ impl) -> InterceptedRequestResult> BigTable { if rows_limit == 0 { return Ok(vec![]); } - self.refresh_access_token().await; + self.refresh_access_token(); let response = self .client .read_rows(ReadRowsRequest { @@ -468,7 +468,7 @@ impl) -> InterceptedRequestResult> BigTable { /// Check whether a row key exists in a `table` pub async fn row_key_exists(&mut self, table_name: &str, row_key: RowKey) -> Result { - self.refresh_access_token().await; + self.refresh_access_token(); let response = self .client @@ -513,7 +513,7 @@ impl) -> InterceptedRequestResult> BigTable { if rows_limit == 0 { return Ok(vec![]); } - self.refresh_access_token().await; + self.refresh_access_token(); let response = self .client .read_rows(ReadRowsRequest { @@ -547,7 +547,7 @@ impl) -> InterceptedRequestResult> BigTable { table_name: &str, row_keys: &[RowKey], ) -> Result> { - self.refresh_access_token().await; + self.refresh_access_token(); let response = self .client @@ -583,7 +583,7 @@ impl) -> InterceptedRequestResult> BigTable { table_name: &str, row_key: RowKey, ) -> Result { - self.refresh_access_token().await; + self.refresh_access_token(); let response = self .client @@ -612,7 +612,7 @@ impl) -> InterceptedRequestResult> BigTable { /// Delete one or more `table` rows async fn delete_rows(&mut self, table_name: &str, row_keys: &[RowKey]) -> Result<()> { - self.refresh_access_token().await; + self.refresh_access_token(); let mut entries = vec![]; for row_key in row_keys { @@ -658,7 +658,7 @@ impl) -> InterceptedRequestResult> BigTable { family_name: &str, row_data: &[(&RowKey, RowData)], ) -> Result<()> { - self.refresh_access_token().await; + self.refresh_access_token(); let mut entries = vec![]; for (row_key, row_data) in row_data { From 4d0ccab0756e69f152e25c02aeccac1a3521733e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:31:49 +1100 Subject: [PATCH 085/213] v1.17: cpi: direct_mapping: always zero spare capacity if account alloc changes (backport of #34141) (#34177) cpi: direct_mapping: always zero spare capacity if account alloc changes (#34141) If the vector holding an account is reallocated during execution of a callee, we must zero the spare capacity regardless of whether the account size changed, because the underlying vector might contain uninitialized memory in the spare capacity. Co-authored-by: Alessandro Decina --- programs/bpf_loader/src/syscalls/cpi.rs | 181 ++++++++++++---------- programs/sbf/rust/invoke/src/processor.rs | 28 ++++ 2 files changed, 127 insertions(+), 82 deletions(-) diff --git a/programs/bpf_loader/src/syscalls/cpi.rs b/programs/bpf_loader/src/syscalls/cpi.rs index c91e3705423151..e9c4bd91beef58 100644 --- a/programs/bpf_loader/src/syscalls/cpi.rs +++ b/programs/bpf_loader/src/syscalls/cpi.rs @@ -1463,11 +1463,14 @@ fn update_caller_account( caller_account.vm_data_addr, caller_account.original_data_len, )? { - // Since each instruction account is directly mapped in a memory region - // with a *fixed* length, upon returning from CPI we must ensure that the - // current capacity is at least the original length (what is mapped in - // memory), so that the account's memory region never points to an - // invalid address. + // Since each instruction account is directly mapped in a memory region with a *fixed* + // length, upon returning from CPI we must ensure that the current capacity is at least + // the original length (what is mapped in memory), so that the account's memory region + // never points to an invalid address. + // + // Note that the capacity can be smaller than the original length only if the account is + // reallocated using the AccountSharedData API directly (deprecated). BorrowedAccount + // and CoW don't trigger this, see BorrowedAccount::make_data_mut. let min_capacity = caller_account.original_data_len; if callee_account.capacity() < min_capacity { callee_account @@ -1475,10 +1478,13 @@ fn update_caller_account( zero_all_mapped_spare_capacity = true; } - // If an account's data pointer has changed - because of CoW, reserve() as called above - // or because of using AccountSharedData directly (deprecated) - we must update the - // corresponding MemoryRegion in the caller's address space. Address spaces are fixed so - // we don't need to update the MemoryRegion's length. + // If an account's data pointer has changed we must update the corresponding + // MemoryRegion in the caller's address space. Address spaces are fixed so we don't need + // to update the MemoryRegion's length. + // + // An account's data pointer can change if the account is reallocated because of CoW, + // because of BorrowedAccount::make_data_mut or by a program that uses the + // AccountSharedData API directly (deprecated). let callee_ptr = callee_account.get_data().as_ptr() as u64; if region.host_addr.get() != callee_ptr { region.host_addr.set(callee_ptr); @@ -1489,7 +1495,6 @@ fn update_caller_account( let prev_len = *caller_account.ref_to_len_in_vm.get()? as usize; let post_len = callee_account.get_data().len(); - let realloc_bytes_used = post_len.saturating_sub(caller_account.original_data_len); if prev_len != post_len { let max_increase = if direct_mapping && !invoke_context.get_check_aligned() { 0 @@ -1513,37 +1518,8 @@ fn update_caller_account( if post_len < prev_len { if direct_mapping { // We have two separate regions to zero out: the account data - // and the realloc region. - // - // Here we zero the account data region. - let spare_len = if zero_all_mapped_spare_capacity { - // In the unlikely case where the account data vector has - // changed - which can happen during CoW - we zero the whole - // extra capacity up to the original data length. - // - // The extra capacity up to original data length is - // accessible from the vm and since it's uninitialized - // memory, it could be a source of non determinism. - caller_account.original_data_len - } else { - // If the allocation has not changed, we only zero the - // difference between the previous and current lengths. The - // rest of the memory contains whatever it contained before, - // which is deterministic. - prev_len - } - .saturating_sub(post_len); - if spare_len > 0 { - let dst = callee_account - .spare_data_capacity_mut()? - .get_mut(..spare_len) - .ok_or_else(|| Box::new(InstructionError::AccountDataTooSmall))? - .as_mut_ptr(); - // Safety: we check bounds above - unsafe { ptr::write_bytes(dst, 0, spare_len) }; - } - - // Here we zero the realloc region. + // and the realloc region. Here we zero the realloc region, the + // data region is zeroed further down below. // // This is done for compatibility but really only necessary for // the fringe case of a program calling itself, see @@ -1636,51 +1612,92 @@ fn update_caller_account( } } } - if !direct_mapping { - let to_slice = &mut caller_account.serialized_data; - let from_slice = callee_account - .get_data() - .get(0..post_len) - .ok_or(SyscallError::InvalidLength)?; - if to_slice.len() != from_slice.len() { - return Err(Box::new(InstructionError::AccountDataTooSmall)); - } - to_slice.copy_from_slice(from_slice); - } else if realloc_bytes_used > 0 { - // In the is_loader_deprecated case, we must have failed with - // InvalidRealloc by now. - debug_assert!(!is_loader_deprecated); - - let to_slice = { - // If a callee reallocs an account, we write into the caller's - // realloc region regardless of whether the caller has write - // permissions to the account or not. If the callee has been able to - // make changes, it means they had permissions to do so, and here - // we're just going to reflect those changes to the caller's frame. + + if direct_mapping { + // Here we zero the account data region. + // + // If zero_all_mapped_spare_capacity=true, we need to zero regardless of whether the account + // size changed, because the underlying vector holding the account might have been + // reallocated and contain uninitialized memory in the spare capacity. + // + // See TEST_CPI_CHANGE_ACCOUNT_DATA_MEMORY_ALLOCATION for an example of + // this case. + let spare_len = if zero_all_mapped_spare_capacity { + // In the unlikely case where the account data vector has + // changed - which can happen during CoW - we zero the whole + // extra capacity up to the original data length. // - // Therefore we temporarily configure the realloc region as writable - // then set it back to whatever state it had. - let realloc_region = caller_account - .realloc_region(memory_mapping, is_loader_deprecated)? - .unwrap(); // unwrapping here is fine, we asserted !is_loader_deprecated - let original_state = realloc_region.state.replace(MemoryState::Writable); - defer! { - realloc_region.state.set(original_state); - }; + // The extra capacity up to original data length is + // accessible from the vm and since it's uninitialized + // memory, it could be a source of non determinism. + caller_account.original_data_len + } else { + // If the allocation has not changed, we only zero the + // difference between the previous and current lengths. The + // rest of the memory contains whatever it contained before, + // which is deterministic. + prev_len + } + .saturating_sub(post_len); + + if spare_len > 0 { + let dst = callee_account + .spare_data_capacity_mut()? + .get_mut(..spare_len) + .ok_or_else(|| Box::new(InstructionError::AccountDataTooSmall))? + .as_mut_ptr(); + // Safety: we check bounds above + unsafe { ptr::write_bytes(dst, 0, spare_len) }; + } - translate_slice_mut::( - memory_mapping, - caller_account - .vm_data_addr - .saturating_add(caller_account.original_data_len as u64), - realloc_bytes_used as u64, - invoke_context.get_check_aligned(), - invoke_context.get_check_size(), - )? - }; + // Propagate changes to the realloc region in the callee up to the caller. + let realloc_bytes_used = post_len.saturating_sub(caller_account.original_data_len); + if realloc_bytes_used > 0 { + // In the is_loader_deprecated case, we must have failed with + // InvalidRealloc by now. + debug_assert!(!is_loader_deprecated); + + let to_slice = { + // If a callee reallocs an account, we write into the caller's + // realloc region regardless of whether the caller has write + // permissions to the account or not. If the callee has been able to + // make changes, it means they had permissions to do so, and here + // we're just going to reflect those changes to the caller's frame. + // + // Therefore we temporarily configure the realloc region as writable + // then set it back to whatever state it had. + let realloc_region = caller_account + .realloc_region(memory_mapping, is_loader_deprecated)? + .unwrap(); // unwrapping here is fine, we asserted !is_loader_deprecated + let original_state = realloc_region.state.replace(MemoryState::Writable); + defer! { + realloc_region.state.set(original_state); + }; + + translate_slice_mut::( + memory_mapping, + caller_account + .vm_data_addr + .saturating_add(caller_account.original_data_len as u64), + realloc_bytes_used as u64, + invoke_context.get_check_aligned(), + invoke_context.get_check_size(), + )? + }; + let from_slice = callee_account + .get_data() + .get(caller_account.original_data_len..post_len) + .ok_or(SyscallError::InvalidLength)?; + if to_slice.len() != from_slice.len() { + return Err(Box::new(InstructionError::AccountDataTooSmall)); + } + to_slice.copy_from_slice(from_slice); + } + } else { + let to_slice = &mut caller_account.serialized_data; let from_slice = callee_account .get_data() - .get(caller_account.original_data_len..post_len) + .get(0..post_len) .ok_or(SyscallError::InvalidLength)?; if to_slice.len() != from_slice.len() { return Err(Box::new(InstructionError::AccountDataTooSmall)); diff --git a/programs/sbf/rust/invoke/src/processor.rs b/programs/sbf/rust/invoke/src/processor.rs index a14ee76c2e301b..2e58c3298a50cc 100644 --- a/programs/sbf/rust/invoke/src/processor.rs +++ b/programs/sbf/rust/invoke/src/processor.rs @@ -1313,6 +1313,34 @@ fn process_instruction( }, &vec![0; original_data_len - new_len] ); + + // Realloc to [0xFC; 2]. Here we keep the same length, but realloc the underlying + // vector. CPI must zero even if the length is unchanged. + invoke( + &create_instruction( + *callee_program_id, + &[ + (accounts[ARGUMENT_INDEX].key, true, false), + (callee_program_id, false, false), + ], + vec![0xFC; 2], + ), + accounts, + ) + .unwrap(); + + // Check that [2..20] is zeroed + let new_len = account.data_len(); + assert_eq!(&*account.data.borrow(), &[0xFC; 2]); + assert_eq!( + unsafe { + slice::from_raw_parts( + account.data.borrow().as_ptr().add(new_len), + original_data_len - new_len, + ) + }, + &vec![0; original_data_len - new_len] + ); } TEST_WRITE_ACCOUNT => { msg!("TEST_WRITE_ACCOUNT"); From d353453f03dc7e298a679f0969c99a528203dd59 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:50:17 +1100 Subject: [PATCH 086/213] v1.17: direct_mapping: disable stack frame gaps (backport of #34254) (#34260) direct_mapping: disable stack frame gaps (#34254) Gaps don't work with direct mapping which assumes a 1:1 mapping between virtual and host addresses. (cherry picked from commit a0df9def91a70cf44c7a73200c2626d4c49dd664) Co-authored-by: Alessandro Decina --- programs/bpf_loader/src/syscalls/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/bpf_loader/src/syscalls/mod.rs b/programs/bpf_loader/src/syscalls/mod.rs index 47654a0f6b2f1e..fa7d99cabe3757 100644 --- a/programs/bpf_loader/src/syscalls/mod.rs +++ b/programs/bpf_loader/src/syscalls/mod.rs @@ -275,7 +275,7 @@ pub fn create_program_runtime_environment_v1<'a>( max_call_depth: compute_budget.max_call_depth, stack_frame_size: compute_budget.stack_frame_size, enable_address_translation: true, - enable_stack_frame_gaps: true, + enable_stack_frame_gaps: !feature_set.is_active(&bpf_account_data_direct_mapping::id()), instruction_meter_checkpoint_distance: 10000, enable_instruction_meter: true, enable_instruction_tracing: debugging_features, From a55711d0758a8a26d1332c2d4357eac11ed5c7ba Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:45:05 -0800 Subject: [PATCH 087/213] v1.17: Increase pull request clusterinfo probability (backport of #34231) (#34262) Increase pull request clusterinfo probability (#34231) * ensure new contactinfo propagated quicker when handling pull requests * improve readability (cherry picked from commit 0a2ff8525a0dfcfe4764dc091ac058907507d444) Co-authored-by: Greg Cusack --- gossip/src/cluster_info.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gossip/src/cluster_info.rs b/gossip/src/cluster_info.rs index 07fbbf93334e12..f2e99eed285162 100644 --- a/gossip/src/cluster_info.rs +++ b/gossip/src/cluster_info.rs @@ -2078,7 +2078,7 @@ impl ClusterInfo { score }; let score = match response.data { - CrdsData::LegacyContactInfo(_) => 2 * score, + CrdsData::LegacyContactInfo(_) | CrdsData::ContactInfo(_) => 2 * score, _ => score, }; ((addr, response), score) From ff1d9a62929547eded4e3b8948be17f80ae54ea1 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 30 Nov 2023 16:36:16 -0600 Subject: [PATCH 088/213] v1.17: Output BankHashDetails file when leader drops its' own block (backport of #34256) (#34275) Output BankHashDetails file when leader drops its' own block (#34256) Currently, the file is generated when a node drops a block that was produced by another node. However, it would also be beneficial to see the account state when a node drops its' own block. Output the file in this additional failure codepath (cherry picked from commit 935e06f8f1c0ecb638cf88e1f6285a1bc6055343) Co-authored-by: steviez --- core/src/replay_stage.rs | 26 +++++++++++++++++++------- ledger-tool/src/main.rs | 6 +++++- runtime/src/bank/bank_hash_details.rs | 10 +++------- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index 5f5caf34cb365a..77453fbf5a5d5e 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -1360,14 +1360,22 @@ impl ReplayStage { ); } - // Should not dump slots for which we were the leader if Some(*my_pubkey) == leader_schedule_cache.slot_leader_at(*duplicate_slot, None) { - panic!("We are attempting to dump a block that we produced. \ - This indicates that we are producing duplicate blocks, \ - or that there is a bug in our runtime/replay code which \ - causes us to compute different bank hashes than the rest of the cluster. \ - We froze slot {duplicate_slot} with hash {frozen_hash:?} while the cluster hash is {correct_hash}"); + if let Some(bank) = bank_forks.read().unwrap().get(*duplicate_slot) { + bank_hash_details::write_bank_hash_details_file(&bank) + .map_err(|err| { + warn!("Unable to write bank hash details file: {err}"); + }) + .ok(); + } else { + warn!("Unable to get bank for slot {duplicate_slot} from bank forks"); + } + panic!("We are attempting to dump a block that we produced. \ + This indicates that we are producing duplicate blocks, \ + or that there is a bug in our runtime/replay code which \ + causes us to compute different bank hashes than the rest of the cluster. \ + We froze slot {duplicate_slot} with hash {frozen_hash:?} while the cluster hash is {correct_hash}"); } let attempt_no = purge_repair_slot_counter @@ -1518,7 +1526,11 @@ impl ReplayStage { let bank = w_bank_forks .remove(*slot) .expect("BankForks should not have been purged yet"); - let _ = bank_hash_details::write_bank_hash_details_file(&bank); + bank_hash_details::write_bank_hash_details_file(&bank) + .map_err(|err| { + warn!("Unable to write bank hash details file: {err}"); + }) + .ok(); ((*slot, bank.bank_id()), bank) }) .unzip() diff --git a/ledger-tool/src/main.rs b/ledger-tool/src/main.rs index 721c46a8ff0f5e..aeed15fc9c9bbf 100644 --- a/ledger-tool/src/main.rs +++ b/ledger-tool/src/main.rs @@ -2693,7 +2693,11 @@ fn main() { } if write_bank_file { let working_bank = bank_forks.read().unwrap().working_bank(); - let _ = bank_hash_details::write_bank_hash_details_file(&working_bank); + bank_hash_details::write_bank_hash_details_file(&working_bank) + .map_err(|err| { + warn!("Unable to write bank hash_details file: {err}"); + }) + .ok(); } exit_signal.store(true, Ordering::Relaxed); system_monitor_service.join().unwrap(); diff --git a/runtime/src/bank/bank_hash_details.rs b/runtime/src/bank/bank_hash_details.rs index d4ea3f65651b5c..aa251d2c49c75d 100644 --- a/runtime/src/bank/bank_hash_details.rs +++ b/runtime/src/bank/bank_hash_details.rs @@ -213,14 +213,10 @@ pub fn write_bank_hash_details_file(bank: &Bank) -> std::result::Result<(), Stri // path does not exist. So, call std::fs_create_dir_all first. // https://doc.rust-lang.org/std/fs/fn.write.html _ = std::fs::create_dir_all(parent_dir); - let file = std::fs::File::create(&path).map_err(|err| { - format!( - "Unable to create bank hash file at {}: {err}", - path.display() - ) - })?; + let file = std::fs::File::create(&path) + .map_err(|err| format!("Unable to create file at {}: {err}", path.display()))?; serde_json::to_writer_pretty(file, &details) - .map_err(|err| format!("Unable to write bank hash file contents: {err}"))?; + .map_err(|err| format!("Unable to write file at {}: {err}", path.display()))?; } Ok(()) } From 4abd18f6cda8fe3cc46ddee7ccc84d5fd5068cfa Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 30 Nov 2023 17:58:40 -0500 Subject: [PATCH 089/213] v1.17: Skip shrink until startup verification is complete (backport of #34209) (#34227) --- runtime/src/accounts_background_service.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/runtime/src/accounts_background_service.rs b/runtime/src/accounts_background_service.rs index b826f8eddc5724..09f3758ab34a21 100644 --- a/runtime/src/accounts_background_service.rs +++ b/runtime/src/accounts_background_service.rs @@ -708,9 +708,21 @@ impl AccountsBackgroundService { bank.force_flush_accounts_cache(); bank.clean_accounts(last_full_snapshot_slot); last_cleaned_block_height = bank.block_height(); - bank.shrink_ancient_slots(); + // See justification below for why we skip 'shrink' here. + if bank.is_startup_verification_complete() { + bank.shrink_ancient_slots(); + } + } + // Do not 'shrink' until *after* the startup verification is complete. + // This is because startup verification needs to get the snapshot + // storages *as they existed at startup* (to calculate the accounts hash). + // If 'shrink' were to run, then it is possible startup verification + // (1) could race with 'shrink', and fail to assert that shrinking is not in + // progress, or (2) could get snapshot storages that were newer than what + // was in the snapshot itself. + if bank.is_startup_verification_complete() { + bank.shrink_candidate_slots(); } - bank.shrink_candidate_slots(); } stats.record_and_maybe_submit(start_time.elapsed()); sleep(Duration::from_millis(INTERVAL_MS)); From fca44b78a681ac1abf7878079e8a7a319c31b23f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 30 Nov 2023 17:30:12 -0600 Subject: [PATCH 090/213] v1.17: Allow Blockstore to open unknown columns (backport of #34174) (#34287) * Allow Blockstore to open unknown columns (#34174) As we develop new features or modifications, we occassionally need to introduce new columns to the Blockstore. Adding a new column introduces a compatibility break given that opening the database in Primary mode (R/W access) requires opening all columns. Reverting to an old software version that is unaware of the new column is obviously problematic. In the past, we have addressed by backporting minimal "stub" PR's to older versions. This is annoying, and only allow compatibility for the single version or two that we backport to. This PR adds a change to automatically detect all columns, and create default column descriptors for columns we were unaware of. As a result, older software versions can open a Blockstore that was modified by a newer software version, even if that new version added columns that the old version is unaware of. (cherry picked from commit 71c1782c74d5c9ea284241307908a2d5ffa4a402) # Conflicts: # ledger/src/blockstore_db.rs * Merge conflicts --------- Co-authored-by: steviez --- ledger/src/blockstore_db.rs | 120 ++++++++++++++++++++++++++++++++---- 1 file changed, 109 insertions(+), 11 deletions(-) diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index 72660af445df5b..7a4769a356a907 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -34,7 +34,7 @@ use { }, solana_storage_proto::convert::generated, std::{ - collections::HashMap, + collections::{HashMap, HashSet}, ffi::{CStr, CString}, fs, marker::PhantomData, @@ -376,15 +376,12 @@ impl Rocks { } let oldest_slot = OldestSlot::default(); let column_options = options.column_options.clone(); + let cf_descriptors = Self::cf_descriptors(path, &options, &oldest_slot); // Open the database let db = match access_type { AccessType::Primary | AccessType::PrimaryForMaintenance => Rocks { - db: DB::open_cf_descriptors( - &db_options, - path, - Self::cf_descriptors(&options, &oldest_slot), - )?, + db: DB::open_cf_descriptors(&db_options, path, cf_descriptors)?, access_type, oldest_slot, column_options, @@ -404,7 +401,7 @@ impl Rocks { &db_options, path, &secondary_path, - Self::cf_descriptors(&options, &oldest_slot), + cf_descriptors, )?, access_type, oldest_slot, @@ -418,7 +415,17 @@ impl Rocks { Ok(db) } + /// Create the column family (CF) descriptors necessary to open the database. + /// + /// In order to open a RocksDB database with Primary access, all columns must be opened. So, + /// in addition to creating descriptors for all of the expected columns, also create + /// descriptors for columns that were discovered but are otherwise unknown to the software. + /// + /// One case where columns could be unknown is if a RocksDB database is modified with a newer + /// software version that adds a new column, and then also opened with an older version that + /// did not have knowledge of that new column. fn cf_descriptors( + path: &Path, options: &BlockstoreOptions, oldest_slot: &OldestSlot, ) -> Vec { @@ -426,7 +433,7 @@ impl Rocks { let (cf_descriptor_shred_data, cf_descriptor_shred_code) = new_cf_descriptor_pair_shreds::(options, oldest_slot); - vec![ + let mut cf_descriptors = vec![ new_cf_descriptor::(options, oldest_slot), new_cf_descriptor::(options, oldest_slot), new_cf_descriptor::(options, oldest_slot), @@ -447,7 +454,52 @@ impl Rocks { new_cf_descriptor::(options, oldest_slot), new_cf_descriptor::(options, oldest_slot), new_cf_descriptor::(options, oldest_slot), - ] + ]; + + // If the access type is Secondary, we don't need to open all of the + // columns so we can just return immediately. + match options.access_type { + AccessType::Secondary => { + return cf_descriptors; + } + AccessType::Primary | AccessType::PrimaryForMaintenance => {} + } + + // Attempt to detect the column families that are present. It is not a + // fatal error if we cannot, for example, if the Blockstore is brand + // new and will be created by the call to Rocks::open(). + let detected_cfs = match DB::list_cf(&Options::default(), path) { + Ok(detected_cfs) => detected_cfs, + Err(err) => { + warn!("Unable to detect Rocks columns: {err:?}"); + vec![] + } + }; + // The default column is handled automatically, we don't need to create + // a descriptor for it + const DEFAULT_COLUMN_NAME: &str = "default"; + let known_cfs: HashSet<_> = cf_descriptors + .iter() + .map(|cf_descriptor| cf_descriptor.name().to_string()) + .chain(std::iter::once(DEFAULT_COLUMN_NAME.to_string())) + .collect(); + detected_cfs.iter().for_each(|cf_name| { + if known_cfs.get(cf_name.as_str()).is_none() { + info!("Detected unknown column {cf_name}, opening column with basic options"); + // This version of the software was unaware of the column, so + // it is fair to assume that we will not attempt to read or + // write the column. So, set some bare bones settings to avoid + // using extra resources on this unknown column. + let mut options = Options::default(); + // Lower the default to avoid unnecessary allocations + options.set_write_buffer_size(1024 * 1024); + // Disable compactions to avoid any modifications to the column + options.set_disable_auto_compactions(true); + cf_descriptors.push(ColumnFamilyDescriptor::new(cf_name, options)); + } + }); + + cf_descriptors } fn columns() -> Vec<&'static str> { @@ -1982,7 +2034,9 @@ fn should_enable_compression() -> bool { #[cfg(test)] pub mod tests { - use {super::*, crate::blockstore_db::columns::ShredData}; + use { + super::*, crate::blockstore_db::columns::ShredData, std::path::PathBuf, tempfile::tempdir, + }; #[test] fn test_compaction_filter() { @@ -2034,6 +2088,7 @@ pub mod tests { #[test] fn test_cf_names_and_descriptors_equal_length() { + let path = PathBuf::default(); let options = BlockstoreOptions::default(); let oldest_slot = OldestSlot::default(); // The names and descriptors don't need to be in the same order for our use cases; @@ -2041,7 +2096,7 @@ pub mod tests { // should update both lists. assert_eq!( Rocks::columns().len(), - Rocks::cf_descriptors(&options, &oldest_slot).len() + Rocks::cf_descriptors(&path, &options, &oldest_slot).len() ); } @@ -2065,4 +2120,47 @@ pub mod tests { }); assert!(!should_enable_cf_compaction("something else")); } + + #[test] + fn test_open_unknown_columns() { + solana_logger::setup(); + + let temp_dir = tempdir().unwrap(); + let db_path = temp_dir.path(); + + // Open with Primary to create the new database + { + let options = BlockstoreOptions { + access_type: AccessType::Primary, + enforce_ulimit_nofile: false, + ..BlockstoreOptions::default() + }; + let mut rocks = Rocks::open(db_path, options).unwrap(); + + // Introduce a new column that will not be known + rocks + .db + .create_cf("new_column", &Options::default()) + .unwrap(); + } + + // Opening with either Secondary or Primary access should succeed, + // even though the Rocks code is unaware of "new_column" + { + let options = BlockstoreOptions { + access_type: AccessType::Secondary, + enforce_ulimit_nofile: false, + ..BlockstoreOptions::default() + }; + let _ = Rocks::open(db_path, options).unwrap(); + } + { + let options = BlockstoreOptions { + access_type: AccessType::Primary, + enforce_ulimit_nofile: false, + ..BlockstoreOptions::default() + }; + let _ = Rocks::open(db_path, options).unwrap(); + } + } } From fdaa4caaaf6b4c14b19f43fae83d7fa7b8b77ec3 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Thu, 30 Nov 2023 21:02:19 -0600 Subject: [PATCH 091/213] Update version to v1.17.8 (#34293) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ddc3432895c806..2d84abf1ca5c45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.7" +version = "1.17.8" dependencies = [ "regex", ] @@ -4065,7 +4065,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.7" +version = "1.17.8" dependencies = [ "protobuf-src", "tonic-build", @@ -4308,7 +4308,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.7" +version = "1.17.8" [[package]] name = "rcgen" @@ -5098,7 +5098,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.7" +version = "1.17.8" dependencies = [ "Inflector", "assert_matches", @@ -5122,7 +5122,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 2.33.3", "log", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 2.33.3", "log", @@ -5166,7 +5166,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.7" +version = "1.17.8" dependencies = [ "arrayref", "assert_matches", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "bytemuck", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -5260,7 +5260,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5284,7 +5284,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5301,7 +5301,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.7" +version = "1.17.8" dependencies = [ "serde", "solana-sdk", @@ -5310,7 +5310,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "crossbeam-channel", @@ -5328,7 +5328,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5339,7 +5339,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5380,7 +5380,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bv", "fnv", @@ -5397,7 +5397,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -5418,7 +5418,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -5429,7 +5429,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bv", "bytemuck", @@ -5448,7 +5448,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "solana-logger", @@ -5456,7 +5456,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_cmd", "bzip2", @@ -5477,11 +5477,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.7" +version = "1.17.8" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.7" +version = "1.17.8" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5492,7 +5492,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "chrono", @@ -5509,7 +5509,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "chrono", @@ -5527,7 +5527,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -5580,7 +5580,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.7" +version = "1.17.8" dependencies = [ "anyhow", "dirs-next", @@ -5595,7 +5595,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.7" +version = "1.17.8" dependencies = [ "Inflector", "base64 0.21.4", @@ -5621,7 +5621,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-trait", "bincode", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.7" +version = "1.17.8" dependencies = [ "futures-util", "rand 0.8.5", @@ -5683,7 +5683,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5691,7 +5691,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "chrono", @@ -5704,7 +5704,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-trait", "bincode", @@ -5728,7 +5728,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5811,7 +5811,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.7" +version = "1.17.8" dependencies = [ "lazy_static", "log", @@ -5836,7 +5836,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "clap 3.2.23", @@ -5866,7 +5866,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "console", "indicatif", @@ -5878,7 +5878,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5889,7 +5889,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -5911,7 +5911,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "byteorder", @@ -5933,7 +5933,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.7" +version = "1.17.8" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5963,7 +5963,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.7" +version = "1.17.8" dependencies = [ "proc-macro2", "quote", @@ -5973,7 +5973,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.7" +version = "1.17.8" dependencies = [ "base64 0.21.4", "bincode", @@ -5998,7 +5998,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "solana-accounts-db", @@ -6009,7 +6009,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "solana-sdk", @@ -6019,7 +6019,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bs58", "crossbeam-channel", @@ -6044,7 +6044,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -6095,7 +6095,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.7" +version = "1.17.8" dependencies = [ "atty", "bincode", @@ -6130,7 +6130,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bs58", "clap 3.2.23", @@ -6147,7 +6147,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -6215,7 +6215,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_cmd", "bs58", @@ -6264,7 +6264,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "log", @@ -6276,7 +6276,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6315,7 +6315,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.7" +version = "1.17.8" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6327,7 +6327,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.7" +version = "1.17.8" dependencies = [ "env_logger", "lazy_static", @@ -6336,7 +6336,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "solana-sdk", @@ -6344,11 +6344,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.7" +version = "1.17.8" [[package]] name = "solana-merkle-root-bench" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 2.33.3", "log", @@ -6361,7 +6361,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.7" +version = "1.17.8" dependencies = [ "fast-math", "hex", @@ -6370,7 +6370,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.7" +version = "1.17.8" dependencies = [ "crossbeam-channel", "env_logger", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6397,7 +6397,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "clap 3.2.23", @@ -6417,7 +6417,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "reqwest", @@ -6427,7 +6427,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.7" +version = "1.17.8" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6458,7 +6458,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -6479,7 +6479,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 3.2.23", "log", @@ -6494,7 +6494,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "anyhow", "ark-bn254", @@ -6551,7 +6551,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6580,7 +6580,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "async-trait", @@ -6609,7 +6609,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "anyhow", "crossbeam-channel", @@ -6633,7 +6633,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-mutex", "async-trait", @@ -6661,7 +6661,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.7" +version = "1.17.8" dependencies = [ "lazy_static", "num_cpus", @@ -6669,7 +6669,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "console", @@ -6688,7 +6688,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.7" +version = "1.17.8" dependencies = [ "base64 0.21.4", "bincode", @@ -6747,7 +6747,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "async-trait", @@ -6776,7 +6776,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.7" +version = "1.17.8" dependencies = [ "base64 0.21.4", "bs58", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "anyhow", "clap 2.33.3", @@ -6813,7 +6813,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "bs58", @@ -6840,7 +6840,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.7" +version = "1.17.8" dependencies = [ "arrayref", "assert_matches", @@ -6923,7 +6923,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.7" +version = "1.17.8" dependencies = [ "anyhow", "assert_matches", @@ -6981,7 +6981,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bs58", "proc-macro2", @@ -6992,7 +6992,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.7" +version = "1.17.8" dependencies = [ "crossbeam-channel", "log", @@ -7007,7 +7007,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7023,7 +7023,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -7040,7 +7040,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.7" +version = "1.17.8" dependencies = [ "backoff", "bincode", @@ -7072,7 +7072,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "bs58", @@ -7088,7 +7088,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 2.33.3", "log", @@ -7100,7 +7100,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "async-channel", @@ -7132,7 +7132,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -7146,7 +7146,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.7" +version = "1.17.8" dependencies = [ "base64 0.21.4", "bincode", @@ -7176,7 +7176,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "log", @@ -7190,7 +7190,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -7223,7 +7223,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-trait", "bincode", @@ -7245,7 +7245,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "clap 2.33.3", @@ -7272,7 +7272,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.7" +version = "1.17.8" dependencies = [ "Inflector", "base64 0.21.4", @@ -7295,7 +7295,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -7332,7 +7332,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-trait", "solana-connection-cache", @@ -7345,7 +7345,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.7" +version = "1.17.8" dependencies = [ "serde_json", "solana-metrics", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.7" +version = "1.17.8" dependencies = [ "chrono", "clap 2.33.3", @@ -7417,7 +7417,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "rustc_version 0.4.0", @@ -7431,7 +7431,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "crossbeam-channel", @@ -7450,7 +7450,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -7473,7 +7473,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 2.33.3", "humantime", @@ -7492,7 +7492,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bs58", "clap 3.2.23", @@ -7511,7 +7511,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bytemuck", "criterion", @@ -7525,7 +7525,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7537,7 +7537,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.7" +version = "1.17.8" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index d6bb9ba70f339f..68da570fe55223 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.7" +version = "1.17.8" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.7" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.7" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.7" } -solana-banks-client = { path = "banks-client", version = "=1.17.7" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.7" } -solana-banks-server = { path = "banks-server", version = "=1.17.7" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.7" } -solana-bloom = { path = "bloom", version = "=1.17.7" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.7" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.7" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.7", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.7" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.7" } -solana-cli = { path = "cli", version = "=1.17.7" } -solana-cli-config = { path = "cli-config", version = "=1.17.7" } -solana-cli-output = { path = "cli-output", version = "=1.17.7" } -solana-client = { path = "client", version = "=1.17.7" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.7" } -solana-config-program = { path = "programs/config", version = "=1.17.7" } -solana-core = { path = "core", version = "=1.17.7" } -solana-cost-model = { path = "cost-model", version = "=1.17.7" } -solana-download-utils = { path = "download-utils", version = "=1.17.7" } -solana-entry = { path = "entry", version = "=1.17.7" } -solana-faucet = { path = "faucet", version = "=1.17.7" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.7" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.7" } -solana-genesis = { path = "genesis", version = "=1.17.7" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.7" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.7" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.7" } -solana-gossip = { path = "gossip", version = "=1.17.7" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.7" } -solana-ledger = { path = "ledger", version = "=1.17.7" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.7" } -solana-logger = { path = "logger", version = "=1.17.7" } -solana-measure = { path = "measure", version = "=1.17.7" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.7" } -solana-metrics = { path = "metrics", version = "=1.17.7" } -solana-net-utils = { path = "net-utils", version = "=1.17.7" } -solana-notifier = { path = "notifier", version = "=1.17.7" } -solana-perf = { path = "perf", version = "=1.17.7" } -solana-poh = { path = "poh", version = "=1.17.7" } -solana-program = { path = "sdk/program", version = "=1.17.7" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.7" } -solana-program-test = { path = "program-test", version = "=1.17.7" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.7" } -solana-quic-client = { path = "quic-client", version = "=1.17.7" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.7" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.7", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.7" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.7", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.7" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.7" } -solana-runtime = { path = "runtime", version = "=1.17.7" } -solana-sdk = { path = "sdk", version = "=1.17.7" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.7" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.7" } -solana-stake-program = { path = "programs/stake", version = "=1.17.7" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.7" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.7" } -solana-streamer = { path = "streamer", version = "=1.17.7" } -solana-system-program = { path = "programs/system", version = "=1.17.7" } -solana-test-validator = { path = "test-validator", version = "=1.17.7" } -solana-thin-client = { path = "thin-client", version = "=1.17.7" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.7", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.7" } -solana-turbine = { path = "turbine", version = "=1.17.7" } -solana-udp-client = { path = "udp-client", version = "=1.17.7" } -solana-version = { path = "version", version = "=1.17.7" } -solana-vote = { path = "vote", version = "=1.17.7" } -solana-vote-program = { path = "programs/vote", version = "=1.17.7" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.7" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.7" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.7" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.8" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.8" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.8" } +solana-banks-client = { path = "banks-client", version = "=1.17.8" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.8" } +solana-banks-server = { path = "banks-server", version = "=1.17.8" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.8" } +solana-bloom = { path = "bloom", version = "=1.17.8" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.8" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.8" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.8", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.8" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.8" } +solana-cli = { path = "cli", version = "=1.17.8" } +solana-cli-config = { path = "cli-config", version = "=1.17.8" } +solana-cli-output = { path = "cli-output", version = "=1.17.8" } +solana-client = { path = "client", version = "=1.17.8" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.8" } +solana-config-program = { path = "programs/config", version = "=1.17.8" } +solana-core = { path = "core", version = "=1.17.8" } +solana-cost-model = { path = "cost-model", version = "=1.17.8" } +solana-download-utils = { path = "download-utils", version = "=1.17.8" } +solana-entry = { path = "entry", version = "=1.17.8" } +solana-faucet = { path = "faucet", version = "=1.17.8" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.8" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.8" } +solana-genesis = { path = "genesis", version = "=1.17.8" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.8" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.8" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.8" } +solana-gossip = { path = "gossip", version = "=1.17.8" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.8" } +solana-ledger = { path = "ledger", version = "=1.17.8" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.8" } +solana-logger = { path = "logger", version = "=1.17.8" } +solana-measure = { path = "measure", version = "=1.17.8" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.8" } +solana-metrics = { path = "metrics", version = "=1.17.8" } +solana-net-utils = { path = "net-utils", version = "=1.17.8" } +solana-notifier = { path = "notifier", version = "=1.17.8" } +solana-perf = { path = "perf", version = "=1.17.8" } +solana-poh = { path = "poh", version = "=1.17.8" } +solana-program = { path = "sdk/program", version = "=1.17.8" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.8" } +solana-program-test = { path = "program-test", version = "=1.17.8" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.8" } +solana-quic-client = { path = "quic-client", version = "=1.17.8" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.8" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.8", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.8" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.8", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.8" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.8" } +solana-runtime = { path = "runtime", version = "=1.17.8" } +solana-sdk = { path = "sdk", version = "=1.17.8" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.8" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.8" } +solana-stake-program = { path = "programs/stake", version = "=1.17.8" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.8" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.8" } +solana-streamer = { path = "streamer", version = "=1.17.8" } +solana-system-program = { path = "programs/system", version = "=1.17.8" } +solana-test-validator = { path = "test-validator", version = "=1.17.8" } +solana-thin-client = { path = "thin-client", version = "=1.17.8" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.8", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.8" } +solana-turbine = { path = "turbine", version = "=1.17.8" } +solana-udp-client = { path = "udp-client", version = "=1.17.8" } +solana-version = { path = "version", version = "=1.17.8" } +solana-vote = { path = "vote", version = "=1.17.8" } +solana-vote-program = { path = "programs/vote", version = "=1.17.8" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.8" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.8" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.8" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 4f3007e3ec3ee5..2a1bfb3bef4a82 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.7" +version = "1.17.8" dependencies = [ "Inflector", "base64 0.21.4", @@ -4468,7 +4468,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.7" +version = "1.17.8" dependencies = [ "arrayref", "bincode", @@ -4525,7 +4525,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "bytemuck", @@ -4544,7 +4544,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4559,7 +4559,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.7" +version = "1.17.8" dependencies = [ "serde", "solana-sdk", @@ -4568,7 +4568,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "crossbeam-channel", @@ -4586,7 +4586,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bv", "fnv", @@ -4603,7 +4603,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.7" +version = "1.17.8" dependencies = [ "array-bytes", "serde", @@ -4630,7 +4630,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bv", "bytemuck", @@ -4646,7 +4646,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "chrono", "clap 2.33.3", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.7" +version = "1.17.8" dependencies = [ "dirs-next", "lazy_static", @@ -4675,7 +4675,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.7" +version = "1.17.8" dependencies = [ "Inflector", "base64 0.21.4", @@ -4700,7 +4700,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-trait", "bincode", @@ -4731,7 +4731,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4739,7 +4739,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "chrono", @@ -4751,7 +4751,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-trait", "bincode", @@ -4771,7 +4771,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.7" +version = "1.17.8" dependencies = [ "base64 0.21.4", "bincode", @@ -4843,7 +4843,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.7" +version = "1.17.8" dependencies = [ "lazy_static", "log", @@ -4865,7 +4865,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "console", "indicatif", @@ -4877,7 +4877,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "crossbeam-channel", @@ -4897,7 +4897,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.7" +version = "1.17.8" dependencies = [ "ahash 0.8.3", "blake3", @@ -4947,7 +4947,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.7" +version = "1.17.8" dependencies = [ "proc-macro2", "quote", @@ -4957,7 +4957,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "solana-accounts-db", @@ -4968,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "solana-sdk", @@ -4978,7 +4978,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bs58", "crossbeam-channel", @@ -5003,7 +5003,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -5051,7 +5051,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "bincode", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "solana-measure", @@ -5126,7 +5126,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.7" +version = "1.17.8" dependencies = [ "env_logger", "lazy_static", @@ -5135,7 +5135,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "solana-sdk", @@ -5143,7 +5143,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.7" +version = "1.17.8" dependencies = [ "fast-math", "solana-program", @@ -5151,7 +5151,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.7" +version = "1.17.8" dependencies = [ "crossbeam-channel", "gethostname", @@ -5164,7 +5164,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "clap 3.1.6", @@ -5184,7 +5184,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.7" +version = "1.17.8" dependencies = [ "ahash 0.8.3", "bincode", @@ -5211,7 +5211,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.7" +version = "1.17.8" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5227,7 +5227,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "ark-bn254", "ark-ec", @@ -5279,7 +5279,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.7" +version = "1.17.8" dependencies = [ "base64 0.21.4", "bincode", @@ -5305,7 +5305,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "async-trait", @@ -5333,7 +5333,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "crossbeam-channel", "futures-util", @@ -5356,7 +5356,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-mutex", "async-trait", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.7" +version = "1.17.8" dependencies = [ "lazy_static", "num_cpus", @@ -5389,7 +5389,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.7" +version = "1.17.8" dependencies = [ "console", "dialoguer", @@ -5406,7 +5406,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.7" +version = "1.17.8" dependencies = [ "base64 0.21.4", "bincode", @@ -5461,7 +5461,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-trait", "base64 0.21.4", @@ -5485,7 +5485,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.7" +version = "1.17.8" dependencies = [ "base64 0.21.4", "bs58", @@ -5505,7 +5505,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.7" +version = "1.17.8" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5516,7 +5516,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.7" +version = "1.17.8" dependencies = [ "arrayref", "base64 0.21.4", @@ -5591,7 +5591,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5628,21 +5628,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.7" +version = "1.17.8" dependencies = [ "array-bytes", "solana-program", @@ -5650,7 +5650,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.7" +version = "1.17.8" dependencies = [ "array-bytes", "solana-program", @@ -5658,21 +5658,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5680,14 +5680,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.7" +version = "1.17.8" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5695,21 +5695,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.7" +version = "1.17.8" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5719,42 +5719,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.7" +version = "1.17.8" dependencies = [ "rustversion", "solana-program", @@ -5764,49 +5764,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5814,14 +5814,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-program-runtime", @@ -5831,7 +5831,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5839,21 +5839,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5861,14 +5861,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.7" +version = "1.17.8" dependencies = [ "array-bytes", "solana-program", @@ -5876,7 +5876,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.7" +version = "1.17.8" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5885,14 +5885,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5900,7 +5900,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-program-runtime", @@ -5910,21 +5910,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-program-runtime", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.7" +version = "1.17.8" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.7" +version = "1.17.8" dependencies = [ "blake3", "solana-program", @@ -5950,21 +5950,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-logger", "solana-program", @@ -5975,21 +5975,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", "solana-program-runtime", @@ -5999,21 +5999,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.7" +version = "1.17.8" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.7" +version = "1.17.8" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6065,7 +6065,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bs58", "proc-macro2", @@ -6076,7 +6076,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.7" +version = "1.17.8" dependencies = [ "crossbeam-channel", "log", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "log", @@ -6103,7 +6103,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.7" +version = "1.17.8" dependencies = [ "backoff", "bincode", @@ -6135,7 +6135,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "bs58", @@ -6150,7 +6150,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-channel", "bytes", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "log", @@ -6192,7 +6192,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.7" +version = "1.17.8" dependencies = [ "base64 0.21.4", "bincode", @@ -6222,7 +6222,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "log", @@ -6235,7 +6235,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-trait", "bincode", @@ -6257,7 +6257,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.7" +version = "1.17.8" dependencies = [ "Inflector", "base64 0.21.4", @@ -6280,7 +6280,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "bytes", @@ -6315,7 +6315,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.7" +version = "1.17.8" dependencies = [ "async-trait", "solana-connection-cache", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.7" +version = "1.17.8" dependencies = [ "chrono", "clap 2.33.3", @@ -6390,7 +6390,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.7" +version = "1.17.8" dependencies = [ "log", "rustc_version", @@ -6404,7 +6404,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.7" +version = "1.17.8" dependencies = [ "crossbeam-channel", "itertools", @@ -6421,7 +6421,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bincode", "log", @@ -6441,7 +6441,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.7" +version = "1.17.8" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6453,7 +6453,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.7" +version = "1.17.8" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 60eea273eccb90..25b9fbc619369a 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.7" +version = "1.17.8" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.7" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.7" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.7" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.7" } -solana-ledger = { path = "../../ledger", version = "=1.17.7" } -solana-logger = { path = "../../logger", version = "=1.17.7" } -solana-measure = { path = "../../measure", version = "=1.17.7" } -solana-program = { path = "../../sdk/program", version = "=1.17.7" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.7" } -solana-program-test = { path = "../../program-test", version = "=1.17.7" } -solana-runtime = { path = "../../runtime", version = "=1.17.7" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.7" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.7" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.7", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.7" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.7" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.7" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.7", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.7" } -solana-sdk = { path = "../../sdk", version = "=1.17.7" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.7" } -solana-validator = { path = "../../validator", version = "=1.17.7" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.7" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.8" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.8" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.8" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.8" } +solana-ledger = { path = "../../ledger", version = "=1.17.8" } +solana-logger = { path = "../../logger", version = "=1.17.8" } +solana-measure = { path = "../../measure", version = "=1.17.8" } +solana-program = { path = "../../sdk/program", version = "=1.17.8" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.8" } +solana-program-test = { path = "../../program-test", version = "=1.17.8" } +solana-runtime = { path = "../../runtime", version = "=1.17.8" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.8" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.8" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.8", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.8" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.8" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.8" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.8", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.8" } +solana-sdk = { path = "../../sdk", version = "=1.17.8" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.8" } +solana-validator = { path = "../../validator", version = "=1.17.8" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.8" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 1e6110748a0acf..2c9e439232ae92 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.7" +version = "1.17.8" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.7" } +solana-program = { path = "../../../../program", version = "=1.17.8" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 2f01a53d4e6fe3..7c3757ceab89bc 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.7" +version = "1.17.8" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.7" } +solana-program = { path = "../../../../program", version = "=1.17.8" } [lib] crate-type = ["cdylib"] From da2dadd05eaddb3f9a2f15701b318d1a13e2bfaf Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 04:02:12 +0000 Subject: [PATCH 092/213] v1.17: add merkle root meta column to blockstore (backport of #33979) (#34028) * add merkle root meta column to blockstore (#33979) * add merkle root meta column to blockstore * pr feedback: remove write/reads to column * pr feedback: u64 -> u32 + revert * pr feedback: fec_set_index u32, use Self::Index * pr feedback: key size 16 -> 12 (cherry picked from commit e457c0287906f313ad0284e0f317c5d00a42d467) * blockstore: make merkle root Optional in MerkleRootMeta column (#34091) --------- Co-authored-by: Ashwin Sekar --- ledger/src/blockstore.rs | 4 ++ ledger/src/blockstore/blockstore_purge.rs | 8 ++++ ledger/src/blockstore_db.rs | 51 +++++++++++++++++++++++ ledger/src/blockstore_meta.rs | 10 +++++ 4 files changed, 73 insertions(+) diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index 6d053997ca6f60..8b964e5b3ce9a1 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -211,6 +211,7 @@ pub struct Blockstore { program_costs_cf: LedgerColumn, bank_hash_cf: LedgerColumn, optimistic_slots_cf: LedgerColumn, + merkle_root_meta_cf: LedgerColumn, last_root: RwLock, insert_shreds_lock: Mutex<()>, new_shreds_signals: Mutex>>, @@ -312,6 +313,7 @@ impl Blockstore { let program_costs_cf = db.column(); let bank_hash_cf = db.column(); let optimistic_slots_cf = db.column(); + let merkle_root_meta_cf = db.column(); let db = Arc::new(db); @@ -365,6 +367,7 @@ impl Blockstore { program_costs_cf, bank_hash_cf, optimistic_slots_cf, + merkle_root_meta_cf, new_shreds_signals: Mutex::default(), completed_slots_senders: Mutex::default(), shred_timing_point_sender: None, @@ -734,6 +737,7 @@ impl Blockstore { self.program_costs_cf.submit_rocksdb_cf_metrics(); self.bank_hash_cf.submit_rocksdb_cf_metrics(); self.optimistic_slots_cf.submit_rocksdb_cf_metrics(); + self.merkle_root_meta_cf.submit_rocksdb_cf_metrics(); } fn try_shred_recovery( diff --git a/ledger/src/blockstore/blockstore_purge.rs b/ledger/src/blockstore/blockstore_purge.rs index 090096d17e970a..92f9453eabb6ed 100644 --- a/ledger/src/blockstore/blockstore_purge.rs +++ b/ledger/src/blockstore/blockstore_purge.rs @@ -214,6 +214,10 @@ impl Blockstore { & self .db .delete_range_cf::(&mut write_batch, from_slot, to_slot) + .is_ok() + & self + .db + .delete_range_cf::(&mut write_batch, from_slot, to_slot) .is_ok(); let mut w_active_transaction_status_index = self.active_transaction_status_index.write().unwrap(); @@ -337,6 +341,10 @@ impl Blockstore { .db .delete_file_in_range_cf::(from_slot, to_slot) .is_ok() + & self + .db + .delete_file_in_range_cf::(from_slot, to_slot) + .is_ok() } /// Purges special columns (using a non-Slot primary-index) exactly, by diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index 7a4769a356a907..6dd7f4dbe4c4f2 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -2,6 +2,7 @@ pub use rocksdb::Direction as IteratorDirection; use { crate::{ blockstore_meta, + blockstore_meta::MerkleRootMeta, blockstore_metrics::{ maybe_enable_rocksdb_perf, report_rocksdb_read_perf, report_rocksdb_write_perf, BlockstoreRocksDbColumnFamilyMetrics, PerfSamplingStatus, PERF_METRIC_OP_NAME_GET, @@ -103,6 +104,8 @@ const BLOCK_HEIGHT_CF: &str = "block_height"; const PROGRAM_COSTS_CF: &str = "program_costs"; /// Column family for optimistic slots const OPTIMISTIC_SLOTS_CF: &str = "optimistic_slots"; +/// Column family for merkle roots +const MERKLE_ROOT_META_CF: &str = "merkle_root_meta"; #[derive(Error, Debug)] pub enum BlockstoreError { @@ -323,6 +326,19 @@ pub mod columns { /// * value type: [`blockstore_meta::OptimisticSlotMetaVersioned`] pub struct OptimisticSlots; + #[derive(Debug)] + /// The merkle root meta column + /// + /// Each merkle shred is part of a merkle tree for + /// its FEC set. This column stores that merkle root and associated + /// meta information about the first shred received. + /// + /// Its index type is (Slot, fec_set_index). + /// + /// * index type: `crate::shred::ErasureSetId` `(Slot, fec_set_index: u32)` + /// * value type: [`blockstore_meta::MerkleRootMeta`]` + pub struct MerkleRootMeta; + // When adding a new column ... // - Add struct below and implement `Column` and `ColumnName` traits // - Add descriptor in Rocks::cf_descriptors() and name in Rocks::columns() @@ -454,6 +470,7 @@ impl Rocks { new_cf_descriptor::(options, oldest_slot), new_cf_descriptor::(options, oldest_slot), new_cf_descriptor::(options, oldest_slot), + new_cf_descriptor::(options, oldest_slot), ]; // If the access type is Secondary, we don't need to open all of the @@ -526,6 +543,7 @@ impl Rocks { BlockHeight::NAME, ProgramCosts::NAME, OptimisticSlots::NAME, + MerkleRootMeta::NAME, ] } @@ -1157,6 +1175,39 @@ impl TypedColumn for columns::OptimisticSlots { type Type = blockstore_meta::OptimisticSlotMetaVersioned; } +impl Column for columns::MerkleRootMeta { + type Index = (Slot, /*fec_set_index:*/ u32); + + fn index(key: &[u8]) -> Self::Index { + let slot = BigEndian::read_u64(&key[..8]); + let fec_set_index = BigEndian::read_u32(&key[8..]); + + (slot, fec_set_index) + } + + fn key((slot, fec_set_index): Self::Index) -> Vec { + let mut key = vec![0; 12]; + BigEndian::write_u64(&mut key[..8], slot); + BigEndian::write_u32(&mut key[8..], fec_set_index); + key + } + + fn primary_index((slot, _fec_set_index): Self::Index) -> Slot { + slot + } + + fn as_index(slot: Slot) -> Self::Index { + (slot, 0) + } +} + +impl ColumnName for columns::MerkleRootMeta { + const NAME: &'static str = MERKLE_ROOT_META_CF; +} +impl TypedColumn for columns::MerkleRootMeta { + type Type = MerkleRootMeta; +} + #[derive(Debug)] pub struct Database { backend: Arc, diff --git a/ledger/src/blockstore_meta.rs b/ledger/src/blockstore_meta.rs index 79954ee96b6d04..5066a028336330 100644 --- a/ledger/src/blockstore_meta.rs +++ b/ledger/src/blockstore_meta.rs @@ -138,6 +138,16 @@ pub(crate) struct ErasureConfig { num_coding: usize, } +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct MerkleRootMeta { + /// The merkle root, `None` for legacy shreds + merkle_root: Option, + /// The first received shred index + first_received_shred_index: u32, + /// The shred type of the first received shred + first_received_shred_type: ShredType, +} + #[derive(Deserialize, Serialize)] pub struct DuplicateSlotProof { #[serde(with = "serde_bytes")] From e3bd31c06775ea46c192e1be3e32b035d88548e3 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:12:14 +0000 Subject: [PATCH 093/213] v1.17: exits send_requests_task if the connection is closed (backport of #33837) (#34324) exits send_requests_task if the connection is closed (#33837) receiver.recv() can unnecessarily block when the connection is already closed. The commit exits send_requests_task if the connection is closed. (cherry picked from commit 20966266339044d320299efca6f81dfcc95cd5e0) Co-authored-by: behzad nouri --- core/src/repair/quic_endpoint.rs | 43 ++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/core/src/repair/quic_endpoint.rs b/core/src/repair/quic_endpoint.rs index c6f2e00df53a26..89f9de78491101 100644 --- a/core/src/repair/quic_endpoint.rs +++ b/core/src/repair/quic_endpoint.rs @@ -408,11 +408,16 @@ async fn handle_connection( )); match futures::future::try_join(send_requests_task, recv_requests_task).await { Err(err) => error!("handle_connection: {remote_pubkey}, {remote_address}, {err:?}"), - Ok(((), Err(err))) => { - debug!("recv_requests_task: {remote_pubkey}, {remote_address}, {err:?}"); - record_error(&err, &stats); + Ok(out) => { + if let (Err(ref err), _) = out { + debug!("send_requests_task: {remote_pubkey}, {remote_address}, {err:?}"); + record_error(err, &stats); + } + if let (_, Err(ref err)) = out { + debug!("recv_requests_task: {remote_pubkey}, {remote_address}, {err:?}"); + record_error(err, &stats); + } } - Ok(((), Ok(()))) => (), } drop_connection(remote_pubkey, &connection, &cache).await; if let Entry::Occupied(entry) = router.write().await.entry(remote_address) { @@ -513,15 +518,27 @@ async fn send_requests_task( connection: Connection, mut receiver: AsyncReceiver, stats: Arc, -) { - while let Some(request) = receiver.recv().await { - tokio::task::spawn(send_request_task( - endpoint.clone(), - remote_address, - connection.clone(), - request, - stats.clone(), - )); +) -> Result<(), Error> { + tokio::pin! { + let connection_closed = connection.closed(); + } + loop { + tokio::select! { + biased; + request = receiver.recv() => { + match request { + None => return Ok(()), + Some(request) => tokio::task::spawn(send_request_task( + endpoint.clone(), + remote_address, + connection.clone(), + request, + stats.clone(), + )), + }; + } + err = &mut connection_closed => return Err(Error::from(err)), + } } } From a665996e0bb7d057ab02120a0a842d4517657a70 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 22:10:09 +0000 Subject: [PATCH 094/213] v1.17: exits send_datagram_task if the connection is closed (backport of #33836) (#34327) exits send_datagram_task if the connection is closed (#33836) Waiting on receiver.recv() can unnecessarily block while the connection is already closed. The commit exits send_datagram_task if the connection is closed. (cherry picked from commit 03fbe083b8d88474ca7a9295f0cf13809b474303) Co-authored-by: behzad nouri --- turbine/src/quic_endpoint.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/turbine/src/quic_endpoint.rs b/turbine/src/quic_endpoint.rs index e8a316420b42d8..a947f212296fb7 100644 --- a/turbine/src/quic_endpoint.rs +++ b/turbine/src/quic_endpoint.rs @@ -435,10 +435,21 @@ async fn send_datagram_task( connection: Connection, mut receiver: AsyncReceiver, ) -> Result<(), Error> { - while let Some(bytes) = receiver.recv().await { - connection.send_datagram(bytes)?; + tokio::pin! { + let connection_closed = connection.closed(); + } + loop { + tokio::select! { + biased; + bytes = receiver.recv() => { + match bytes { + None => return Ok(()), + Some(bytes) => connection.send_datagram(bytes)?, + } + } + err = &mut connection_closed => return Err(Error::from(err)), + } } - Ok(()) } async fn make_connection_task( From 311e986b424dd7a727d395ab5ebe071594e53e8e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 6 Dec 2023 21:54:32 +0000 Subject: [PATCH 095/213] v1.17: patches slots_per_epoch vs last_slot ordering in shred_fetch_stage (backport of #34338) (#34345) patches slots_per_epoch vs last_slot ordering in shred_fetch_stage (#34338) (cherry picked from commit b1c701e53b45f8c4936a20b1294d80c314f08207) Co-authored-by: behzad nouri --- core/src/shred_fetch_stage.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/shred_fetch_stage.rs b/core/src/shred_fetch_stage.rs index 62733953cc724f..bbb130573cab9a 100644 --- a/core/src/shred_fetch_stage.rs +++ b/core/src/shred_fetch_stage.rs @@ -50,7 +50,7 @@ impl ShredFetchStage { .as_ref() .map(|(_, cluster_info)| cluster_info.keypair().clone()); - let (mut last_root, mut last_slot, mut slots_per_epoch) = { + let (mut last_root, mut slots_per_epoch, mut last_slot) = { let bank_forks_r = bank_forks.read().unwrap(); let root_bank = bank_forks_r.root_bank(); ( From d17243fc41441363bdd3e0225236363ad53bd25c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 10:36:51 +0100 Subject: [PATCH 096/213] v1.17: Fix - Removes redundant `TotalBatchesLen` from `ThreadExecuteTimings::accumulate()` (backport of #34179) (#34347) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix - Removes redundant `TotalBatchesLen` from `ThreadExecuteTimings::accumulate()` (#34179) Removes redundant TotalBatchesLen from ThreadExecuteTimings::accumulate(). (cherry picked from commit c0a4fc870c4d86fb15bbefe8515e642f93ea74e0) Co-authored-by: Alexander Meißner --- program-runtime/src/timings.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/program-runtime/src/timings.rs b/program-runtime/src/timings.rs index 0e2e4956a55889..8eeb9c5a005cde 100644 --- a/program-runtime/src/timings.rs +++ b/program-runtime/src/timings.rs @@ -300,13 +300,6 @@ impl ThreadExecuteTimings { } pub fn accumulate(&mut self, other: &ThreadExecuteTimings) { - self.execute_timings.saturating_add_in_place( - ExecuteTimingType::TotalBatchesLen, - *other - .execute_timings - .metrics - .index(ExecuteTimingType::TotalBatchesLen), - ); self.execute_timings.accumulate(&other.execute_timings); saturating_add_assign!(self.total_thread_us, other.total_thread_us); saturating_add_assign!( From 22f4694c75c7b8250b40732b37b3f788e751822d Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 09:33:26 -0500 Subject: [PATCH 097/213] v1.17: shred: expose merkle root for use in blockstore (backport of #34063) (#34291) shred: expose merkle root for use in blockstore (#34063) * shred: expose merkle root for use in blockstore * pr feedback: sorted, keep Result return type * convert Result -> Option (cherry picked from commit 6a5b8e86f3c492a4984e780591cc97a027a59a8a) Co-authored-by: Ashwin Sekar --- ledger/src/blockstore_meta.rs | 29 +++++++++++++++++++++++++++++ ledger/src/shred.rs | 1 + ledger/src/shred/merkle.rs | 4 ++-- ledger/src/shred/shred_code.rs | 9 ++++++++- ledger/src/shred/shred_data.rs | 9 ++++++++- 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/ledger/src/blockstore_meta.rs b/ledger/src/blockstore_meta.rs index 5066a028336330..6e618154f20751 100644 --- a/ledger/src/blockstore_meta.rs +++ b/ledger/src/blockstore_meta.rs @@ -406,6 +406,35 @@ impl ErasureMeta { } } +#[allow(dead_code)] +impl MerkleRootMeta { + pub(crate) fn from_shred(shred: &Shred) -> Self { + Self { + // An error here after the shred has already sigverified + // can only indicate that the leader is sending + // legacy or malformed shreds. We should still store + // `None` for those cases in blockstore, as a later + // shred that contains a proper merkle root would constitute + // a valid duplicate shred proof. + merkle_root: shred.merkle_root().ok(), + first_received_shred_index: shred.index(), + first_received_shred_type: shred.shred_type(), + } + } + + pub(crate) fn merkle_root(&self) -> Option { + self.merkle_root + } + + pub(crate) fn first_received_shred_index(&self) -> u32 { + self.first_received_shred_index + } + + pub(crate) fn first_received_shred_type(&self) -> ShredType { + self.first_received_shred_type + } +} + impl DuplicateSlotProof { pub(crate) fn new(shred1: Vec, shred2: Vec) -> Self { DuplicateSlotProof { shred1, shred2 } diff --git a/ledger/src/shred.rs b/ledger/src/shred.rs index 5fda160e29b976..4cd4f8b85b918a 100644 --- a/ledger/src/shred.rs +++ b/ledger/src/shred.rs @@ -334,6 +334,7 @@ impl Shred { dispatch!(pub(crate) fn erasure_shard_index(&self) -> Result); dispatch!(pub fn into_payload(self) -> Vec); + dispatch!(pub fn merkle_root(&self) -> Result); dispatch!(pub fn payload(&self) -> &Vec); dispatch!(pub fn sanitize(&self) -> Result<(), Error>); diff --git a/ledger/src/shred/merkle.rs b/ledger/src/shred/merkle.rs index 4f1cd22111e07f..d0d507ae48aba1 100644 --- a/ledger/src/shred/merkle.rs +++ b/ledger/src/shred/merkle.rs @@ -154,7 +154,7 @@ impl ShredData { Ok(Self::SIZE_OF_HEADERS + Self::capacity(proof_size)?) } - fn merkle_root(&self) -> Result { + pub(super) fn merkle_root(&self) -> Result { let proof_size = self.proof_size()?; let index = self.erasure_shard_index()?; let proof_offset = Self::proof_offset(proof_size)?; @@ -266,7 +266,7 @@ impl ShredCode { Ok(Self::SIZE_OF_HEADERS + Self::capacity(proof_size)?) } - fn merkle_root(&self) -> Result { + pub(super) fn merkle_root(&self) -> Result { let proof_size = self.proof_size()?; let index = self.erasure_shard_index()?; let proof_offset = Self::proof_offset(proof_size)?; diff --git a/ledger/src/shred/shred_code.rs b/ledger/src/shred/shred_code.rs index ba85d92af25187..0ad97a0f729a77 100644 --- a/ledger/src/shred/shred_code.rs +++ b/ledger/src/shred/shred_code.rs @@ -6,7 +6,7 @@ use { CodingShredHeader, Error, ShredCommonHeader, ShredType, SignedData, DATA_SHREDS_PER_FEC_BLOCK, MAX_DATA_SHREDS_PER_SLOT, SIZE_OF_NONCE, }, - solana_sdk::{clock::Slot, packet::PACKET_DATA_SIZE, signature::Signature}, + solana_sdk::{clock::Slot, hash::Hash, packet::PACKET_DATA_SIZE, signature::Signature}, static_assertions::const_assert_eq, }; @@ -47,6 +47,13 @@ impl ShredCode { } } + pub(super) fn merkle_root(&self) -> Result { + match self { + Self::Legacy(_) => Err(Error::InvalidShredType), + Self::Merkle(shred) => shred.merkle_root(), + } + } + pub(super) fn new_from_parity_shard( slot: Slot, index: u32, diff --git a/ledger/src/shred/shred_data.rs b/ledger/src/shred/shred_data.rs index 9bf2c0bf05f79e..ecb40367b4ef08 100644 --- a/ledger/src/shred/shred_data.rs +++ b/ledger/src/shred/shred_data.rs @@ -7,7 +7,7 @@ use { DataShredHeader, Error, ShredCommonHeader, ShredFlags, ShredType, ShredVariant, SignedData, MAX_DATA_SHREDS_PER_SLOT, }, - solana_sdk::{clock::Slot, signature::Signature}, + solana_sdk::{clock::Slot, hash::Hash, signature::Signature}, }; #[derive(Clone, Debug, Eq, PartialEq)] @@ -41,6 +41,13 @@ impl ShredData { } } + pub(super) fn merkle_root(&self) -> Result { + match self { + Self::Legacy(_) => Err(Error::InvalidShredType), + Self::Merkle(shred) => shred.merkle_root(), + } + } + pub(super) fn new_from_data( slot: Slot, index: u32, From fe8f77e7bdefea8551da1a41c335679523a1df14 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 17:10:33 +0000 Subject: [PATCH 098/213] v1.17: adds feature gated code to drop legacy shreds (backport of #34328) (#34346) * adds feature gated code to drop legacy shreds (#34328) (cherry picked from commit d5eee0195049d65a47c7220bb2a9053b8766e333) * derefrences instead of clone --------- Co-authored-by: behzad nouri --- core/src/shred_fetch_stage.rs | 57 ++++++++++++++++++++++++++++++++--- ledger/src/shred.rs | 18 ++++++++++- sdk/src/feature_set.rs | 5 +++ 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/core/src/shred_fetch_stage.rs b/core/src/shred_fetch_stage.rs index bbb130573cab9a..703167b0b44ac1 100644 --- a/core/src/shred_fetch_stage.rs +++ b/core/src/shred_fetch_stage.rs @@ -10,7 +10,9 @@ use { solana_perf::packet::{PacketBatch, PacketBatchRecycler, PacketFlags, PACKETS_PER_BATCH}, solana_runtime::bank_forks::BankForks, solana_sdk::{ - clock::DEFAULT_MS_PER_SLOT, + clock::{Slot, DEFAULT_MS_PER_SLOT}, + epoch_schedule::EpochSchedule, + feature_set::{self, FeatureSet}, packet::{Meta, PACKET_DATA_SIZE}, pubkey::Pubkey, }, @@ -50,12 +52,20 @@ impl ShredFetchStage { .as_ref() .map(|(_, cluster_info)| cluster_info.keypair().clone()); - let (mut last_root, mut slots_per_epoch, mut last_slot) = { + let ( + mut last_root, + mut slots_per_epoch, + mut feature_set, + mut epoch_schedule, + mut last_slot, + ) = { let bank_forks_r = bank_forks.read().unwrap(); let root_bank = bank_forks_r.root_bank(); ( root_bank.slot(), root_bank.get_slots_in_epoch(root_bank.epoch()), + root_bank.feature_set.clone(), + *root_bank.epoch_schedule(), bank_forks_r.highest_slot(), ) }; @@ -69,6 +79,8 @@ impl ShredFetchStage { last_slot = bank_forks_r.highest_slot(); bank_forks_r.root_bank() }; + feature_set = root_bank.feature_set.clone(); + epoch_schedule = *root_bank.epoch_schedule(); last_root = root_bank.slot(); slots_per_epoch = root_bank.get_slots_in_epoch(root_bank.epoch()); keypair = repair_context @@ -92,10 +104,19 @@ impl ShredFetchStage { // Limit shreds to 2 epochs away. let max_slot = last_slot + 2 * slots_per_epoch; + let should_drop_legacy_shreds = + |shred_slot| should_drop_legacy_shreds(shred_slot, &feature_set, &epoch_schedule); let turbine_disabled = turbine_disabled.load(Ordering::Relaxed); for packet in packet_batch.iter_mut().filter(|p| !p.meta().discard()) { if turbine_disabled - || should_discard_shred(packet, last_root, max_slot, shred_version, &mut stats) + || should_discard_shred( + packet, + last_root, + max_slot, + shred_version, + should_drop_legacy_shreds, + &mut stats, + ) { packet.meta_mut().set_discard(true); } else { @@ -373,6 +394,22 @@ pub(crate) fn receive_repair_quic_packets( } } +#[must_use] +fn should_drop_legacy_shreds( + shred_slot: Slot, + feature_set: &FeatureSet, + epoch_schedule: &EpochSchedule, +) -> bool { + match feature_set.activated_slot(&feature_set::drop_legacy_shreds::id()) { + None => false, + Some(feature_slot) => { + let feature_epoch = epoch_schedule.get_epoch(feature_slot); + let shred_epoch = epoch_schedule.get_epoch(shred_slot); + feature_epoch < shred_epoch + } + } +} + #[cfg(test)] mod tests { use { @@ -413,6 +450,7 @@ mod tests { last_root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats, )); let coding = solana_ledger::shred::Shredder::generate_coding_shreds( @@ -426,6 +464,7 @@ mod tests { last_root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats, )); } @@ -447,6 +486,7 @@ mod tests { last_root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats, )); assert_eq!(stats.index_overrun, 1); @@ -468,12 +508,18 @@ mod tests { 3, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats, )); assert_eq!(stats.slot_out_of_range, 1); assert!(should_discard_shred( - &packet, last_root, max_slot, /*shred_version:*/ 345, &mut stats, + &packet, + last_root, + max_slot, + 345, // shred_version + |_| false, // should_drop_legacy_shreds + &mut stats, )); assert_eq!(stats.shred_version_mismatch, 1); @@ -483,6 +529,7 @@ mod tests { last_root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats, )); @@ -504,6 +551,7 @@ mod tests { last_root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats, )); @@ -515,6 +563,7 @@ mod tests { last_root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats, )); } diff --git a/ledger/src/shred.rs b/ledger/src/shred.rs index 4cd4f8b85b918a..ebb0b791e56973 100644 --- a/ledger/src/shred.rs +++ b/ledger/src/shred.rs @@ -894,6 +894,7 @@ pub fn should_discard_shred( root: Slot, max_slot: Slot, shred_version: u16, + should_drop_legacy_shreds: impl Fn(Slot) -> bool, stats: &mut ShredFetchStats, ) -> bool { debug_assert!(root < max_slot); @@ -968,7 +969,11 @@ pub fn should_discard_shred( } } match shred_variant { - ShredVariant::LegacyCode | ShredVariant::LegacyData => (), + ShredVariant::LegacyCode | ShredVariant::LegacyData => { + if should_drop_legacy_shreds(slot) { + return true; + } + } ShredVariant::MerkleCode(_) => { stats.num_shreds_merkle_code = stats.num_shreds_merkle_code.saturating_add(1); } @@ -1172,6 +1177,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); assert_eq!(stats, ShredFetchStats::default()); @@ -1182,6 +1188,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); assert_eq!(stats.index_overrun, 1); @@ -1192,6 +1199,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); assert_eq!(stats.index_overrun, 2); @@ -1202,6 +1210,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); assert_eq!(stats.index_overrun, 3); @@ -1212,6 +1221,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); assert_eq!(stats.index_overrun, 4); @@ -1222,6 +1232,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); assert_eq!(stats.bad_parent_offset, 1); @@ -1242,6 +1253,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); @@ -1261,6 +1273,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); assert_eq!(1, stats.index_out_of_bounds); @@ -1281,6 +1294,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); packet.buffer_mut()[OFFSET_OF_SHRED_VARIANT] = u8::MAX; @@ -1290,6 +1304,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); assert_eq!(1, stats.bad_shred_type); @@ -1301,6 +1316,7 @@ mod tests { root, max_slot, shred_version, + |_| false, // should_drop_legacy_shreds &mut stats )); assert_eq!(1, stats.bad_shred_type); diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 44d81f52d1d19c..34dfdbcbbcbc29 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -728,6 +728,10 @@ pub mod enable_zk_transfer_with_fee { solana_sdk::declare_id!("zkNLP7EQALfC1TYeB3biDU7akDckj8iPkvh9y2Mt2K3"); } +pub mod drop_legacy_shreds { + solana_sdk::declare_id!("GV49KKQdBNaiv2pgqhS2Dy3GWYJGXMTVYbYkdk91orRy"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -905,6 +909,7 @@ lazy_static! { (update_hashes_per_tick6::id(), "Update desired hashes per tick to 10M"), (validate_fee_collector_account::id(), "validate fee collector account #33888"), (enable_zk_transfer_with_fee::id(), "enable Zk Token proof program transfer with fee"), + (drop_legacy_shreds::id(), "drops legacy shreds #34328"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() From d1858aaed1997d0a2e7db6708ffc5cfdd75917de Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 19:12:14 +0100 Subject: [PATCH 099/213] v1.17: Fix `solana-address-lookup-table-program` compilation (backport of #34353) (#34357) Fix `solana-address-lookup-table-program` compilation (#34353) * Add checks to decide which SDK crate to use * Make module only available in non-program environments * Remove `solana-sdk` export and only export from `solana-program` (cherry picked from commit 46921b3135d47165c7ac9a93e85ba7776f7827d1) Co-authored-by: acheron <98934430+acheroncrypto@users.noreply.github.com> --- programs/address-lookup-table/src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/programs/address-lookup-table/src/lib.rs b/programs/address-lookup-table/src/lib.rs index 11d9b4b0dd34e4..737ec32c8f6782 100644 --- a/programs/address-lookup-table/src/lib.rs +++ b/programs/address-lookup-table/src/lib.rs @@ -2,13 +2,14 @@ #![cfg_attr(RUSTC_WITH_SPECIALIZATION, feature(specialization))] #![cfg_attr(RUSTC_NEEDS_PROC_MACRO_HYGIENE, feature(proc_macro_hygiene))] +#[cfg(not(target_os = "solana"))] pub mod processor; #[deprecated( since = "1.17.0", - note = "Please use `solana_sdk::address_lookup_table` instead" + note = "Please use `solana_program::address_lookup_table` instead" )] -pub use solana_sdk::address_lookup_table::{ +pub use solana_program::address_lookup_table::{ error, instruction, program::{check_id, id, ID}, state, From 4b10458b3d538f8d0d9b31fbd1750f4831577010 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:34:33 -0600 Subject: [PATCH 100/213] v1.17: Comment sysvar and builtin lists as deprecated and remove new keys (backport of #34365) (#34369) Comment sysvar and builtin lists as deprecated and remove new keys (#34365) (cherry picked from commit 79739e1b787d971c1c5912416446244710ebc09e) Co-authored-by: Justin Starry --- sdk/program/src/message/legacy.rs | 2 +- sdk/program/src/sysvar/mod.rs | 15 +-------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/sdk/program/src/message/legacy.rs b/sdk/program/src/message/legacy.rs index e81c7c485ff5f6..7c00813fcf6a9c 100644 --- a/sdk/program/src/message/legacy.rs +++ b/sdk/program/src/message/legacy.rs @@ -26,7 +26,7 @@ use { }; lazy_static! { - // Copied keys over since direct references create cyclical dependency. + // This will be deprecated and so this list shouldn't be modified pub static ref BUILTIN_PROGRAMS_KEYS: [Pubkey; 10] = { let parse = |s| Pubkey::from_str(s).unwrap(); [ diff --git a/sdk/program/src/sysvar/mod.rs b/sdk/program/src/sysvar/mod.rs index 1bb7c12b33a728..5a5afec8bcf8a3 100644 --- a/sdk/program/src/sysvar/mod.rs +++ b/sdk/program/src/sysvar/mod.rs @@ -100,6 +100,7 @@ pub mod slot_history; pub mod stake_history; lazy_static! { + // This will be deprecated and so this list shouldn't be modified pub static ref ALL_IDS: Vec = vec![ clock::id(), epoch_schedule::id(), @@ -113,8 +114,6 @@ lazy_static! { slot_history::id(), stake_history::id(), instructions::id(), - epoch_rewards::id(), - last_restart_slot::id(), ]; } @@ -138,12 +137,6 @@ macro_rules! declare_sysvar_id( check_id(pubkey) } } - - #[cfg(test)] - #[test] - fn test_sysvar_id() { - assert!($crate::sysvar::is_sysvar_id(&id()), "sysvar::is_sysvar_id() doesn't know about {}", $name); - } ) ); @@ -164,12 +157,6 @@ macro_rules! declare_deprecated_sysvar_id( check_id(pubkey) } } - - #[cfg(test)] - #[test] - fn test_sysvar_id() { - assert!($crate::sysvar::is_sysvar_id(&id()), "sysvar::is_sysvar_id() doesn't know about {}", $name); - } ) ); From 7036ea034572412c313b8e44b8d811d529226887 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 9 Dec 2023 08:11:34 +0900 Subject: [PATCH 101/213] v1.17: chore: Update light-poseidon to 0.2.0 (backport of #33923) (#34247) chore: Update light-poseidon to 0.2.0 (#33923) That new release contains an important change which prevents a potential DDoS. * Lightprotocol/light-poseidon#32 Invoking `from_bytes_be` function light-poseidon 0.1.1 inverts all the inputs before performing a check whether their length exceeds the modulus of the prime field. Therefore, it was prone to an attack, where a mailicious user could submit long byte slices just to DDoS the validator, being stuck on inverting large byte sequences. The update and mentioned change fixes the same issue as #33363 aims to address. The new release contains also few other less important changes like: * Lightprotocol/light-poseidon#37 * Lightprotocol/light-poseidon#38 * Lightprotocol/light-poseidon#39 (cherry picked from commit 67f8daf6e966d9bb6ac5007ee082e9fa32ed3345) Co-authored-by: vadorovsky --- Cargo.lock | 5 ++-- Cargo.toml | 2 +- programs/sbf/Cargo.lock | 5 ++-- sdk/program/src/poseidon.rs | 52 +++++++++++++++++++++---------------- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2d84abf1ca5c45..782e44abacb0d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2967,12 +2967,13 @@ dependencies = [ [[package]] name = "light-poseidon" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949bdd22e4ed93481d45e9a6badb34b99132bcad0c8a8d4f05c42f7dcc7b90bc" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ "ark-bn254", "ark-ff", + "num-bigint 0.4.4", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index 68da570fe55223..3e1fa13386f5b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -233,7 +233,7 @@ lazy_static = "1.4.0" libc = "0.2.148" libloading = "0.7.4" libsecp256k1 = "0.6.0" -light-poseidon = "0.1.1" +light-poseidon = "0.2.0" log = "0.4.20" lru = "0.7.7" lz4 = "1.24.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 2a1bfb3bef4a82..5cd0e9e723eb4f 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -2604,12 +2604,13 @@ dependencies = [ [[package]] name = "light-poseidon" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949bdd22e4ed93481d45e9a6badb34b99132bcad0c8a8d4f05c42f7dcc7b90bc" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ "ark-bn254", "ark-ff", + "num-bigint 0.4.4", "thiserror", ] diff --git a/sdk/program/src/poseidon.rs b/sdk/program/src/poseidon.rs index c23cded6db9310..9c02fe90bc8b50 100644 --- a/sdk/program/src/poseidon.rs +++ b/sdk/program/src/poseidon.rs @@ -21,12 +21,16 @@ pub enum PoseidonSyscallError { "Invalid length of the input. The length matching the modulus of the prime field is 32." )] InvalidInputLength, + #[error("Failed to convert bytest into a prime field element.")] + BytesToPrimeFieldElement, #[error("Input is larger than the modulus of the prime field.")] InputLargerThanModulus, #[error("Failed to convert a vector of bytes into an array.")] VecToArray, #[error("Failed to convert the number of inputs from u64 to u8.")] U64Tou8, + #[error("Failed to convert bytes to BigInt")] + BytesToBigInt, #[error("Invalid width. Choose a width between 2 and 16 for 1 to 15 inputs.")] InvalidWidthCircom, #[error("Unexpected error")] @@ -41,10 +45,12 @@ impl From for PoseidonSyscallError { 3 => PoseidonSyscallError::InvalidNumberOfInputs, 4 => PoseidonSyscallError::EmptyInput, 5 => PoseidonSyscallError::InvalidInputLength, - 6 => PoseidonSyscallError::InputLargerThanModulus, - 7 => PoseidonSyscallError::VecToArray, - 8 => PoseidonSyscallError::U64Tou8, - 9 => PoseidonSyscallError::InvalidWidthCircom, + 6 => PoseidonSyscallError::BytesToPrimeFieldElement, + 7 => PoseidonSyscallError::InputLargerThanModulus, + 8 => PoseidonSyscallError::VecToArray, + 9 => PoseidonSyscallError::U64Tou8, + 10 => PoseidonSyscallError::BytesToBigInt, + 11 => PoseidonSyscallError::InvalidWidthCircom, _ => PoseidonSyscallError::Unexpected, } } @@ -58,11 +64,13 @@ impl From for u64 { PoseidonSyscallError::InvalidNumberOfInputs => 3, PoseidonSyscallError::EmptyInput => 4, PoseidonSyscallError::InvalidInputLength => 5, - PoseidonSyscallError::InputLargerThanModulus => 6, - PoseidonSyscallError::VecToArray => 7, - PoseidonSyscallError::U64Tou8 => 8, - PoseidonSyscallError::InvalidWidthCircom => 9, - PoseidonSyscallError::Unexpected => 10, + PoseidonSyscallError::BytesToPrimeFieldElement => 6, + PoseidonSyscallError::InputLargerThanModulus => 7, + PoseidonSyscallError::VecToArray => 8, + PoseidonSyscallError::U64Tou8 => 9, + PoseidonSyscallError::BytesToBigInt => 10, + PoseidonSyscallError::InvalidWidthCircom => 11, + PoseidonSyscallError::Unexpected => 12, } } } @@ -210,25 +218,25 @@ pub fn hashv( impl From for PoseidonSyscallError { fn from(error: PoseidonError) -> Self { match error { - PoseidonError::InvalidNumberOfInputs { - inputs: _, - max_limit: _, - width: _, - } => PoseidonSyscallError::InvalidNumberOfInputs, + PoseidonError::InvalidNumberOfInputs { .. } => { + PoseidonSyscallError::InvalidNumberOfInputs + } PoseidonError::EmptyInput => PoseidonSyscallError::EmptyInput, - PoseidonError::InvalidInputLength { - len: _, - modulus_bytes_len: _, - } => PoseidonSyscallError::InvalidInputLength, + PoseidonError::InvalidInputLength { .. } => { + PoseidonSyscallError::InvalidInputLength + } + PoseidonError::BytesToPrimeFieldElement { .. } => { + PoseidonSyscallError::BytesToPrimeFieldElement + } PoseidonError::InputLargerThanModulus => { PoseidonSyscallError::InputLargerThanModulus } PoseidonError::VecToArray => PoseidonSyscallError::VecToArray, PoseidonError::U64Tou8 => PoseidonSyscallError::U64Tou8, - PoseidonError::InvalidWidthCircom { - width: _, - max_limit: _, - } => PoseidonSyscallError::InvalidWidthCircom, + PoseidonError::BytesToBigInt => PoseidonSyscallError::BytesToBigInt, + PoseidonError::InvalidWidthCircom { .. } => { + PoseidonSyscallError::InvalidWidthCircom + } } } } From 01306a6e1ed1d054fe1def5750ccc1f3d4f5123c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 8 Dec 2023 17:00:40 -0700 Subject: [PATCH 102/213] v1.17: tokens: fix url clap arg name (backport of #34371) (#34375) tokens: fix url clap arg name (#34371) Fix url clap arg name (cherry picked from commit e8945d2ed56bb8d88245577b483f28550f809549) Co-authored-by: Tyera --- tokens/src/arg_parser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tokens/src/arg_parser.rs b/tokens/src/arg_parser.rs index 924c4e3e8eebb6..024bdf52832d73 100644 --- a/tokens/src/arg_parser.rs +++ b/tokens/src/arg_parser.rs @@ -652,7 +652,7 @@ where { let matches = get_matches(args); let config_file = matches.value_of("config_file").unwrap().to_string(); - let url = matches.value_of("url").map(|x| x.to_string()); + let url = matches.value_of("json_rpc_url").map(|x| x.to_string()); let command = match matches.subcommand() { ("distribute-tokens", Some(matches)) => { From 78e7796a0251d10f06eccbd10c10ca25eb1e2034 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sat, 9 Dec 2023 08:58:56 -0600 Subject: [PATCH 103/213] Update version to v1.17.9 (#34378) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 782e44abacb0d2..32d96c26725e12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.8" +version = "1.17.9" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.8" +version = "1.17.9" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.8" +version = "1.17.9" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.8" +version = "1.17.9" dependencies = [ "Inflector", "assert_matches", @@ -5123,7 +5123,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 2.33.3", "log", @@ -5137,7 +5137,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 2.33.3", "log", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.8" +version = "1.17.9" dependencies = [ "arrayref", "assert_matches", @@ -5231,7 +5231,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "bytemuck", @@ -5250,7 +5250,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -5261,7 +5261,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5285,7 +5285,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.8" +version = "1.17.9" dependencies = [ "serde", "solana-sdk", @@ -5311,7 +5311,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "crossbeam-channel", @@ -5329,7 +5329,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5340,7 +5340,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bv", "fnv", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -5419,7 +5419,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -5430,7 +5430,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bv", "bytemuck", @@ -5449,7 +5449,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "solana-logger", @@ -5457,7 +5457,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_cmd", "bzip2", @@ -5478,11 +5478,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.8" +version = "1.17.9" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.8" +version = "1.17.9" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5493,7 +5493,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "chrono", @@ -5510,7 +5510,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "chrono", @@ -5528,7 +5528,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.8" +version = "1.17.9" dependencies = [ "anyhow", "dirs-next", @@ -5596,7 +5596,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.8" +version = "1.17.9" dependencies = [ "Inflector", "base64 0.21.4", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-trait", "bincode", @@ -5654,7 +5654,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.8" +version = "1.17.9" dependencies = [ "futures-util", "rand 0.8.5", @@ -5684,7 +5684,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5692,7 +5692,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "chrono", @@ -5705,7 +5705,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-trait", "bincode", @@ -5729,7 +5729,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5812,7 +5812,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.8" +version = "1.17.9" dependencies = [ "lazy_static", "log", @@ -5837,7 +5837,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "clap 3.2.23", @@ -5867,7 +5867,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "console", "indicatif", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5890,7 +5890,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -5912,7 +5912,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "byteorder", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.8" +version = "1.17.9" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5964,7 +5964,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.8" +version = "1.17.9" dependencies = [ "proc-macro2", "quote", @@ -5974,7 +5974,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.8" +version = "1.17.9" dependencies = [ "base64 0.21.4", "bincode", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "solana-accounts-db", @@ -6010,7 +6010,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "solana-sdk", @@ -6020,7 +6020,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bs58", "crossbeam-channel", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -6096,7 +6096,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.8" +version = "1.17.9" dependencies = [ "atty", "bincode", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bs58", "clap 3.2.23", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -6216,7 +6216,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_cmd", "bs58", @@ -6265,7 +6265,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "log", @@ -6277,7 +6277,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.8" +version = "1.17.9" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.8" +version = "1.17.9" dependencies = [ "env_logger", "lazy_static", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "solana-sdk", @@ -6345,11 +6345,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.8" +version = "1.17.9" [[package]] name = "solana-merkle-root-bench" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 2.33.3", "log", @@ -6362,7 +6362,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.8" +version = "1.17.9" dependencies = [ "fast-math", "hex", @@ -6371,7 +6371,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.8" +version = "1.17.9" dependencies = [ "crossbeam-channel", "env_logger", @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "clap 3.2.23", @@ -6418,7 +6418,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "reqwest", @@ -6428,7 +6428,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.8" +version = "1.17.9" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6459,7 +6459,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -6480,7 +6480,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 3.2.23", "log", @@ -6495,7 +6495,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "anyhow", "ark-bn254", @@ -6552,7 +6552,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6581,7 +6581,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "async-trait", @@ -6610,7 +6610,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "anyhow", "crossbeam-channel", @@ -6634,7 +6634,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-mutex", "async-trait", @@ -6662,7 +6662,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.8" +version = "1.17.9" dependencies = [ "lazy_static", "num_cpus", @@ -6670,7 +6670,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "console", @@ -6689,7 +6689,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.8" +version = "1.17.9" dependencies = [ "base64 0.21.4", "bincode", @@ -6748,7 +6748,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "async-trait", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.8" +version = "1.17.9" dependencies = [ "base64 0.21.4", "bs58", @@ -6797,7 +6797,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "anyhow", "clap 2.33.3", @@ -6814,7 +6814,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "bs58", @@ -6841,7 +6841,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.8" +version = "1.17.9" dependencies = [ "arrayref", "assert_matches", @@ -6924,7 +6924,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.8" +version = "1.17.9" dependencies = [ "anyhow", "assert_matches", @@ -6982,7 +6982,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bs58", "proc-macro2", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.8" +version = "1.17.9" dependencies = [ "crossbeam-channel", "log", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7024,7 +7024,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -7041,7 +7041,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.8" +version = "1.17.9" dependencies = [ "backoff", "bincode", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "bs58", @@ -7089,7 +7089,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 2.33.3", "log", @@ -7101,7 +7101,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "async-channel", @@ -7133,7 +7133,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -7147,7 +7147,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.8" +version = "1.17.9" dependencies = [ "base64 0.21.4", "bincode", @@ -7177,7 +7177,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -7224,7 +7224,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-trait", "bincode", @@ -7246,7 +7246,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "clap 2.33.3", @@ -7273,7 +7273,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.8" +version = "1.17.9" dependencies = [ "Inflector", "base64 0.21.4", @@ -7296,7 +7296,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -7333,7 +7333,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-trait", "solana-connection-cache", @@ -7346,7 +7346,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.8" +version = "1.17.9" dependencies = [ "serde_json", "solana-metrics", @@ -7354,7 +7354,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.8" +version = "1.17.9" dependencies = [ "chrono", "clap 2.33.3", @@ -7418,7 +7418,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "rustc_version 0.4.0", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "crossbeam-channel", @@ -7451,7 +7451,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -7474,7 +7474,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 2.33.3", "humantime", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bs58", "clap 3.2.23", @@ -7512,7 +7512,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bytemuck", "criterion", @@ -7526,7 +7526,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7538,7 +7538,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.8" +version = "1.17.9" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 3e1fa13386f5b6..e443b84cd5cbca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.8" +version = "1.17.9" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.8" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.8" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.8" } -solana-banks-client = { path = "banks-client", version = "=1.17.8" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.8" } -solana-banks-server = { path = "banks-server", version = "=1.17.8" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.8" } -solana-bloom = { path = "bloom", version = "=1.17.8" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.8" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.8" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.8", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.8" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.8" } -solana-cli = { path = "cli", version = "=1.17.8" } -solana-cli-config = { path = "cli-config", version = "=1.17.8" } -solana-cli-output = { path = "cli-output", version = "=1.17.8" } -solana-client = { path = "client", version = "=1.17.8" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.8" } -solana-config-program = { path = "programs/config", version = "=1.17.8" } -solana-core = { path = "core", version = "=1.17.8" } -solana-cost-model = { path = "cost-model", version = "=1.17.8" } -solana-download-utils = { path = "download-utils", version = "=1.17.8" } -solana-entry = { path = "entry", version = "=1.17.8" } -solana-faucet = { path = "faucet", version = "=1.17.8" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.8" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.8" } -solana-genesis = { path = "genesis", version = "=1.17.8" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.8" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.8" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.8" } -solana-gossip = { path = "gossip", version = "=1.17.8" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.8" } -solana-ledger = { path = "ledger", version = "=1.17.8" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.8" } -solana-logger = { path = "logger", version = "=1.17.8" } -solana-measure = { path = "measure", version = "=1.17.8" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.8" } -solana-metrics = { path = "metrics", version = "=1.17.8" } -solana-net-utils = { path = "net-utils", version = "=1.17.8" } -solana-notifier = { path = "notifier", version = "=1.17.8" } -solana-perf = { path = "perf", version = "=1.17.8" } -solana-poh = { path = "poh", version = "=1.17.8" } -solana-program = { path = "sdk/program", version = "=1.17.8" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.8" } -solana-program-test = { path = "program-test", version = "=1.17.8" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.8" } -solana-quic-client = { path = "quic-client", version = "=1.17.8" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.8" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.8", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.8" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.8", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.8" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.8" } -solana-runtime = { path = "runtime", version = "=1.17.8" } -solana-sdk = { path = "sdk", version = "=1.17.8" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.8" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.8" } -solana-stake-program = { path = "programs/stake", version = "=1.17.8" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.8" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.8" } -solana-streamer = { path = "streamer", version = "=1.17.8" } -solana-system-program = { path = "programs/system", version = "=1.17.8" } -solana-test-validator = { path = "test-validator", version = "=1.17.8" } -solana-thin-client = { path = "thin-client", version = "=1.17.8" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.8", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.8" } -solana-turbine = { path = "turbine", version = "=1.17.8" } -solana-udp-client = { path = "udp-client", version = "=1.17.8" } -solana-version = { path = "version", version = "=1.17.8" } -solana-vote = { path = "vote", version = "=1.17.8" } -solana-vote-program = { path = "programs/vote", version = "=1.17.8" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.8" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.8" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.8" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.9" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.9" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.9" } +solana-banks-client = { path = "banks-client", version = "=1.17.9" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.9" } +solana-banks-server = { path = "banks-server", version = "=1.17.9" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.9" } +solana-bloom = { path = "bloom", version = "=1.17.9" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.9" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.9" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.9", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.9" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.9" } +solana-cli = { path = "cli", version = "=1.17.9" } +solana-cli-config = { path = "cli-config", version = "=1.17.9" } +solana-cli-output = { path = "cli-output", version = "=1.17.9" } +solana-client = { path = "client", version = "=1.17.9" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.9" } +solana-config-program = { path = "programs/config", version = "=1.17.9" } +solana-core = { path = "core", version = "=1.17.9" } +solana-cost-model = { path = "cost-model", version = "=1.17.9" } +solana-download-utils = { path = "download-utils", version = "=1.17.9" } +solana-entry = { path = "entry", version = "=1.17.9" } +solana-faucet = { path = "faucet", version = "=1.17.9" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.9" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.9" } +solana-genesis = { path = "genesis", version = "=1.17.9" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.9" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.9" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.9" } +solana-gossip = { path = "gossip", version = "=1.17.9" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.9" } +solana-ledger = { path = "ledger", version = "=1.17.9" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.9" } +solana-logger = { path = "logger", version = "=1.17.9" } +solana-measure = { path = "measure", version = "=1.17.9" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.9" } +solana-metrics = { path = "metrics", version = "=1.17.9" } +solana-net-utils = { path = "net-utils", version = "=1.17.9" } +solana-notifier = { path = "notifier", version = "=1.17.9" } +solana-perf = { path = "perf", version = "=1.17.9" } +solana-poh = { path = "poh", version = "=1.17.9" } +solana-program = { path = "sdk/program", version = "=1.17.9" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.9" } +solana-program-test = { path = "program-test", version = "=1.17.9" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.9" } +solana-quic-client = { path = "quic-client", version = "=1.17.9" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.9" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.9", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.9" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.9", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.9" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.9" } +solana-runtime = { path = "runtime", version = "=1.17.9" } +solana-sdk = { path = "sdk", version = "=1.17.9" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.9" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.9" } +solana-stake-program = { path = "programs/stake", version = "=1.17.9" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.9" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.9" } +solana-streamer = { path = "streamer", version = "=1.17.9" } +solana-system-program = { path = "programs/system", version = "=1.17.9" } +solana-test-validator = { path = "test-validator", version = "=1.17.9" } +solana-thin-client = { path = "thin-client", version = "=1.17.9" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.9", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.9" } +solana-turbine = { path = "turbine", version = "=1.17.9" } +solana-udp-client = { path = "udp-client", version = "=1.17.9" } +solana-version = { path = "version", version = "=1.17.9" } +solana-vote = { path = "vote", version = "=1.17.9" } +solana-vote-program = { path = "programs/vote", version = "=1.17.9" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.9" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.9" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.9" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 5cd0e9e723eb4f..2e1d16881192f2 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4447,7 +4447,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.8" +version = "1.17.9" dependencies = [ "Inflector", "base64 0.21.4", @@ -4469,7 +4469,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.8" +version = "1.17.9" dependencies = [ "arrayref", "bincode", @@ -4526,7 +4526,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "bytemuck", @@ -4545,7 +4545,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4560,7 +4560,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.8" +version = "1.17.9" dependencies = [ "serde", "solana-sdk", @@ -4569,7 +4569,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "crossbeam-channel", @@ -4587,7 +4587,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bv", "fnv", @@ -4604,7 +4604,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4621,7 +4621,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.8" +version = "1.17.9" dependencies = [ "array-bytes", "serde", @@ -4631,7 +4631,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bv", "bytemuck", @@ -4647,7 +4647,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "chrono", "clap 2.33.3", @@ -4662,7 +4662,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.8" +version = "1.17.9" dependencies = [ "dirs-next", "lazy_static", @@ -4676,7 +4676,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.8" +version = "1.17.9" dependencies = [ "Inflector", "base64 0.21.4", @@ -4701,7 +4701,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-trait", "bincode", @@ -4732,7 +4732,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4740,7 +4740,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "chrono", @@ -4752,7 +4752,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-trait", "bincode", @@ -4772,7 +4772,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.8" +version = "1.17.9" dependencies = [ "base64 0.21.4", "bincode", @@ -4844,7 +4844,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.8" +version = "1.17.9" dependencies = [ "lazy_static", "log", @@ -4866,7 +4866,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "console", "indicatif", @@ -4878,7 +4878,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "crossbeam-channel", @@ -4898,7 +4898,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4920,7 +4920,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.8" +version = "1.17.9" dependencies = [ "ahash 0.8.3", "blake3", @@ -4948,7 +4948,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.8" +version = "1.17.9" dependencies = [ "proc-macro2", "quote", @@ -4958,7 +4958,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "solana-accounts-db", @@ -4969,7 +4969,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "solana-sdk", @@ -4979,7 +4979,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bs58", "crossbeam-channel", @@ -5004,7 +5004,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -5052,7 +5052,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "solana-measure", @@ -5127,7 +5127,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.8" +version = "1.17.9" dependencies = [ "env_logger", "lazy_static", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "solana-sdk", @@ -5144,7 +5144,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.8" +version = "1.17.9" dependencies = [ "fast-math", "solana-program", @@ -5152,7 +5152,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.8" +version = "1.17.9" dependencies = [ "crossbeam-channel", "gethostname", @@ -5165,7 +5165,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "clap 3.1.6", @@ -5185,7 +5185,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.8" +version = "1.17.9" dependencies = [ "ahash 0.8.3", "bincode", @@ -5212,7 +5212,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.8" +version = "1.17.9" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5228,7 +5228,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "ark-bn254", "ark-ec", @@ -5280,7 +5280,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.8" +version = "1.17.9" dependencies = [ "base64 0.21.4", "bincode", @@ -5306,7 +5306,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "async-trait", @@ -5334,7 +5334,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "crossbeam-channel", "futures-util", @@ -5357,7 +5357,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-mutex", "async-trait", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.8" +version = "1.17.9" dependencies = [ "lazy_static", "num_cpus", @@ -5390,7 +5390,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.8" +version = "1.17.9" dependencies = [ "console", "dialoguer", @@ -5407,7 +5407,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.8" +version = "1.17.9" dependencies = [ "base64 0.21.4", "bincode", @@ -5462,7 +5462,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-trait", "base64 0.21.4", @@ -5486,7 +5486,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.8" +version = "1.17.9" dependencies = [ "base64 0.21.4", "bs58", @@ -5506,7 +5506,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.8" +version = "1.17.9" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5517,7 +5517,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.8" +version = "1.17.9" dependencies = [ "arrayref", "base64 0.21.4", @@ -5592,7 +5592,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5621,7 +5621,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5629,21 +5629,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.8" +version = "1.17.9" dependencies = [ "array-bytes", "solana-program", @@ -5651,7 +5651,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.8" +version = "1.17.9" dependencies = [ "array-bytes", "solana-program", @@ -5659,21 +5659,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5681,14 +5681,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.8" +version = "1.17.9" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5696,21 +5696,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.8" +version = "1.17.9" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5720,42 +5720,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.8" +version = "1.17.9" dependencies = [ "rustversion", "solana-program", @@ -5765,49 +5765,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5815,14 +5815,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-program-runtime", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5840,21 +5840,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5862,14 +5862,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.8" +version = "1.17.9" dependencies = [ "array-bytes", "solana-program", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.8" +version = "1.17.9" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5886,14 +5886,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-program-runtime", @@ -5911,21 +5911,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-program-runtime", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.8" +version = "1.17.9" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5943,7 +5943,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.8" +version = "1.17.9" dependencies = [ "blake3", "solana-program", @@ -5951,21 +5951,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-logger", "solana-program", @@ -5976,21 +5976,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", "solana-program-runtime", @@ -6000,21 +6000,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.8" +version = "1.17.9" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.8" +version = "1.17.9" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6066,7 +6066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bs58", "proc-macro2", @@ -6077,7 +6077,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.8" +version = "1.17.9" dependencies = [ "crossbeam-channel", "log", @@ -6091,7 +6091,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "log", @@ -6104,7 +6104,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.8" +version = "1.17.9" dependencies = [ "backoff", "bincode", @@ -6136,7 +6136,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "bs58", @@ -6151,7 +6151,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-channel", "bytes", @@ -6181,7 +6181,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "log", @@ -6193,7 +6193,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.8" +version = "1.17.9" dependencies = [ "base64 0.21.4", "bincode", @@ -6223,7 +6223,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "log", @@ -6236,7 +6236,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-trait", "bincode", @@ -6258,7 +6258,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.8" +version = "1.17.9" dependencies = [ "Inflector", "base64 0.21.4", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "bytes", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.8" +version = "1.17.9" dependencies = [ "async-trait", "solana-connection-cache", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.8" +version = "1.17.9" dependencies = [ "chrono", "clap 2.33.3", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.8" +version = "1.17.9" dependencies = [ "log", "rustc_version", @@ -6405,7 +6405,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.8" +version = "1.17.9" dependencies = [ "crossbeam-channel", "itertools", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bincode", "log", @@ -6442,7 +6442,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.8" +version = "1.17.9" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6454,7 +6454,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.8" +version = "1.17.9" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 25b9fbc619369a..992e86fd4dfc32 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.8" +version = "1.17.9" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.8" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.8" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.8" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.8" } -solana-ledger = { path = "../../ledger", version = "=1.17.8" } -solana-logger = { path = "../../logger", version = "=1.17.8" } -solana-measure = { path = "../../measure", version = "=1.17.8" } -solana-program = { path = "../../sdk/program", version = "=1.17.8" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.8" } -solana-program-test = { path = "../../program-test", version = "=1.17.8" } -solana-runtime = { path = "../../runtime", version = "=1.17.8" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.8" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.8" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.8", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.8" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.8" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.8" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.8", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.8" } -solana-sdk = { path = "../../sdk", version = "=1.17.8" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.8" } -solana-validator = { path = "../../validator", version = "=1.17.8" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.8" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.9" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.9" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.9" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.9" } +solana-ledger = { path = "../../ledger", version = "=1.17.9" } +solana-logger = { path = "../../logger", version = "=1.17.9" } +solana-measure = { path = "../../measure", version = "=1.17.9" } +solana-program = { path = "../../sdk/program", version = "=1.17.9" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.9" } +solana-program-test = { path = "../../program-test", version = "=1.17.9" } +solana-runtime = { path = "../../runtime", version = "=1.17.9" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.9" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.9" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.9", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.9" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.9" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.9" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.9", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.9" } +solana-sdk = { path = "../../sdk", version = "=1.17.9" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.9" } +solana-validator = { path = "../../validator", version = "=1.17.9" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.9" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 2c9e439232ae92..0eeb33d1af7da6 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.8" +version = "1.17.9" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.8" } +solana-program = { path = "../../../../program", version = "=1.17.9" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 7c3757ceab89bc..015559377f7b9d 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.8" +version = "1.17.9" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.8" } +solana-program = { path = "../../../../program", version = "=1.17.9" } [lib] crate-type = ["cdylib"] From daf37308f25918adec29cfef7b19859482d29e6b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 9 Dec 2023 10:07:35 -0700 Subject: [PATCH 104/213] v1.17: Add metrics for locking the blockhash queue in banking stage (backport of #34382) (#34384) * Add metrics for locking the blockhash queue in banking stage (#34382) (cherry picked from commit 2971e84ec87815adb1e4def95cbcd8d0d96845f5) # Conflicts: # core/src/banking_stage/consume_worker.rs * resolve conflicts --------- Co-authored-by: Justin Starry Co-authored-by: Justin Starry --- core/src/banking_stage/committer.rs | 7 +++---- core/src/banking_stage/consumer.rs | 6 ++++++ core/src/banking_stage/leader_slot_timing_metrics.rs | 3 +++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/src/banking_stage/committer.rs b/core/src/banking_stage/committer.rs index a5e42cbc75f8ec..88b129aae3d203 100644 --- a/core/src/banking_stage/committer.rs +++ b/core/src/banking_stage/committer.rs @@ -15,7 +15,7 @@ use { prioritization_fee_cache::PrioritizationFeeCache, transaction_batch::TransactionBatch, }, - solana_sdk::{pubkey::Pubkey, saturating_add_assign}, + solana_sdk::{hash::Hash, pubkey::Pubkey, saturating_add_assign}, solana_transaction_status::{ token_balances::TransactionTokenBalancesSet, TransactionTokenBalance, }, @@ -65,6 +65,8 @@ impl Committer { batch: &TransactionBatch, loaded_transactions: &mut [TransactionLoadResult], execution_results: Vec, + last_blockhash: Hash, + lamports_per_signature: u64, starting_transaction_index: Option, bank: &Arc, pre_balance_info: &mut PreBalanceInfo, @@ -74,9 +76,6 @@ impl Committer { executed_non_vote_transactions_count: usize, executed_with_successful_result_count: usize, ) -> (u64, Vec) { - let (last_blockhash, lamports_per_signature) = - bank.last_blockhash_and_lamports_per_signature(); - let executed_transactions = execution_results .iter() .zip(batch.sanitized_transactions()) diff --git a/core/src/banking_stage/consumer.rs b/core/src/banking_stage/consumer.rs index ba915bc767efc8..ebdfeeacf07140 100644 --- a/core/src/banking_stage/consumer.rs +++ b/core/src/banking_stage/consumer.rs @@ -587,6 +587,10 @@ impl Consumer { let (freeze_lock, freeze_lock_us) = measure_us!(bank.freeze_lock()); execute_and_commit_timings.freeze_lock_us = freeze_lock_us; + let ((last_blockhash, lamports_per_signature), last_blockhash_us) = + measure_us!(bank.last_blockhash_and_lamports_per_signature()); + execute_and_commit_timings.last_blockhash_us = last_blockhash_us; + let (record_transactions_summary, record_us) = measure_us!(self .transaction_recorder .record_transactions(bank.slot(), executed_transactions)); @@ -623,6 +627,8 @@ impl Consumer { batch, &mut loaded_transactions, execution_results, + last_blockhash, + lamports_per_signature, starting_transaction_index, bank, &mut pre_balance_info, diff --git a/core/src/banking_stage/leader_slot_timing_metrics.rs b/core/src/banking_stage/leader_slot_timing_metrics.rs index 543b80b4a48897..7727b6cf6c6563 100644 --- a/core/src/banking_stage/leader_slot_timing_metrics.rs +++ b/core/src/banking_stage/leader_slot_timing_metrics.rs @@ -10,6 +10,7 @@ pub struct LeaderExecuteAndCommitTimings { pub collect_balances_us: u64, pub load_execute_us: u64, pub freeze_lock_us: u64, + pub last_blockhash_us: u64, pub record_us: u64, pub commit_us: u64, pub find_and_send_votes_us: u64, @@ -22,6 +23,7 @@ impl LeaderExecuteAndCommitTimings { saturating_add_assign!(self.collect_balances_us, other.collect_balances_us); saturating_add_assign!(self.load_execute_us, other.load_execute_us); saturating_add_assign!(self.freeze_lock_us, other.freeze_lock_us); + saturating_add_assign!(self.last_blockhash_us, other.last_blockhash_us); saturating_add_assign!(self.record_us, other.record_us); saturating_add_assign!(self.commit_us, other.commit_us); saturating_add_assign!(self.find_and_send_votes_us, other.find_and_send_votes_us); @@ -38,6 +40,7 @@ impl LeaderExecuteAndCommitTimings { ("collect_balances_us", self.collect_balances_us as i64, i64), ("load_execute_us", self.load_execute_us as i64, i64), ("freeze_lock_us", self.freeze_lock_us as i64, i64), + ("last_blockhash_us", self.last_blockhash_us as i64, i64), ("record_us", self.record_us as i64, i64), ("commit_us", self.commit_us as i64, i64), ( From b9fc9486dbeee38d2b273a9fe49c0953532ef844 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sun, 10 Dec 2023 20:56:48 +0000 Subject: [PATCH 105/213] v1.17: ci: add macos clippy test (backport of #34272) (#34388) * ci: add macos clippy test (#34272) * ci: add clippy test for macos and windows * ci: remove windows from clippy test * ci: cancel cargo clippy on Github Actions when new commits comming * ci: set -e for .github/scripts/cargo-clippy-before-script.sh (cherry picked from commit 4832b4ecec57f9e87a640011b30bc5cc07921721) * scripts/cargo-clippy.sh: Extract our non-trivial cargo clippy command (manual backport of #33982) --------- Co-authored-by: Yihau Chen Co-authored-by: yihau --- .github/scripts/cargo-clippy-before-script.sh | 17 ++++++ .github/workflows/cargo.yml | 50 +++++++++++++++ ci/test-checks.sh | 30 +-------- scripts/cargo-clippy.sh | 61 +++++++++++++++++++ 4 files changed, 129 insertions(+), 29 deletions(-) create mode 100755 .github/scripts/cargo-clippy-before-script.sh create mode 100644 .github/workflows/cargo.yml create mode 100755 scripts/cargo-clippy.sh diff --git a/.github/scripts/cargo-clippy-before-script.sh b/.github/scripts/cargo-clippy-before-script.sh new file mode 100755 index 00000000000000..b9426203aa6ffc --- /dev/null +++ b/.github/scripts/cargo-clippy-before-script.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -e + +os_name="$1" + +case "$os_name" in +"Windows") + ;; +"macOS") + brew install protobuf + ;; +"Linux") ;; +*) + echo "Unknown Operating System" + ;; +esac diff --git a/.github/workflows/cargo.yml b/.github/workflows/cargo.yml new file mode 100644 index 00000000000000..54566f705cb160 --- /dev/null +++ b/.github/workflows/cargo.yml @@ -0,0 +1,50 @@ +name: Cargo + +on: + push: + branches: + - master + - v[0-9]+.[0-9]+ + pull_request: + branches: + - master + - v[0-9]+.[0-9]+ + paths: + - "**.rs" + - "**/Cargo.toml" + - "**/Cargo.lock" + - ".github/scripts/cargo-clippy-before-script.sh" + - ".github/workflows/cargo.yml" + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + SHELL: /bin/bash + SCCACHE_GHA_ENABLED: "true" + RUSTC_WRAPPER: "sccache" + +jobs: + clippy: + strategy: + matrix: + os: + - macos-latest + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + + - uses: mozilla-actions/sccache-action@v0.0.3 + with: + version: "v0.5.4" + + - shell: bash + run: .github/scripts/cargo-clippy-before-script.sh ${{ runner.os }} + + - shell: bash + run: | + source ci/rust-version.sh all + rustup component add clippy --toolchain "$rust_stable" + rustup component add clippy --toolchain "$rust_nightly" + scripts/cargo-clippy.sh diff --git a/ci/test-checks.sh b/ci/test-checks.sh index 0f037cb3478ded..e29ed1faae0454 100755 --- a/ci/test-checks.sh +++ b/ci/test-checks.sh @@ -61,35 +61,7 @@ fi _ ci/order-crates-for-publishing.py -nightly_clippy_allows=(--allow=clippy::redundant_clone) - -# Use nightly clippy, as frozen-abi proc-macro generates a lot of code across -# various crates in this whole monorepo (frozen-abi is enabled only under nightly -# due to the use of unstable rust feature). Likewise, frozen-abi(-macro) crates' -# unit tests are only compiled under nightly. -# Similarly, nightly is desired to run clippy over all of bench files because -# the bench itself isn't stabilized yet... -# ref: https://github.com/rust-lang/rust/issues/66287 -_ scripts/cargo-for-all-lock-files.sh -- "+${rust_nightly}" clippy --workspace --all-targets --features dummy-for-ci-check -- \ - --deny=warnings \ - --deny=clippy::default_trait_access \ - --deny=clippy::arithmetic_side_effects \ - --deny=clippy::manual_let_else \ - --deny=clippy::used_underscore_binding \ - "${nightly_clippy_allows[@]}" - -# temporarily run stable clippy as well to scan the codebase for -# `redundant_clone`s, which is disabled as nightly clippy is buggy: -# https://github.com/solana-labs/solana/issues/31834 -# -# can't use --all-targets: -# error[E0554]: `#![feature]` may not be used on the stable release channel -_ scripts/cargo-for-all-lock-files.sh -- clippy --workspace --tests --bins --examples --features dummy-for-ci-check -- \ - --deny=warnings \ - --deny=clippy::default_trait_access \ - --deny=clippy::arithmetic_side_effects \ - --deny=clippy::manual_let_else \ - --deny=clippy::used_underscore_binding +_ scripts/cargo-clippy.sh if [[ -n $CI ]]; then # exclude from printing "Checking xxx ..." diff --git a/scripts/cargo-clippy.sh b/scripts/cargo-clippy.sh new file mode 100755 index 00000000000000..7ec6c34110133b --- /dev/null +++ b/scripts/cargo-clippy.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +# Runs `cargo clippy` in all individual workspaces in the repository. +# +# We have a number of clippy parameters that we want to enforce across the +# code base. They are defined here. +# +# This script is run by the CI, so if you want to replicate what the CI is +# doing, better run this script, rather than calling `cargo clippy` manually. +# +# TODO It would be nice to provide arguments to narrow clippy checks to a single +# workspace and/or package. To speed up the interactive workflow. + +set -o errexit + +here="$(dirname "$0")" +cargo="$(readlink -f "${here}/../cargo")" + +if [[ -z $cargo ]]; then + echo >&2 "Failed to find cargo. Mac readlink doesn't support -f. Consider switching + to gnu readlink with 'brew install coreutils' and then symlink greadlink as + /usr/local/bin/readlink." + exit 1 +fi + +# shellcheck source=ci/rust-version.sh +source "$here/../ci/rust-version.sh" + +nightly_clippy_allows=(--allow=clippy::redundant_clone) + +# Use nightly clippy, as frozen-abi proc-macro generates a lot of code across +# various crates in this whole monorepo (frozen-abi is enabled only under nightly +# due to the use of unstable rust feature). Likewise, frozen-abi(-macro) crates' +# unit tests are only compiled under nightly. +# Similarly, nightly is desired to run clippy over all of bench files because +# the bench itself isn't stabilized yet... +# ref: https://github.com/rust-lang/rust/issues/66287 +"$here/cargo-for-all-lock-files.sh" -- \ + "+${rust_nightly}" clippy \ + --workspace --all-targets --features dummy-for-ci-check -- \ + --deny=warnings \ + --deny=clippy::default_trait_access \ + --deny=clippy::arithmetic_side_effects \ + --deny=clippy::manual_let_else \ + --deny=clippy::used_underscore_binding \ + "${nightly_clippy_allows[@]}" + +# temporarily run stable clippy as well to scan the codebase for +# `redundant_clone`s, which is disabled as nightly clippy is buggy: +# https://github.com/solana-labs/solana/issues/31834 +# +# can't use --all-targets: +# error[E0554]: `#![feature]` may not be used on the stable release channel +"$here/cargo-for-all-lock-files.sh" -- \ + clippy \ + --workspace --tests --bins --examples --features dummy-for-ci-check -- \ + --deny=warnings \ + --deny=clippy::default_trait_access \ + --deny=clippy::arithmetic_side_effects \ + --deny=clippy::manual_let_else \ + --deny=clippy::used_underscore_binding From 9f51f5d0fc973331a33641c0334cfd87a6431f2e Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sun, 10 Dec 2023 14:57:00 -0600 Subject: [PATCH 106/213] Update version to v1.17.10 (#34394) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 32d96c26725e12..797bd7b2fe3957 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.9" +version = "1.17.10" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.9" +version = "1.17.10" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.9" +version = "1.17.10" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.9" +version = "1.17.10" dependencies = [ "Inflector", "assert_matches", @@ -5123,7 +5123,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 2.33.3", "log", @@ -5137,7 +5137,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 2.33.3", "log", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.9" +version = "1.17.10" dependencies = [ "arrayref", "assert_matches", @@ -5231,7 +5231,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "bytemuck", @@ -5250,7 +5250,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -5261,7 +5261,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5285,7 +5285,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.9" +version = "1.17.10" dependencies = [ "serde", "solana-sdk", @@ -5311,7 +5311,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "crossbeam-channel", @@ -5329,7 +5329,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5340,7 +5340,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bv", "fnv", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -5419,7 +5419,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -5430,7 +5430,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bv", "bytemuck", @@ -5449,7 +5449,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "solana-logger", @@ -5457,7 +5457,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_cmd", "bzip2", @@ -5478,11 +5478,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.9" +version = "1.17.10" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.9" +version = "1.17.10" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5493,7 +5493,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "chrono", @@ -5510,7 +5510,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "chrono", @@ -5528,7 +5528,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.9" +version = "1.17.10" dependencies = [ "anyhow", "dirs-next", @@ -5596,7 +5596,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.9" +version = "1.17.10" dependencies = [ "Inflector", "base64 0.21.4", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-trait", "bincode", @@ -5654,7 +5654,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.9" +version = "1.17.10" dependencies = [ "futures-util", "rand 0.8.5", @@ -5684,7 +5684,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5692,7 +5692,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "chrono", @@ -5705,7 +5705,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-trait", "bincode", @@ -5729,7 +5729,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5812,7 +5812,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.9" +version = "1.17.10" dependencies = [ "lazy_static", "log", @@ -5837,7 +5837,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "clap 3.2.23", @@ -5867,7 +5867,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "console", "indicatif", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5890,7 +5890,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -5912,7 +5912,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "byteorder", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.9" +version = "1.17.10" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5964,7 +5964,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.9" +version = "1.17.10" dependencies = [ "proc-macro2", "quote", @@ -5974,7 +5974,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.9" +version = "1.17.10" dependencies = [ "base64 0.21.4", "bincode", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "solana-accounts-db", @@ -6010,7 +6010,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "solana-sdk", @@ -6020,7 +6020,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bs58", "crossbeam-channel", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -6096,7 +6096,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.9" +version = "1.17.10" dependencies = [ "atty", "bincode", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bs58", "clap 3.2.23", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -6216,7 +6216,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_cmd", "bs58", @@ -6265,7 +6265,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "log", @@ -6277,7 +6277,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.9" +version = "1.17.10" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.9" +version = "1.17.10" dependencies = [ "env_logger", "lazy_static", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "solana-sdk", @@ -6345,11 +6345,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.9" +version = "1.17.10" [[package]] name = "solana-merkle-root-bench" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 2.33.3", "log", @@ -6362,7 +6362,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.9" +version = "1.17.10" dependencies = [ "fast-math", "hex", @@ -6371,7 +6371,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.9" +version = "1.17.10" dependencies = [ "crossbeam-channel", "env_logger", @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "clap 3.2.23", @@ -6418,7 +6418,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "reqwest", @@ -6428,7 +6428,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.9" +version = "1.17.10" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6459,7 +6459,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -6480,7 +6480,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 3.2.23", "log", @@ -6495,7 +6495,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "anyhow", "ark-bn254", @@ -6552,7 +6552,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6581,7 +6581,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "async-trait", @@ -6610,7 +6610,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "anyhow", "crossbeam-channel", @@ -6634,7 +6634,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-mutex", "async-trait", @@ -6662,7 +6662,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.9" +version = "1.17.10" dependencies = [ "lazy_static", "num_cpus", @@ -6670,7 +6670,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "console", @@ -6689,7 +6689,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.9" +version = "1.17.10" dependencies = [ "base64 0.21.4", "bincode", @@ -6748,7 +6748,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "async-trait", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.9" +version = "1.17.10" dependencies = [ "base64 0.21.4", "bs58", @@ -6797,7 +6797,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "anyhow", "clap 2.33.3", @@ -6814,7 +6814,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "bs58", @@ -6841,7 +6841,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.9" +version = "1.17.10" dependencies = [ "arrayref", "assert_matches", @@ -6924,7 +6924,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.9" +version = "1.17.10" dependencies = [ "anyhow", "assert_matches", @@ -6982,7 +6982,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bs58", "proc-macro2", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.9" +version = "1.17.10" dependencies = [ "crossbeam-channel", "log", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7024,7 +7024,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -7041,7 +7041,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.9" +version = "1.17.10" dependencies = [ "backoff", "bincode", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "bs58", @@ -7089,7 +7089,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 2.33.3", "log", @@ -7101,7 +7101,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "async-channel", @@ -7133,7 +7133,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -7147,7 +7147,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.9" +version = "1.17.10" dependencies = [ "base64 0.21.4", "bincode", @@ -7177,7 +7177,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -7224,7 +7224,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-trait", "bincode", @@ -7246,7 +7246,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "clap 2.33.3", @@ -7273,7 +7273,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.9" +version = "1.17.10" dependencies = [ "Inflector", "base64 0.21.4", @@ -7296,7 +7296,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -7333,7 +7333,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-trait", "solana-connection-cache", @@ -7346,7 +7346,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.9" +version = "1.17.10" dependencies = [ "serde_json", "solana-metrics", @@ -7354,7 +7354,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.9" +version = "1.17.10" dependencies = [ "chrono", "clap 2.33.3", @@ -7418,7 +7418,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "rustc_version 0.4.0", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "crossbeam-channel", @@ -7451,7 +7451,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -7474,7 +7474,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 2.33.3", "humantime", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bs58", "clap 3.2.23", @@ -7512,7 +7512,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bytemuck", "criterion", @@ -7526,7 +7526,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7538,7 +7538,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.9" +version = "1.17.10" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index e443b84cd5cbca..dcadfac157ab3f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.9" +version = "1.17.10" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.9" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.9" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.9" } -solana-banks-client = { path = "banks-client", version = "=1.17.9" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.9" } -solana-banks-server = { path = "banks-server", version = "=1.17.9" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.9" } -solana-bloom = { path = "bloom", version = "=1.17.9" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.9" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.9" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.9", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.9" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.9" } -solana-cli = { path = "cli", version = "=1.17.9" } -solana-cli-config = { path = "cli-config", version = "=1.17.9" } -solana-cli-output = { path = "cli-output", version = "=1.17.9" } -solana-client = { path = "client", version = "=1.17.9" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.9" } -solana-config-program = { path = "programs/config", version = "=1.17.9" } -solana-core = { path = "core", version = "=1.17.9" } -solana-cost-model = { path = "cost-model", version = "=1.17.9" } -solana-download-utils = { path = "download-utils", version = "=1.17.9" } -solana-entry = { path = "entry", version = "=1.17.9" } -solana-faucet = { path = "faucet", version = "=1.17.9" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.9" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.9" } -solana-genesis = { path = "genesis", version = "=1.17.9" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.9" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.9" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.9" } -solana-gossip = { path = "gossip", version = "=1.17.9" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.9" } -solana-ledger = { path = "ledger", version = "=1.17.9" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.9" } -solana-logger = { path = "logger", version = "=1.17.9" } -solana-measure = { path = "measure", version = "=1.17.9" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.9" } -solana-metrics = { path = "metrics", version = "=1.17.9" } -solana-net-utils = { path = "net-utils", version = "=1.17.9" } -solana-notifier = { path = "notifier", version = "=1.17.9" } -solana-perf = { path = "perf", version = "=1.17.9" } -solana-poh = { path = "poh", version = "=1.17.9" } -solana-program = { path = "sdk/program", version = "=1.17.9" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.9" } -solana-program-test = { path = "program-test", version = "=1.17.9" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.9" } -solana-quic-client = { path = "quic-client", version = "=1.17.9" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.9" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.9", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.9" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.9", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.9" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.9" } -solana-runtime = { path = "runtime", version = "=1.17.9" } -solana-sdk = { path = "sdk", version = "=1.17.9" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.9" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.9" } -solana-stake-program = { path = "programs/stake", version = "=1.17.9" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.9" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.9" } -solana-streamer = { path = "streamer", version = "=1.17.9" } -solana-system-program = { path = "programs/system", version = "=1.17.9" } -solana-test-validator = { path = "test-validator", version = "=1.17.9" } -solana-thin-client = { path = "thin-client", version = "=1.17.9" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.9", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.9" } -solana-turbine = { path = "turbine", version = "=1.17.9" } -solana-udp-client = { path = "udp-client", version = "=1.17.9" } -solana-version = { path = "version", version = "=1.17.9" } -solana-vote = { path = "vote", version = "=1.17.9" } -solana-vote-program = { path = "programs/vote", version = "=1.17.9" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.9" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.9" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.9" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.10" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.10" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.10" } +solana-banks-client = { path = "banks-client", version = "=1.17.10" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.10" } +solana-banks-server = { path = "banks-server", version = "=1.17.10" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.10" } +solana-bloom = { path = "bloom", version = "=1.17.10" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.10" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.10" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.10", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.10" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.10" } +solana-cli = { path = "cli", version = "=1.17.10" } +solana-cli-config = { path = "cli-config", version = "=1.17.10" } +solana-cli-output = { path = "cli-output", version = "=1.17.10" } +solana-client = { path = "client", version = "=1.17.10" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.10" } +solana-config-program = { path = "programs/config", version = "=1.17.10" } +solana-core = { path = "core", version = "=1.17.10" } +solana-cost-model = { path = "cost-model", version = "=1.17.10" } +solana-download-utils = { path = "download-utils", version = "=1.17.10" } +solana-entry = { path = "entry", version = "=1.17.10" } +solana-faucet = { path = "faucet", version = "=1.17.10" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.10" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.10" } +solana-genesis = { path = "genesis", version = "=1.17.10" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.10" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.10" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.10" } +solana-gossip = { path = "gossip", version = "=1.17.10" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.10" } +solana-ledger = { path = "ledger", version = "=1.17.10" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.10" } +solana-logger = { path = "logger", version = "=1.17.10" } +solana-measure = { path = "measure", version = "=1.17.10" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.10" } +solana-metrics = { path = "metrics", version = "=1.17.10" } +solana-net-utils = { path = "net-utils", version = "=1.17.10" } +solana-notifier = { path = "notifier", version = "=1.17.10" } +solana-perf = { path = "perf", version = "=1.17.10" } +solana-poh = { path = "poh", version = "=1.17.10" } +solana-program = { path = "sdk/program", version = "=1.17.10" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.10" } +solana-program-test = { path = "program-test", version = "=1.17.10" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.10" } +solana-quic-client = { path = "quic-client", version = "=1.17.10" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.10" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.10", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.10" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.10", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.10" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.10" } +solana-runtime = { path = "runtime", version = "=1.17.10" } +solana-sdk = { path = "sdk", version = "=1.17.10" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.10" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.10" } +solana-stake-program = { path = "programs/stake", version = "=1.17.10" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.10" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.10" } +solana-streamer = { path = "streamer", version = "=1.17.10" } +solana-system-program = { path = "programs/system", version = "=1.17.10" } +solana-test-validator = { path = "test-validator", version = "=1.17.10" } +solana-thin-client = { path = "thin-client", version = "=1.17.10" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.10", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.10" } +solana-turbine = { path = "turbine", version = "=1.17.10" } +solana-udp-client = { path = "udp-client", version = "=1.17.10" } +solana-version = { path = "version", version = "=1.17.10" } +solana-vote = { path = "vote", version = "=1.17.10" } +solana-vote-program = { path = "programs/vote", version = "=1.17.10" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.10" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.10" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.10" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 2e1d16881192f2..a20909d96ba7ca 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4447,7 +4447,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.9" +version = "1.17.10" dependencies = [ "Inflector", "base64 0.21.4", @@ -4469,7 +4469,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.9" +version = "1.17.10" dependencies = [ "arrayref", "bincode", @@ -4526,7 +4526,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "bytemuck", @@ -4545,7 +4545,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4560,7 +4560,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.9" +version = "1.17.10" dependencies = [ "serde", "solana-sdk", @@ -4569,7 +4569,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "crossbeam-channel", @@ -4587,7 +4587,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bv", "fnv", @@ -4604,7 +4604,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4621,7 +4621,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.9" +version = "1.17.10" dependencies = [ "array-bytes", "serde", @@ -4631,7 +4631,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bv", "bytemuck", @@ -4647,7 +4647,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "chrono", "clap 2.33.3", @@ -4662,7 +4662,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.9" +version = "1.17.10" dependencies = [ "dirs-next", "lazy_static", @@ -4676,7 +4676,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.9" +version = "1.17.10" dependencies = [ "Inflector", "base64 0.21.4", @@ -4701,7 +4701,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-trait", "bincode", @@ -4732,7 +4732,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4740,7 +4740,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "chrono", @@ -4752,7 +4752,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-trait", "bincode", @@ -4772,7 +4772,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.9" +version = "1.17.10" dependencies = [ "base64 0.21.4", "bincode", @@ -4844,7 +4844,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.9" +version = "1.17.10" dependencies = [ "lazy_static", "log", @@ -4866,7 +4866,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "console", "indicatif", @@ -4878,7 +4878,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "crossbeam-channel", @@ -4898,7 +4898,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4920,7 +4920,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.9" +version = "1.17.10" dependencies = [ "ahash 0.8.3", "blake3", @@ -4948,7 +4948,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.9" +version = "1.17.10" dependencies = [ "proc-macro2", "quote", @@ -4958,7 +4958,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "solana-accounts-db", @@ -4969,7 +4969,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "solana-sdk", @@ -4979,7 +4979,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bs58", "crossbeam-channel", @@ -5004,7 +5004,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -5052,7 +5052,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "solana-measure", @@ -5127,7 +5127,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.9" +version = "1.17.10" dependencies = [ "env_logger", "lazy_static", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "solana-sdk", @@ -5144,7 +5144,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.9" +version = "1.17.10" dependencies = [ "fast-math", "solana-program", @@ -5152,7 +5152,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.9" +version = "1.17.10" dependencies = [ "crossbeam-channel", "gethostname", @@ -5165,7 +5165,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "clap 3.1.6", @@ -5185,7 +5185,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.9" +version = "1.17.10" dependencies = [ "ahash 0.8.3", "bincode", @@ -5212,7 +5212,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.9" +version = "1.17.10" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5228,7 +5228,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "ark-bn254", "ark-ec", @@ -5280,7 +5280,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.9" +version = "1.17.10" dependencies = [ "base64 0.21.4", "bincode", @@ -5306,7 +5306,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "async-trait", @@ -5334,7 +5334,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "crossbeam-channel", "futures-util", @@ -5357,7 +5357,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-mutex", "async-trait", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.9" +version = "1.17.10" dependencies = [ "lazy_static", "num_cpus", @@ -5390,7 +5390,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.9" +version = "1.17.10" dependencies = [ "console", "dialoguer", @@ -5407,7 +5407,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.9" +version = "1.17.10" dependencies = [ "base64 0.21.4", "bincode", @@ -5462,7 +5462,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-trait", "base64 0.21.4", @@ -5486,7 +5486,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.9" +version = "1.17.10" dependencies = [ "base64 0.21.4", "bs58", @@ -5506,7 +5506,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.9" +version = "1.17.10" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5517,7 +5517,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.9" +version = "1.17.10" dependencies = [ "arrayref", "base64 0.21.4", @@ -5592,7 +5592,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5621,7 +5621,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5629,21 +5629,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.9" +version = "1.17.10" dependencies = [ "array-bytes", "solana-program", @@ -5651,7 +5651,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.9" +version = "1.17.10" dependencies = [ "array-bytes", "solana-program", @@ -5659,21 +5659,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5681,14 +5681,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.9" +version = "1.17.10" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5696,21 +5696,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.9" +version = "1.17.10" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5720,42 +5720,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.9" +version = "1.17.10" dependencies = [ "rustversion", "solana-program", @@ -5765,49 +5765,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5815,14 +5815,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-program-runtime", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5840,21 +5840,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5862,14 +5862,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.9" +version = "1.17.10" dependencies = [ "array-bytes", "solana-program", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.9" +version = "1.17.10" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5886,14 +5886,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-program-runtime", @@ -5911,21 +5911,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-program-runtime", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.9" +version = "1.17.10" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5943,7 +5943,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.9" +version = "1.17.10" dependencies = [ "blake3", "solana-program", @@ -5951,21 +5951,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-logger", "solana-program", @@ -5976,21 +5976,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", "solana-program-runtime", @@ -6000,21 +6000,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.9" +version = "1.17.10" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.9" +version = "1.17.10" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6066,7 +6066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bs58", "proc-macro2", @@ -6077,7 +6077,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.9" +version = "1.17.10" dependencies = [ "crossbeam-channel", "log", @@ -6091,7 +6091,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "log", @@ -6104,7 +6104,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.9" +version = "1.17.10" dependencies = [ "backoff", "bincode", @@ -6136,7 +6136,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "bs58", @@ -6151,7 +6151,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-channel", "bytes", @@ -6181,7 +6181,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "log", @@ -6193,7 +6193,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.9" +version = "1.17.10" dependencies = [ "base64 0.21.4", "bincode", @@ -6223,7 +6223,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "log", @@ -6236,7 +6236,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-trait", "bincode", @@ -6258,7 +6258,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.9" +version = "1.17.10" dependencies = [ "Inflector", "base64 0.21.4", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "bytes", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.9" +version = "1.17.10" dependencies = [ "async-trait", "solana-connection-cache", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.9" +version = "1.17.10" dependencies = [ "chrono", "clap 2.33.3", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.9" +version = "1.17.10" dependencies = [ "log", "rustc_version", @@ -6405,7 +6405,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.9" +version = "1.17.10" dependencies = [ "crossbeam-channel", "itertools", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bincode", "log", @@ -6442,7 +6442,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.9" +version = "1.17.10" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6454,7 +6454,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.9" +version = "1.17.10" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 992e86fd4dfc32..55dccf53769678 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.9" +version = "1.17.10" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.9" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.9" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.9" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.9" } -solana-ledger = { path = "../../ledger", version = "=1.17.9" } -solana-logger = { path = "../../logger", version = "=1.17.9" } -solana-measure = { path = "../../measure", version = "=1.17.9" } -solana-program = { path = "../../sdk/program", version = "=1.17.9" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.9" } -solana-program-test = { path = "../../program-test", version = "=1.17.9" } -solana-runtime = { path = "../../runtime", version = "=1.17.9" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.9" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.9" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.9", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.9" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.9" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.9" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.9", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.9" } -solana-sdk = { path = "../../sdk", version = "=1.17.9" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.9" } -solana-validator = { path = "../../validator", version = "=1.17.9" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.9" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.10" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.10" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.10" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.10" } +solana-ledger = { path = "../../ledger", version = "=1.17.10" } +solana-logger = { path = "../../logger", version = "=1.17.10" } +solana-measure = { path = "../../measure", version = "=1.17.10" } +solana-program = { path = "../../sdk/program", version = "=1.17.10" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.10" } +solana-program-test = { path = "../../program-test", version = "=1.17.10" } +solana-runtime = { path = "../../runtime", version = "=1.17.10" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.10" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.10" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.10", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.10" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.10" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.10" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.10", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.10" } +solana-sdk = { path = "../../sdk", version = "=1.17.10" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.10" } +solana-validator = { path = "../../validator", version = "=1.17.10" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.10" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 0eeb33d1af7da6..b2f498728d8d4c 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.9" +version = "1.17.10" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.9" } +solana-program = { path = "../../../../program", version = "=1.17.10" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 015559377f7b9d..c5d00a26b2042b 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.9" +version = "1.17.10" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.9" } +solana-program = { path = "../../../../program", version = "=1.17.10" } [lib] crate-type = ["cdylib"] From 222ca9bc6552597f8434d992aa446103ff9d43f7 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 15:21:57 +0100 Subject: [PATCH 107/213] v1.17: Cleanup - program runtime (backport of #34318) (#34413) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cleanup - program runtime (#34318) * Removes retain() from prune_by_deployment_slot() as that is covered in remove_programs_with_no_entries() already. * Removes remove_programs_with_no_entries() from sort_and_unload(). * Fixes ix_usage_counter in LoadedProgram::to_unloaded(). * Fixes doc comment of LoadedProgram::ix_usage_counter. * Removes unused num_total_programs from test_eviction(). * Replaces .as_ref() in lambda with std::option::Option::as_ref. * Replaces .for_each() with a for-loop. * Uses .retain() instead of iter().filter().cloned().collect(). (cherry picked from commit cf0c52c207b4ac2bd65951e1c517d7f11791da69) Co-authored-by: Alexander Meißner --- program-runtime/src/invoke_context.rs | 2 +- program-runtime/src/loaded_programs.rs | 24 +++++++----------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/program-runtime/src/invoke_context.rs b/program-runtime/src/invoke_context.rs index 9a270ed2d19617..2b1c009b0cf499 100644 --- a/program-runtime/src/invoke_context.rs +++ b/program-runtime/src/invoke_context.rs @@ -902,7 +902,7 @@ impl<'a> InvokeContext<'a> { pub fn get_syscall_context(&self) -> Result<&SyscallContext, InstructionError> { self.syscall_context .last() - .and_then(|syscall_context| syscall_context.as_ref()) + .and_then(std::option::Option::as_ref) .ok_or(InstructionError::CallDepth) } diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 297ba4aba308d5..77e4c2b228923b 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -139,7 +139,7 @@ pub struct LoadedProgram { pub maybe_expiration_slot: Option, /// How often this entry was used by a transaction pub tx_usage_counter: AtomicU64, - /// How often this entry was used by a transaction + /// How often this entry was used by an instruction pub ix_usage_counter: AtomicU64, } @@ -371,7 +371,7 @@ impl LoadedProgram { effective_slot: self.effective_slot, maybe_expiration_slot: self.maybe_expiration_slot, tx_usage_counter: AtomicU64::new(self.tx_usage_counter.load(Ordering::Relaxed)), - ix_usage_counter: AtomicU64::new(self.tx_usage_counter.load(Ordering::Relaxed)), + ix_usage_counter: AtomicU64::new(self.ix_usage_counter.load(Ordering::Relaxed)), }) } @@ -639,14 +639,9 @@ impl LoadedPrograms { } pub fn prune_by_deployment_slot(&mut self, slot: Slot) { - self.entries.retain(|_key, second_level| { - *second_level = second_level - .iter() - .filter(|entry| entry.deployment_slot != slot) - .cloned() - .collect(); - !second_level.is_empty() - }); + for second_level in self.entries.values_mut() { + second_level.retain(|entry| entry.deployment_slot != slot); + } self.remove_programs_with_no_entries(); } @@ -914,7 +909,6 @@ impl LoadedPrograms { .len() .saturating_sub(shrink_to.apply_to(MAX_LOADED_ENTRY_COUNT)); self.unload_program_entries(sorted_candidates.iter().take(num_to_unload)); - self.remove_programs_with_no_entries(); } /// Removes all the entries at the given keys, if they exist @@ -926,7 +920,7 @@ impl LoadedPrograms { fn unload_program(&mut self, id: &Pubkey) { if let Some(entries) = self.entries.get_mut(id) { - entries.iter_mut().for_each(|entry| { + for entry in entries.iter_mut() { if let Some(unloaded) = entry.to_unloaded() { *entry = Arc::new(unloaded); self.stats @@ -935,7 +929,7 @@ impl LoadedPrograms { .and_modify(|c| saturating_add_assign!(*c, 1)) .or_insert(1); } - }); + } } } @@ -1128,7 +1122,6 @@ mod tests { #[test] fn test_eviction() { let mut programs = vec![]; - let mut num_total_programs: usize = 0; let mut cache = new_mock_cache::(); @@ -1148,7 +1141,6 @@ mod tests { AtomicU64::new(usage_counter), ), ); - num_total_programs += 1; programs.push((program1, *deployment_slot, usage_counter)); }); @@ -1182,7 +1174,6 @@ mod tests { AtomicU64::new(usage_counter), ), ); - num_total_programs += 1; programs.push((program2, *deployment_slot, usage_counter)); }); @@ -1215,7 +1206,6 @@ mod tests { AtomicU64::new(usage_counter), ), ); - num_total_programs += 1; programs.push((program3, *deployment_slot, usage_counter)); }); From 0b6a172a8217e1e630fdabf4c7fb7dd997d4ea3f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 22:42:33 +0100 Subject: [PATCH 108/213] v1.17: Fix - Uses `fetch_add()` to accumulate usage counters in `LoadedPrograms` (backport of #34319) (#34348) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix - Uses `fetch_add()` to accumulate usage counters in `LoadedPrograms` (#34319) Uses fetch_add() to accumulate usage counters. (cherry picked from commit f70d5481bc616c3d747a28b055f61a3035a137da) Co-authored-by: Alexander Meißner --- program-runtime/src/loaded_programs.rs | 40 ++++++++++++-------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 77e4c2b228923b..b47729935075ac 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -600,13 +600,11 @@ impl LoadedPrograms { if matches!(existing.program, LoadedProgramType::Unloaded(_)) { // The unloaded program is getting reloaded // Copy over the usage counter to the new entry - let mut usage_count = existing.tx_usage_counter.load(Ordering::Relaxed); - saturating_add_assign!( - usage_count, - entry.tx_usage_counter.load(Ordering::Relaxed) + entry.tx_usage_counter.fetch_add( + existing.tx_usage_counter.load(Ordering::Relaxed), + Ordering::Relaxed, ); - entry.tx_usage_counter.store(usage_count, Ordering::Relaxed); - entry.ix_usage_counter.store( + entry.ix_usage_counter.fetch_add( existing.ix_usage_counter.load(Ordering::Relaxed), Ordering::Relaxed, ); @@ -786,7 +784,7 @@ impl LoadedPrograms { let mut unloaded = Vec::new(); let current_slot = working_slot.current_slot(); let found = keys - .filter_map(|(key, (match_criteria, count))| { + .filter_map(|(key, (match_criteria, usage_count))| { if let Some(second_level) = self.entries.get(&key) { for entry in second_level.iter().rev() { let is_ancestor = if let Some(fork_graph) = &self.fork_graph { @@ -810,41 +808,41 @@ impl LoadedPrograms { { if current_slot >= entry.effective_slot { if !Self::is_entry_usable(entry, current_slot, &match_criteria) { - missing.push((key, count)); + missing.push((key, usage_count)); return None; } if !Self::matches_environment(entry, environments) { - missing.push((key, count)); + missing.push((key, usage_count)); return None; } if let LoadedProgramType::Unloaded(_environment) = &entry.program { - unloaded.push((key, count)); + unloaded.push((key, usage_count)); return None; } - let mut usage_count = - entry.tx_usage_counter.load(Ordering::Relaxed); - saturating_add_assign!(usage_count, count); - entry.tx_usage_counter.store(usage_count, Ordering::Relaxed); + entry + .tx_usage_counter + .fetch_add(usage_count, Ordering::Relaxed); return Some((key, entry.clone())); } else if entry.is_implicit_delay_visibility_tombstone(current_slot) { // Found a program entry on the current fork, but it's not effective // yet. It indicates that the program has delayed visibility. Return // the tombstone to reflect that. - return Some(( - key, - Arc::new(LoadedProgram::new_tombstone( - entry.deployment_slot, - LoadedProgramType::DelayVisibility, - )), + let entry_to_return = Arc::new(LoadedProgram::new_tombstone( + entry.deployment_slot, + LoadedProgramType::DelayVisibility, )); + entry_to_return + .tx_usage_counter + .fetch_add(usage_count, Ordering::Relaxed); + return Some((key, entry_to_return)); } } } } - missing.push((key, count)); + missing.push((key, usage_count)); None }) .collect::>>(); From 8b2c1a547d283bcd813a039982e3f8b18f37c0bd Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 10:50:41 -0500 Subject: [PATCH 109/213] v1.17: changelog: Adds --use-snapshot-archives-at-startup to v1.17.0 (backport of #34401) (#34438) changelog: Adds --use-snapshot-archives-at-startup to v1.17.0 (#34401) (cherry picked from commit 501458a7daa023eb2c64a18d54ad618d4305af68) Co-authored-by: Brooks --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cba94c0dcc823..a5c7410ba555cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and follows a [Backwards Compatibility Policy](https://docs.solana.com/developin ## [1.17.0] * Changes * Added a changelog. + * Added `--use-snapshot-archives-at-startup` for faster validator restarts * Upgrade Notes ## Adding to this Changelog From 928e384393e6414d564d62c3e4c9e9f133a8149e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 08:55:05 -0700 Subject: [PATCH 110/213] v1.17: Patch tokio to vendored version (backport of #34240) (#34435) * Patch tokio to vendored version (#34240) * Patch tokio to vendored version * Fix typo (cherry picked from commit aaa48ec8dbac3a1c15fd7ac26b5de87c3cefa47c) # Conflicts: # Cargo.toml * Fix conflict --------- Co-authored-by: Tyera --- Cargo.lock | 6 ++---- Cargo.toml | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 797bd7b2fe3957..c81ad40c3b4465 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8214,8 +8214,7 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" version = "1.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +source = "git+https://github.com/solana-labs/solana-tokio.git?rev=7cf47705faacf7bf0e43e4131a5377b3291fce21#7cf47705faacf7bf0e43e4131a5377b3291fce21" dependencies = [ "autocfg", "backtrace", @@ -8244,8 +8243,7 @@ dependencies = [ [[package]] name = "tokio-macros" version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +source = "git+https://github.com/solana-labs/solana-tokio.git?rev=7cf47705faacf7bf0e43e4131a5377b3291fce21#7cf47705faacf7bf0e43e4131a5377b3291fce21" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index dcadfac157ab3f..554db8b768d87e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -396,6 +396,7 @@ tempfile = "3.8.0" test-case = "3.2.1" thiserror = "1.0.49" tiny-bip39 = "0.8.2" +# Update solana-tokio patch below when updating this version tokio = "1.29.1" tokio-serde = "0.8" tokio-stream = "0.1.14" @@ -445,3 +446,21 @@ crossbeam-epoch = { git = "https://github.com/solana-labs/crossbeam", rev = "fd2 # overrides in sync. solana-program = { path = "sdk/program" } solana-zk-token-sdk = { path = "zk-token-sdk" } +# +# Solana RPC nodes experience stalls when running with `tokio` containing this +# commit: +# https://github.com/tokio-rs/tokio/commit/4eed411519783ef6f58cbf74f886f91142b5cfa6 +# +# Tokio maintainers believe performance degradation is due to application bugs: +# https://github.com/tokio-rs/tokio/issues/4873#issuecomment-1198277677 +# +# This may indeed be true of the code in this monorepo, but we haven't yet +# identified the bug or a way to fix. As a stopgap, this patches `tokio` to the +# tagged version specified above with commit `4eed411` reverted. +# +# Comparison: +# https://github.com/tokio-rs/tokio/compare/tokio-1.29.1...solana-labs:solana-tokio:tokio-1.29.1-revert-4eed411 +# +[patch.crates-io.tokio] +git = "https://github.com/solana-labs/solana-tokio.git" +rev = "7cf47705faacf7bf0e43e4131a5377b3291fce21" From 28e8af4aa3594d686be53d08f00f47264d0adb81 Mon Sep 17 00:00:00 2001 From: steviez Date: Wed, 13 Dec 2023 19:23:07 -0600 Subject: [PATCH 111/213] V1.17.11 version bump (#34451) * Update version to v1.17.11 * Undo hashbrown version changes --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c81ad40c3b4465..e52ffd290b2151 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.10" +version = "1.17.11" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.10" +version = "1.17.11" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.10" +version = "1.17.11" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.10" +version = "1.17.11" dependencies = [ "Inflector", "assert_matches", @@ -5123,7 +5123,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 2.33.3", "log", @@ -5137,7 +5137,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 2.33.3", "log", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.10" +version = "1.17.11" dependencies = [ "arrayref", "assert_matches", @@ -5231,7 +5231,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "bytemuck", @@ -5250,7 +5250,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -5261,7 +5261,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5285,7 +5285,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.10" +version = "1.17.11" dependencies = [ "serde", "solana-sdk", @@ -5311,7 +5311,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "crossbeam-channel", @@ -5329,7 +5329,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5340,7 +5340,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bv", "fnv", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -5419,7 +5419,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -5430,7 +5430,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bv", "bytemuck", @@ -5449,7 +5449,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "solana-logger", @@ -5457,7 +5457,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_cmd", "bzip2", @@ -5478,11 +5478,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.10" +version = "1.17.11" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.10" +version = "1.17.11" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5493,7 +5493,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "chrono", @@ -5510,7 +5510,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "chrono", @@ -5528,7 +5528,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.10" +version = "1.17.11" dependencies = [ "anyhow", "dirs-next", @@ -5596,7 +5596,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.10" +version = "1.17.11" dependencies = [ "Inflector", "base64 0.21.4", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-trait", "bincode", @@ -5654,7 +5654,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.10" +version = "1.17.11" dependencies = [ "futures-util", "rand 0.8.5", @@ -5684,7 +5684,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5692,7 +5692,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "chrono", @@ -5705,7 +5705,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-trait", "bincode", @@ -5729,7 +5729,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5812,7 +5812,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.10" +version = "1.17.11" dependencies = [ "lazy_static", "log", @@ -5837,7 +5837,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "clap 3.2.23", @@ -5867,7 +5867,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "console", "indicatif", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5890,7 +5890,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -5912,7 +5912,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "byteorder", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.10" +version = "1.17.11" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5964,7 +5964,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.10" +version = "1.17.11" dependencies = [ "proc-macro2", "quote", @@ -5974,7 +5974,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.10" +version = "1.17.11" dependencies = [ "base64 0.21.4", "bincode", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "solana-accounts-db", @@ -6010,7 +6010,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "solana-sdk", @@ -6020,7 +6020,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bs58", "crossbeam-channel", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -6096,7 +6096,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.10" +version = "1.17.11" dependencies = [ "atty", "bincode", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bs58", "clap 3.2.23", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -6216,7 +6216,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_cmd", "bs58", @@ -6265,7 +6265,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "log", @@ -6277,7 +6277,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.10" +version = "1.17.11" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.10" +version = "1.17.11" dependencies = [ "env_logger", "lazy_static", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "solana-sdk", @@ -6345,11 +6345,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.10" +version = "1.17.11" [[package]] name = "solana-merkle-root-bench" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 2.33.3", "log", @@ -6362,7 +6362,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.10" +version = "1.17.11" dependencies = [ "fast-math", "hex", @@ -6371,7 +6371,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.10" +version = "1.17.11" dependencies = [ "crossbeam-channel", "env_logger", @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "clap 3.2.23", @@ -6418,7 +6418,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "reqwest", @@ -6428,7 +6428,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.10" +version = "1.17.11" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6459,7 +6459,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -6480,7 +6480,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 3.2.23", "log", @@ -6495,7 +6495,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "anyhow", "ark-bn254", @@ -6552,7 +6552,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6581,7 +6581,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "async-trait", @@ -6610,7 +6610,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "anyhow", "crossbeam-channel", @@ -6634,7 +6634,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-mutex", "async-trait", @@ -6662,7 +6662,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.10" +version = "1.17.11" dependencies = [ "lazy_static", "num_cpus", @@ -6670,7 +6670,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "console", @@ -6689,7 +6689,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.10" +version = "1.17.11" dependencies = [ "base64 0.21.4", "bincode", @@ -6748,7 +6748,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "async-trait", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.10" +version = "1.17.11" dependencies = [ "base64 0.21.4", "bs58", @@ -6797,7 +6797,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "anyhow", "clap 2.33.3", @@ -6814,7 +6814,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "bs58", @@ -6841,7 +6841,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.10" +version = "1.17.11" dependencies = [ "arrayref", "assert_matches", @@ -6924,7 +6924,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.10" +version = "1.17.11" dependencies = [ "anyhow", "assert_matches", @@ -6982,7 +6982,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bs58", "proc-macro2", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.10" +version = "1.17.11" dependencies = [ "crossbeam-channel", "log", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7024,7 +7024,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -7041,7 +7041,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.10" +version = "1.17.11" dependencies = [ "backoff", "bincode", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "bs58", @@ -7089,7 +7089,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 2.33.3", "log", @@ -7101,7 +7101,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "async-channel", @@ -7133,7 +7133,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -7147,7 +7147,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.10" +version = "1.17.11" dependencies = [ "base64 0.21.4", "bincode", @@ -7177,7 +7177,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -7224,7 +7224,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-trait", "bincode", @@ -7246,7 +7246,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "clap 2.33.3", @@ -7273,7 +7273,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.10" +version = "1.17.11" dependencies = [ "Inflector", "base64 0.21.4", @@ -7296,7 +7296,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -7333,7 +7333,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-trait", "solana-connection-cache", @@ -7346,7 +7346,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.10" +version = "1.17.11" dependencies = [ "serde_json", "solana-metrics", @@ -7354,7 +7354,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.10" +version = "1.17.11" dependencies = [ "chrono", "clap 2.33.3", @@ -7418,7 +7418,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "rustc_version 0.4.0", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "crossbeam-channel", @@ -7451,7 +7451,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -7474,7 +7474,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 2.33.3", "humantime", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bs58", "clap 3.2.23", @@ -7512,7 +7512,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bytemuck", "criterion", @@ -7526,7 +7526,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7538,7 +7538,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.10" +version = "1.17.11" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 554db8b768d87e..e52b802af2ded8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.10" +version = "1.17.11" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.10" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.10" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.10" } -solana-banks-client = { path = "banks-client", version = "=1.17.10" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.10" } -solana-banks-server = { path = "banks-server", version = "=1.17.10" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.10" } -solana-bloom = { path = "bloom", version = "=1.17.10" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.10" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.10" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.10", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.10" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.10" } -solana-cli = { path = "cli", version = "=1.17.10" } -solana-cli-config = { path = "cli-config", version = "=1.17.10" } -solana-cli-output = { path = "cli-output", version = "=1.17.10" } -solana-client = { path = "client", version = "=1.17.10" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.10" } -solana-config-program = { path = "programs/config", version = "=1.17.10" } -solana-core = { path = "core", version = "=1.17.10" } -solana-cost-model = { path = "cost-model", version = "=1.17.10" } -solana-download-utils = { path = "download-utils", version = "=1.17.10" } -solana-entry = { path = "entry", version = "=1.17.10" } -solana-faucet = { path = "faucet", version = "=1.17.10" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.10" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.10" } -solana-genesis = { path = "genesis", version = "=1.17.10" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.10" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.10" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.10" } -solana-gossip = { path = "gossip", version = "=1.17.10" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.10" } -solana-ledger = { path = "ledger", version = "=1.17.10" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.10" } -solana-logger = { path = "logger", version = "=1.17.10" } -solana-measure = { path = "measure", version = "=1.17.10" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.10" } -solana-metrics = { path = "metrics", version = "=1.17.10" } -solana-net-utils = { path = "net-utils", version = "=1.17.10" } -solana-notifier = { path = "notifier", version = "=1.17.10" } -solana-perf = { path = "perf", version = "=1.17.10" } -solana-poh = { path = "poh", version = "=1.17.10" } -solana-program = { path = "sdk/program", version = "=1.17.10" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.10" } -solana-program-test = { path = "program-test", version = "=1.17.10" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.10" } -solana-quic-client = { path = "quic-client", version = "=1.17.10" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.10" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.10", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.10" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.10", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.10" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.10" } -solana-runtime = { path = "runtime", version = "=1.17.10" } -solana-sdk = { path = "sdk", version = "=1.17.10" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.10" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.10" } -solana-stake-program = { path = "programs/stake", version = "=1.17.10" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.10" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.10" } -solana-streamer = { path = "streamer", version = "=1.17.10" } -solana-system-program = { path = "programs/system", version = "=1.17.10" } -solana-test-validator = { path = "test-validator", version = "=1.17.10" } -solana-thin-client = { path = "thin-client", version = "=1.17.10" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.10", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.10" } -solana-turbine = { path = "turbine", version = "=1.17.10" } -solana-udp-client = { path = "udp-client", version = "=1.17.10" } -solana-version = { path = "version", version = "=1.17.10" } -solana-vote = { path = "vote", version = "=1.17.10" } -solana-vote-program = { path = "programs/vote", version = "=1.17.10" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.10" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.10" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.10" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.11" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.11" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.11" } +solana-banks-client = { path = "banks-client", version = "=1.17.11" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.11" } +solana-banks-server = { path = "banks-server", version = "=1.17.11" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.11" } +solana-bloom = { path = "bloom", version = "=1.17.11" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.11" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.11" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.11", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.11" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.11" } +solana-cli = { path = "cli", version = "=1.17.11" } +solana-cli-config = { path = "cli-config", version = "=1.17.11" } +solana-cli-output = { path = "cli-output", version = "=1.17.11" } +solana-client = { path = "client", version = "=1.17.11" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.11" } +solana-config-program = { path = "programs/config", version = "=1.17.11" } +solana-core = { path = "core", version = "=1.17.11" } +solana-cost-model = { path = "cost-model", version = "=1.17.11" } +solana-download-utils = { path = "download-utils", version = "=1.17.11" } +solana-entry = { path = "entry", version = "=1.17.11" } +solana-faucet = { path = "faucet", version = "=1.17.11" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.11" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.11" } +solana-genesis = { path = "genesis", version = "=1.17.11" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.11" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.11" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.11" } +solana-gossip = { path = "gossip", version = "=1.17.11" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.11" } +solana-ledger = { path = "ledger", version = "=1.17.11" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.11" } +solana-logger = { path = "logger", version = "=1.17.11" } +solana-measure = { path = "measure", version = "=1.17.11" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.11" } +solana-metrics = { path = "metrics", version = "=1.17.11" } +solana-net-utils = { path = "net-utils", version = "=1.17.11" } +solana-notifier = { path = "notifier", version = "=1.17.11" } +solana-perf = { path = "perf", version = "=1.17.11" } +solana-poh = { path = "poh", version = "=1.17.11" } +solana-program = { path = "sdk/program", version = "=1.17.11" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.11" } +solana-program-test = { path = "program-test", version = "=1.17.11" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.11" } +solana-quic-client = { path = "quic-client", version = "=1.17.11" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.11" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.11", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.11" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.11", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.11" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.11" } +solana-runtime = { path = "runtime", version = "=1.17.11" } +solana-sdk = { path = "sdk", version = "=1.17.11" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.11" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.11" } +solana-stake-program = { path = "programs/stake", version = "=1.17.11" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.11" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.11" } +solana-streamer = { path = "streamer", version = "=1.17.11" } +solana-system-program = { path = "programs/system", version = "=1.17.11" } +solana-test-validator = { path = "test-validator", version = "=1.17.11" } +solana-thin-client = { path = "thin-client", version = "=1.17.11" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.11", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.11" } +solana-turbine = { path = "turbine", version = "=1.17.11" } +solana-udp-client = { path = "udp-client", version = "=1.17.11" } +solana-version = { path = "version", version = "=1.17.11" } +solana-vote = { path = "vote", version = "=1.17.11" } +solana-vote-program = { path = "programs/vote", version = "=1.17.11" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.11" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.11" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.11" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index a20909d96ba7ca..c59d983f7124ce 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4447,7 +4447,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.10" +version = "1.17.11" dependencies = [ "Inflector", "base64 0.21.4", @@ -4469,7 +4469,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.10" +version = "1.17.11" dependencies = [ "arrayref", "bincode", @@ -4526,7 +4526,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "bytemuck", @@ -4545,7 +4545,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4560,7 +4560,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.10" +version = "1.17.11" dependencies = [ "serde", "solana-sdk", @@ -4569,7 +4569,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "crossbeam-channel", @@ -4587,7 +4587,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bv", "fnv", @@ -4604,7 +4604,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4621,7 +4621,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.10" +version = "1.17.11" dependencies = [ "array-bytes", "serde", @@ -4631,7 +4631,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bv", "bytemuck", @@ -4647,7 +4647,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "chrono", "clap 2.33.3", @@ -4662,7 +4662,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.10" +version = "1.17.11" dependencies = [ "dirs-next", "lazy_static", @@ -4676,7 +4676,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.10" +version = "1.17.11" dependencies = [ "Inflector", "base64 0.21.4", @@ -4701,7 +4701,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-trait", "bincode", @@ -4732,7 +4732,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4740,7 +4740,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "chrono", @@ -4752,7 +4752,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-trait", "bincode", @@ -4772,7 +4772,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.10" +version = "1.17.11" dependencies = [ "base64 0.21.4", "bincode", @@ -4844,7 +4844,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.10" +version = "1.17.11" dependencies = [ "lazy_static", "log", @@ -4866,7 +4866,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "console", "indicatif", @@ -4878,7 +4878,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "crossbeam-channel", @@ -4898,7 +4898,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4920,7 +4920,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.10" +version = "1.17.11" dependencies = [ "ahash 0.8.3", "blake3", @@ -4948,7 +4948,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.10" +version = "1.17.11" dependencies = [ "proc-macro2", "quote", @@ -4958,7 +4958,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "solana-accounts-db", @@ -4969,7 +4969,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "solana-sdk", @@ -4979,7 +4979,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bs58", "crossbeam-channel", @@ -5004,7 +5004,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -5052,7 +5052,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "solana-measure", @@ -5127,7 +5127,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.10" +version = "1.17.11" dependencies = [ "env_logger", "lazy_static", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "solana-sdk", @@ -5144,7 +5144,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.10" +version = "1.17.11" dependencies = [ "fast-math", "solana-program", @@ -5152,7 +5152,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.10" +version = "1.17.11" dependencies = [ "crossbeam-channel", "gethostname", @@ -5165,7 +5165,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "clap 3.1.6", @@ -5185,7 +5185,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.10" +version = "1.17.11" dependencies = [ "ahash 0.8.3", "bincode", @@ -5212,7 +5212,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.10" +version = "1.17.11" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5228,7 +5228,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "ark-bn254", "ark-ec", @@ -5280,7 +5280,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.10" +version = "1.17.11" dependencies = [ "base64 0.21.4", "bincode", @@ -5306,7 +5306,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "async-trait", @@ -5334,7 +5334,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "crossbeam-channel", "futures-util", @@ -5357,7 +5357,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-mutex", "async-trait", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.10" +version = "1.17.11" dependencies = [ "lazy_static", "num_cpus", @@ -5390,7 +5390,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.10" +version = "1.17.11" dependencies = [ "console", "dialoguer", @@ -5407,7 +5407,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.10" +version = "1.17.11" dependencies = [ "base64 0.21.4", "bincode", @@ -5462,7 +5462,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-trait", "base64 0.21.4", @@ -5486,7 +5486,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.10" +version = "1.17.11" dependencies = [ "base64 0.21.4", "bs58", @@ -5506,7 +5506,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.10" +version = "1.17.11" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5517,7 +5517,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.10" +version = "1.17.11" dependencies = [ "arrayref", "base64 0.21.4", @@ -5592,7 +5592,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5621,7 +5621,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5629,21 +5629,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.10" +version = "1.17.11" dependencies = [ "array-bytes", "solana-program", @@ -5651,7 +5651,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.10" +version = "1.17.11" dependencies = [ "array-bytes", "solana-program", @@ -5659,21 +5659,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5681,14 +5681,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.10" +version = "1.17.11" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5696,21 +5696,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.10" +version = "1.17.11" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5720,42 +5720,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.10" +version = "1.17.11" dependencies = [ "rustversion", "solana-program", @@ -5765,49 +5765,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5815,14 +5815,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-program-runtime", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5840,21 +5840,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5862,14 +5862,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.10" +version = "1.17.11" dependencies = [ "array-bytes", "solana-program", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.10" +version = "1.17.11" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5886,14 +5886,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-program-runtime", @@ -5911,21 +5911,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-program-runtime", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.10" +version = "1.17.11" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5943,7 +5943,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.10" +version = "1.17.11" dependencies = [ "blake3", "solana-program", @@ -5951,21 +5951,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-logger", "solana-program", @@ -5976,21 +5976,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", "solana-program-runtime", @@ -6000,21 +6000,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.10" +version = "1.17.11" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.10" +version = "1.17.11" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6066,7 +6066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bs58", "proc-macro2", @@ -6077,7 +6077,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.10" +version = "1.17.11" dependencies = [ "crossbeam-channel", "log", @@ -6091,7 +6091,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "log", @@ -6104,7 +6104,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.10" +version = "1.17.11" dependencies = [ "backoff", "bincode", @@ -6136,7 +6136,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "bs58", @@ -6151,7 +6151,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-channel", "bytes", @@ -6181,7 +6181,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "log", @@ -6193,7 +6193,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.10" +version = "1.17.11" dependencies = [ "base64 0.21.4", "bincode", @@ -6223,7 +6223,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "log", @@ -6236,7 +6236,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-trait", "bincode", @@ -6258,7 +6258,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.10" +version = "1.17.11" dependencies = [ "Inflector", "base64 0.21.4", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "bytes", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.10" +version = "1.17.11" dependencies = [ "async-trait", "solana-connection-cache", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.10" +version = "1.17.11" dependencies = [ "chrono", "clap 2.33.3", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.10" +version = "1.17.11" dependencies = [ "log", "rustc_version", @@ -6405,7 +6405,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.10" +version = "1.17.11" dependencies = [ "crossbeam-channel", "itertools", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bincode", "log", @@ -6442,7 +6442,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.10" +version = "1.17.11" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6454,7 +6454,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.10" +version = "1.17.11" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 55dccf53769678..5c3ee5122cc764 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.10" +version = "1.17.11" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.10" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.10" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.10" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.10" } -solana-ledger = { path = "../../ledger", version = "=1.17.10" } -solana-logger = { path = "../../logger", version = "=1.17.10" } -solana-measure = { path = "../../measure", version = "=1.17.10" } -solana-program = { path = "../../sdk/program", version = "=1.17.10" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.10" } -solana-program-test = { path = "../../program-test", version = "=1.17.10" } -solana-runtime = { path = "../../runtime", version = "=1.17.10" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.10" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.10" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.10", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.10" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.10" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.10" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.10", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.10" } -solana-sdk = { path = "../../sdk", version = "=1.17.10" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.10" } -solana-validator = { path = "../../validator", version = "=1.17.10" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.10" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.11" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.11" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.11" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.11" } +solana-ledger = { path = "../../ledger", version = "=1.17.11" } +solana-logger = { path = "../../logger", version = "=1.17.11" } +solana-measure = { path = "../../measure", version = "=1.17.11" } +solana-program = { path = "../../sdk/program", version = "=1.17.11" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.11" } +solana-program-test = { path = "../../program-test", version = "=1.17.11" } +solana-runtime = { path = "../../runtime", version = "=1.17.11" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.11" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.11" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.11", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.11" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.11" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.11" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.11", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.11" } +solana-sdk = { path = "../../sdk", version = "=1.17.11" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.11" } +solana-validator = { path = "../../validator", version = "=1.17.11" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.11" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index b2f498728d8d4c..f88bd72f0fc5d6 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.10" +version = "1.17.11" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.10" } +solana-program = { path = "../../../../program", version = "=1.17.11" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index c5d00a26b2042b..419e68ace58877 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.10" +version = "1.17.11" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.10" } +solana-program = { path = "../../../../program", version = "=1.17.11" } [lib] crate-type = ["cdylib"] From 4d131b0e4c6ddbf6211068e114dad4ca3d6d87db Mon Sep 17 00:00:00 2001 From: steviez Date: Wed, 13 Dec 2023 19:38:06 -0600 Subject: [PATCH 112/213] blockstore: Allow fallback for AddressSignature index() (#34440) blockstore: Allow fallback for AddressSignature index A change landed somewhat recently in master that changed the key format of the transaction metadata columns. A compatibility backport was introduced to allow a blockstore that had been populated with this newer version to still be readable by v1.17 (backwards software compat). However, there was an oversight in the backport. Namely, the index() function for AddressSignatures column did a regular unwrap() on the try_current_index() result. try_current_index() can fail if a key with an unknown size is encountered. This would be exactly the case for encountering a key that was populated by the newer software version with the different key format. So, use .unwrap_or_else() in the index() implementation for AddressSignatures; this will now be consistent with the implementation of index() for TransactionStatus column. --- ledger/src/blockstore_db.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index 6dd7f4dbe4c4f2..30cb4b2e9779a4 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -875,7 +875,8 @@ impl Column for columns::AddressSignatures { } fn index(key: &[u8]) -> (u64, Pubkey, Slot, Signature) { - ::try_current_index(key).unwrap() + ::try_current_index(key) + .unwrap_or_else(|_| Self::as_index(0)) } fn primary_index(index: Self::Index) -> u64 { From ca34005ad5c5040e7cd8bc22f3ae7d755e293d6b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 07:15:56 -0800 Subject: [PATCH 113/213] v1.17: Set root slot/epoch in cache constructor (backport of #34447) (#34460) --- program-runtime/src/loaded_programs.rs | 33 +++++++++++++------------- runtime/src/bank.rs | 10 ++++++-- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index b47729935075ac..896c21134d1ee6 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -475,21 +475,6 @@ pub struct LoadedPrograms { pub fork_graph: Option>>, } -impl Default for LoadedPrograms { - fn default() -> Self { - Self { - entries: HashMap::new(), - latest_root_slot: 0, - latest_root_epoch: 0, - environments: ProgramRuntimeEnvironments::default(), - upcoming_environments: None, - programs_to_recompile: Vec::default(), - stats: Stats::default(), - fork_graph: None, - } - } -} - #[derive(Clone, Debug, Default)] pub struct LoadedProgramsForTxBatch { /// Pubkey is the address of a program. @@ -565,6 +550,19 @@ pub enum LoadedProgramMatchCriteria { } impl LoadedPrograms { + pub fn new(root_slot: Slot, root_epoch: Epoch) -> Self { + Self { + entries: HashMap::new(), + latest_root_slot: root_slot, + latest_root_epoch: root_epoch, + environments: ProgramRuntimeEnvironments::default(), + upcoming_environments: None, + programs_to_recompile: Vec::default(), + stats: Stats::default(), + fork_graph: None, + } + } + pub fn set_fork_graph(&mut self, fork_graph: Arc>) { self.fork_graph = Some(fork_graph); } @@ -983,7 +981,7 @@ impl solana_frozen_abi::abi_example::AbiExample for LoadedProgram { impl solana_frozen_abi::abi_example::AbiExample for LoadedPrograms { fn example() -> Self { // LoadedPrograms isn't serializable by definition. - Self::default() + Self::new(Slot::default(), Epoch::default()) } } @@ -1015,7 +1013,8 @@ mod tests { std::sync::OnceLock::::new(); fn new_mock_cache() -> LoadedPrograms { - let mut cache = LoadedPrograms::default(); + let mut cache = LoadedPrograms::new(0, 0); + cache.environments.program_runtime_v1 = MOCK_ENVIRONMENT .get_or_init(|| Arc::new(BuiltinProgram::new_mock())) .clone(); diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 9669553ec01fbd..420ec7217dd129 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -1069,7 +1069,10 @@ impl Bank { accounts_data_size_delta_on_chain: AtomicI64::new(0), accounts_data_size_delta_off_chain: AtomicI64::new(0), fee_structure: FeeStructure::default(), - loaded_programs_cache: Arc::>>::default(), + loaded_programs_cache: Arc::new(RwLock::new(LoadedPrograms::new( + Slot::default(), + Epoch::default(), + ))), check_program_modification_slot: false, epoch_reward_status: EpochRewardStatus::default(), }; @@ -1918,7 +1921,10 @@ impl Bank { accounts_data_size_delta_on_chain: AtomicI64::new(0), accounts_data_size_delta_off_chain: AtomicI64::new(0), fee_structure: FeeStructure::default(), - loaded_programs_cache: Arc::>>::default(), + loaded_programs_cache: Arc::new(RwLock::new(LoadedPrograms::new( + fields.slot, + fields.epoch, + ))), check_program_modification_slot: false, epoch_reward_status: EpochRewardStatus::default(), }; From e191d8d1ca8bd83f7f51d269cb56af7b4b774320 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 17:53:37 +0100 Subject: [PATCH 114/213] v1.17: Refactor - `ExtractedPrograms` (backport of #34205) (#34351) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor - `ExtractedPrograms` (#34205) * Puts ExtractedPrograms into Arc>. * Merges ExtractedPrograms::missing and ExtractedPrograms::unloaded. * Unifies missing entry insertion in LoadedPrograms::extract(). (cherry picked from commit 4ee5078e5ffdfff36d3f7920217788e2892c1a85) Co-authored-by: Alexander Meißner --- program-runtime/src/loaded_programs.rs | 396 ++++++++++--------------- runtime/src/bank.rs | 31 +- 2 files changed, 165 insertions(+), 262 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 896c21134d1ee6..b7bf3365648b66 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -25,7 +25,7 @@ use { fmt::{Debug, Formatter}, sync::{ atomic::{AtomicU64, Ordering}, - Arc, RwLock, + Arc, Mutex, RwLock, }, }, }; @@ -486,8 +486,7 @@ pub struct LoadedProgramsForTxBatch { pub struct ExtractedPrograms { pub loaded: LoadedProgramsForTxBatch, - pub missing: Vec<(Pubkey, u64)>, - pub unloaded: Vec<(Pubkey, u64)>, + pub missing: HashMap, } impl LoadedProgramsForTxBatch { @@ -776,13 +775,21 @@ impl LoadedPrograms { &self, working_slot: &S, keys: impl Iterator, - ) -> ExtractedPrograms { + ) -> Arc> { let environments = self.get_environments_for_epoch(working_slot.current_epoch()); - let mut missing = Vec::new(); - let mut unloaded = Vec::new(); let current_slot = working_slot.current_slot(); - let found = keys + let extracted = Arc::new(Mutex::new(ExtractedPrograms { + loaded: LoadedProgramsForTxBatch { + entries: HashMap::new(), + slot: current_slot, + environments: environments.clone(), + }, + missing: HashMap::new(), + })); + let mut extracting = extracted.lock().unwrap(); + extracting.loaded.entries = keys .filter_map(|(key, (match_criteria, usage_count))| { + let mut reloading = false; if let Some(second_level) = self.entries.get(&key) { for entry in second_level.iter().rev() { let is_ancestor = if let Some(fork_graph) = &self.fork_graph { @@ -805,19 +812,15 @@ impl LoadedPrograms { || is_ancestor { if current_slot >= entry.effective_slot { - if !Self::is_entry_usable(entry, current_slot, &match_criteria) { - missing.push((key, usage_count)); - return None; - } - - if !Self::matches_environment(entry, environments) { - missing.push((key, usage_count)); - return None; + if !Self::is_entry_usable(entry, current_slot, &match_criteria) + || !Self::matches_environment(entry, environments) + { + break; } if let LoadedProgramType::Unloaded(_environment) = &entry.program { - unloaded.push((key, usage_count)); - return None; + reloading = true; + break; } entry @@ -840,26 +843,18 @@ impl LoadedPrograms { } } } - missing.push((key, usage_count)); + extracting.missing.insert(key, (usage_count, reloading)); None }) .collect::>>(); - self.stats .misses - .fetch_add(missing.len() as u64, Ordering::Relaxed); + .fetch_add(extracting.missing.len() as u64, Ordering::Relaxed); self.stats .hits - .fetch_add(found.len() as u64, Ordering::Relaxed); - ExtractedPrograms { - loaded: LoadedProgramsForTxBatch { - entries: found, - slot: current_slot, - environments: environments.clone(), - }, - missing, - unloaded, - } + .fetch_add(extracting.loaded.entries.len() as u64, Ordering::Relaxed); + drop(extracting); + extracted } pub fn merge(&mut self, tx_batch_cache: &LoadedProgramsForTxBatch) { @@ -990,7 +985,7 @@ mod tests { use { crate::loaded_programs::{ BlockRelation, ExtractedPrograms, ForkGraph, LoadedProgram, LoadedProgramMatchCriteria, - LoadedProgramType, LoadedPrograms, LoadedProgramsForTxBatch, ProgramRuntimeEnvironment, + LoadedProgramType, LoadedPrograms, ProgramRuntimeEnvironment, ProgramRuntimeEnvironments, WorkingSlot, DELAY_VISIBILITY_SLOT_OFFSET, }, assert_matches::assert_matches, @@ -1004,7 +999,7 @@ mod tests { ops::ControlFlow, sync::{ atomic::{AtomicU64, Ordering}, - Arc, RwLock, + Arc, Mutex, RwLock, }, }, }; @@ -1607,18 +1602,33 @@ mod tests { } fn match_slot( - table: &LoadedProgramsForTxBatch, + extracted: &Arc>, program: &Pubkey, deployment_slot: Slot, working_slot: Slot, ) -> bool { - assert_eq!(table.slot, working_slot); - table + let extracted = extracted.lock().unwrap(); + assert_eq!(extracted.loaded.slot, working_slot); + extracted + .loaded .find(program) .map(|entry| entry.deployment_slot == deployment_slot) .unwrap_or(false) } + fn match_missing( + extracted: &Arc>, + key: &Pubkey, + reload: bool, + ) -> bool { + let extracted = extracted.lock().unwrap(); + extracted + .missing + .get(key) + .filter(|(_count, reloading)| *reloading == reload) + .is_some() + } + #[test] fn test_fork_extract_and_prune() { let mut cache = new_mock_cache::(); @@ -1697,11 +1707,7 @@ mod tests { // 23 // Testing fork 0 - 10 - 12 - 22 with current slot at 22 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(22), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1712,19 +1718,14 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 20, 22)); - assert!(match_slot(&found, &program4, 0, 22)); + assert!(match_slot(&extracted, &program1, 20, 22)); + assert!(match_slot(&extracted, &program4, 0, 22)); - assert!(missing.contains(&(program2, 2))); - assert!(missing.contains(&(program3, 3))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program2, false)); + assert!(match_missing(&extracted, &program3, false)); - // Testing fork 0 - 5 - 11 - 15 - 16 with current slot at 15 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + // Testing fork 0 - 5 - 11 - 15 - 16 with current slot at 16 + let extracted = cache.extract( &TestWorkingSlot(15), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1735,24 +1736,24 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 15)); - assert!(match_slot(&found, &program2, 11, 15)); + assert!(match_slot(&extracted, &program1, 0, 15)); + assert!(match_slot(&extracted, &program2, 11, 15)); // The effective slot of program4 deployed in slot 15 is 19. So it should not be usable in slot 16. // A delay visibility tombstone should be returned here. - let tombstone = found.find(&program4).expect("Failed to find the tombstone"); + let tombstone = extracted + .lock() + .unwrap() + .loaded + .find(&program4) + .expect("Failed to find the tombstone"); assert_matches!(tombstone.program, LoadedProgramType::DelayVisibility); assert_eq!(tombstone.deployment_slot, 15); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); // Testing the same fork above, but current slot is now 18 (equal to effective slot of program4). - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(18), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1763,21 +1764,16 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 18)); - assert!(match_slot(&found, &program2, 11, 18)); + assert!(match_slot(&extracted, &program1, 0, 18)); + assert!(match_slot(&extracted, &program2, 11, 18)); // The effective slot of program4 deployed in slot 15 is 18. So it should be usable in slot 18. - assert!(match_slot(&found, &program4, 15, 18)); + assert!(match_slot(&extracted, &program4, 15, 18)); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); // Testing the same fork above, but current slot is now 23 (future slot than effective slot of program4). - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(23), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1788,21 +1784,16 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 23)); - assert!(match_slot(&found, &program2, 11, 23)); + assert!(match_slot(&extracted, &program1, 0, 23)); + assert!(match_slot(&extracted, &program2, 11, 23)); // The effective slot of program4 deployed in slot 15 is 19. So it should be usable in slot 23. - assert!(match_slot(&found, &program4, 15, 23)); + assert!(match_slot(&extracted, &program4, 15, 23)); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); // Testing fork 0 - 5 - 11 - 15 - 16 with current slot at 11 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(11), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1813,15 +1804,19 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 11)); + assert!(match_slot(&extracted, &program1, 0, 11)); // program2 was updated at slot 11, but is not effective till slot 12. The result should contain a tombstone. - let tombstone = found.find(&program2).expect("Failed to find the tombstone"); + let tombstone = extracted + .lock() + .unwrap() + .loaded + .find(&program2) + .expect("Failed to find the tombstone"); assert_matches!(tombstone.program, LoadedProgramType::DelayVisibility); assert_eq!(tombstone.deployment_slot, 11); - assert!(match_slot(&found, &program4, 5, 11)); + assert!(match_slot(&extracted, &program4, 5, 11)); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); // The following is a special case, where there's an expiration slot let test_program = Arc::new(LoadedProgram { @@ -1836,11 +1831,7 @@ mod tests { assert!(!cache.replenish(program4, test_program).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(19), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1851,21 +1842,16 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 19)); - assert!(match_slot(&found, &program2, 11, 19)); + assert!(match_slot(&extracted, &program1, 0, 19)); + assert!(match_slot(&extracted, &program2, 11, 19)); // Program4 deployed at slot 19 should not be expired yet - assert!(match_slot(&found, &program4, 19, 19)); + assert!(match_slot(&extracted, &program4, 19, 19)); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 21 // This would cause program4 deployed at slot 19 to be expired. - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(21), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1876,12 +1862,11 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 21)); - assert!(match_slot(&found, &program2, 11, 21)); + assert!(match_slot(&extracted, &program1, 0, 21)); + assert!(match_slot(&extracted, &program2, 11, 21)); - assert!(missing.contains(&(program3, 1))); - assert!(missing.contains(&(program4, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&extracted, &program4, false)); // Remove the expired entry to let the rest of the test continue if let Some(programs) = cache.entries.get_mut(&program4) { @@ -1905,12 +1890,8 @@ mod tests { // | // 23 - // Testing fork 11 - 15 - 16- 19 - 22 with root at 5 and current slot at 21 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + // Testing fork 11 - 15 - 16- 19 - 22 with root at 5 and current slot at 22 + let extracted = cache.extract( &TestWorkingSlot(21), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1922,19 +1903,14 @@ mod tests { ); // Since the fork was pruned, we should not find the entry deployed at slot 20. - assert!(match_slot(&found, &program1, 0, 21)); - assert!(match_slot(&found, &program2, 11, 21)); - assert!(match_slot(&found, &program4, 15, 21)); + assert!(match_slot(&extracted, &program1, 0, 21)); + assert!(match_slot(&extracted, &program2, 11, 21)); + assert!(match_slot(&extracted, &program4, 15, 21)); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); // Testing fork 0 - 5 - 11 - 25 - 27 with current slot at 27 - let ExtractedPrograms { - loaded: found, - missing: _, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(27), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1945,11 +1921,10 @@ mod tests { .into_iter(), ); - assert!(unloaded.is_empty()); - assert!(match_slot(&found, &program1, 0, 27)); - assert!(match_slot(&found, &program2, 11, 27)); - assert!(match_slot(&found, &program3, 25, 27)); - assert!(match_slot(&found, &program4, 5, 27)); + assert!(match_slot(&extracted, &program1, 0, 27)); + assert!(match_slot(&extracted, &program2, 11, 27)); + assert!(match_slot(&extracted, &program3, 25, 27)); + assert!(match_slot(&extracted, &program4, 5, 27)); cache.prune(15, 0); @@ -1969,11 +1944,7 @@ mod tests { // 23 // Testing fork 16, 19, 23, with root at 15, current slot at 23 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(23), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -1984,13 +1955,12 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 23)); - assert!(match_slot(&found, &program2, 11, 23)); - assert!(match_slot(&found, &program4, 15, 23)); + assert!(match_slot(&extracted, &program1, 0, 23)); + assert!(match_slot(&extracted, &program2, 11, 23)); + assert!(match_slot(&extracted, &program4, 15, 23)); // program3 was deployed on slot 25, which has been pruned - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); } #[test] @@ -2032,11 +2002,7 @@ mod tests { assert!(!cache.replenish(program3, new_test_loaded_program(25, 26)).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(12), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2046,18 +2012,13 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 12)); - assert!(match_slot(&found, &program2, 11, 12)); + assert!(match_slot(&extracted, &program1, 0, 12)); + assert!(match_slot(&extracted, &program2, 11, 12)); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); // Test the same fork, but request the program modified at a later slot than what's in the cache. - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(12), vec![ ( @@ -2073,11 +2034,10 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program2, 11, 12)); + assert!(match_slot(&extracted, &program2, 11, 12)); - assert!(missing.contains(&(program1, 1))); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program1, false)); + assert!(match_missing(&extracted, &program3, false)); } #[test] @@ -2136,11 +2096,7 @@ mod tests { ); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(19), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2150,18 +2106,13 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 19)); - assert!(match_slot(&found, &program2, 11, 19)); + assert!(match_slot(&extracted, &program1, 0, 19)); + assert!(match_slot(&extracted, &program2, 11, 19)); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); // Testing fork 0 - 5 - 11 - 25 - 27 with current slot at 27 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(27), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2171,18 +2122,13 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 27)); - assert!(match_slot(&found, &program2, 11, 27)); + assert!(match_slot(&extracted, &program1, 0, 27)); + assert!(match_slot(&extracted, &program2, 11, 27)); - assert!(unloaded.contains(&(program3, 1))); - assert!(missing.is_empty()); + assert!(match_missing(&extracted, &program3, true)); // Testing fork 0 - 10 - 20 - 22 with current slot at 22 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(22), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2192,10 +2138,10 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 20, 22)); + assert!(match_slot(&extracted, &program1, 20, 22)); - assert!(missing.contains(&(program2, 1))); - assert!(unloaded.contains(&(program3, 1))); + assert!(match_missing(&extracted, &program2, false)); + assert!(match_missing(&extracted, &program3, true)); } #[test] @@ -2248,11 +2194,7 @@ mod tests { assert!(!cache.replenish(program1, test_program).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(12), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2263,19 +2205,14 @@ mod tests { ); // Program1 deployed at slot 11 should not be expired yet - assert!(match_slot(&found, &program1, 11, 12)); - assert!(match_slot(&found, &program2, 11, 12)); + assert!(match_slot(&extracted, &program1, 11, 12)); + assert!(match_slot(&extracted, &program2, 11, 12)); - assert!(missing.contains(&(program3, 1))); - assert!(unloaded.is_empty()); + assert!(match_missing(&extracted, &program3, false)); // Testing fork 0 - 5 - 11 - 12 - 15 - 16 - 19 - 21 - 23 with current slot at 15 // This would cause program4 deployed at slot 15 to be expired. - let ExtractedPrograms { - loaded: found, - missing, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(15), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2284,12 +2221,11 @@ mod tests { ] .into_iter(), ); - assert!(unloaded.is_empty()); - assert!(match_slot(&found, &program2, 11, 15)); + assert!(match_slot(&extracted, &program2, 11, 15)); - assert!(missing.contains(&(program1, 1))); - assert!(missing.contains(&(program3, 1))); + assert!(match_missing(&extracted, &program1, false)); + assert!(match_missing(&extracted, &program3, false)); // Test that the program still exists in the cache, even though it is expired. assert_eq!( @@ -2343,19 +2279,17 @@ mod tests { cache.prune(10, 0); - let ExtractedPrograms { - loaded: found, - missing: _, - unloaded, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(20), vec![(program1, (LoadedProgramMatchCriteria::NoCriteria, 1))].into_iter(), ); - assert!(unloaded.is_empty()); // The cache should have the program deployed at slot 0 assert_eq!( - found + extracted + .lock() + .unwrap() + .loaded .entries .get(&program1) .expect("Did not find the program") @@ -2391,11 +2325,7 @@ mod tests { let program2 = Pubkey::new_unique(); assert!(!cache.replenish(program2, new_test_loaded_program(10, 11)).0); - let ExtractedPrograms { - loaded: found, - missing: _, - unloaded: _, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(20), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2404,14 +2334,10 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 20)); - assert!(match_slot(&found, &program2, 10, 20)); + assert!(match_slot(&extracted, &program1, 0, 20)); + assert!(match_slot(&extracted, &program2, 10, 20)); - let ExtractedPrograms { - loaded: found, - missing, - unloaded: _, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(6), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2420,18 +2346,14 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 5, 6)); - assert!(missing.contains(&(program2, 1))); + assert!(match_slot(&extracted, &program1, 5, 6)); + assert!(match_missing(&extracted, &program2, false)); // Pruning slot 5 will remove program1 entry deployed at slot 5. // On fork chaining from slot 5, the entry deployed at slot 0 will become visible. cache.prune_by_deployment_slot(5); - let ExtractedPrograms { - loaded: found, - missing: _, - unloaded: _, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(20), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2440,14 +2362,10 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 20)); - assert!(match_slot(&found, &program2, 10, 20)); + assert!(match_slot(&extracted, &program1, 0, 20)); + assert!(match_slot(&extracted, &program2, 10, 20)); - let ExtractedPrograms { - loaded: found, - missing, - unloaded: _, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(6), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2456,18 +2374,14 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 6)); - assert!(missing.contains(&(program2, 1))); + assert!(match_slot(&extracted, &program1, 0, 6)); + assert!(match_missing(&extracted, &program2, false)); // Pruning slot 10 will remove program2 entry deployed at slot 10. // As there is no other entry for program2, extract() will return it as missing. cache.prune_by_deployment_slot(10); - let ExtractedPrograms { - loaded: found, - missing: _, - unloaded: _, - } = cache.extract( + let extracted = cache.extract( &TestWorkingSlot(20), vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), @@ -2476,8 +2390,8 @@ mod tests { .into_iter(), ); - assert!(match_slot(&found, &program1, 0, 20)); - assert!(missing.contains(&(program2, 1))); + assert!(match_slot(&extracted, &program1, 0, 20)); + assert!(match_missing(&extracted, &program2, false)); } #[test] diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 420ec7217dd129..a7acc0235e9645 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -195,7 +195,7 @@ use { AtomicBool, AtomicI64, AtomicU64, AtomicUsize, Ordering::{self, AcqRel, Acquire, Relaxed}, }, - Arc, LockResult, RwLock, RwLockReadGuard, RwLockWriteGuard, + Arc, LockResult, Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard, }, thread::Builder, time::{Duration, Instant}, @@ -5078,28 +5078,23 @@ impl Bank { let ExtractedPrograms { loaded: mut loaded_programs_for_txs, missing, - unloaded, } = { // Lock the global cache to figure out which programs need to be loaded let loaded_programs_cache = self.loaded_programs_cache.read().unwrap(); - loaded_programs_cache.extract(self, programs_and_slots.into_iter()) + Mutex::into_inner( + Arc::into_inner( + loaded_programs_cache.extract(self, programs_and_slots.into_iter()), + ) + .unwrap(), + ) + .unwrap() }; // Load missing programs while global cache is unlocked let missing_programs: Vec<(Pubkey, Arc)> = missing .iter() - .map(|(key, count)| { - let program = self.load_program(key, false, None); - program.tx_usage_counter.store(*count, Ordering::Relaxed); - (*key, program) - }) - .collect(); - - // Reload unloaded programs while global cache is unlocked - let unloaded_programs: Vec<(Pubkey, Arc)> = unloaded - .iter() - .map(|(key, count)| { - let program = self.load_program(key, true, None); + .map(|(key, (count, reloading))| { + let program = self.load_program(key, *reloading, None); program.tx_usage_counter.store(*count, Ordering::Relaxed); (*key, program) }) @@ -5112,12 +5107,6 @@ impl Bank { // Use the returned entry as that might have been deduplicated globally loaded_programs_for_txs.replenish(key, entry); } - for (key, program) in unloaded_programs { - let (_was_occupied, entry) = loaded_programs_cache.replenish(key, program); - // Use the returned entry as that might have been deduplicated globally - loaded_programs_for_txs.replenish(key, entry); - } - loaded_programs_for_txs } From 96d57e88dd9902bdfc0c69b39285be6e2f77b74e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 17:49:43 +0000 Subject: [PATCH 115/213] v1.17: CI: add check for explicit spl-token-cli version (backport of #34430) (#34465) CI: add check for explicit spl-token-cli version (#34430) * Add script to specify spl-token-cli version * Add check for spl-token-cli version to CI * Add minor release branch cleanup instruction to unblock CI on the new stable branch --------- Co-authored-by: Will Hickey (cherry picked from commit e6e191f843bcf8477063cd3004deee93c7956471) Co-authored-by: Tyera --- RELEASE.md | 1 + ci/check-install-all.sh | 5 +++++ ci/test-checks.sh | 4 ++++ scripts/cargo-install-all.sh | 4 ++++ scripts/spl-token-cli-version.sh | 8 ++++++++ 5 files changed, 22 insertions(+) create mode 100755 ci/check-install-all.sh create mode 100644 scripts/spl-token-cli-version.sh diff --git a/RELEASE.md b/RELEASE.md index abb79a32a8ca8d..c5aa5d540b1191 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -98,6 +98,7 @@ Alternatively use the Github UI. ### Miscellaneous Clean up +1. Pin the spl-token-cli version in the newly promoted stable branch by setting `splTokenCliVersion` in scripts/spl-token-cli-version.sh to the latest release that depends on the stable branch (usually this will be the latest spl-token-cli release). 1. Update [mergify.yml](https://github.com/solana-labs/solana/blob/master/.mergify.yml) to add backport actions for the new branch and remove actions for the obsolete branch. 1. Adjust the [Github backport labels](https://github.com/solana-labs/solana/labels) to add the new branch label and remove the label for the obsolete branch. 1. Announce on Discord #development that the release branch exists so people know to use the new backport labels. diff --git a/ci/check-install-all.sh b/ci/check-install-all.sh new file mode 100755 index 00000000000000..0ffb52a370818c --- /dev/null +++ b/ci/check-install-all.sh @@ -0,0 +1,5 @@ +source scripts/spl-token-cli-version.sh +if [[ -z $splTokenCliVersion ]]; then + echo "On the stable channel, splTokenCliVersion must be set in scripts/spl-token-cli-version.sh" + exit 1 +fi diff --git a/ci/test-checks.sh b/ci/test-checks.sh index e29ed1faae0454..533d05e1720ff3 100755 --- a/ci/test-checks.sh +++ b/ci/test-checks.sh @@ -76,4 +76,8 @@ _ scripts/cargo-for-all-lock-files.sh -- "+${rust_nightly}" fmt --all -- --check _ ci/do-audit.sh +if [[ -n $CI ]] && [[ $CHANNEL = "stable" ]]; then + _ ci/check-install-all.sh +fi + echo --- ok diff --git a/scripts/cargo-install-all.sh b/scripts/cargo-install-all.sh index 4aceef69a4fe73..e48ce4e02deeb8 100755 --- a/scripts/cargo-install-all.sh +++ b/scripts/cargo-install-all.sh @@ -149,11 +149,15 @@ mkdir -p "$installDir/bin" # Exclude `spl-token` binary for net.sh builds if [[ -z "$validatorOnly" ]]; then + # shellcheck source=scripts/spl-token-cli-version.sh + source "$here"/spl-token-cli-version.sh + # the patch-related configs are needed for rust 1.69+ on Windows; see Cargo.toml # shellcheck disable=SC2086 # Don't want to double quote $rust_version "$cargo" $maybeRustVersion \ --config 'patch.crates-io.ntapi.git="https://github.com/solana-labs/ntapi"' \ --config 'patch.crates-io.ntapi.rev="97ede981a1777883ff86d142b75024b023f04fad"' \ + $maybeSplTokenCliVersionArg \ install --locked spl-token-cli --root "$installDir" fi ) diff --git a/scripts/spl-token-cli-version.sh b/scripts/spl-token-cli-version.sh new file mode 100644 index 00000000000000..82559c5bc4bbb6 --- /dev/null +++ b/scripts/spl-token-cli-version.sh @@ -0,0 +1,8 @@ +# populate this on the stable branch +splTokenCliVersion= + +maybeSplTokenCliVersionArg= +if [[ -n "$splTokenCliVersion" ]]; then + # shellcheck disable=SC2034 + maybeSplTokenCliVersionArg="--version $splTokenCliVersion" +fi From 509b9b970babfcdee748f7abba6209d63fb2d230 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 15:55:38 -0800 Subject: [PATCH 116/213] v1.17: [zk-token-sdk] Fix range proof transcript seed typo (backport of #34468) (#34470) [zk-token-sdk] Fix range proof transcript seed typo (#34468) fix range proof transcript seed typo (cherry picked from commit aaccbdd0aee69e9aeddc5c16057295a0b2bc1dab) Co-authored-by: samkim-crypto --- zk-token-sdk/src/instruction/batched_range_proof/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zk-token-sdk/src/instruction/batched_range_proof/mod.rs b/zk-token-sdk/src/instruction/batched_range_proof/mod.rs index 07351d87854c89..5942f3852f7e56 100644 --- a/zk-token-sdk/src/instruction/batched_range_proof/mod.rs +++ b/zk-token-sdk/src/instruction/batched_range_proof/mod.rs @@ -54,7 +54,7 @@ impl BatchedRangeProofContext { fn new_transcript(&self) -> Transcript { let mut transcript = Transcript::new(b"BatchedRangeProof"); transcript.append_message(b"commitments", bytes_of(&self.commitments)); - transcript.append_message(b"bit-legnths", bytes_of(&self.bit_lengths)); + transcript.append_message(b"bit-lengths", bytes_of(&self.bit_lengths)); transcript } From ec87ec9990ab923efe9903fdb0dd44d0e991abd4 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 14:52:59 +0000 Subject: [PATCH 117/213] v1.17: makes last erasure batch size >= 64 shreds (backport of #34330) (#34433) --- ledger/src/shred/merkle.rs | 95 ++++++++++++++++++++-------- ledger/src/shredder.rs | 46 ++++++++++---- local-cluster/tests/local_cluster.rs | 1 + 3 files changed, 102 insertions(+), 40 deletions(-) diff --git a/ledger/src/shred/merkle.rs b/ledger/src/shred/merkle.rs index d0d507ae48aba1..8ed51a6653b411 100644 --- a/ledger/src/shred/merkle.rs +++ b/ledger/src/shred/merkle.rs @@ -821,7 +821,8 @@ pub(super) fn make_shreds_from_data( } } let now = Instant::now(); - let erasure_batch_size = shredder::get_erasure_batch_size(DATA_SHREDS_PER_FEC_BLOCK); + let erasure_batch_size = + shredder::get_erasure_batch_size(DATA_SHREDS_PER_FEC_BLOCK, is_last_in_slot); let proof_size = get_proof_size(erasure_batch_size); let data_buffer_size = ShredData::capacity(proof_size)?; let chunk_size = DATA_SHREDS_PER_FEC_BLOCK * data_buffer_size; @@ -872,7 +873,8 @@ pub(super) fn make_shreds_from_data( let data_buffer_size = ShredData::capacity(proof_size).ok()?; let num_data_shreds = (data.len() + data_buffer_size - 1) / data_buffer_size; let num_data_shreds = num_data_shreds.max(1); - let erasure_batch_size = shredder::get_erasure_batch_size(num_data_shreds); + let erasure_batch_size = + shredder::get_erasure_batch_size(num_data_shreds, is_last_in_slot); (proof_size == get_proof_size(erasure_batch_size)) .then_some((proof_size, data_buffer_size)) }) @@ -932,7 +934,8 @@ pub(super) fn make_shreds_from_data( .scan(next_code_index, |next_code_index, chunk| { let out = Some(*next_code_index); let num_data_shreds = chunk.len(); - let erasure_batch_size = shredder::get_erasure_batch_size(num_data_shreds); + let erasure_batch_size = + shredder::get_erasure_batch_size(num_data_shreds, is_last_in_slot); let num_coding_shreds = erasure_batch_size - num_data_shreds; *next_code_index += num_coding_shreds as u32; out @@ -945,7 +948,13 @@ pub(super) fn make_shreds_from_data( .into_iter() .zip(next_code_index) .map(|(shreds, next_code_index)| { - make_erasure_batch(keypair, shreds, next_code_index, reed_solomon_cache) + make_erasure_batch( + keypair, + shreds, + next_code_index, + is_last_in_slot, + reed_solomon_cache, + ) }) .collect() } else { @@ -954,7 +963,13 @@ pub(super) fn make_shreds_from_data( .into_par_iter() .zip(next_code_index) .map(|(shreds, next_code_index)| { - make_erasure_batch(keypair, shreds, next_code_index, reed_solomon_cache) + make_erasure_batch( + keypair, + shreds, + next_code_index, + is_last_in_slot, + reed_solomon_cache, + ) }) .collect() }) @@ -969,10 +984,11 @@ fn make_erasure_batch( keypair: &Keypair, shreds: Vec, next_code_index: u32, + is_last_in_slot: bool, reed_solomon_cache: &ReedSolomonCache, ) -> Result, Error> { let num_data_shreds = shreds.len(); - let erasure_batch_size = shredder::get_erasure_batch_size(num_data_shreds); + let erasure_batch_size = shredder::get_erasure_batch_size(num_data_shreds, is_last_in_slot); let num_coding_shreds = erasure_batch_size - num_data_shreds; let proof_size = get_proof_size(erasure_batch_size); debug_assert!(shreds @@ -1056,7 +1072,10 @@ mod test { itertools::Itertools, rand::{seq::SliceRandom, CryptoRng, Rng}, rayon::ThreadPoolBuilder, - solana_sdk::signature::{Keypair, Signer}, + solana_sdk::{ + packet::PACKET_DATA_SIZE, + signature::{Keypair, Signer}, + }, std::{cmp::Ordering, iter::repeat_with}, test_case::test_case, }; @@ -1124,8 +1143,7 @@ mod test { assert_eq!(entry, &bytes[..SIZE_OF_MERKLE_PROOF_ENTRY]); } - fn run_merkle_tree_round_trip(size: usize) { - let mut rng = rand::thread_rng(); + fn run_merkle_tree_round_trip(rng: &mut R, size: usize) { let nodes = repeat_with(|| rng.gen::<[u8; 32]>()).map(Hash::from); let nodes: Vec<_> = nodes.take(size).collect(); let tree = make_merkle_tree(nodes.clone()); @@ -1145,8 +1163,9 @@ mod test { #[test] fn test_merkle_tree_round_trip() { - for size in [1, 2, 3, 4, 5, 6, 7, 8, 9, 19, 37, 64, 79] { - run_merkle_tree_round_trip(size); + let mut rng = rand::thread_rng(); + for size in 1..=143 { + run_merkle_tree_round_trip(&mut rng, size); } } @@ -1327,32 +1346,49 @@ mod test { } } - #[test_case(0)] - #[test_case(15600)] - #[test_case(31200)] - #[test_case(46800)] - fn test_make_shreds_from_data(data_size: usize) { + #[test_case(0, false)] + #[test_case(0, true)] + #[test_case(15600, false)] + #[test_case(15600, true)] + #[test_case(31200, false)] + #[test_case(31200, true)] + #[test_case(46800, false)] + #[test_case(46800, true)] + fn test_make_shreds_from_data(data_size: usize, is_last_in_slot: bool) { let mut rng = rand::thread_rng(); let data_size = data_size.saturating_sub(16); let reed_solomon_cache = ReedSolomonCache::default(); for data_size in data_size..data_size + 32 { - run_make_shreds_from_data(&mut rng, data_size, &reed_solomon_cache); + run_make_shreds_from_data(&mut rng, data_size, is_last_in_slot, &reed_solomon_cache); } } - #[test] - fn test_make_shreds_from_data_rand() { + #[test_case(false)] + #[test_case(true)] + fn test_make_shreds_from_data_rand(is_last_in_slot: bool) { let mut rng = rand::thread_rng(); let reed_solomon_cache = ReedSolomonCache::default(); for _ in 0..32 { let data_size = rng.gen_range(0..31200 * 7); - run_make_shreds_from_data(&mut rng, data_size, &reed_solomon_cache); + run_make_shreds_from_data(&mut rng, data_size, is_last_in_slot, &reed_solomon_cache); + } + } + + #[ignore] + #[test_case(false)] + #[test_case(true)] + fn test_make_shreds_from_data_paranoid(is_last_in_slot: bool) { + let mut rng = rand::thread_rng(); + let reed_solomon_cache = ReedSolomonCache::default(); + for data_size in 0..=PACKET_DATA_SIZE * 4 * 64 { + run_make_shreds_from_data(&mut rng, data_size, is_last_in_slot, &reed_solomon_cache); } } fn run_make_shreds_from_data( rng: &mut R, data_size: usize, + is_last_in_slot: bool, reed_solomon_cache: &ReedSolomonCache, ) { let thread_pool = ThreadPoolBuilder::new().num_threads(2).build().unwrap(); @@ -1373,7 +1409,7 @@ mod test { parent_slot, shred_version, reference_tick, - true, // is_last_in_slot + is_last_in_slot, next_shred_index, next_code_index, reed_solomon_cache, @@ -1480,14 +1516,17 @@ mod test { .flags .contains(ShredFlags::LAST_SHRED_IN_SLOT)) .count(), - 1 + if is_last_in_slot { 1 } else { 0 } + ); + assert_eq!( + data_shreds + .last() + .unwrap() + .data_header + .flags + .contains(ShredFlags::LAST_SHRED_IN_SLOT), + is_last_in_slot ); - assert!(data_shreds - .last() - .unwrap() - .data_header - .flags - .contains(ShredFlags::LAST_SHRED_IN_SLOT)); // Assert that data shreds can be recovered from coding shreds. let recovered_data_shreds: Vec<_> = shreds .iter() diff --git a/ledger/src/shredder.rs b/ledger/src/shredder.rs index 1a597c41f984d4..f3203876de7066 100644 --- a/ledger/src/shredder.rs +++ b/ledger/src/shredder.rs @@ -207,7 +207,13 @@ impl Shredder { .iter() .scan(next_code_index, |next_code_index, chunk| { let num_data_shreds = chunk.len(); - let erasure_batch_size = get_erasure_batch_size(num_data_shreds); + let is_last_in_slot = chunk + .last() + .copied() + .map(Shred::last_in_slot) + .unwrap_or(true); + let erasure_batch_size = + get_erasure_batch_size(num_data_shreds, is_last_in_slot); *next_code_index += (erasure_batch_size - num_data_shreds) as u32; Some(*next_code_index) }), @@ -276,7 +282,12 @@ impl Shredder { && shred.version() == version && shred.fec_set_index() == fec_set_index)); let num_data = data.len(); - let num_coding = get_erasure_batch_size(num_data) + let is_last_in_slot = data + .last() + .map(Borrow::borrow) + .map(Shred::last_in_slot) + .unwrap_or(true); + let num_coding = get_erasure_batch_size(num_data, is_last_in_slot) .checked_sub(num_data) .unwrap(); assert!(num_coding > 0); @@ -434,11 +445,16 @@ impl Default for ReedSolomonCache { } /// Maps number of data shreds in each batch to the erasure batch size. -pub(crate) fn get_erasure_batch_size(num_data_shreds: usize) -> usize { - ERASURE_BATCH_SIZE +pub(crate) fn get_erasure_batch_size(num_data_shreds: usize, is_last_in_slot: bool) -> usize { + let erasure_batch_size = ERASURE_BATCH_SIZE .get(num_data_shreds) .copied() - .unwrap_or(2 * num_data_shreds) + .unwrap_or(2 * num_data_shreds); + if is_last_in_slot { + erasure_batch_size.max(2 * DATA_SHREDS_PER_FEC_BLOCK) + } else { + erasure_batch_size + } } // Returns offsets to fec_set_index when spliting shreds into erasure batches. @@ -518,17 +534,19 @@ mod tests { }) .collect(); + let is_last_in_slot = true; let size = serialized_size(&entries).unwrap() as usize; // Integer division to ensure we have enough shreds to fit all the data let data_buffer_size = ShredData::capacity(/*merkle_proof_size:*/ None).unwrap(); let num_expected_data_shreds = (size + data_buffer_size - 1) / data_buffer_size; let num_expected_coding_shreds = - get_erasure_batch_size(num_expected_data_shreds) - num_expected_data_shreds; + get_erasure_batch_size(num_expected_data_shreds, is_last_in_slot) + - num_expected_data_shreds; let start_index = 0; let (data_shreds, coding_shreds) = shredder.entries_to_shreds( &keypair, &entries, - true, // is_last_in_slot + is_last_in_slot, start_index, // next_shred_index start_index, // next_code_index true, // merkle_variant @@ -792,7 +810,7 @@ mod tests { assert_eq!(data_shreds.len(), num_data_shreds); assert_eq!( num_coding_shreds, - get_erasure_batch_size(num_data_shreds) - num_data_shreds + get_erasure_batch_size(num_data_shreds, is_last_in_slot) - num_data_shreds ); let all_shreds = data_shreds @@ -1189,7 +1207,10 @@ mod tests { .iter() .group_by(|shred| shred.fec_set_index()) .into_iter() - .map(|(_, chunk)| get_erasure_batch_size(chunk.count())) + .map(|(_, chunk)| { + let chunk: Vec<_> = chunk.collect(); + get_erasure_batch_size(chunk.len(), chunk.last().unwrap().last_in_slot()) + }) .sum(); assert_eq!(coding_shreds.len(), num_shreds - data_shreds.len()); } @@ -1232,9 +1253,10 @@ mod tests { #[test] fn test_max_shreds_per_slot() { for num_data_shreds in 32..128 { - let num_coding_shreds = get_erasure_batch_size(num_data_shreds) - .checked_sub(num_data_shreds) - .unwrap(); + let num_coding_shreds = + get_erasure_batch_size(num_data_shreds, /*is_last_in_slot:*/ false) + .checked_sub(num_data_shreds) + .unwrap(); assert!( MAX_DATA_SHREDS_PER_SLOT * num_coding_shreds <= MAX_CODE_SHREDS_PER_SLOT * num_data_shreds diff --git a/local-cluster/tests/local_cluster.rs b/local-cluster/tests/local_cluster.rs index 658fdf0de3b04e..90ffae34f10ee5 100644 --- a/local-cluster/tests/local_cluster.rs +++ b/local-cluster/tests/local_cluster.rs @@ -2558,6 +2558,7 @@ fn run_test_load_program_accounts_partition(scan_commitment: CommitmentConfig) { #[test] #[serial] +#[ignore] fn test_rpc_block_subscribe() { let total_stake = 100 * DEFAULT_NODE_STAKE; let leader_stake = total_stake; From 492eb247afe6b3908f52886f3bd524e1a8e63f61 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Fri, 15 Dec 2023 22:25:12 -0600 Subject: [PATCH 118/213] Update version to v1.17.12 (#34492) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e52ffd290b2151..1c988df3e70802 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.11" +version = "1.17.12" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.11" +version = "1.17.12" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.11" +version = "1.17.12" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.11" +version = "1.17.12" dependencies = [ "Inflector", "assert_matches", @@ -5123,7 +5123,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 2.33.3", "log", @@ -5137,7 +5137,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 2.33.3", "log", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.11" +version = "1.17.12" dependencies = [ "arrayref", "assert_matches", @@ -5231,7 +5231,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "bytemuck", @@ -5250,7 +5250,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -5261,7 +5261,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5285,7 +5285,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.11" +version = "1.17.12" dependencies = [ "serde", "solana-sdk", @@ -5311,7 +5311,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "crossbeam-channel", @@ -5329,7 +5329,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5340,7 +5340,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bv", "fnv", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -5419,7 +5419,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -5430,7 +5430,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bv", "bytemuck", @@ -5449,7 +5449,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "solana-logger", @@ -5457,7 +5457,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_cmd", "bzip2", @@ -5478,11 +5478,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.11" +version = "1.17.12" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.11" +version = "1.17.12" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5493,7 +5493,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "chrono", @@ -5510,7 +5510,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "chrono", @@ -5528,7 +5528,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.11" +version = "1.17.12" dependencies = [ "anyhow", "dirs-next", @@ -5596,7 +5596,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.11" +version = "1.17.12" dependencies = [ "Inflector", "base64 0.21.4", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-trait", "bincode", @@ -5654,7 +5654,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.11" +version = "1.17.12" dependencies = [ "futures-util", "rand 0.8.5", @@ -5684,7 +5684,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5692,7 +5692,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "chrono", @@ -5705,7 +5705,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-trait", "bincode", @@ -5729,7 +5729,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5812,7 +5812,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.11" +version = "1.17.12" dependencies = [ "lazy_static", "log", @@ -5837,7 +5837,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "clap 3.2.23", @@ -5867,7 +5867,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "console", "indicatif", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5890,7 +5890,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -5912,7 +5912,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "byteorder", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.11" +version = "1.17.12" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5964,7 +5964,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.11" +version = "1.17.12" dependencies = [ "proc-macro2", "quote", @@ -5974,7 +5974,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.11" +version = "1.17.12" dependencies = [ "base64 0.21.4", "bincode", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "solana-accounts-db", @@ -6010,7 +6010,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "solana-sdk", @@ -6020,7 +6020,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bs58", "crossbeam-channel", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -6096,7 +6096,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.11" +version = "1.17.12" dependencies = [ "atty", "bincode", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bs58", "clap 3.2.23", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -6216,7 +6216,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_cmd", "bs58", @@ -6265,7 +6265,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "log", @@ -6277,7 +6277,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.11" +version = "1.17.12" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.11" +version = "1.17.12" dependencies = [ "env_logger", "lazy_static", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "solana-sdk", @@ -6345,11 +6345,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.11" +version = "1.17.12" [[package]] name = "solana-merkle-root-bench" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 2.33.3", "log", @@ -6362,7 +6362,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.11" +version = "1.17.12" dependencies = [ "fast-math", "hex", @@ -6371,7 +6371,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.11" +version = "1.17.12" dependencies = [ "crossbeam-channel", "env_logger", @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "clap 3.2.23", @@ -6418,7 +6418,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "reqwest", @@ -6428,7 +6428,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.11" +version = "1.17.12" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6459,7 +6459,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -6480,7 +6480,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 3.2.23", "log", @@ -6495,7 +6495,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "anyhow", "ark-bn254", @@ -6552,7 +6552,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6581,7 +6581,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "async-trait", @@ -6610,7 +6610,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "anyhow", "crossbeam-channel", @@ -6634,7 +6634,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-mutex", "async-trait", @@ -6662,7 +6662,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.11" +version = "1.17.12" dependencies = [ "lazy_static", "num_cpus", @@ -6670,7 +6670,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "console", @@ -6689,7 +6689,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.11" +version = "1.17.12" dependencies = [ "base64 0.21.4", "bincode", @@ -6748,7 +6748,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "async-trait", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.11" +version = "1.17.12" dependencies = [ "base64 0.21.4", "bs58", @@ -6797,7 +6797,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "anyhow", "clap 2.33.3", @@ -6814,7 +6814,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "bs58", @@ -6841,7 +6841,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.11" +version = "1.17.12" dependencies = [ "arrayref", "assert_matches", @@ -6924,7 +6924,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.11" +version = "1.17.12" dependencies = [ "anyhow", "assert_matches", @@ -6982,7 +6982,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bs58", "proc-macro2", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.11" +version = "1.17.12" dependencies = [ "crossbeam-channel", "log", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7024,7 +7024,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -7041,7 +7041,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.11" +version = "1.17.12" dependencies = [ "backoff", "bincode", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "bs58", @@ -7089,7 +7089,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 2.33.3", "log", @@ -7101,7 +7101,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "async-channel", @@ -7133,7 +7133,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -7147,7 +7147,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.11" +version = "1.17.12" dependencies = [ "base64 0.21.4", "bincode", @@ -7177,7 +7177,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -7224,7 +7224,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-trait", "bincode", @@ -7246,7 +7246,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "clap 2.33.3", @@ -7273,7 +7273,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.11" +version = "1.17.12" dependencies = [ "Inflector", "base64 0.21.4", @@ -7296,7 +7296,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -7333,7 +7333,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-trait", "solana-connection-cache", @@ -7346,7 +7346,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.11" +version = "1.17.12" dependencies = [ "serde_json", "solana-metrics", @@ -7354,7 +7354,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.11" +version = "1.17.12" dependencies = [ "chrono", "clap 2.33.3", @@ -7418,7 +7418,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "rustc_version 0.4.0", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "crossbeam-channel", @@ -7451,7 +7451,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -7474,7 +7474,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 2.33.3", "humantime", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bs58", "clap 3.2.23", @@ -7512,7 +7512,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bytemuck", "criterion", @@ -7526,7 +7526,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7538,7 +7538,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.11" +version = "1.17.12" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index e52b802af2ded8..0bc870f646f8b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.11" +version = "1.17.12" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.11" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.11" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.11" } -solana-banks-client = { path = "banks-client", version = "=1.17.11" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.11" } -solana-banks-server = { path = "banks-server", version = "=1.17.11" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.11" } -solana-bloom = { path = "bloom", version = "=1.17.11" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.11" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.11" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.11", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.11" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.11" } -solana-cli = { path = "cli", version = "=1.17.11" } -solana-cli-config = { path = "cli-config", version = "=1.17.11" } -solana-cli-output = { path = "cli-output", version = "=1.17.11" } -solana-client = { path = "client", version = "=1.17.11" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.11" } -solana-config-program = { path = "programs/config", version = "=1.17.11" } -solana-core = { path = "core", version = "=1.17.11" } -solana-cost-model = { path = "cost-model", version = "=1.17.11" } -solana-download-utils = { path = "download-utils", version = "=1.17.11" } -solana-entry = { path = "entry", version = "=1.17.11" } -solana-faucet = { path = "faucet", version = "=1.17.11" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.11" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.11" } -solana-genesis = { path = "genesis", version = "=1.17.11" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.11" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.11" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.11" } -solana-gossip = { path = "gossip", version = "=1.17.11" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.11" } -solana-ledger = { path = "ledger", version = "=1.17.11" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.11" } -solana-logger = { path = "logger", version = "=1.17.11" } -solana-measure = { path = "measure", version = "=1.17.11" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.11" } -solana-metrics = { path = "metrics", version = "=1.17.11" } -solana-net-utils = { path = "net-utils", version = "=1.17.11" } -solana-notifier = { path = "notifier", version = "=1.17.11" } -solana-perf = { path = "perf", version = "=1.17.11" } -solana-poh = { path = "poh", version = "=1.17.11" } -solana-program = { path = "sdk/program", version = "=1.17.11" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.11" } -solana-program-test = { path = "program-test", version = "=1.17.11" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.11" } -solana-quic-client = { path = "quic-client", version = "=1.17.11" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.11" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.11", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.11" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.11", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.11" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.11" } -solana-runtime = { path = "runtime", version = "=1.17.11" } -solana-sdk = { path = "sdk", version = "=1.17.11" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.11" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.11" } -solana-stake-program = { path = "programs/stake", version = "=1.17.11" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.11" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.11" } -solana-streamer = { path = "streamer", version = "=1.17.11" } -solana-system-program = { path = "programs/system", version = "=1.17.11" } -solana-test-validator = { path = "test-validator", version = "=1.17.11" } -solana-thin-client = { path = "thin-client", version = "=1.17.11" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.11", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.11" } -solana-turbine = { path = "turbine", version = "=1.17.11" } -solana-udp-client = { path = "udp-client", version = "=1.17.11" } -solana-version = { path = "version", version = "=1.17.11" } -solana-vote = { path = "vote", version = "=1.17.11" } -solana-vote-program = { path = "programs/vote", version = "=1.17.11" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.11" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.11" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.11" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.12" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.12" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.12" } +solana-banks-client = { path = "banks-client", version = "=1.17.12" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.12" } +solana-banks-server = { path = "banks-server", version = "=1.17.12" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.12" } +solana-bloom = { path = "bloom", version = "=1.17.12" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.12" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.12" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.12", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.12" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.12" } +solana-cli = { path = "cli", version = "=1.17.12" } +solana-cli-config = { path = "cli-config", version = "=1.17.12" } +solana-cli-output = { path = "cli-output", version = "=1.17.12" } +solana-client = { path = "client", version = "=1.17.12" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.12" } +solana-config-program = { path = "programs/config", version = "=1.17.12" } +solana-core = { path = "core", version = "=1.17.12" } +solana-cost-model = { path = "cost-model", version = "=1.17.12" } +solana-download-utils = { path = "download-utils", version = "=1.17.12" } +solana-entry = { path = "entry", version = "=1.17.12" } +solana-faucet = { path = "faucet", version = "=1.17.12" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.12" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.12" } +solana-genesis = { path = "genesis", version = "=1.17.12" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.12" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.12" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.12" } +solana-gossip = { path = "gossip", version = "=1.17.12" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.12" } +solana-ledger = { path = "ledger", version = "=1.17.12" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.12" } +solana-logger = { path = "logger", version = "=1.17.12" } +solana-measure = { path = "measure", version = "=1.17.12" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.12" } +solana-metrics = { path = "metrics", version = "=1.17.12" } +solana-net-utils = { path = "net-utils", version = "=1.17.12" } +solana-notifier = { path = "notifier", version = "=1.17.12" } +solana-perf = { path = "perf", version = "=1.17.12" } +solana-poh = { path = "poh", version = "=1.17.12" } +solana-program = { path = "sdk/program", version = "=1.17.12" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.12" } +solana-program-test = { path = "program-test", version = "=1.17.12" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.12" } +solana-quic-client = { path = "quic-client", version = "=1.17.12" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.12" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.12", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.12" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.12", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.12" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.12" } +solana-runtime = { path = "runtime", version = "=1.17.12" } +solana-sdk = { path = "sdk", version = "=1.17.12" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.12" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.12" } +solana-stake-program = { path = "programs/stake", version = "=1.17.12" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.12" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.12" } +solana-streamer = { path = "streamer", version = "=1.17.12" } +solana-system-program = { path = "programs/system", version = "=1.17.12" } +solana-test-validator = { path = "test-validator", version = "=1.17.12" } +solana-thin-client = { path = "thin-client", version = "=1.17.12" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.12", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.12" } +solana-turbine = { path = "turbine", version = "=1.17.12" } +solana-udp-client = { path = "udp-client", version = "=1.17.12" } +solana-version = { path = "version", version = "=1.17.12" } +solana-vote = { path = "vote", version = "=1.17.12" } +solana-vote-program = { path = "programs/vote", version = "=1.17.12" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.12" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.12" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.12" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index c59d983f7124ce..ae70628801ac05 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4447,7 +4447,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.11" +version = "1.17.12" dependencies = [ "Inflector", "base64 0.21.4", @@ -4469,7 +4469,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.11" +version = "1.17.12" dependencies = [ "arrayref", "bincode", @@ -4526,7 +4526,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "bytemuck", @@ -4545,7 +4545,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4560,7 +4560,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.11" +version = "1.17.12" dependencies = [ "serde", "solana-sdk", @@ -4569,7 +4569,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "crossbeam-channel", @@ -4587,7 +4587,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bv", "fnv", @@ -4604,7 +4604,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4621,7 +4621,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.11" +version = "1.17.12" dependencies = [ "array-bytes", "serde", @@ -4631,7 +4631,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bv", "bytemuck", @@ -4647,7 +4647,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "chrono", "clap 2.33.3", @@ -4662,7 +4662,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.11" +version = "1.17.12" dependencies = [ "dirs-next", "lazy_static", @@ -4676,7 +4676,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.11" +version = "1.17.12" dependencies = [ "Inflector", "base64 0.21.4", @@ -4701,7 +4701,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-trait", "bincode", @@ -4732,7 +4732,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4740,7 +4740,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "chrono", @@ -4752,7 +4752,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-trait", "bincode", @@ -4772,7 +4772,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.11" +version = "1.17.12" dependencies = [ "base64 0.21.4", "bincode", @@ -4844,7 +4844,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.11" +version = "1.17.12" dependencies = [ "lazy_static", "log", @@ -4866,7 +4866,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "console", "indicatif", @@ -4878,7 +4878,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "crossbeam-channel", @@ -4898,7 +4898,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4920,7 +4920,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.11" +version = "1.17.12" dependencies = [ "ahash 0.8.3", "blake3", @@ -4948,7 +4948,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.11" +version = "1.17.12" dependencies = [ "proc-macro2", "quote", @@ -4958,7 +4958,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "solana-accounts-db", @@ -4969,7 +4969,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "solana-sdk", @@ -4979,7 +4979,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bs58", "crossbeam-channel", @@ -5004,7 +5004,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -5052,7 +5052,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "solana-measure", @@ -5127,7 +5127,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.11" +version = "1.17.12" dependencies = [ "env_logger", "lazy_static", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "solana-sdk", @@ -5144,7 +5144,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.11" +version = "1.17.12" dependencies = [ "fast-math", "solana-program", @@ -5152,7 +5152,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.11" +version = "1.17.12" dependencies = [ "crossbeam-channel", "gethostname", @@ -5165,7 +5165,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "clap 3.1.6", @@ -5185,7 +5185,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.11" +version = "1.17.12" dependencies = [ "ahash 0.8.3", "bincode", @@ -5212,7 +5212,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.11" +version = "1.17.12" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5228,7 +5228,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "ark-bn254", "ark-ec", @@ -5280,7 +5280,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.11" +version = "1.17.12" dependencies = [ "base64 0.21.4", "bincode", @@ -5306,7 +5306,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "async-trait", @@ -5334,7 +5334,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "crossbeam-channel", "futures-util", @@ -5357,7 +5357,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-mutex", "async-trait", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.11" +version = "1.17.12" dependencies = [ "lazy_static", "num_cpus", @@ -5390,7 +5390,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.11" +version = "1.17.12" dependencies = [ "console", "dialoguer", @@ -5407,7 +5407,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.11" +version = "1.17.12" dependencies = [ "base64 0.21.4", "bincode", @@ -5462,7 +5462,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-trait", "base64 0.21.4", @@ -5486,7 +5486,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.11" +version = "1.17.12" dependencies = [ "base64 0.21.4", "bs58", @@ -5506,7 +5506,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.11" +version = "1.17.12" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5517,7 +5517,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.11" +version = "1.17.12" dependencies = [ "arrayref", "base64 0.21.4", @@ -5592,7 +5592,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5621,7 +5621,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5629,21 +5629,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.11" +version = "1.17.12" dependencies = [ "array-bytes", "solana-program", @@ -5651,7 +5651,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.11" +version = "1.17.12" dependencies = [ "array-bytes", "solana-program", @@ -5659,21 +5659,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5681,14 +5681,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.11" +version = "1.17.12" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5696,21 +5696,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.11" +version = "1.17.12" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5720,42 +5720,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.11" +version = "1.17.12" dependencies = [ "rustversion", "solana-program", @@ -5765,49 +5765,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5815,14 +5815,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-program-runtime", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5840,21 +5840,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5862,14 +5862,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.11" +version = "1.17.12" dependencies = [ "array-bytes", "solana-program", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.11" +version = "1.17.12" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5886,14 +5886,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-program-runtime", @@ -5911,21 +5911,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-program-runtime", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.11" +version = "1.17.12" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5943,7 +5943,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.11" +version = "1.17.12" dependencies = [ "blake3", "solana-program", @@ -5951,21 +5951,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-logger", "solana-program", @@ -5976,21 +5976,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", "solana-program-runtime", @@ -6000,21 +6000,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.11" +version = "1.17.12" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.11" +version = "1.17.12" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6066,7 +6066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bs58", "proc-macro2", @@ -6077,7 +6077,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.11" +version = "1.17.12" dependencies = [ "crossbeam-channel", "log", @@ -6091,7 +6091,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "log", @@ -6104,7 +6104,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.11" +version = "1.17.12" dependencies = [ "backoff", "bincode", @@ -6136,7 +6136,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "bs58", @@ -6151,7 +6151,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-channel", "bytes", @@ -6181,7 +6181,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "log", @@ -6193,7 +6193,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.11" +version = "1.17.12" dependencies = [ "base64 0.21.4", "bincode", @@ -6223,7 +6223,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "log", @@ -6236,7 +6236,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-trait", "bincode", @@ -6258,7 +6258,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.11" +version = "1.17.12" dependencies = [ "Inflector", "base64 0.21.4", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "bytes", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.11" +version = "1.17.12" dependencies = [ "async-trait", "solana-connection-cache", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.11" +version = "1.17.12" dependencies = [ "chrono", "clap 2.33.3", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.11" +version = "1.17.12" dependencies = [ "log", "rustc_version", @@ -6405,7 +6405,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.11" +version = "1.17.12" dependencies = [ "crossbeam-channel", "itertools", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bincode", "log", @@ -6442,7 +6442,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.11" +version = "1.17.12" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6454,7 +6454,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.11" +version = "1.17.12" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 5c3ee5122cc764..ac13b16796414f 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.11" +version = "1.17.12" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.11" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.11" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.11" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.11" } -solana-ledger = { path = "../../ledger", version = "=1.17.11" } -solana-logger = { path = "../../logger", version = "=1.17.11" } -solana-measure = { path = "../../measure", version = "=1.17.11" } -solana-program = { path = "../../sdk/program", version = "=1.17.11" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.11" } -solana-program-test = { path = "../../program-test", version = "=1.17.11" } -solana-runtime = { path = "../../runtime", version = "=1.17.11" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.11" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.11" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.11", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.11" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.11" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.11" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.11", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.11" } -solana-sdk = { path = "../../sdk", version = "=1.17.11" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.11" } -solana-validator = { path = "../../validator", version = "=1.17.11" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.11" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.12" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.12" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.12" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.12" } +solana-ledger = { path = "../../ledger", version = "=1.17.12" } +solana-logger = { path = "../../logger", version = "=1.17.12" } +solana-measure = { path = "../../measure", version = "=1.17.12" } +solana-program = { path = "../../sdk/program", version = "=1.17.12" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.12" } +solana-program-test = { path = "../../program-test", version = "=1.17.12" } +solana-runtime = { path = "../../runtime", version = "=1.17.12" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.12" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.12" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.12", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.12" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.12" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.12" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.12", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.12" } +solana-sdk = { path = "../../sdk", version = "=1.17.12" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.12" } +solana-validator = { path = "../../validator", version = "=1.17.12" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.12" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index f88bd72f0fc5d6..1f06913ba0f086 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.11" +version = "1.17.12" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.11" } +solana-program = { path = "../../../../program", version = "=1.17.12" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 419e68ace58877..dfb30fbbceaaea 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.11" +version = "1.17.12" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.11" } +solana-program = { path = "../../../../program", version = "=1.17.12" } [lib] crate-type = ["cdylib"] From 5787b48b92e4f64baa3e354c6eac3e6db6375e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Mei=C3=9Fner?= Date: Sat, 16 Dec 2023 14:27:17 +0100 Subject: [PATCH 119/213] v1.17 - Cooperative Program Loading (#34487) * Disables verification-less reloading. * Refactors LoadedPrograms::extract() to use a mutable parameter instead of returning the list of missing entries. * cargo fmt * Refactors LoadedPrograms::extract() to use a mutable parameter instead of returning a LoadedProgramsForTxBatch. * Adds explicit SecondLevel structure to LoadedPrograms. * Adds cooperative_loading_task. * Implements cooperative loading in the bank. * Fixes fork graph in tests. * Adds LoadingTaskWaiter. --- program-runtime/src/loaded_programs.rs | 790 +++++++++++++------------ programs/sbf/tests/programs.rs | 14 +- runtime/src/bank.rs | 84 +-- 3 files changed, 471 insertions(+), 417 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index b7bf3365648b66..dc6dcd9b03c798 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -25,7 +25,7 @@ use { fmt::{Debug, Formatter}, sync::{ atomic::{AtomicU64, Ordering}, - Arc, Mutex, RwLock, + Arc, Condvar, Mutex, RwLock, }, }, }; @@ -451,12 +451,67 @@ impl Default for ProgramRuntimeEnvironments { } } +#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)] +pub struct LoadingTaskCookie(u64); + +impl LoadingTaskCookie { + fn new() -> Self { + Self(0) + } + + fn update(&mut self) { + let LoadingTaskCookie(cookie) = self; + *cookie = cookie.wrapping_add(1); + } +} + +/// Prevents excessive polling during cooperative loading +#[derive(Debug, Default)] +pub struct LoadingTaskWaiter { + cookie: Mutex, + cond: Condvar, +} + +impl LoadingTaskWaiter { + pub fn new() -> Self { + Self { + cookie: Mutex::new(LoadingTaskCookie::new()), + cond: Condvar::new(), + } + } + + pub fn cookie(&self) -> LoadingTaskCookie { + *self.cookie.lock().unwrap() + } + + pub fn notify(&self) { + let mut cookie = self.cookie.lock().unwrap(); + cookie.update(); + self.cond.notify_all(); + } + + pub fn wait(&self, cookie: LoadingTaskCookie) -> LoadingTaskCookie { + let cookie_guard = self.cookie.lock().unwrap(); + *self + .cond + .wait_while(cookie_guard, |current_cookie| *current_cookie == cookie) + .unwrap() + } +} + +#[derive(Debug, Default)] +struct SecondLevel { + slot_versions: Vec>, + /// Contains the bank and TX batch a program at this address is currently being loaded + cooperative_loading_lock: Option<(Slot, std::thread::ThreadId)>, +} + #[derive(Debug)] pub struct LoadedPrograms { /// A two level index: /// - /// Pubkey is the address of a program, multiple versions can coexists simultaneously under the same address (in different slots). - entries: HashMap>>, + /// The first level is for the address at which programs are deployed and the second level for the slot (and thus also fork). + entries: HashMap, /// The slot of the last rerooting pub latest_root_slot: Slot, /// The epoch of the last rerooting @@ -473,6 +528,7 @@ pub struct LoadedPrograms { pub programs_to_recompile: Vec<(Pubkey, Arc)>, pub stats: Stats, pub fork_graph: Option>>, + pub loading_task_waiter: Arc, } #[derive(Clone, Debug, Default)] @@ -484,11 +540,6 @@ pub struct LoadedProgramsForTxBatch { pub environments: ProgramRuntimeEnvironments, } -pub struct ExtractedPrograms { - pub loaded: LoadedProgramsForTxBatch, - pub missing: HashMap, -} - impl LoadedProgramsForTxBatch { pub fn new(slot: Slot, environments: ProgramRuntimeEnvironments) -> Self { Self { @@ -559,6 +610,7 @@ impl LoadedPrograms { programs_to_recompile: Vec::default(), stats: Stats::default(), fork_graph: None, + loading_task_waiter: Arc::new(LoadingTaskWaiter::default()), } } @@ -584,12 +636,12 @@ impl LoadedPrograms { key: Pubkey, entry: Arc, ) -> (bool, Arc) { - let second_level = self.entries.entry(key).or_default(); - let index = second_level + let slot_versions = &mut self.entries.entry(key).or_default().slot_versions; + let index = slot_versions .iter() .position(|at| at.effective_slot >= entry.effective_slot); if let Some((existing, entry_index)) = - index.and_then(|index| second_level.get(index).map(|value| (value, index))) + index.and_then(|index| slot_versions.get(index).map(|value| (value, index))) { if existing.deployment_slot == entry.deployment_slot && existing.effective_slot == entry.effective_slot @@ -605,13 +657,13 @@ impl LoadedPrograms { existing.ix_usage_counter.load(Ordering::Relaxed), Ordering::Relaxed, ); - second_level.remove(entry_index); + slot_versions.remove(entry_index); } else if existing.is_tombstone() != entry.is_tombstone() { // Either the old entry is tombstone and the new one is not. // (Let's give the new entry a chance). // Or, the old entry is not a tombstone and the new one is a tombstone. // (Remove the old entry, as the tombstone makes it obsolete). - second_level.remove(entry_index); + slot_versions.remove(entry_index); } else { self.stats.replacements.fetch_add(1, Ordering::Relaxed); return (true, existing.clone()); @@ -619,7 +671,7 @@ impl LoadedPrograms { } } self.stats.insertions.fetch_add(1, Ordering::Relaxed); - second_level.insert(index.unwrap_or(second_level.len()), entry.clone()); + slot_versions.insert(index.unwrap_or(slot_versions.len()), entry.clone()); (false, entry) } @@ -635,7 +687,9 @@ impl LoadedPrograms { pub fn prune_by_deployment_slot(&mut self, slot: Slot) { for second_level in self.entries.values_mut() { - second_level.retain(|entry| entry.deployment_slot != slot); + second_level + .slot_versions + .retain(|entry| entry.deployment_slot != slot); } self.remove_programs_with_no_entries(); } @@ -663,7 +717,8 @@ impl LoadedPrograms { // Remove entries un/re/deployed on orphan forks let mut first_ancestor_found = false; let mut first_ancestor_env = None; - *second_level = second_level + second_level.slot_versions = second_level + .slot_versions .iter() .rev() .filter(|entry| { @@ -719,7 +774,7 @@ impl LoadedPrograms { }) .cloned() .collect(); - second_level.reverse(); + second_level.slot_versions.reverse(); } self.remove_programs_with_no_entries(); debug_assert!(self.latest_root_slot <= new_root_slot); @@ -772,89 +827,114 @@ impl LoadedPrograms { /// Extracts a subset of the programs relevant to a transaction batch /// and returns which program accounts the accounts DB needs to load. pub fn extract( - &self, + &mut self, working_slot: &S, - keys: impl Iterator, - ) -> Arc> { - let environments = self.get_environments_for_epoch(working_slot.current_epoch()); - let current_slot = working_slot.current_slot(); - let extracted = Arc::new(Mutex::new(ExtractedPrograms { - loaded: LoadedProgramsForTxBatch { - entries: HashMap::new(), - slot: current_slot, - environments: environments.clone(), - }, - missing: HashMap::new(), - })); - let mut extracting = extracted.lock().unwrap(); - extracting.loaded.entries = keys - .filter_map(|(key, (match_criteria, usage_count))| { - let mut reloading = false; - if let Some(second_level) = self.entries.get(&key) { - for entry in second_level.iter().rev() { - let is_ancestor = if let Some(fork_graph) = &self.fork_graph { - fork_graph - .read() - .map(|fork_graph_r| { - matches!( - fork_graph_r - .relationship(entry.deployment_slot, current_slot), - BlockRelation::Ancestor - ) - }) - .unwrap_or(false) - } else { - working_slot.is_ancestor(entry.deployment_slot) - }; - - if entry.deployment_slot <= self.latest_root_slot - || entry.deployment_slot == current_slot - || is_ancestor - { - if current_slot >= entry.effective_slot { - if !Self::is_entry_usable(entry, current_slot, &match_criteria) - || !Self::matches_environment(entry, environments) - { + search_for: &mut Vec<(Pubkey, (LoadedProgramMatchCriteria, u64))>, + loaded_programs_for_tx_batch: &mut LoadedProgramsForTxBatch, + ) -> Option<(Pubkey, u64)> { + let mut cooperative_loading_task = None; + search_for.retain(|(key, (match_criteria, usage_count))| { + if let Some(second_level) = self.entries.get_mut(key) { + for entry in second_level.slot_versions.iter().rev() { + let is_ancestor = if let Some(fork_graph) = &self.fork_graph { + fork_graph + .read() + .map(|fork_graph_r| { + matches!( + fork_graph_r.relationship( + entry.deployment_slot, + loaded_programs_for_tx_batch.slot + ), + BlockRelation::Ancestor + ) + }) + .unwrap_or(false) + } else { + working_slot.is_ancestor(entry.deployment_slot) + }; + + if entry.deployment_slot <= self.latest_root_slot + || entry.deployment_slot == loaded_programs_for_tx_batch.slot + || is_ancestor + { + let entry_to_return = + if loaded_programs_for_tx_batch.slot >= entry.effective_slot { + if !Self::is_entry_usable( + entry, + loaded_programs_for_tx_batch.slot, + match_criteria, + ) || !Self::matches_environment( + entry, + &loaded_programs_for_tx_batch.environments, + ) { break; } if let LoadedProgramType::Unloaded(_environment) = &entry.program { - reloading = true; break; } - entry - .tx_usage_counter - .fetch_add(usage_count, Ordering::Relaxed); - return Some((key, entry.clone())); - } else if entry.is_implicit_delay_visibility_tombstone(current_slot) { + entry.clone() + } else if entry.is_implicit_delay_visibility_tombstone( + loaded_programs_for_tx_batch.slot, + ) { // Found a program entry on the current fork, but it's not effective // yet. It indicates that the program has delayed visibility. Return // the tombstone to reflect that. - let entry_to_return = Arc::new(LoadedProgram::new_tombstone( + Arc::new(LoadedProgram::new_tombstone( entry.deployment_slot, LoadedProgramType::DelayVisibility, - )); - entry_to_return - .tx_usage_counter - .fetch_add(usage_count, Ordering::Relaxed); - return Some((key, entry_to_return)); - } - } + )) + } else { + continue; + }; + entry_to_return + .tx_usage_counter + .fetch_add(*usage_count, Ordering::Relaxed); + loaded_programs_for_tx_batch + .entries + .insert(*key, entry_to_return); + return false; } } - extracting.missing.insert(key, (usage_count, reloading)); - None - }) - .collect::>>(); + } + if cooperative_loading_task.is_none() { + // We have not selected a task so far + let second_level = self.entries.entry(*key).or_default(); + if second_level.cooperative_loading_lock.is_none() { + // Select this missing entry which is not selected by any other TX batch yet + cooperative_loading_task = Some((*key, *usage_count)); + second_level.cooperative_loading_lock = + Some((working_slot.current_slot(), std::thread::current().id())); + } + } + true + }); self.stats .misses - .fetch_add(extracting.missing.len() as u64, Ordering::Relaxed); - self.stats - .hits - .fetch_add(extracting.loaded.entries.len() as u64, Ordering::Relaxed); - drop(extracting); - extracted + .fetch_add(search_for.len() as u64, Ordering::Relaxed); + self.stats.hits.fetch_add( + loaded_programs_for_tx_batch.entries.len() as u64, + Ordering::Relaxed, + ); + cooperative_loading_task + } + + /// Called by Bank::replenish_program_cache() for each program that is done loading. + pub fn finish_cooperative_loading_task( + &mut self, + slot: Slot, + key: Pubkey, + loaded_program: Arc, + ) { + let second_level = self.entries.entry(key).or_default(); + debug_assert_eq!( + second_level.cooperative_loading_lock, + Some((slot, std::thread::current().id())) + ); + second_level.cooperative_loading_lock = None; + self.assign_program(key, loaded_program); + self.loading_task_waiter.notify(); } pub fn merge(&mut self, tx_batch_cache: &LoadedProgramsForTxBatch) { @@ -873,8 +953,10 @@ impl LoadedPrograms { ) -> Vec<(Pubkey, Arc)> { self.entries .iter() - .flat_map(|(id, list)| { - list.iter() + .flat_map(|(id, second_level)| { + second_level + .slot_versions + .iter() .filter_map(move |program| match program.program { LoadedProgramType::LegacyV0(_) | LoadedProgramType::LegacyV1(_) if include_program_runtime_v1 => @@ -910,8 +992,8 @@ impl LoadedPrograms { } fn unload_program(&mut self, id: &Pubkey) { - if let Some(entries) = self.entries.get_mut(id) { - for entry in entries.iter_mut() { + if let Some(second_level) = self.entries.get_mut(id) { + for entry in second_level.slot_versions.iter_mut() { if let Some(unloaded) = entry.to_unloaded() { *entry = Arc::new(unloaded); self.stats @@ -934,8 +1016,12 @@ impl LoadedPrograms { remove: impl Iterator)>, ) { for (id, program) in remove { - if let Some(entries) = self.entries.get_mut(id) { - if let Some(candidate) = entries.iter_mut().find(|entry| entry == &program) { + if let Some(second_level) = self.entries.get_mut(id) { + if let Some(candidate) = second_level + .slot_versions + .iter_mut() + .find(|entry| entry == &program) + { if let Some(unloaded) = candidate.to_unloaded() { if candidate.tx_usage_counter.load(Ordering::Relaxed) == 1 { self.stats.one_hit_wonders.fetch_add(1, Ordering::Relaxed); @@ -954,7 +1040,10 @@ impl LoadedPrograms { fn remove_programs_with_no_entries(&mut self) { let num_programs_before_removal = self.entries.len(); - self.entries.retain(|_, programs| !programs.is_empty()); + self.entries.retain(|_, second_level| { + !second_level.slot_versions.is_empty() + || second_level.cooperative_loading_lock.is_some() + }); if self.entries.len() < num_programs_before_removal { self.stats.empty_entries.fetch_add( num_programs_before_removal.saturating_sub(self.entries.len()) as u64, @@ -984,8 +1073,8 @@ impl solana_frozen_abi::abi_example::AbiExample for LoadedProgram mod tests { use { crate::loaded_programs::{ - BlockRelation, ExtractedPrograms, ForkGraph, LoadedProgram, LoadedProgramMatchCriteria, - LoadedProgramType, LoadedPrograms, ProgramRuntimeEnvironment, + BlockRelation, ForkGraph, LoadedProgram, LoadedProgramMatchCriteria, LoadedProgramType, + LoadedPrograms, LoadedProgramsForTxBatch, ProgramRuntimeEnvironment, ProgramRuntimeEnvironments, WorkingSlot, DELAY_VISIBILITY_SLOT_OFFSET, }, assert_matches::assert_matches, @@ -999,7 +1088,7 @@ mod tests { ops::ControlFlow, sync::{ atomic::{AtomicU64, Ordering}, - Arc, Mutex, RwLock, + Arc, RwLock, }, }, }; @@ -1102,8 +1191,9 @@ mod tests { cache .entries .values() - .map(|programs| { - programs + .map(|second_level| { + second_level + .slot_versions .iter() .filter(|program| predicate(&program.program)) .count() @@ -1243,8 +1333,8 @@ mod tests { let unloaded = cache .entries .iter() - .flat_map(|(id, cached_programs)| { - cached_programs.iter().filter_map(|program| { + .flat_map(|(id, second_level)| { + second_level.slot_versions.iter().filter_map(|program| { matches!(program.program, LoadedProgramType::Unloaded(_)) .then_some((*id, program.tx_usage_counter.load(Ordering::Relaxed))) }) @@ -1297,8 +1387,8 @@ mod tests { }); assert_eq!(num_unloaded, 1); - cache.entries.values().for_each(|programs| { - programs.iter().for_each(|program| { + cache.entries.values().for_each(|second_level| { + second_level.slot_versions.iter().for_each(|program| { if matches!(program.program, LoadedProgramType::Unloaded(_)) { // Test that the usage counter is retained for the unloaded program assert_eq!(program.tx_usage_counter.load(Ordering::Relaxed), 10); @@ -1315,8 +1405,8 @@ mod tests { new_test_loaded_program_with_usage(0, 2, AtomicU64::new(0)), ); - cache.entries.values().for_each(|programs| { - programs.iter().for_each(|program| { + cache.entries.values().for_each(|second_level| { + second_level.slot_versions.iter().for_each(|program| { if matches!(program.program, LoadedProgramType::Unloaded(_)) && program.deployment_slot == 0 && program.effective_slot == 2 @@ -1374,8 +1464,8 @@ mod tests { .entries .get(&program1) .expect("Failed to find the entry"); - assert_eq!(second_level.len(), 1); - assert!(second_level.get(0).unwrap().is_tombstone()); + assert_eq!(second_level.slot_versions.len(), 1); + assert!(second_level.slot_versions.first().unwrap().is_tombstone()); assert_eq!(tombstone.deployment_slot, 10); assert_eq!(tombstone.effective_slot, 10); @@ -1390,8 +1480,8 @@ mod tests { .entries .get(&program2) .expect("Failed to find the entry"); - assert_eq!(second_level.len(), 1); - assert!(!second_level.get(0).unwrap().is_tombstone()); + assert_eq!(second_level.slot_versions.len(), 1); + assert!(!second_level.slot_versions.first().unwrap().is_tombstone()); let tombstone = set_tombstone( &mut cache, @@ -1403,9 +1493,9 @@ mod tests { .entries .get(&program2) .expect("Failed to find the entry"); - assert_eq!(second_level.len(), 2); - assert!(!second_level.get(0).unwrap().is_tombstone()); - assert!(second_level.get(1).unwrap().is_tombstone()); + assert_eq!(second_level.slot_versions.len(), 2); + assert!(!second_level.slot_versions.first().unwrap().is_tombstone()); + assert!(second_level.slot_versions.get(1).unwrap().is_tombstone()); assert!(tombstone.is_tombstone()); assert_eq!(tombstone.deployment_slot, 60); assert_eq!(tombstone.effective_slot, 60); @@ -1514,6 +1604,7 @@ mod tests { .entries .get(&program1) .expect("failed to find the program") + .slot_versions .len(), 2 ); @@ -1526,20 +1617,25 @@ mod tests { .entries .get(&program1) .expect("failed to find the program") + .slot_versions .len(), 2 ); cache.prune(22, cache.latest_root_epoch.saturating_add(1)); - let entries = cache + let second_level = cache .entries .get(&program1) .expect("failed to find the program"); // Test that prune removed 1 entry, since epoch changed - assert_eq!(entries.len(), 1); + assert_eq!(second_level.slot_versions.len(), 1); - let entry = entries.first().expect("Failed to get the program").clone(); + let entry = second_level + .slot_versions + .first() + .expect("Failed to get the program") + .clone(); // Test that the correct entry remains in the cache assert_eq!(entry, updated_program); } @@ -1602,31 +1698,25 @@ mod tests { } fn match_slot( - extracted: &Arc>, + extracted: &LoadedProgramsForTxBatch, program: &Pubkey, deployment_slot: Slot, working_slot: Slot, ) -> bool { - let extracted = extracted.lock().unwrap(); - assert_eq!(extracted.loaded.slot, working_slot); + assert_eq!(extracted.slot, working_slot); extracted - .loaded - .find(program) + .entries + .get(program) .map(|entry| entry.deployment_slot == deployment_slot) .unwrap_or(false) } fn match_missing( - extracted: &Arc>, - key: &Pubkey, - reload: bool, + missing: &[(Pubkey, (LoadedProgramMatchCriteria, u64))], + program: &Pubkey, + _reload: bool, ) -> bool { - let extracted = extracted.lock().unwrap(); - extracted - .missing - .get(key) - .filter(|(_count, reloading)| *reloading == reload) - .is_some() + missing.iter().any(|(key, _)| key == program) } #[test] @@ -1707,34 +1797,30 @@ mod tests { // 23 // Testing fork 0 - 10 - 12 - 22 with current slot at 22 - let extracted = cache.extract( - &TestWorkingSlot(22), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 2)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 3)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 4)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 2)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 3)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 4)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(22, cache.environments.clone()); + cache.extract(&TestWorkingSlot(22), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 20, 22)); assert!(match_slot(&extracted, &program4, 0, 22)); - assert!(match_missing(&extracted, &program2, false)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program2, false)); + assert!(match_missing(&missing, &program3, false)); // Testing fork 0 - 5 - 11 - 15 - 16 with current slot at 16 - let extracted = cache.extract( - &TestWorkingSlot(15), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(15, cache.environments.clone()); + cache.extract(&TestWorkingSlot(15), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 15)); assert!(match_slot(&extracted, &program2, 11, 15)); @@ -1742,27 +1828,22 @@ mod tests { // The effective slot of program4 deployed in slot 15 is 19. So it should not be usable in slot 16. // A delay visibility tombstone should be returned here. let tombstone = extracted - .lock() - .unwrap() - .loaded .find(&program4) .expect("Failed to find the tombstone"); assert_matches!(tombstone.program, LoadedProgramType::DelayVisibility); assert_eq!(tombstone.deployment_slot, 15); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); // Testing the same fork above, but current slot is now 18 (equal to effective slot of program4). - let extracted = cache.extract( - &TestWorkingSlot(18), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(18, cache.environments.clone()); + cache.extract(&TestWorkingSlot(18), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 18)); assert!(match_slot(&extracted, &program2, 11, 18)); @@ -1770,19 +1851,17 @@ mod tests { // The effective slot of program4 deployed in slot 15 is 18. So it should be usable in slot 18. assert!(match_slot(&extracted, &program4, 15, 18)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); // Testing the same fork above, but current slot is now 23 (future slot than effective slot of program4). - let extracted = cache.extract( - &TestWorkingSlot(23), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(23, cache.environments.clone()); + cache.extract(&TestWorkingSlot(23), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 23)); assert!(match_slot(&extracted, &program2, 11, 23)); @@ -1790,33 +1869,28 @@ mod tests { // The effective slot of program4 deployed in slot 15 is 19. So it should be usable in slot 23. assert!(match_slot(&extracted, &program4, 15, 23)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); // Testing fork 0 - 5 - 11 - 15 - 16 with current slot at 11 - let extracted = cache.extract( - &TestWorkingSlot(11), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(11, cache.environments.clone()); + cache.extract(&TestWorkingSlot(11), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 11)); // program2 was updated at slot 11, but is not effective till slot 12. The result should contain a tombstone. let tombstone = extracted - .lock() - .unwrap() - .loaded .find(&program2) .expect("Failed to find the tombstone"); assert_matches!(tombstone.program, LoadedProgramType::DelayVisibility); assert_eq!(tombstone.deployment_slot, 11); assert!(match_slot(&extracted, &program4, 5, 11)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); // The following is a special case, where there's an expiration slot let test_program = Arc::new(LoadedProgram { @@ -1831,46 +1905,42 @@ mod tests { assert!(!cache.replenish(program4, test_program).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let extracted = cache.extract( - &TestWorkingSlot(19), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(19, cache.environments.clone()); + cache.extract(&TestWorkingSlot(19), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 19)); assert!(match_slot(&extracted, &program2, 11, 19)); // Program4 deployed at slot 19 should not be expired yet assert!(match_slot(&extracted, &program4, 19, 19)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 21 // This would cause program4 deployed at slot 19 to be expired. - let extracted = cache.extract( - &TestWorkingSlot(21), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(21, cache.environments.clone()); + cache.extract(&TestWorkingSlot(21), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 21)); assert!(match_slot(&extracted, &program2, 11, 21)); - assert!(match_missing(&extracted, &program3, false)); - assert!(match_missing(&extracted, &program4, false)); + assert!(match_missing(&missing, &program3, false)); + assert!(match_missing(&missing, &program4, false)); // Remove the expired entry to let the rest of the test continue - if let Some(programs) = cache.entries.get_mut(&program4) { - programs.pop(); + if let Some(second_level) = cache.entries.get_mut(&program4) { + second_level.slot_versions.pop(); } cache.prune(5, 0); @@ -1891,35 +1961,31 @@ mod tests { // 23 // Testing fork 11 - 15 - 16- 19 - 22 with root at 5 and current slot at 22 - let extracted = cache.extract( - &TestWorkingSlot(21), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(21, cache.environments.clone()); + cache.extract(&TestWorkingSlot(21), &mut missing, &mut extracted); // Since the fork was pruned, we should not find the entry deployed at slot 20. assert!(match_slot(&extracted, &program1, 0, 21)); assert!(match_slot(&extracted, &program2, 11, 21)); assert!(match_slot(&extracted, &program4, 15, 21)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); // Testing fork 0 - 5 - 11 - 25 - 27 with current slot at 27 - let extracted = cache.extract( - &TestWorkingSlot(27), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(27, cache.environments.clone()); + cache.extract(&TestWorkingSlot(27), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 27)); assert!(match_slot(&extracted, &program2, 11, 27)); @@ -1944,23 +2010,21 @@ mod tests { // 23 // Testing fork 16, 19, 23, with root at 15, current slot at 23 - let extracted = cache.extract( - &TestWorkingSlot(23), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(23, cache.environments.clone()); + cache.extract(&TestWorkingSlot(23), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 23)); assert!(match_slot(&extracted, &program2, 11, 23)); assert!(match_slot(&extracted, &program4, 15, 23)); // program3 was deployed on slot 25, which has been pruned - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); } #[test] @@ -2002,42 +2066,38 @@ mod tests { assert!(!cache.replenish(program3, new_test_loaded_program(25, 26)).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let extracted = cache.extract( - &TestWorkingSlot(12), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(12, cache.environments.clone()); + cache.extract(&TestWorkingSlot(12), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 12)); assert!(match_slot(&extracted, &program2, 11, 12)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); // Test the same fork, but request the program modified at a later slot than what's in the cache. - let extracted = cache.extract( - &TestWorkingSlot(12), - vec![ - ( - program1, - (LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(5), 1), - ), - ( - program2, - (LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(5), 1), - ), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + ( + program1, + (LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(5), 1), + ), + ( + program2, + (LoadedProgramMatchCriteria::DeployedOnOrAfterSlot(5), 1), + ), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(12, cache.environments.clone()); + cache.extract(&TestWorkingSlot(12), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program2, 11, 12)); - assert!(match_missing(&extracted, &program1, false)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program1, false)); + assert!(match_missing(&missing, &program3, false)); } #[test] @@ -2096,52 +2156,46 @@ mod tests { ); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let extracted = cache.extract( - &TestWorkingSlot(19), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(19, cache.environments.clone()); + cache.extract(&TestWorkingSlot(19), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 19)); assert!(match_slot(&extracted, &program2, 11, 19)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); // Testing fork 0 - 5 - 11 - 25 - 27 with current slot at 27 - let extracted = cache.extract( - &TestWorkingSlot(27), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(27, cache.environments.clone()); + cache.extract(&TestWorkingSlot(27), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 27)); assert!(match_slot(&extracted, &program2, 11, 27)); - assert!(match_missing(&extracted, &program3, true)); + assert!(match_missing(&missing, &program3, true)); // Testing fork 0 - 10 - 20 - 22 with current slot at 22 - let extracted = cache.extract( - &TestWorkingSlot(22), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(22, cache.environments.clone()); + cache.extract(&TestWorkingSlot(22), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 20, 22)); - assert!(match_missing(&extracted, &program2, false)); - assert!(match_missing(&extracted, &program3, true)); + assert!(match_missing(&missing, &program2, false)); + assert!(match_missing(&missing, &program3, true)); } #[test] @@ -2194,38 +2248,34 @@ mod tests { assert!(!cache.replenish(program1, test_program).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 - let extracted = cache.extract( - &TestWorkingSlot(12), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(12, cache.environments.clone()); + cache.extract(&TestWorkingSlot(12), &mut missing, &mut extracted); // Program1 deployed at slot 11 should not be expired yet assert!(match_slot(&extracted, &program1, 11, 12)); assert!(match_slot(&extracted, &program2, 11, 12)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program3, false)); // Testing fork 0 - 5 - 11 - 12 - 15 - 16 - 19 - 21 - 23 with current slot at 15 // This would cause program4 deployed at slot 15 to be expired. - let extracted = cache.extract( - &TestWorkingSlot(15), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(15, cache.environments.clone()); + cache.extract(&TestWorkingSlot(15), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program2, 11, 15)); - assert!(match_missing(&extracted, &program1, false)); - assert!(match_missing(&extracted, &program3, false)); + assert!(match_missing(&missing, &program1, false)); + assert!(match_missing(&missing, &program3, false)); // Test that the program still exists in the cache, even though it is expired. assert_eq!( @@ -2233,6 +2283,7 @@ mod tests { .entries .get(&program1) .expect("Didn't find program1") + .slot_versions .len(), 3 ); @@ -2244,10 +2295,14 @@ mod tests { .entries .get(&program1) .expect("Didn't find program1") + .slot_versions .len(), 1 ); + // Unlock the cooperative loading lock so that the subsequent prune can do its job + cache.finish_cooperative_loading_task(15, program1, new_test_loaded_program(0, 1)); + // New root 15 should evict the expired entry for program1 cache.prune(15, 0); assert!(cache.entries.get(&program1).is_none()); @@ -2279,19 +2334,14 @@ mod tests { cache.prune(10, 0); - let extracted = cache.extract( - &TestWorkingSlot(20), - vec![(program1, (LoadedProgramMatchCriteria::NoCriteria, 1))].into_iter(), - ); + let mut missing = vec![(program1, (LoadedProgramMatchCriteria::NoCriteria, 1))]; + let mut extracted = LoadedProgramsForTxBatch::new(20, cache.environments.clone()); + cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted); // The cache should have the program deployed at slot 0 assert_eq!( extracted - .lock() - .unwrap() - .loaded - .entries - .get(&program1) + .find(&program1) .expect("Did not find the program") .deployment_slot, 0 @@ -2325,73 +2375,63 @@ mod tests { let program2 = Pubkey::new_unique(); assert!(!cache.replenish(program2, new_test_loaded_program(10, 11)).0); - let extracted = cache.extract( - &TestWorkingSlot(20), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(20, cache.environments.clone()); + cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 20)); assert!(match_slot(&extracted, &program2, 10, 20)); - let extracted = cache.extract( - &TestWorkingSlot(6), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(6, cache.environments.clone()); + cache.extract(&TestWorkingSlot(6), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 5, 6)); - assert!(match_missing(&extracted, &program2, false)); + assert!(match_missing(&missing, &program2, false)); // Pruning slot 5 will remove program1 entry deployed at slot 5. // On fork chaining from slot 5, the entry deployed at slot 0 will become visible. cache.prune_by_deployment_slot(5); - let extracted = cache.extract( - &TestWorkingSlot(20), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(20, cache.environments.clone()); + cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 20)); assert!(match_slot(&extracted, &program2, 10, 20)); - let extracted = cache.extract( - &TestWorkingSlot(6), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(6, cache.environments.clone()); + cache.extract(&TestWorkingSlot(6), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 6)); - assert!(match_missing(&extracted, &program2, false)); + assert!(match_missing(&missing, &program2, false)); // Pruning slot 10 will remove program2 entry deployed at slot 10. // As there is no other entry for program2, extract() will return it as missing. cache.prune_by_deployment_slot(10); - let extracted = cache.extract( - &TestWorkingSlot(20), - vec![ - (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), - (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), - ] - .into_iter(), - ); + let mut missing = vec![ + (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), + (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), + ]; + let mut extracted = LoadedProgramsForTxBatch::new(20, cache.environments.clone()); + cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted); assert!(match_slot(&extracted, &program1, 0, 20)); - assert!(match_missing(&extracted, &program2, false)); + assert!(match_missing(&missing, &program2, false)); } #[test] diff --git a/programs/sbf/tests/programs.rs b/programs/sbf/tests/programs.rs index 83c1ba00a77a22..8df7a01a8cdbc8 100644 --- a/programs/sbf/tests/programs.rs +++ b/programs/sbf/tests/programs.rs @@ -2079,10 +2079,9 @@ fn test_program_sbf_invoke_in_same_tx_as_redeployment() { ); // load_upgradeable_program sets clock sysvar to 1, which causes the program to be effective - // after 2 slots. So we need to advance the bank client by 2 slots here. - let bank = bank_client - .advance_slot(2, &Pubkey::default()) - .expect("Failed to advance slot"); + // after 2 slots. They need to be called individually to create the correct fork graph in between. + bank_client.advance_slot(1, &Pubkey::default()).unwrap(); + let bank = bank_client.advance_slot(1, &Pubkey::default()).unwrap(); // Prepare redeployment let buffer_keypair = Keypair::new(); @@ -2176,10 +2175,9 @@ fn test_program_sbf_invoke_in_same_tx_as_undeployment() { ); // load_upgradeable_program sets clock sysvar to 1, which causes the program to be effective - // after 2 slots. So we need to advance the bank client by 2 slots here. - let bank = bank_client - .advance_slot(2, &Pubkey::default()) - .expect("Failed to advance slot"); + // after 2 slots. They need to be called individually to create the correct fork graph in between. + bank_client.advance_slot(1, &Pubkey::default()).unwrap(); + let bank = bank_client.advance_slot(1, &Pubkey::default()).unwrap(); // Prepare undeployment let (programdata_address, _) = Pubkey::find_program_address( diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index a7acc0235e9645..f30b368480f609 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -195,7 +195,7 @@ use { AtomicBool, AtomicI64, AtomicU64, AtomicUsize, Ordering::{self, AcqRel, Acquire, Relaxed}, }, - Arc, LockResult, Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard, + Arc, LockResult, RwLock, RwLockReadGuard, RwLockWriteGuard, }, thread::Builder, time::{Duration, Instant}, @@ -277,7 +277,6 @@ pub struct BankRc { #[cfg(RUSTC_WITH_SPECIALIZATION)] use solana_frozen_abi::abi_example::AbiExample; -use solana_program_runtime::loaded_programs::ExtractedPrograms; #[cfg(RUSTC_WITH_SPECIALIZATION)] impl AbiExample for BankRc { @@ -5049,7 +5048,7 @@ impl Bank { &self, program_accounts_map: &HashMap, ) -> LoadedProgramsForTxBatch { - let programs_and_slots: Vec<(Pubkey, (LoadedProgramMatchCriteria, u64))> = + let mut missing_programs: Vec<(Pubkey, (LoadedProgramMatchCriteria, u64))> = if self.check_program_modification_slot { program_accounts_map .iter() @@ -5075,39 +5074,56 @@ impl Bank { .collect() }; - let ExtractedPrograms { - loaded: mut loaded_programs_for_txs, - missing, - } = { - // Lock the global cache to figure out which programs need to be loaded - let loaded_programs_cache = self.loaded_programs_cache.read().unwrap(); - Mutex::into_inner( - Arc::into_inner( - loaded_programs_cache.extract(self, programs_and_slots.into_iter()), - ) - .unwrap(), - ) - .unwrap() - }; - - // Load missing programs while global cache is unlocked - let missing_programs: Vec<(Pubkey, Arc)> = missing - .iter() - .map(|(key, (count, reloading))| { - let program = self.load_program(key, *reloading, None); - program.tx_usage_counter.store(*count, Ordering::Relaxed); - (*key, program) - }) - .collect(); + let mut loaded_programs_for_txs = None; + let mut program_to_store = None; + loop { + let (program_to_load, task_cookie, task_waiter) = { + // Lock the global cache. + let mut loaded_programs_cache = self.loaded_programs_cache.write().unwrap(); + // Initialize our local cache. + if loaded_programs_for_txs.is_none() { + loaded_programs_for_txs = Some(LoadedProgramsForTxBatch::new( + self.slot, + loaded_programs_cache + .get_environments_for_epoch(self.epoch) + .clone(), + )); + } + // Submit our last completed loading task. + if let Some((key, program)) = program_to_store.take() { + loaded_programs_cache.finish_cooperative_loading_task( + self.slot(), + key, + program, + ); + } + // Figure out which program needs to be loaded next. + let program_to_load = loaded_programs_cache.extract( + self, + &mut missing_programs, + loaded_programs_for_txs.as_mut().unwrap(), + ); + let task_waiter = Arc::clone(&loaded_programs_cache.loading_task_waiter); + (program_to_load, task_waiter.cookie(), task_waiter) + // Unlock the global cache again. + }; - // Lock the global cache again to replenish the missing programs - let mut loaded_programs_cache = self.loaded_programs_cache.write().unwrap(); - for (key, program) in missing_programs { - let (_was_occupied, entry) = loaded_programs_cache.replenish(key, program); - // Use the returned entry as that might have been deduplicated globally - loaded_programs_for_txs.replenish(key, entry); + if let Some((key, count)) = program_to_load { + // Load, verify and compile one program. + let program = self.load_program(&key, false, None); + program.tx_usage_counter.store(count, Ordering::Relaxed); + program_to_store = Some((key, program)); + } else if missing_programs.is_empty() { + break; + } else { + // Sleep until the next finish_cooperative_loading_task() call. + // Once a task completes we'll wake up and try to load the + // missing programs inside the tx batch again. + let _new_cookie = task_waiter.wait(task_cookie); + } } - loaded_programs_for_txs + + loaded_programs_for_txs.unwrap() } #[allow(clippy::type_complexity)] From aaa266eb4d2484f37da9c3a75d260b909fed40ba Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sun, 17 Dec 2023 04:19:34 -0600 Subject: [PATCH 120/213] Update version to v1.17.13 (#34496) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1c988df3e70802..01999c5c68e5d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.12" +version = "1.17.13" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.12" +version = "1.17.13" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.12" +version = "1.17.13" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.12" +version = "1.17.13" dependencies = [ "Inflector", "assert_matches", @@ -5123,7 +5123,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 2.33.3", "log", @@ -5137,7 +5137,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 2.33.3", "log", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.12" +version = "1.17.13" dependencies = [ "arrayref", "assert_matches", @@ -5231,7 +5231,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "bytemuck", @@ -5250,7 +5250,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -5261,7 +5261,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5285,7 +5285,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.12" +version = "1.17.13" dependencies = [ "serde", "solana-sdk", @@ -5311,7 +5311,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "crossbeam-channel", @@ -5329,7 +5329,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5340,7 +5340,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bv", "fnv", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -5419,7 +5419,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -5430,7 +5430,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bv", "bytemuck", @@ -5449,7 +5449,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "solana-logger", @@ -5457,7 +5457,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_cmd", "bzip2", @@ -5478,11 +5478,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.12" +version = "1.17.13" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.12" +version = "1.17.13" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5493,7 +5493,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "chrono", @@ -5510,7 +5510,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "chrono", @@ -5528,7 +5528,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.12" +version = "1.17.13" dependencies = [ "anyhow", "dirs-next", @@ -5596,7 +5596,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.12" +version = "1.17.13" dependencies = [ "Inflector", "base64 0.21.4", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-trait", "bincode", @@ -5654,7 +5654,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.12" +version = "1.17.13" dependencies = [ "futures-util", "rand 0.8.5", @@ -5684,7 +5684,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5692,7 +5692,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "chrono", @@ -5705,7 +5705,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-trait", "bincode", @@ -5729,7 +5729,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5812,7 +5812,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.12" +version = "1.17.13" dependencies = [ "lazy_static", "log", @@ -5837,7 +5837,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "clap 3.2.23", @@ -5867,7 +5867,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "console", "indicatif", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5890,7 +5890,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -5912,7 +5912,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "byteorder", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.12" +version = "1.17.13" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5964,7 +5964,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.12" +version = "1.17.13" dependencies = [ "proc-macro2", "quote", @@ -5974,7 +5974,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.12" +version = "1.17.13" dependencies = [ "base64 0.21.4", "bincode", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "solana-accounts-db", @@ -6010,7 +6010,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "solana-sdk", @@ -6020,7 +6020,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bs58", "crossbeam-channel", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -6096,7 +6096,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.12" +version = "1.17.13" dependencies = [ "atty", "bincode", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bs58", "clap 3.2.23", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -6216,7 +6216,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_cmd", "bs58", @@ -6265,7 +6265,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "log", @@ -6277,7 +6277,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.12" +version = "1.17.13" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.12" +version = "1.17.13" dependencies = [ "env_logger", "lazy_static", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "solana-sdk", @@ -6345,11 +6345,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.12" +version = "1.17.13" [[package]] name = "solana-merkle-root-bench" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 2.33.3", "log", @@ -6362,7 +6362,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.12" +version = "1.17.13" dependencies = [ "fast-math", "hex", @@ -6371,7 +6371,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.12" +version = "1.17.13" dependencies = [ "crossbeam-channel", "env_logger", @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "clap 3.2.23", @@ -6418,7 +6418,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "reqwest", @@ -6428,7 +6428,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.12" +version = "1.17.13" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6459,7 +6459,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -6480,7 +6480,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 3.2.23", "log", @@ -6495,7 +6495,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "anyhow", "ark-bn254", @@ -6552,7 +6552,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6581,7 +6581,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "async-trait", @@ -6610,7 +6610,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "anyhow", "crossbeam-channel", @@ -6634,7 +6634,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-mutex", "async-trait", @@ -6662,7 +6662,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.12" +version = "1.17.13" dependencies = [ "lazy_static", "num_cpus", @@ -6670,7 +6670,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "console", @@ -6689,7 +6689,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.12" +version = "1.17.13" dependencies = [ "base64 0.21.4", "bincode", @@ -6748,7 +6748,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "async-trait", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.12" +version = "1.17.13" dependencies = [ "base64 0.21.4", "bs58", @@ -6797,7 +6797,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "anyhow", "clap 2.33.3", @@ -6814,7 +6814,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "bs58", @@ -6841,7 +6841,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.12" +version = "1.17.13" dependencies = [ "arrayref", "assert_matches", @@ -6924,7 +6924,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.12" +version = "1.17.13" dependencies = [ "anyhow", "assert_matches", @@ -6982,7 +6982,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bs58", "proc-macro2", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.12" +version = "1.17.13" dependencies = [ "crossbeam-channel", "log", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7024,7 +7024,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -7041,7 +7041,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.12" +version = "1.17.13" dependencies = [ "backoff", "bincode", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "bs58", @@ -7089,7 +7089,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 2.33.3", "log", @@ -7101,7 +7101,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "async-channel", @@ -7133,7 +7133,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -7147,7 +7147,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.12" +version = "1.17.13" dependencies = [ "base64 0.21.4", "bincode", @@ -7177,7 +7177,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -7224,7 +7224,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-trait", "bincode", @@ -7246,7 +7246,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "clap 2.33.3", @@ -7273,7 +7273,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.12" +version = "1.17.13" dependencies = [ "Inflector", "base64 0.21.4", @@ -7296,7 +7296,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -7333,7 +7333,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-trait", "solana-connection-cache", @@ -7346,7 +7346,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.12" +version = "1.17.13" dependencies = [ "serde_json", "solana-metrics", @@ -7354,7 +7354,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.12" +version = "1.17.13" dependencies = [ "chrono", "clap 2.33.3", @@ -7418,7 +7418,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "rustc_version 0.4.0", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "crossbeam-channel", @@ -7451,7 +7451,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -7474,7 +7474,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 2.33.3", "humantime", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bs58", "clap 3.2.23", @@ -7512,7 +7512,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bytemuck", "criterion", @@ -7526,7 +7526,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7538,7 +7538,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.12" +version = "1.17.13" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 0bc870f646f8b2..6b0777c758f163 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.12" +version = "1.17.13" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.12" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.12" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.12" } -solana-banks-client = { path = "banks-client", version = "=1.17.12" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.12" } -solana-banks-server = { path = "banks-server", version = "=1.17.12" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.12" } -solana-bloom = { path = "bloom", version = "=1.17.12" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.12" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.12" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.12", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.12" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.12" } -solana-cli = { path = "cli", version = "=1.17.12" } -solana-cli-config = { path = "cli-config", version = "=1.17.12" } -solana-cli-output = { path = "cli-output", version = "=1.17.12" } -solana-client = { path = "client", version = "=1.17.12" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.12" } -solana-config-program = { path = "programs/config", version = "=1.17.12" } -solana-core = { path = "core", version = "=1.17.12" } -solana-cost-model = { path = "cost-model", version = "=1.17.12" } -solana-download-utils = { path = "download-utils", version = "=1.17.12" } -solana-entry = { path = "entry", version = "=1.17.12" } -solana-faucet = { path = "faucet", version = "=1.17.12" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.12" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.12" } -solana-genesis = { path = "genesis", version = "=1.17.12" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.12" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.12" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.12" } -solana-gossip = { path = "gossip", version = "=1.17.12" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.12" } -solana-ledger = { path = "ledger", version = "=1.17.12" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.12" } -solana-logger = { path = "logger", version = "=1.17.12" } -solana-measure = { path = "measure", version = "=1.17.12" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.12" } -solana-metrics = { path = "metrics", version = "=1.17.12" } -solana-net-utils = { path = "net-utils", version = "=1.17.12" } -solana-notifier = { path = "notifier", version = "=1.17.12" } -solana-perf = { path = "perf", version = "=1.17.12" } -solana-poh = { path = "poh", version = "=1.17.12" } -solana-program = { path = "sdk/program", version = "=1.17.12" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.12" } -solana-program-test = { path = "program-test", version = "=1.17.12" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.12" } -solana-quic-client = { path = "quic-client", version = "=1.17.12" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.12" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.12", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.12" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.12", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.12" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.12" } -solana-runtime = { path = "runtime", version = "=1.17.12" } -solana-sdk = { path = "sdk", version = "=1.17.12" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.12" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.12" } -solana-stake-program = { path = "programs/stake", version = "=1.17.12" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.12" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.12" } -solana-streamer = { path = "streamer", version = "=1.17.12" } -solana-system-program = { path = "programs/system", version = "=1.17.12" } -solana-test-validator = { path = "test-validator", version = "=1.17.12" } -solana-thin-client = { path = "thin-client", version = "=1.17.12" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.12", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.12" } -solana-turbine = { path = "turbine", version = "=1.17.12" } -solana-udp-client = { path = "udp-client", version = "=1.17.12" } -solana-version = { path = "version", version = "=1.17.12" } -solana-vote = { path = "vote", version = "=1.17.12" } -solana-vote-program = { path = "programs/vote", version = "=1.17.12" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.12" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.12" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.12" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.13" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.13" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.13" } +solana-banks-client = { path = "banks-client", version = "=1.17.13" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.13" } +solana-banks-server = { path = "banks-server", version = "=1.17.13" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.13" } +solana-bloom = { path = "bloom", version = "=1.17.13" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.13" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.13" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.13", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.13" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.13" } +solana-cli = { path = "cli", version = "=1.17.13" } +solana-cli-config = { path = "cli-config", version = "=1.17.13" } +solana-cli-output = { path = "cli-output", version = "=1.17.13" } +solana-client = { path = "client", version = "=1.17.13" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.13" } +solana-config-program = { path = "programs/config", version = "=1.17.13" } +solana-core = { path = "core", version = "=1.17.13" } +solana-cost-model = { path = "cost-model", version = "=1.17.13" } +solana-download-utils = { path = "download-utils", version = "=1.17.13" } +solana-entry = { path = "entry", version = "=1.17.13" } +solana-faucet = { path = "faucet", version = "=1.17.13" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.13" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.13" } +solana-genesis = { path = "genesis", version = "=1.17.13" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.13" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.13" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.13" } +solana-gossip = { path = "gossip", version = "=1.17.13" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.13" } +solana-ledger = { path = "ledger", version = "=1.17.13" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.13" } +solana-logger = { path = "logger", version = "=1.17.13" } +solana-measure = { path = "measure", version = "=1.17.13" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.13" } +solana-metrics = { path = "metrics", version = "=1.17.13" } +solana-net-utils = { path = "net-utils", version = "=1.17.13" } +solana-notifier = { path = "notifier", version = "=1.17.13" } +solana-perf = { path = "perf", version = "=1.17.13" } +solana-poh = { path = "poh", version = "=1.17.13" } +solana-program = { path = "sdk/program", version = "=1.17.13" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.13" } +solana-program-test = { path = "program-test", version = "=1.17.13" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.13" } +solana-quic-client = { path = "quic-client", version = "=1.17.13" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.13" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.13", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.13" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.13", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.13" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.13" } +solana-runtime = { path = "runtime", version = "=1.17.13" } +solana-sdk = { path = "sdk", version = "=1.17.13" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.13" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.13" } +solana-stake-program = { path = "programs/stake", version = "=1.17.13" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.13" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.13" } +solana-streamer = { path = "streamer", version = "=1.17.13" } +solana-system-program = { path = "programs/system", version = "=1.17.13" } +solana-test-validator = { path = "test-validator", version = "=1.17.13" } +solana-thin-client = { path = "thin-client", version = "=1.17.13" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.13", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.13" } +solana-turbine = { path = "turbine", version = "=1.17.13" } +solana-udp-client = { path = "udp-client", version = "=1.17.13" } +solana-version = { path = "version", version = "=1.17.13" } +solana-vote = { path = "vote", version = "=1.17.13" } +solana-vote-program = { path = "programs/vote", version = "=1.17.13" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.13" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.13" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.13" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index ae70628801ac05..c17ddd62bafb3a 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4447,7 +4447,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.12" +version = "1.17.13" dependencies = [ "Inflector", "base64 0.21.4", @@ -4469,7 +4469,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.12" +version = "1.17.13" dependencies = [ "arrayref", "bincode", @@ -4526,7 +4526,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "bytemuck", @@ -4545,7 +4545,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4560,7 +4560,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.12" +version = "1.17.13" dependencies = [ "serde", "solana-sdk", @@ -4569,7 +4569,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "crossbeam-channel", @@ -4587,7 +4587,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bv", "fnv", @@ -4604,7 +4604,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4621,7 +4621,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.12" +version = "1.17.13" dependencies = [ "array-bytes", "serde", @@ -4631,7 +4631,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bv", "bytemuck", @@ -4647,7 +4647,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "chrono", "clap 2.33.3", @@ -4662,7 +4662,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.12" +version = "1.17.13" dependencies = [ "dirs-next", "lazy_static", @@ -4676,7 +4676,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.12" +version = "1.17.13" dependencies = [ "Inflector", "base64 0.21.4", @@ -4701,7 +4701,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-trait", "bincode", @@ -4732,7 +4732,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4740,7 +4740,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "chrono", @@ -4752,7 +4752,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-trait", "bincode", @@ -4772,7 +4772,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.12" +version = "1.17.13" dependencies = [ "base64 0.21.4", "bincode", @@ -4844,7 +4844,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.12" +version = "1.17.13" dependencies = [ "lazy_static", "log", @@ -4866,7 +4866,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "console", "indicatif", @@ -4878,7 +4878,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "crossbeam-channel", @@ -4898,7 +4898,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4920,7 +4920,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.12" +version = "1.17.13" dependencies = [ "ahash 0.8.3", "blake3", @@ -4948,7 +4948,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.12" +version = "1.17.13" dependencies = [ "proc-macro2", "quote", @@ -4958,7 +4958,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "solana-accounts-db", @@ -4969,7 +4969,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "solana-sdk", @@ -4979,7 +4979,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bs58", "crossbeam-channel", @@ -5004,7 +5004,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -5052,7 +5052,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "solana-measure", @@ -5127,7 +5127,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.12" +version = "1.17.13" dependencies = [ "env_logger", "lazy_static", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "solana-sdk", @@ -5144,7 +5144,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.12" +version = "1.17.13" dependencies = [ "fast-math", "solana-program", @@ -5152,7 +5152,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.12" +version = "1.17.13" dependencies = [ "crossbeam-channel", "gethostname", @@ -5165,7 +5165,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "clap 3.1.6", @@ -5185,7 +5185,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.12" +version = "1.17.13" dependencies = [ "ahash 0.8.3", "bincode", @@ -5212,7 +5212,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.12" +version = "1.17.13" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5228,7 +5228,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "ark-bn254", "ark-ec", @@ -5280,7 +5280,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.12" +version = "1.17.13" dependencies = [ "base64 0.21.4", "bincode", @@ -5306,7 +5306,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "async-trait", @@ -5334,7 +5334,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "crossbeam-channel", "futures-util", @@ -5357,7 +5357,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-mutex", "async-trait", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.12" +version = "1.17.13" dependencies = [ "lazy_static", "num_cpus", @@ -5390,7 +5390,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.12" +version = "1.17.13" dependencies = [ "console", "dialoguer", @@ -5407,7 +5407,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.12" +version = "1.17.13" dependencies = [ "base64 0.21.4", "bincode", @@ -5462,7 +5462,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-trait", "base64 0.21.4", @@ -5486,7 +5486,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.12" +version = "1.17.13" dependencies = [ "base64 0.21.4", "bs58", @@ -5506,7 +5506,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.12" +version = "1.17.13" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5517,7 +5517,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.12" +version = "1.17.13" dependencies = [ "arrayref", "base64 0.21.4", @@ -5592,7 +5592,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5621,7 +5621,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5629,21 +5629,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.12" +version = "1.17.13" dependencies = [ "array-bytes", "solana-program", @@ -5651,7 +5651,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.12" +version = "1.17.13" dependencies = [ "array-bytes", "solana-program", @@ -5659,21 +5659,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5681,14 +5681,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.12" +version = "1.17.13" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5696,21 +5696,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.12" +version = "1.17.13" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5720,42 +5720,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.12" +version = "1.17.13" dependencies = [ "rustversion", "solana-program", @@ -5765,49 +5765,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5815,14 +5815,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-program-runtime", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5840,21 +5840,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5862,14 +5862,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.12" +version = "1.17.13" dependencies = [ "array-bytes", "solana-program", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.12" +version = "1.17.13" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5886,14 +5886,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-program-runtime", @@ -5911,21 +5911,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-program-runtime", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.12" +version = "1.17.13" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5943,7 +5943,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.12" +version = "1.17.13" dependencies = [ "blake3", "solana-program", @@ -5951,21 +5951,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-logger", "solana-program", @@ -5976,21 +5976,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", "solana-program-runtime", @@ -6000,21 +6000,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.12" +version = "1.17.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.12" +version = "1.17.13" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6066,7 +6066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bs58", "proc-macro2", @@ -6077,7 +6077,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.12" +version = "1.17.13" dependencies = [ "crossbeam-channel", "log", @@ -6091,7 +6091,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "log", @@ -6104,7 +6104,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.12" +version = "1.17.13" dependencies = [ "backoff", "bincode", @@ -6136,7 +6136,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "bs58", @@ -6151,7 +6151,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-channel", "bytes", @@ -6181,7 +6181,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "log", @@ -6193,7 +6193,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.12" +version = "1.17.13" dependencies = [ "base64 0.21.4", "bincode", @@ -6223,7 +6223,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "log", @@ -6236,7 +6236,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-trait", "bincode", @@ -6258,7 +6258,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.12" +version = "1.17.13" dependencies = [ "Inflector", "base64 0.21.4", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "bytes", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.12" +version = "1.17.13" dependencies = [ "async-trait", "solana-connection-cache", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.12" +version = "1.17.13" dependencies = [ "chrono", "clap 2.33.3", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.12" +version = "1.17.13" dependencies = [ "log", "rustc_version", @@ -6405,7 +6405,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.12" +version = "1.17.13" dependencies = [ "crossbeam-channel", "itertools", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bincode", "log", @@ -6442,7 +6442,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.12" +version = "1.17.13" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6454,7 +6454,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.12" +version = "1.17.13" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index ac13b16796414f..58faa6e5ca3b8a 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.12" +version = "1.17.13" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.12" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.12" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.12" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.12" } -solana-ledger = { path = "../../ledger", version = "=1.17.12" } -solana-logger = { path = "../../logger", version = "=1.17.12" } -solana-measure = { path = "../../measure", version = "=1.17.12" } -solana-program = { path = "../../sdk/program", version = "=1.17.12" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.12" } -solana-program-test = { path = "../../program-test", version = "=1.17.12" } -solana-runtime = { path = "../../runtime", version = "=1.17.12" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.12" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.12" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.12", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.12" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.12" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.12" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.12", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.12" } -solana-sdk = { path = "../../sdk", version = "=1.17.12" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.12" } -solana-validator = { path = "../../validator", version = "=1.17.12" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.12" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.13" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.13" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.13" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.13" } +solana-ledger = { path = "../../ledger", version = "=1.17.13" } +solana-logger = { path = "../../logger", version = "=1.17.13" } +solana-measure = { path = "../../measure", version = "=1.17.13" } +solana-program = { path = "../../sdk/program", version = "=1.17.13" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.13" } +solana-program-test = { path = "../../program-test", version = "=1.17.13" } +solana-runtime = { path = "../../runtime", version = "=1.17.13" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.13" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.13" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.13", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.13" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.13" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.13" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.13", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.13" } +solana-sdk = { path = "../../sdk", version = "=1.17.13" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.13" } +solana-validator = { path = "../../validator", version = "=1.17.13" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.13" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 1f06913ba0f086..069e38603ae5a1 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.12" +version = "1.17.13" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.12" } +solana-program = { path = "../../../../program", version = "=1.17.13" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index dfb30fbbceaaea..8e0bfba049ab6f 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.12" +version = "1.17.13" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.12" } +solana-program = { path = "../../../../program", version = "=1.17.13" } [lib] crate-type = ["cdylib"] From 9a328fb54f9a32af6139022636f7792c18de681c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 11:51:46 -0700 Subject: [PATCH 121/213] v1.17: build(deps): bump zerocopy from 0.7.15 to 0.7.31 (backport of #34477) (#34506) * build(deps): bump zerocopy from 0.7.15 to 0.7.31 (#34477) * build(deps): bump zerocopy from 0.7.15 to 0.7.31 Bumps [zerocopy](https://github.com/google/zerocopy) from 0.7.15 to 0.7.31. - [Release notes](https://github.com/google/zerocopy/releases) - [Changelog](https://github.com/google/zerocopy/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/zerocopy/compare/v0.7.15...v0.7.31) --- updated-dependencies: - dependency-name: zerocopy dependency-type: indirect ... Signed-off-by: dependabot[bot] * [auto-commit] Update all Cargo lock files --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot-buildkite (cherry picked from commit a1032ef42e4367632307829c5783d6514ef69f65) # Conflicts: # Cargo.lock # programs/sbf/Cargo.lock * Fix conflicts --------- Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tyera Eulberg --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01999c5c68e5d3..ef2d98d659a863 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9051,18 +9051,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.11" +version = "0.7.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c19fae0c8a9efc6a8281f2e623db8af1db9e57852e04cde3e754dd2dc29340f" +checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.11" +version = "0.7.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc56589e9ddd1f1c28d4b4b5c773ce232910a6bb67a70133d61c9e347585efe9" +checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" dependencies = [ "proc-macro2", "quote", From 8301417f9eb403ab2e02c3b7748fe14f236ed51b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 20:28:42 +0000 Subject: [PATCH 122/213] v1.17: cargo-install-all: use full path for sourcing (backport of #34525) (#34528) cargo-install-all: use full path for sourcing (#34525) Use full path for sourcing (cherry picked from commit 51c9963a60a3deaa2eb0e184e218a14f5899bcf6) Co-authored-by: Tyera --- scripts/cargo-install-all.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/cargo-install-all.sh b/scripts/cargo-install-all.sh index e48ce4e02deeb8..003d63fd1d24b0 100755 --- a/scripts/cargo-install-all.sh +++ b/scripts/cargo-install-all.sh @@ -17,7 +17,8 @@ if [[ $OSTYPE == darwin* ]]; then fi fi -cargo="$("${readlink_cmd}" -f "${here}/../cargo")" +SOLANA_ROOT="$("${readlink_cmd}" -f "${here}/..")" +cargo="${SOLANA_ROOT}/cargo" set -e @@ -150,7 +151,7 @@ mkdir -p "$installDir/bin" # Exclude `spl-token` binary for net.sh builds if [[ -z "$validatorOnly" ]]; then # shellcheck source=scripts/spl-token-cli-version.sh - source "$here"/spl-token-cli-version.sh + source "$SOLANA_ROOT"/scripts/spl-token-cli-version.sh # the patch-related configs are needed for rust 1.69+ on Windows; see Cargo.toml # shellcheck disable=SC2086 # Don't want to double quote $rust_version From f7a655fe0c736004cb5d902ec3c597f32029b680 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 15:32:19 -0500 Subject: [PATCH 123/213] v1.17: replay: feature flag consumption of duplicate proofs from blockstore (backport of #34372) (#34515) * replay: feature flag consumption of duplicate proofs from blockstore (#34372) * replay: feature flag consumption of duplicate proofs from blockstore * pr feedback: reorder check, add flag for restart logic (cherry picked from commit 4a8d27d92123ff1a5613e735612e28805d871d2e) # Conflicts: # sdk/src/feature_set.rs * fix feature set conflict --------- Co-authored-by: Ashwin Sekar --- core/src/replay_stage.rs | 20 ++++++++++++++++---- sdk/src/feature_set.rs | 5 +++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index 77453fbf5a5d5e..b91b103fae3b12 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -66,6 +66,7 @@ use { }, solana_sdk::{ clock::{BankId, Slot, MAX_PROCESSING_AGE, NUM_CONSECUTIVE_LEADER_SLOTS}, + feature_set, genesis_config::ClusterType, hash::Hash, pubkey::Pubkey, @@ -1238,8 +1239,12 @@ impl ReplayStage { let duplicate_slots = blockstore .duplicate_slots_iterator(bank_forks.root_bank().slot()) .unwrap(); - let duplicate_slot_hashes = duplicate_slots - .filter_map(|slot| bank_forks.bank_hash(slot).map(|hash| (slot, hash))); + let duplicate_slot_hashes = duplicate_slots.filter_map(|slot| { + let bank = bank_forks.get(slot)?; + bank.feature_set + .is_active(&feature_set::consume_blockstore_duplicate_proofs::id()) + .then_some((slot, bank.hash())) + }); ( bank_forks.root_bank(), bank_forks.frozen_banks().values().cloned().collect(), @@ -2119,7 +2124,11 @@ impl ReplayStage { ); // If we previously marked this slot as duplicate in blockstore, let the state machine know - if !duplicate_slots_tracker.contains(&slot) && blockstore.get_duplicate_slot(slot).is_some() + if bank + .feature_set + .is_active(&feature_set::consume_blockstore_duplicate_proofs::id()) + && !duplicate_slots_tracker.contains(&slot) + && blockstore.get_duplicate_slot(slot).is_some() { let duplicate_state = DuplicateState::new_from_state( slot, @@ -2883,7 +2892,10 @@ impl ReplayStage { SlotStateUpdate::BankFrozen(bank_frozen_state), ); // If we previously marked this slot as duplicate in blockstore, let the state machine know - if !duplicate_slots_tracker.contains(&bank.slot()) + if bank + .feature_set + .is_active(&feature_set::consume_blockstore_duplicate_proofs::id()) + && !duplicate_slots_tracker.contains(&bank.slot()) && blockstore.get_duplicate_slot(bank.slot()).is_some() { let duplicate_state = DuplicateState::new_from_state( diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 34dfdbcbbcbc29..78b4369ac6387a 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -732,6 +732,10 @@ pub mod drop_legacy_shreds { solana_sdk::declare_id!("GV49KKQdBNaiv2pgqhS2Dy3GWYJGXMTVYbYkdk91orRy"); } +pub mod consume_blockstore_duplicate_proofs { + solana_sdk::declare_id!("6YsBCejwK96GZCkJ6mkZ4b68oP63z2PLoQmWjC7ggTqZ"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -910,6 +914,7 @@ lazy_static! { (validate_fee_collector_account::id(), "validate fee collector account #33888"), (enable_zk_transfer_with_fee::id(), "enable Zk Token proof program transfer with fee"), (drop_legacy_shreds::id(), "drops legacy shreds #34328"), + (consume_blockstore_duplicate_proofs::id(), "consume duplicate proofs from blockstore in consensus #34372") /*************** ADD NEW FEATURES HERE ***************/ ] .iter() From 907b904784543e7c27bf63b8b72647238007e144 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 20:49:57 +0000 Subject: [PATCH 124/213] v1.17: disables turbine and repair QUIC endpoints on mainnet-beta (backport of #34523) (#34526) * disables turbine and repair QUIC endpoints on mainnet-beta (#34523) On mainnet-beta, respective QUIC endpoint are unnecessary for now until testnet has fully migrated to QUIC. The commit disables turbine and repair QUIC endpoints on mainnet-beta. (cherry picked from commit 4feadbdb7c52419362bf675132116a96da954269) # Conflicts: # core/src/validator.rs * resolves mergify merge conflicts --------- Co-authored-by: behzad nouri --- core/src/validator.rs | 132 +++++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 54 deletions(-) diff --git a/core/src/validator.rs b/core/src/validator.rs index fac592aedb8620..550c1cd1c809e5 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -108,7 +108,7 @@ use { clock::Slot, epoch_schedule::MAX_LEADER_SCHEDULE_EPOCH_OFFSET, exit::Exit, - genesis_config::GenesisConfig, + genesis_config::{ClusterType, GenesisConfig}, hash::Hash, pubkey::Pubkey, shred_version::compute_shred_version, @@ -465,12 +465,12 @@ pub struct Validator { ledger_metric_report_service: LedgerMetricReportService, accounts_background_service: AccountsBackgroundService, accounts_hash_verifier: AccountsHashVerifier, - turbine_quic_endpoint: Endpoint, + turbine_quic_endpoint: Option, turbine_quic_endpoint_runtime: Option, - turbine_quic_endpoint_join_handle: solana_turbine::quic_endpoint::AsyncTryJoinHandle, - repair_quic_endpoint: Endpoint, + turbine_quic_endpoint_join_handle: Option, + repair_quic_endpoint: Option, repair_quic_endpoint_runtime: Option, - repair_quic_endpoint_join_handle: repair::quic_endpoint::AsyncTryJoinHandle, + repair_quic_endpoint_join_handle: Option, } impl Validator { @@ -1153,58 +1153,74 @@ impl Validator { // Outside test-validator crate, we always need a tokio runtime (and // the respective handle) to initialize the turbine QUIC endpoint. let current_runtime_handle = tokio::runtime::Handle::try_current(); - let turbine_quic_endpoint_runtime = current_runtime_handle.is_err().then(|| { - tokio::runtime::Builder::new_multi_thread() - .enable_all() - .thread_name("solTurbineQuic") - .build() - .unwrap() - }); + let turbine_quic_endpoint_runtime = (current_runtime_handle.is_err() + && genesis_config.cluster_type != ClusterType::MainnetBeta) + .then(|| { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .thread_name("solTurbineQuic") + .build() + .unwrap() + }); let (turbine_quic_endpoint_sender, turbine_quic_endpoint_receiver) = unbounded(); let ( turbine_quic_endpoint, turbine_quic_endpoint_sender, turbine_quic_endpoint_join_handle, - ) = solana_turbine::quic_endpoint::new_quic_endpoint( - turbine_quic_endpoint_runtime - .as_ref() - .map(TokioRuntime::handle) - .unwrap_or_else(|| current_runtime_handle.as_ref().unwrap()), - &identity_keypair, - node.sockets.tvu_quic, - node.info - .tvu(Protocol::QUIC) - .expect("Operator must spin up node with valid QUIC TVU address") - .ip(), - turbine_quic_endpoint_sender, - bank_forks.clone(), - ) - .unwrap(); - - // Repair quic endpoint. - let repair_quic_endpoint_runtime = current_runtime_handle.is_err().then(|| { - tokio::runtime::Builder::new_multi_thread() - .enable_all() - .thread_name("solRepairQuic") - .build() - .unwrap() - }); - let (repair_quic_endpoint, repair_quic_endpoint_sender, repair_quic_endpoint_join_handle) = - repair::quic_endpoint::new_quic_endpoint( - repair_quic_endpoint_runtime + ) = if genesis_config.cluster_type == ClusterType::MainnetBeta { + let (sender, _receiver) = tokio::sync::mpsc::channel(1); + (None, sender, None) + } else { + solana_turbine::quic_endpoint::new_quic_endpoint( + turbine_quic_endpoint_runtime .as_ref() .map(TokioRuntime::handle) .unwrap_or_else(|| current_runtime_handle.as_ref().unwrap()), &identity_keypair, - node.sockets.serve_repair_quic, + node.sockets.tvu_quic, node.info - .serve_repair(Protocol::QUIC) - .expect("Operator must spin up node with valid QUIC serve-repair address") + .tvu(Protocol::QUIC) + .expect("Operator must spin up node with valid QUIC TVU address") .ip(), - repair_quic_endpoint_sender, + turbine_quic_endpoint_sender, bank_forks.clone(), ) - .unwrap(); + .map(|(endpoint, sender, join_handle)| (Some(endpoint), sender, Some(join_handle))) + .unwrap() + }; + + // Repair quic endpoint. + let repair_quic_endpoint_runtime = (current_runtime_handle.is_err() + && genesis_config.cluster_type != ClusterType::MainnetBeta) + .then(|| { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .thread_name("solRepairQuic") + .build() + .unwrap() + }); + let (repair_quic_endpoint, repair_quic_endpoint_sender, repair_quic_endpoint_join_handle) = + if genesis_config.cluster_type == ClusterType::MainnetBeta { + let (sender, _receiver) = tokio::sync::mpsc::channel(1); + (None, sender, None) + } else { + repair::quic_endpoint::new_quic_endpoint( + repair_quic_endpoint_runtime + .as_ref() + .map(TokioRuntime::handle) + .unwrap_or_else(|| current_runtime_handle.as_ref().unwrap()), + &identity_keypair, + node.sockets.serve_repair_quic, + node.info + .serve_repair(Protocol::QUIC) + .expect("Operator must spin up node with valid QUIC serve-repair address") + .ip(), + repair_quic_endpoint_sender, + bank_forks.clone(), + ) + .map(|(endpoint, sender, join_handle)| (Some(endpoint), sender, Some(join_handle))) + .unwrap() + }; let (replay_vote_sender, replay_vote_receiver) = unbounded(); let tvu = Tvu::new( @@ -1460,14 +1476,18 @@ impl Validator { } self.gossip_service.join().expect("gossip_service"); - repair::quic_endpoint::close_quic_endpoint(&self.repair_quic_endpoint); + if let Some(repair_quic_endpoint) = &self.repair_quic_endpoint { + repair::quic_endpoint::close_quic_endpoint(repair_quic_endpoint); + } self.serve_repair_service .join() .expect("serve_repair_service"); - self.repair_quic_endpoint_runtime - .map(|runtime| runtime.block_on(self.repair_quic_endpoint_join_handle)) - .transpose() - .unwrap(); + if let Some(repair_quic_endpoint_join_handle) = self.repair_quic_endpoint_join_handle { + self.repair_quic_endpoint_runtime + .map(|runtime| runtime.block_on(repair_quic_endpoint_join_handle)) + .transpose() + .unwrap(); + }; self.stats_reporter_service .join() .expect("stats_reporter_service"); @@ -1480,13 +1500,17 @@ impl Validator { self.accounts_hash_verifier .join() .expect("accounts_hash_verifier"); - solana_turbine::quic_endpoint::close_quic_endpoint(&self.turbine_quic_endpoint); + if let Some(turbine_quic_endpoint) = &self.turbine_quic_endpoint { + solana_turbine::quic_endpoint::close_quic_endpoint(turbine_quic_endpoint); + } self.tpu.join().expect("tpu"); self.tvu.join().expect("tvu"); - self.turbine_quic_endpoint_runtime - .map(|runtime| runtime.block_on(self.turbine_quic_endpoint_join_handle)) - .transpose() - .unwrap(); + if let Some(turbine_quic_endpoint_join_handle) = self.turbine_quic_endpoint_join_handle { + self.turbine_quic_endpoint_runtime + .map(|runtime| runtime.block_on(turbine_quic_endpoint_join_handle)) + .transpose() + .unwrap(); + } self.completed_data_sets_service .join() .expect("completed_data_sets_service"); From b9aaedba6a15eabdc33d203c01bcb54559971cc3 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 14:21:50 -0500 Subject: [PATCH 125/213] v1.17: Add feature flag for LastIndex and Erasure duplicate proofs (backport of #34360) (#34541) * Add feature flag for LastIndex and Erasure duplicate proofs (#34360) * Add feature flag for LastIndex and Erasure duplicate proofs * pr feedback: use root bank instead of 2 params * pr feedback: & instead of &Arc * pr feedback: reuse fn, remove redundant clones * rebase: fix feature set conflict (cherry picked from commit def3bc4c4f551db73095e49faf44433507bc296b) # Conflicts: # sdk/src/feature_set.rs * fix feature set conflict --------- Co-authored-by: Ashwin Sekar --- core/src/window_service.rs | 43 +++++++++++++++++++++++++++++++++--- sdk/src/feature_set.rs | 7 +++++- turbine/src/cluster_nodes.rs | 2 +- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/core/src/window_service.rs b/core/src/window_service.rs index a68a20e2078471..a36692cc7ef3ab 100644 --- a/core/src/window_service.rs +++ b/core/src/window_service.rs @@ -1,6 +1,7 @@ //! `window_service` handles the data plane incoming shreds, storing them in //! blockstore and retransmitting where required //! + use { crate::{ cluster_info_vote_listener::VerifiedVoteReceiver, @@ -28,7 +29,12 @@ use { solana_metrics::inc_new_counter_error, solana_perf::packet::{Packet, PacketBatch}, solana_rayon_threadlimit::get_thread_count, - solana_sdk::clock::Slot, + solana_runtime::bank_forks::BankForks, + solana_sdk::{ + clock::{Slot, DEFAULT_MS_PER_SLOT}, + feature_set, + }, + solana_turbine::cluster_nodes, std::{ cmp::Reverse, collections::{HashMap, HashSet}, @@ -142,12 +148,31 @@ fn run_check_duplicate( blockstore: &Blockstore, shred_receiver: &Receiver, duplicate_slots_sender: &DuplicateSlotSender, + bank_forks: &RwLock, ) -> Result<()> { + let mut root_bank = bank_forks.read().unwrap().root_bank(); + let mut last_updated = Instant::now(); let check_duplicate = |shred: PossibleDuplicateShred| -> Result<()> { + if last_updated.elapsed().as_millis() as u64 > DEFAULT_MS_PER_SLOT { + // Grabs bank forks lock once a slot + last_updated = Instant::now(); + root_bank = bank_forks.read().unwrap().root_bank(); + } let shred_slot = shred.slot(); + let send_index_and_erasure_conflicts = cluster_nodes::check_feature_activation( + &feature_set::index_erasure_conflict_duplicate_proofs::id(), + shred_slot, + &root_bank, + ); let (shred1, shred2) = match shred { - PossibleDuplicateShred::LastIndexConflict(shred, conflict) => (shred, conflict), - PossibleDuplicateShred::ErasureConflict(shred, conflict) => (shred, conflict), + PossibleDuplicateShred::LastIndexConflict(shred, conflict) + | PossibleDuplicateShred::ErasureConflict(shred, conflict) => { + if send_index_and_erasure_conflicts { + (shred, conflict) + } else { + return Ok(()); + } + } PossibleDuplicateShred::Exists(shred) => { // Unlike the other cases we have to wait until here to decide to handle the duplicate and store // in blockstore. This is because the duplicate could have been part of the same insert batch, @@ -342,6 +367,7 @@ impl WindowService { let outstanding_requests = Arc::>::default(); let cluster_info = repair_info.cluster_info.clone(); + let bank_forks = repair_info.bank_forks.clone(); let repair_service = RepairService::new( blockstore.clone(), @@ -366,6 +392,7 @@ impl WindowService { blockstore.clone(), duplicate_receiver, duplicate_slots_sender, + bank_forks, ); let t_insert = Self::start_window_insert_thread( @@ -392,6 +419,7 @@ impl WindowService { blockstore: Arc, duplicate_receiver: Receiver, duplicate_slots_sender: DuplicateSlotSender, + bank_forks: Arc>, ) -> JoinHandle<()> { let handle_error = || { inc_new_counter_error!("solana-check-duplicate-error", 1, 1); @@ -405,6 +433,7 @@ impl WindowService { &blockstore, &duplicate_receiver, &duplicate_slots_sender, + &bank_forks, ) { if Self::should_exit_on_error(e, &handle_error) { break; @@ -507,9 +536,11 @@ mod test { solana_gossip::contact_info::ContactInfo, solana_ledger::{ blockstore::{make_many_slot_entries, Blockstore}, + genesis_utils::create_genesis_config, get_tmp_ledger_path_auto_delete, shred::{ProcessShredsStats, Shredder}, }, + solana_runtime::bank::Bank, solana_sdk::{ hash::Hash, signature::{Keypair, Signer}, @@ -556,6 +587,8 @@ mod test { #[test] fn test_run_check_duplicate() { let ledger_path = get_tmp_ledger_path_auto_delete!(); + let genesis_config = create_genesis_config(10_000).genesis_config; + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests(&genesis_config)); let blockstore = Arc::new(Blockstore::open(ledger_path.path()).unwrap()); let (sender, receiver) = unbounded(); let (duplicate_slot_sender, duplicate_slot_receiver) = unbounded(); @@ -587,6 +620,7 @@ mod test { &blockstore, &receiver, &duplicate_slot_sender, + &bank_forks, ) .unwrap(); @@ -616,6 +650,8 @@ mod test { Arc::new(keypair), SocketAddrSpace::Unspecified, )); + let genesis_config = create_genesis_config(10_000).genesis_config; + let bank_forks = BankForks::new_rw_arc(Bank::new_for_tests(&genesis_config)); // Start duplicate thread receiving and inserting duplicates let t_check_duplicate = WindowService::start_check_duplicate_thread( @@ -624,6 +660,7 @@ mod test { blockstore.clone(), duplicate_shred_receiver, duplicate_slot_sender, + bank_forks, ); let handle_duplicate = |shred| { diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 78b4369ac6387a..09937642d884c5 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -736,6 +736,10 @@ pub mod consume_blockstore_duplicate_proofs { solana_sdk::declare_id!("6YsBCejwK96GZCkJ6mkZ4b68oP63z2PLoQmWjC7ggTqZ"); } +pub mod index_erasure_conflict_duplicate_proofs { + solana_sdk::declare_id!("dupPajaLy2SSn8ko42aZz4mHANDNrLe8Nw8VQgFecLa"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -914,7 +918,8 @@ lazy_static! { (validate_fee_collector_account::id(), "validate fee collector account #33888"), (enable_zk_transfer_with_fee::id(), "enable Zk Token proof program transfer with fee"), (drop_legacy_shreds::id(), "drops legacy shreds #34328"), - (consume_blockstore_duplicate_proofs::id(), "consume duplicate proofs from blockstore in consensus #34372") + (consume_blockstore_duplicate_proofs::id(), "consume duplicate proofs from blockstore in consensus #34372"), + (index_erasure_conflict_duplicate_proofs::id(), "generate duplicate proofs for index and erasure conflicts #34360"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() diff --git a/turbine/src/cluster_nodes.rs b/turbine/src/cluster_nodes.rs index 57676a34b75eff..124d6d8c99cca1 100644 --- a/turbine/src/cluster_nodes.rs +++ b/turbine/src/cluster_nodes.rs @@ -513,7 +513,7 @@ fn enable_turbine_fanout_experiments(shred_slot: Slot, root_bank: &Bank) -> bool // Returns true if the feature is effective for the shred slot. #[must_use] -fn check_feature_activation(feature: &Pubkey, shred_slot: Slot, root_bank: &Bank) -> bool { +pub fn check_feature_activation(feature: &Pubkey, shred_slot: Slot, root_bank: &Bank) -> bool { match root_bank.feature_set.activated_slot(feature) { None => false, Some(feature_slot) => { From de35043e313734ce8457e935d387e86d53ec70a6 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 20:26:12 +0000 Subject: [PATCH 126/213] v1.17: Cargo needs version arg after subcommand (backport of #34547) (#34551) Cargo needs version arg after subcommand (#34547) (cherry picked from commit d4363526fee3be0eddba3cf5a92224e5378c70b2) Co-authored-by: Tyera --- scripts/cargo-install-all.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/cargo-install-all.sh b/scripts/cargo-install-all.sh index 003d63fd1d24b0..549aa15550b0eb 100755 --- a/scripts/cargo-install-all.sh +++ b/scripts/cargo-install-all.sh @@ -158,8 +158,7 @@ mkdir -p "$installDir/bin" "$cargo" $maybeRustVersion \ --config 'patch.crates-io.ntapi.git="https://github.com/solana-labs/ntapi"' \ --config 'patch.crates-io.ntapi.rev="97ede981a1777883ff86d142b75024b023f04fad"' \ - $maybeSplTokenCliVersionArg \ - install --locked spl-token-cli --root "$installDir" + install --locked spl-token-cli --root "$installDir" $maybeSplTokenCliVersionArg fi ) From ef1fb9ec8eae3173ab94ab7688f4b5cd9dfbb9b0 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 05:56:21 +0000 Subject: [PATCH 127/213] v1.17: ledger-tool: support v0 transactions in blocks from bigtable (backport of #34544) (#34550) ledger-tool: support v0 transactions in blocks from bigtable (#34544) Support v0 transactions (cherry picked from commit 7d209a448dd2b310f5cda675b35662a8c9dd89c2) Co-authored-by: Tyera --- ledger-tool/src/bigtable.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger-tool/src/bigtable.rs b/ledger-tool/src/bigtable.rs index 6f0f3e8829ed7a..801b844e5219a5 100644 --- a/ledger-tool/src/bigtable.rs +++ b/ledger-tool/src/bigtable.rs @@ -126,7 +126,7 @@ async fn block( BlockEncodingOptions { transaction_details: TransactionDetails::Full, show_rewards: true, - max_supported_transaction_version: None, + max_supported_transaction_version: Some(0), }, ) .map_err(|err| match err { From 6a0ac908ed4ccacd6f1831032736883ffa8e54ba Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Thu, 21 Dec 2023 10:39:46 -0600 Subject: [PATCH 128/213] Update version to v1.17.14 (#34563) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ef2d98d659a863..6d2ab3a854b9b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.13" +version = "1.17.14" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.13" +version = "1.17.14" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.13" +version = "1.17.14" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.13" +version = "1.17.14" dependencies = [ "Inflector", "assert_matches", @@ -5123,7 +5123,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 2.33.3", "log", @@ -5137,7 +5137,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 2.33.3", "log", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.13" +version = "1.17.14" dependencies = [ "arrayref", "assert_matches", @@ -5231,7 +5231,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "bytemuck", @@ -5250,7 +5250,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -5261,7 +5261,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5285,7 +5285,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.13" +version = "1.17.14" dependencies = [ "serde", "solana-sdk", @@ -5311,7 +5311,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "crossbeam-channel", @@ -5329,7 +5329,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5340,7 +5340,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5381,7 +5381,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bv", "fnv", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -5419,7 +5419,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -5430,7 +5430,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bv", "bytemuck", @@ -5449,7 +5449,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "solana-logger", @@ -5457,7 +5457,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_cmd", "bzip2", @@ -5478,11 +5478,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.13" +version = "1.17.14" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.13" +version = "1.17.14" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5493,7 +5493,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "chrono", @@ -5510,7 +5510,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "chrono", @@ -5528,7 +5528,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.13" +version = "1.17.14" dependencies = [ "anyhow", "dirs-next", @@ -5596,7 +5596,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.13" +version = "1.17.14" dependencies = [ "Inflector", "base64 0.21.4", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-trait", "bincode", @@ -5654,7 +5654,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.13" +version = "1.17.14" dependencies = [ "futures-util", "rand 0.8.5", @@ -5684,7 +5684,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5692,7 +5692,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "chrono", @@ -5705,7 +5705,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-trait", "bincode", @@ -5729,7 +5729,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5812,7 +5812,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.13" +version = "1.17.14" dependencies = [ "lazy_static", "log", @@ -5837,7 +5837,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "clap 3.2.23", @@ -5867,7 +5867,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "console", "indicatif", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5890,7 +5890,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -5912,7 +5912,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "byteorder", @@ -5934,7 +5934,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.13" +version = "1.17.14" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5964,7 +5964,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.13" +version = "1.17.14" dependencies = [ "proc-macro2", "quote", @@ -5974,7 +5974,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.13" +version = "1.17.14" dependencies = [ "base64 0.21.4", "bincode", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "solana-accounts-db", @@ -6010,7 +6010,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "solana-sdk", @@ -6020,7 +6020,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bs58", "crossbeam-channel", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -6096,7 +6096,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.13" +version = "1.17.14" dependencies = [ "atty", "bincode", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bs58", "clap 3.2.23", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -6216,7 +6216,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_cmd", "bs58", @@ -6265,7 +6265,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "log", @@ -6277,7 +6277,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.13" +version = "1.17.14" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.13" +version = "1.17.14" dependencies = [ "env_logger", "lazy_static", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "solana-sdk", @@ -6345,11 +6345,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.13" +version = "1.17.14" [[package]] name = "solana-merkle-root-bench" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 2.33.3", "log", @@ -6362,7 +6362,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.13" +version = "1.17.14" dependencies = [ "fast-math", "hex", @@ -6371,7 +6371,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.13" +version = "1.17.14" dependencies = [ "crossbeam-channel", "env_logger", @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "clap 3.2.23", @@ -6418,7 +6418,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "reqwest", @@ -6428,7 +6428,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.13" +version = "1.17.14" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6459,7 +6459,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -6480,7 +6480,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 3.2.23", "log", @@ -6495,7 +6495,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "anyhow", "ark-bn254", @@ -6552,7 +6552,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6581,7 +6581,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "async-trait", @@ -6610,7 +6610,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "anyhow", "crossbeam-channel", @@ -6634,7 +6634,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-mutex", "async-trait", @@ -6662,7 +6662,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.13" +version = "1.17.14" dependencies = [ "lazy_static", "num_cpus", @@ -6670,7 +6670,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "console", @@ -6689,7 +6689,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.13" +version = "1.17.14" dependencies = [ "base64 0.21.4", "bincode", @@ -6748,7 +6748,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "async-trait", @@ -6777,7 +6777,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.13" +version = "1.17.14" dependencies = [ "base64 0.21.4", "bs58", @@ -6797,7 +6797,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "anyhow", "clap 2.33.3", @@ -6814,7 +6814,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "bs58", @@ -6841,7 +6841,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.13" +version = "1.17.14" dependencies = [ "arrayref", "assert_matches", @@ -6924,7 +6924,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.13" +version = "1.17.14" dependencies = [ "anyhow", "assert_matches", @@ -6982,7 +6982,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bs58", "proc-macro2", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.13" +version = "1.17.14" dependencies = [ "crossbeam-channel", "log", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7024,7 +7024,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -7041,7 +7041,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.13" +version = "1.17.14" dependencies = [ "backoff", "bincode", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "bs58", @@ -7089,7 +7089,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 2.33.3", "log", @@ -7101,7 +7101,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "async-channel", @@ -7133,7 +7133,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -7147,7 +7147,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.13" +version = "1.17.14" dependencies = [ "base64 0.21.4", "bincode", @@ -7177,7 +7177,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -7224,7 +7224,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-trait", "bincode", @@ -7246,7 +7246,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "clap 2.33.3", @@ -7273,7 +7273,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.13" +version = "1.17.14" dependencies = [ "Inflector", "base64 0.21.4", @@ -7296,7 +7296,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -7333,7 +7333,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-trait", "solana-connection-cache", @@ -7346,7 +7346,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.13" +version = "1.17.14" dependencies = [ "serde_json", "solana-metrics", @@ -7354,7 +7354,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.13" +version = "1.17.14" dependencies = [ "chrono", "clap 2.33.3", @@ -7418,7 +7418,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "rustc_version 0.4.0", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "crossbeam-channel", @@ -7451,7 +7451,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -7474,7 +7474,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 2.33.3", "humantime", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bs58", "clap 3.2.23", @@ -7512,7 +7512,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bytemuck", "criterion", @@ -7526,7 +7526,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7538,7 +7538,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.13" +version = "1.17.14" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 6b0777c758f163..cea09c1d49b401 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.13" +version = "1.17.14" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.13" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.13" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.13" } -solana-banks-client = { path = "banks-client", version = "=1.17.13" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.13" } -solana-banks-server = { path = "banks-server", version = "=1.17.13" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.13" } -solana-bloom = { path = "bloom", version = "=1.17.13" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.13" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.13" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.13", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.13" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.13" } -solana-cli = { path = "cli", version = "=1.17.13" } -solana-cli-config = { path = "cli-config", version = "=1.17.13" } -solana-cli-output = { path = "cli-output", version = "=1.17.13" } -solana-client = { path = "client", version = "=1.17.13" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.13" } -solana-config-program = { path = "programs/config", version = "=1.17.13" } -solana-core = { path = "core", version = "=1.17.13" } -solana-cost-model = { path = "cost-model", version = "=1.17.13" } -solana-download-utils = { path = "download-utils", version = "=1.17.13" } -solana-entry = { path = "entry", version = "=1.17.13" } -solana-faucet = { path = "faucet", version = "=1.17.13" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.13" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.13" } -solana-genesis = { path = "genesis", version = "=1.17.13" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.13" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.13" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.13" } -solana-gossip = { path = "gossip", version = "=1.17.13" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.13" } -solana-ledger = { path = "ledger", version = "=1.17.13" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.13" } -solana-logger = { path = "logger", version = "=1.17.13" } -solana-measure = { path = "measure", version = "=1.17.13" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.13" } -solana-metrics = { path = "metrics", version = "=1.17.13" } -solana-net-utils = { path = "net-utils", version = "=1.17.13" } -solana-notifier = { path = "notifier", version = "=1.17.13" } -solana-perf = { path = "perf", version = "=1.17.13" } -solana-poh = { path = "poh", version = "=1.17.13" } -solana-program = { path = "sdk/program", version = "=1.17.13" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.13" } -solana-program-test = { path = "program-test", version = "=1.17.13" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.13" } -solana-quic-client = { path = "quic-client", version = "=1.17.13" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.13" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.13", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.13" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.13", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.13" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.13" } -solana-runtime = { path = "runtime", version = "=1.17.13" } -solana-sdk = { path = "sdk", version = "=1.17.13" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.13" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.13" } -solana-stake-program = { path = "programs/stake", version = "=1.17.13" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.13" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.13" } -solana-streamer = { path = "streamer", version = "=1.17.13" } -solana-system-program = { path = "programs/system", version = "=1.17.13" } -solana-test-validator = { path = "test-validator", version = "=1.17.13" } -solana-thin-client = { path = "thin-client", version = "=1.17.13" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.13", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.13" } -solana-turbine = { path = "turbine", version = "=1.17.13" } -solana-udp-client = { path = "udp-client", version = "=1.17.13" } -solana-version = { path = "version", version = "=1.17.13" } -solana-vote = { path = "vote", version = "=1.17.13" } -solana-vote-program = { path = "programs/vote", version = "=1.17.13" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.13" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.13" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.13" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.14" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.14" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.14" } +solana-banks-client = { path = "banks-client", version = "=1.17.14" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.14" } +solana-banks-server = { path = "banks-server", version = "=1.17.14" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.14" } +solana-bloom = { path = "bloom", version = "=1.17.14" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.14" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.14" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.14", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.14" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.14" } +solana-cli = { path = "cli", version = "=1.17.14" } +solana-cli-config = { path = "cli-config", version = "=1.17.14" } +solana-cli-output = { path = "cli-output", version = "=1.17.14" } +solana-client = { path = "client", version = "=1.17.14" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.14" } +solana-config-program = { path = "programs/config", version = "=1.17.14" } +solana-core = { path = "core", version = "=1.17.14" } +solana-cost-model = { path = "cost-model", version = "=1.17.14" } +solana-download-utils = { path = "download-utils", version = "=1.17.14" } +solana-entry = { path = "entry", version = "=1.17.14" } +solana-faucet = { path = "faucet", version = "=1.17.14" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.14" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.14" } +solana-genesis = { path = "genesis", version = "=1.17.14" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.14" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.14" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.14" } +solana-gossip = { path = "gossip", version = "=1.17.14" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.14" } +solana-ledger = { path = "ledger", version = "=1.17.14" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.14" } +solana-logger = { path = "logger", version = "=1.17.14" } +solana-measure = { path = "measure", version = "=1.17.14" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.14" } +solana-metrics = { path = "metrics", version = "=1.17.14" } +solana-net-utils = { path = "net-utils", version = "=1.17.14" } +solana-notifier = { path = "notifier", version = "=1.17.14" } +solana-perf = { path = "perf", version = "=1.17.14" } +solana-poh = { path = "poh", version = "=1.17.14" } +solana-program = { path = "sdk/program", version = "=1.17.14" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.14" } +solana-program-test = { path = "program-test", version = "=1.17.14" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.14" } +solana-quic-client = { path = "quic-client", version = "=1.17.14" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.14" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.14", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.14" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.14", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.14" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.14" } +solana-runtime = { path = "runtime", version = "=1.17.14" } +solana-sdk = { path = "sdk", version = "=1.17.14" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.14" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.14" } +solana-stake-program = { path = "programs/stake", version = "=1.17.14" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.14" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.14" } +solana-streamer = { path = "streamer", version = "=1.17.14" } +solana-system-program = { path = "programs/system", version = "=1.17.14" } +solana-test-validator = { path = "test-validator", version = "=1.17.14" } +solana-thin-client = { path = "thin-client", version = "=1.17.14" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.14", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.14" } +solana-turbine = { path = "turbine", version = "=1.17.14" } +solana-udp-client = { path = "udp-client", version = "=1.17.14" } +solana-version = { path = "version", version = "=1.17.14" } +solana-vote = { path = "vote", version = "=1.17.14" } +solana-vote-program = { path = "programs/vote", version = "=1.17.14" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.14" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.14" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.14" } spl-associated-token-account = "=2.2.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index c17ddd62bafb3a..586be58ff3ae33 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4447,7 +4447,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.13" +version = "1.17.14" dependencies = [ "Inflector", "base64 0.21.4", @@ -4469,7 +4469,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.13" +version = "1.17.14" dependencies = [ "arrayref", "bincode", @@ -4526,7 +4526,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "bytemuck", @@ -4545,7 +4545,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4560,7 +4560,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.13" +version = "1.17.14" dependencies = [ "serde", "solana-sdk", @@ -4569,7 +4569,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "crossbeam-channel", @@ -4587,7 +4587,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bv", "fnv", @@ -4604,7 +4604,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4621,7 +4621,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.13" +version = "1.17.14" dependencies = [ "array-bytes", "serde", @@ -4631,7 +4631,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bv", "bytemuck", @@ -4647,7 +4647,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "chrono", "clap 2.33.3", @@ -4662,7 +4662,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.13" +version = "1.17.14" dependencies = [ "dirs-next", "lazy_static", @@ -4676,7 +4676,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.13" +version = "1.17.14" dependencies = [ "Inflector", "base64 0.21.4", @@ -4701,7 +4701,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-trait", "bincode", @@ -4732,7 +4732,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4740,7 +4740,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "chrono", @@ -4752,7 +4752,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-trait", "bincode", @@ -4772,7 +4772,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.13" +version = "1.17.14" dependencies = [ "base64 0.21.4", "bincode", @@ -4844,7 +4844,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.13" +version = "1.17.14" dependencies = [ "lazy_static", "log", @@ -4866,7 +4866,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "console", "indicatif", @@ -4878,7 +4878,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "crossbeam-channel", @@ -4898,7 +4898,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4920,7 +4920,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.13" +version = "1.17.14" dependencies = [ "ahash 0.8.3", "blake3", @@ -4948,7 +4948,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.13" +version = "1.17.14" dependencies = [ "proc-macro2", "quote", @@ -4958,7 +4958,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "solana-accounts-db", @@ -4969,7 +4969,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "solana-sdk", @@ -4979,7 +4979,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bs58", "crossbeam-channel", @@ -5004,7 +5004,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -5052,7 +5052,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "solana-measure", @@ -5127,7 +5127,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.13" +version = "1.17.14" dependencies = [ "env_logger", "lazy_static", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "solana-sdk", @@ -5144,7 +5144,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.13" +version = "1.17.14" dependencies = [ "fast-math", "solana-program", @@ -5152,7 +5152,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.13" +version = "1.17.14" dependencies = [ "crossbeam-channel", "gethostname", @@ -5165,7 +5165,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "clap 3.1.6", @@ -5185,7 +5185,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.13" +version = "1.17.14" dependencies = [ "ahash 0.8.3", "bincode", @@ -5212,7 +5212,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.13" +version = "1.17.14" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5228,7 +5228,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "ark-bn254", "ark-ec", @@ -5280,7 +5280,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.13" +version = "1.17.14" dependencies = [ "base64 0.21.4", "bincode", @@ -5306,7 +5306,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "async-trait", @@ -5334,7 +5334,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "crossbeam-channel", "futures-util", @@ -5357,7 +5357,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-mutex", "async-trait", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.13" +version = "1.17.14" dependencies = [ "lazy_static", "num_cpus", @@ -5390,7 +5390,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.13" +version = "1.17.14" dependencies = [ "console", "dialoguer", @@ -5407,7 +5407,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.13" +version = "1.17.14" dependencies = [ "base64 0.21.4", "bincode", @@ -5462,7 +5462,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-trait", "base64 0.21.4", @@ -5486,7 +5486,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.13" +version = "1.17.14" dependencies = [ "base64 0.21.4", "bs58", @@ -5506,7 +5506,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.13" +version = "1.17.14" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5517,7 +5517,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.13" +version = "1.17.14" dependencies = [ "arrayref", "base64 0.21.4", @@ -5592,7 +5592,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5621,7 +5621,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5629,21 +5629,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.13" +version = "1.17.14" dependencies = [ "array-bytes", "solana-program", @@ -5651,7 +5651,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.13" +version = "1.17.14" dependencies = [ "array-bytes", "solana-program", @@ -5659,21 +5659,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5681,14 +5681,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.13" +version = "1.17.14" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5696,21 +5696,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.13" +version = "1.17.14" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5720,42 +5720,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.13" +version = "1.17.14" dependencies = [ "rustversion", "solana-program", @@ -5765,49 +5765,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5815,14 +5815,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-program-runtime", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5840,21 +5840,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5862,14 +5862,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.13" +version = "1.17.14" dependencies = [ "array-bytes", "solana-program", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.13" +version = "1.17.14" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5886,14 +5886,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-program-runtime", @@ -5911,21 +5911,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-program-runtime", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.13" +version = "1.17.14" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5943,7 +5943,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.13" +version = "1.17.14" dependencies = [ "blake3", "solana-program", @@ -5951,21 +5951,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-logger", "solana-program", @@ -5976,21 +5976,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", "solana-program-runtime", @@ -6000,21 +6000,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.13" +version = "1.17.14" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.13" +version = "1.17.14" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6066,7 +6066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bs58", "proc-macro2", @@ -6077,7 +6077,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.17.13" +version = "1.17.14" dependencies = [ "crossbeam-channel", "log", @@ -6091,7 +6091,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "log", @@ -6104,7 +6104,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.13" +version = "1.17.14" dependencies = [ "backoff", "bincode", @@ -6136,7 +6136,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "bs58", @@ -6151,7 +6151,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-channel", "bytes", @@ -6181,7 +6181,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "log", @@ -6193,7 +6193,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.13" +version = "1.17.14" dependencies = [ "base64 0.21.4", "bincode", @@ -6223,7 +6223,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "log", @@ -6236,7 +6236,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-trait", "bincode", @@ -6258,7 +6258,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.13" +version = "1.17.14" dependencies = [ "Inflector", "base64 0.21.4", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "bytes", @@ -6316,7 +6316,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.13" +version = "1.17.14" dependencies = [ "async-trait", "solana-connection-cache", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.13" +version = "1.17.14" dependencies = [ "chrono", "clap 2.33.3", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.13" +version = "1.17.14" dependencies = [ "log", "rustc_version", @@ -6405,7 +6405,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.13" +version = "1.17.14" dependencies = [ "crossbeam-channel", "itertools", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bincode", "log", @@ -6442,7 +6442,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.13" +version = "1.17.14" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6454,7 +6454,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.13" +version = "1.17.14" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 58faa6e5ca3b8a..0e4d01b5daf6dd 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.13" +version = "1.17.14" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.13" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.13" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.13" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.13" } -solana-ledger = { path = "../../ledger", version = "=1.17.13" } -solana-logger = { path = "../../logger", version = "=1.17.13" } -solana-measure = { path = "../../measure", version = "=1.17.13" } -solana-program = { path = "../../sdk/program", version = "=1.17.13" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.13" } -solana-program-test = { path = "../../program-test", version = "=1.17.13" } -solana-runtime = { path = "../../runtime", version = "=1.17.13" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.13" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.13" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.13", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.13" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.13" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.13" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.13", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.13" } -solana-sdk = { path = "../../sdk", version = "=1.17.13" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.13" } -solana-validator = { path = "../../validator", version = "=1.17.13" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.13" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.14" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.14" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.14" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.14" } +solana-ledger = { path = "../../ledger", version = "=1.17.14" } +solana-logger = { path = "../../logger", version = "=1.17.14" } +solana-measure = { path = "../../measure", version = "=1.17.14" } +solana-program = { path = "../../sdk/program", version = "=1.17.14" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.14" } +solana-program-test = { path = "../../program-test", version = "=1.17.14" } +solana-runtime = { path = "../../runtime", version = "=1.17.14" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.14" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.14" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.14", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.14" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.14" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.14" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.14", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.14" } +solana-sdk = { path = "../../sdk", version = "=1.17.14" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.14" } +solana-validator = { path = "../../validator", version = "=1.17.14" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.14" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 069e38603ae5a1..698a395fedebd3 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.13" +version = "1.17.14" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.13" } +solana-program = { path = "../../../../program", version = "=1.17.14" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 8e0bfba049ab6f..9038ef28240c10 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.13" +version = "1.17.14" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.13" } +solana-program = { path = "../../../../program", version = "=1.17.14" } [lib] crate-type = ["cdylib"] From 069612e0dc9a959815c743c1ee1406a7c9a33630 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 20:09:25 +0000 Subject: [PATCH 129/213] v1.17: ci: split cargo-clippy into stable and nightly (backport of #34566) (#34569) * ci: split cargo-clippy into stable and nightly (#34566) * ci: split cargo-clippy into stable and nightly * ci: update mergify (cherry picked from commit 5247be17a976968a66f909f9d87ed55d0b8d2796) # Conflicts: # .mergify.yml # scripts/cargo-clippy.sh * fix conflict --------- Co-authored-by: Yihau Chen Co-authored-by: yihau --- .github/workflows/cargo.yml | 27 ++++++++++++++++--- scripts/cargo-clippy-nightly.sh | 33 +++++++++++++++++++++++ scripts/cargo-clippy-stable.sh | 31 ++++++++++++++++++++++ scripts/cargo-clippy.sh | 47 +++------------------------------ 4 files changed, 92 insertions(+), 46 deletions(-) create mode 100755 scripts/cargo-clippy-nightly.sh create mode 100755 scripts/cargo-clippy-stable.sh diff --git a/.github/workflows/cargo.yml b/.github/workflows/cargo.yml index 54566f705cb160..d0bad722e0d3a6 100644 --- a/.github/workflows/cargo.yml +++ b/.github/workflows/cargo.yml @@ -26,7 +26,7 @@ env: RUSTC_WRAPPER: "sccache" jobs: - clippy: + clippy-stable: strategy: matrix: os: @@ -44,7 +44,28 @@ jobs: - shell: bash run: | - source ci/rust-version.sh all + source ci/rust-version.sh stable rustup component add clippy --toolchain "$rust_stable" + scripts/cargo-clippy-stable.sh + + clippy-nightly: + strategy: + matrix: + os: + - macos-latest + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + + - uses: mozilla-actions/sccache-action@v0.0.3 + with: + version: "v0.5.4" + + - shell: bash + run: .github/scripts/cargo-clippy-before-script.sh ${{ runner.os }} + + - shell: bash + run: | + source ci/rust-version.sh nightly rustup component add clippy --toolchain "$rust_nightly" - scripts/cargo-clippy.sh + scripts/cargo-clippy-nightly.sh diff --git a/scripts/cargo-clippy-nightly.sh b/scripts/cargo-clippy-nightly.sh new file mode 100755 index 00000000000000..5393225542e2f6 --- /dev/null +++ b/scripts/cargo-clippy-nightly.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -o errexit + +here="$(dirname "$0")" +cargo="$(readlink -f "${here}/../cargo")" + +if [[ -z $cargo ]]; then + echo >&2 "Failed to find cargo. Mac readlink doesn't support -f. Consider switching + to gnu readlink with 'brew install coreutils' and then symlink greadlink as + /usr/local/bin/readlink." + exit 1 +fi + +# shellcheck source=ci/rust-version.sh +source "$here/../ci/rust-version.sh" nightly + +# Use nightly clippy, as frozen-abi proc-macro generates a lot of code across +# various crates in this whole monorepo (frozen-abi is enabled only under nightly +# due to the use of unstable rust feature). Likewise, frozen-abi(-macro) crates' +# unit tests are only compiled under nightly. +# Similarly, nightly is desired to run clippy over all of bench files because +# the bench itself isn't stabilized yet... +# ref: https://github.com/rust-lang/rust/issues/66287 +"$here/cargo-for-all-lock-files.sh" -- \ + "+${rust_nightly}" clippy \ + --workspace --all-targets --features dummy-for-ci-check -- \ + --deny=warnings \ + --deny=clippy::default_trait_access \ + --deny=clippy::arithmetic_side_effects \ + --deny=clippy::manual_let_else \ + --deny=clippy::used_underscore_binding \ + --allow=clippy::redundant_clone diff --git a/scripts/cargo-clippy-stable.sh b/scripts/cargo-clippy-stable.sh new file mode 100755 index 00000000000000..ed564503e6ae2a --- /dev/null +++ b/scripts/cargo-clippy-stable.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -o errexit + +here="$(dirname "$0")" +cargo="$(readlink -f "${here}/../cargo")" + +if [[ -z $cargo ]]; then + >&2 echo "Failed to find cargo. Mac readlink doesn't support -f. Consider switching + to gnu readlink with 'brew install coreutils' and then symlink greadlink as + /usr/local/bin/readlink." + exit 1 +fi + +# shellcheck source=ci/rust-version.sh +source "$here/../ci/rust-version.sh" stable + +# temporarily run stable clippy as well to scan the codebase for +# `redundant_clone`s, which is disabled as nightly clippy is buggy: +# https://github.com/solana-labs/solana/issues/31834 +# +# can't use --all-targets: +# error[E0554]: `#![feature]` may not be used on the stable release channel +"$here/cargo-for-all-lock-files.sh" -- \ + clippy \ + --workspace --tests --bins --examples --features dummy-for-ci-check -- \ + --deny=warnings \ + --deny=clippy::default_trait_access \ + --deny=clippy::arithmetic_side_effects \ + --deny=clippy::manual_let_else \ + --deny=clippy::used_underscore_binding diff --git a/scripts/cargo-clippy.sh b/scripts/cargo-clippy.sh index 7ec6c34110133b..2be51de54fb324 100755 --- a/scripts/cargo-clippy.sh +++ b/scripts/cargo-clippy.sh @@ -14,48 +14,9 @@ set -o errexit here="$(dirname "$0")" -cargo="$(readlink -f "${here}/../cargo")" -if [[ -z $cargo ]]; then - echo >&2 "Failed to find cargo. Mac readlink doesn't support -f. Consider switching - to gnu readlink with 'brew install coreutils' and then symlink greadlink as - /usr/local/bin/readlink." - exit 1 -fi +# stable +"$here/cargo-clippy-stable.sh" -# shellcheck source=ci/rust-version.sh -source "$here/../ci/rust-version.sh" - -nightly_clippy_allows=(--allow=clippy::redundant_clone) - -# Use nightly clippy, as frozen-abi proc-macro generates a lot of code across -# various crates in this whole monorepo (frozen-abi is enabled only under nightly -# due to the use of unstable rust feature). Likewise, frozen-abi(-macro) crates' -# unit tests are only compiled under nightly. -# Similarly, nightly is desired to run clippy over all of bench files because -# the bench itself isn't stabilized yet... -# ref: https://github.com/rust-lang/rust/issues/66287 -"$here/cargo-for-all-lock-files.sh" -- \ - "+${rust_nightly}" clippy \ - --workspace --all-targets --features dummy-for-ci-check -- \ - --deny=warnings \ - --deny=clippy::default_trait_access \ - --deny=clippy::arithmetic_side_effects \ - --deny=clippy::manual_let_else \ - --deny=clippy::used_underscore_binding \ - "${nightly_clippy_allows[@]}" - -# temporarily run stable clippy as well to scan the codebase for -# `redundant_clone`s, which is disabled as nightly clippy is buggy: -# https://github.com/solana-labs/solana/issues/31834 -# -# can't use --all-targets: -# error[E0554]: `#![feature]` may not be used on the stable release channel -"$here/cargo-for-all-lock-files.sh" -- \ - clippy \ - --workspace --tests --bins --examples --features dummy-for-ci-check -- \ - --deny=warnings \ - --deny=clippy::default_trait_access \ - --deny=clippy::arithmetic_side_effects \ - --deny=clippy::manual_let_else \ - --deny=clippy::used_underscore_binding +# nightly +"$here/cargo-clippy-nightly.sh" From 32c896397abecb6ded8ab64f671edc8cfc4ae62f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 15:33:44 -0800 Subject: [PATCH 130/213] v1.17: Add ContactInfo handling for shred versioning (backport of #34286) (#34570) Add ContactInfo handling for shred versioning (#34286) * handle ContactInfo in places where only LegacyContactInfo was used * missed a spot * missed a spot * import contact info for crds lookup * cargo fmt * rm contactinfo from crds_entry. not supported yet * typo * remove crds.nodes insert for ContactInfo. not supported yet * forgot to remove clusterinfo in remove() * move around contactinfo match arm * remove contactinfo updating crds.shred_version (cherry picked from commit 8ed149a3f2a94adfc7317a1c6fc43f2ccb829d04) Co-authored-by: Greg Cusack --- gossip/src/cluster_info.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gossip/src/cluster_info.rs b/gossip/src/cluster_info.rs index f2e99eed285162..4e4193a19fd880 100644 --- a/gossip/src/cluster_info.rs +++ b/gossip/src/cluster_info.rs @@ -3126,6 +3126,7 @@ fn filter_on_shred_version( if crds.get_shred_version(from) == Some(self_shred_version) { values.retain(|value| match &value.data { // Allow contact-infos so that shred-versions are updated. + CrdsData::ContactInfo(_) => true, CrdsData::LegacyContactInfo(_) => true, CrdsData::NodeInstance(_) => true, // Only retain values with the same shred version. @@ -3135,6 +3136,7 @@ fn filter_on_shred_version( values.retain(|value| match &value.data { // Allow node to update its own contact info in case their // shred-version changes + CrdsData::ContactInfo(node) => node.pubkey() == from, CrdsData::LegacyContactInfo(node) => node.pubkey() == from, CrdsData::NodeInstance(_) => true, _ => false, @@ -3153,6 +3155,11 @@ fn filter_on_shred_version( { Some(msg) } + CrdsData::ContactInfo(node) + if node.shred_version() == 0 || node.shred_version() == self_shred_version => + { + Some(msg) + } _ => { stats.skip_pull_shred_version.add_relaxed(1); None From bbdce0f273798f9ecce62e6c4c22e4a88b20c683 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 22:16:43 -0500 Subject: [PATCH 131/213] v1.17: spl: Bump token-2022 to v1 (backport of #34412) (#34572) * spl: Bump token-2022 to v1 (#34412) * Update toml and lockfiles * account-decoder: Add group and group member extensions * transaction-status: Add token group + pointer extensions * program-test: Update token-2022 binary (cherry picked from commit 8a8466cd86030a667a04e446d1dc174aa39cfad0) # Conflicts: # Cargo.toml * Fix merge conflicts --------- Co-authored-by: Jon Cinque --- Cargo.lock | 50 +++-- Cargo.toml | 5 +- account-decoder/Cargo.toml | 1 + account-decoder/src/parse_token_extension.rs | 96 +++++++++ program-test/src/programs.rs | 2 +- .../src/programs/spl_token_2022-0.9.0.so | Bin 599088 -> 0 bytes .../src/programs/spl_token_2022-1.0.0.so | Bin 0 -> 535256 bytes programs/sbf/Cargo.lock | 50 +++-- transaction-status/src/parse_token.rs | 46 ++++- .../extension/group_member_pointer.rs | 189 ++++++++++++++++++ .../parse_token/extension/group_pointer.rs | 183 +++++++++++++++++ .../src/parse_token/extension/mod.rs | 2 + 12 files changed, 589 insertions(+), 35 deletions(-) delete mode 100644 program-test/src/programs/spl_token_2022-0.9.0.so create mode 100755 program-test/src/programs/spl_token_2022-1.0.0.so create mode 100644 transaction-status/src/parse_token/extension/group_member_pointer.rs create mode 100644 transaction-status/src/parse_token/extension/group_pointer.rs diff --git a/Cargo.lock b/Cargo.lock index 6d2ab3a854b9b4..a2a8c340e5af5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3388,11 +3388,11 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70bf6736f74634d299d00086f02986875b3c2d924781a6a2cb6c201e73da0ceb" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" dependencies = [ - "num_enum_derive 0.7.0", + "num_enum_derive 0.7.1", ] [[package]] @@ -3421,9 +3421,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" dependencies = [ "proc-macro-crate 1.1.0", "proc-macro2", @@ -5116,6 +5116,7 @@ dependencies = [ "spl-pod", "spl-token", "spl-token-2022", + "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", "zstd", @@ -6991,6 +6992,12 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + [[package]] name = "solana-send-transaction-service" version = "1.17.14" @@ -7608,9 +7615,9 @@ dependencies = [ [[package]] name = "spl-associated-token-account" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3" +checksum = "992d9c64c2564cc8f63a4b508bf3ebcdf2254b0429b13cd1d31adb6162432a5f" dependencies = [ "assert_matches", "borsh 0.10.3", @@ -7716,9 +7723,9 @@ dependencies = [ [[package]] name = "spl-tlv-account-resolution" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +checksum = "3f7020347c07892c08560d230fbb8a980316c9e198e22b198b7b9d951ff96047" dependencies = [ "bytemuck", "solana-program", @@ -7745,26 +7752,41 @@ dependencies = [ [[package]] name = "spl-token-2022" -version = "0.9.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" +checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" dependencies = [ "arrayref", "bytemuck", "num-derive 0.4.1", "num-traits", - "num_enum 0.7.0", + "num_enum 0.7.1", "solana-program", + "solana-security-txt", "solana-zk-token-sdk", "spl-memo", "spl-pod", "spl-token", + "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface", "spl-type-length-value", "thiserror", ] +[[package]] +name = "spl-token-group-interface" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + [[package]] name = "spl-token-metadata-interface" version = "0.2.0" @@ -7781,9 +7803,9 @@ dependencies = [ [[package]] name = "spl-transfer-hook-interface" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" +checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" dependencies = [ "arrayref", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index cea09c1d49b401..40c7d7494f9ae2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -373,12 +373,13 @@ solana-vote-program = { path = "programs/vote", version = "=1.17.14" } solana-zk-keygen = { path = "zk-keygen", version = "=1.17.14" } solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.14" } solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.14" } -spl-associated-token-account = "=2.2.0" +spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" spl-pod = "=0.1.0" spl-token = "=4.0.0" -spl-token-2022 = "=0.9.0" +spl-token-2022 = "=1.0.0" +spl-token-group-interface = "=0.1.0" spl-token-metadata-interface = "=0.2.0" static_assertions = "1.1.0" stream-cancel = "0.8.1" diff --git a/account-decoder/Cargo.toml b/account-decoder/Cargo.toml index 3f883ddc23f9f5..7aee8478b4f126 100644 --- a/account-decoder/Cargo.toml +++ b/account-decoder/Cargo.toml @@ -23,6 +23,7 @@ solana-config-program = { workspace = true } solana-sdk = { workspace = true } spl-token = { workspace = true, features = ["no-entrypoint"] } spl-token-2022 = { workspace = true, features = ["no-entrypoint"] } +spl-token-group-interface = { workspace = true } spl-token-metadata-interface = { workspace = true } thiserror = { workspace = true } zstd = { workspace = true } diff --git a/account-decoder/src/parse_token_extension.rs b/account-decoder/src/parse_token_extension.rs index 39d26d83a20b99..a2fdef41b47407 100644 --- a/account-decoder/src/parse_token_extension.rs +++ b/account-decoder/src/parse_token_extension.rs @@ -6,6 +6,7 @@ use { solana_program::pubkey::Pubkey, solana_zk_token_sdk::zk_token_elgamal::pod::ElGamalPubkey, }, + spl_token_group_interface::state::{TokenGroup, TokenGroupMember}, spl_token_metadata_interface::state::TokenMetadata, }; @@ -32,6 +33,10 @@ pub enum UiExtension { TransferHookAccount(UiTransferHookAccount), MetadataPointer(UiMetadataPointer), TokenMetadata(UiTokenMetadata), + GroupPointer(UiGroupPointer), + GroupMemberPointer(UiGroupMemberPointer), + TokenGroup(UiTokenGroup), + TokenGroupMember(UiTokenGroupMember), UnparseableExtension, } @@ -108,6 +113,22 @@ pub fn parse_extension( .get_extension::() .map(|&extension| UiExtension::TransferHookAccount(extension.into())) .unwrap_or(UiExtension::UnparseableExtension), + ExtensionType::GroupPointer => account + .get_extension::() + .map(|&extension| UiExtension::GroupPointer(extension.into())) + .unwrap_or(UiExtension::UnparseableExtension), + ExtensionType::GroupMemberPointer => account + .get_extension::() + .map(|&extension| UiExtension::GroupMemberPointer(extension.into())) + .unwrap_or(UiExtension::UnparseableExtension), + ExtensionType::TokenGroup => account + .get_extension::() + .map(|&extension| UiExtension::TokenGroup(extension.into())) + .unwrap_or(UiExtension::UnparseableExtension), + ExtensionType::TokenGroupMember => account + .get_extension::() + .map(|&extension| UiExtension::TokenGroupMember(extension.into())) + .unwrap_or(UiExtension::UnparseableExtension), } } @@ -481,3 +502,78 @@ impl From for UiTransferHookAccou } } } + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct UiGroupPointer { + pub authority: Option, + pub group_address: Option, +} + +impl From for UiGroupPointer { + fn from(group_pointer: extension::group_pointer::GroupPointer) -> Self { + let authority: Option = group_pointer.authority.into(); + let group_address: Option = group_pointer.group_address.into(); + Self { + authority: authority.map(|pubkey| pubkey.to_string()), + group_address: group_address.map(|pubkey| pubkey.to_string()), + } + } +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct UiGroupMemberPointer { + pub authority: Option, + pub member_address: Option, +} + +impl From for UiGroupMemberPointer { + fn from(member_pointer: extension::group_member_pointer::GroupMemberPointer) -> Self { + let authority: Option = member_pointer.authority.into(); + let member_address: Option = member_pointer.member_address.into(); + Self { + authority: authority.map(|pubkey| pubkey.to_string()), + member_address: member_address.map(|pubkey| pubkey.to_string()), + } + } +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct UiTokenGroup { + pub update_authority: Option, + pub mint: String, + pub size: u32, + pub max_size: u32, +} + +impl From for UiTokenGroup { + fn from(token_group: TokenGroup) -> Self { + let update_authority: Option = token_group.update_authority.into(); + Self { + update_authority: update_authority.map(|pubkey| pubkey.to_string()), + mint: token_group.mint.to_string(), + size: token_group.size.into(), + max_size: token_group.max_size.into(), + } + } +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct UiTokenGroupMember { + pub mint: String, + pub group: String, + pub member_number: u32, +} + +impl From for UiTokenGroupMember { + fn from(member: TokenGroupMember) -> Self { + Self { + mint: member.mint.to_string(), + group: member.group.to_string(), + member_number: member.member_number.into(), + } + } +} diff --git a/program-test/src/programs.rs b/program-test/src/programs.rs index ed96be7644f277..8d9a42790f7af2 100644 --- a/program-test/src/programs.rs +++ b/program-test/src/programs.rs @@ -30,7 +30,7 @@ static SPL_PROGRAMS: &[(Pubkey, Pubkey, &[u8])] = &[ ( spl_token_2022::ID, solana_sdk::bpf_loader_upgradeable::ID, - include_bytes!("programs/spl_token_2022-0.9.0.so"), + include_bytes!("programs/spl_token_2022-1.0.0.so"), ), ( spl_memo_1_0::ID, diff --git a/program-test/src/programs/spl_token_2022-0.9.0.so b/program-test/src/programs/spl_token_2022-0.9.0.so deleted file mode 100644 index 704fce119087717dafb64963b1c15faac125f6df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599088 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�3OwjK8_M^Gbpz$J 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 KANen@|Nj8y*1}By diff --git a/program-test/src/programs/spl_token_2022-1.0.0.so b/program-test/src/programs/spl_token_2022-1.0.0.so new file mode 100755 index 0000000000000000000000000000000000000000..796fafc4cc13ab3b2e1b00551f2e0c5cb4107fe4 GIT binary patch literal 535256 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

    re=z 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 z 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 "mint", + | AuthorityType::MetadataPointer + | AuthorityType::GroupPointer + | AuthorityType::GroupMemberPointer => "mint", AuthorityType::AccountOwner | AuthorityType::CloseAccount => "account", }; let mut value = json!({ @@ -650,6 +652,30 @@ pub fn parse_token( account_keys, ) } + TokenInstruction::GroupPointerExtension => { + if instruction.data.len() < 2 { + return Err(ParseInstructionError::InstructionNotParsable( + ParsableProgram::SplToken, + )); + } + parse_group_pointer_instruction( + &instruction.data[1..], + &instruction.accounts, + account_keys, + ) + } + TokenInstruction::GroupMemberPointerExtension => { + if instruction.data.len() < 2 { + return Err(ParseInstructionError::InstructionNotParsable( + ParsableProgram::SplToken, + )); + } + parse_group_member_pointer_instruction( + &instruction.data[1..], + &instruction.accounts, + account_keys, + ) + } } } @@ -669,6 +695,8 @@ pub enum UiAuthorityType { TransferHookProgramId, ConfidentialTransferFeeConfig, MetadataPointer, + GroupPointer, + GroupMemberPointer, } impl From for UiAuthorityType { @@ -689,6 +717,8 @@ impl From for UiAuthorityType { UiAuthorityType::ConfidentialTransferFeeConfig } AuthorityType::MetadataPointer => UiAuthorityType::MetadataPointer, + AuthorityType::GroupPointer => UiAuthorityType::GroupPointer, + AuthorityType::GroupMemberPointer => UiAuthorityType::GroupMemberPointer, } } } @@ -716,6 +746,10 @@ pub enum UiExtensionType { ConfidentialTransferFeeAmount, MetadataPointer, TokenMetadata, + GroupPointer, + GroupMemberPointer, + TokenGroup, + TokenGroupMember, } impl From for UiExtensionType { @@ -747,6 +781,10 @@ impl From for UiExtensionType { } ExtensionType::MetadataPointer => UiExtensionType::MetadataPointer, ExtensionType::TokenMetadata => UiExtensionType::TokenMetadata, + ExtensionType::GroupPointer => UiExtensionType::GroupPointer, + ExtensionType::GroupMemberPointer => UiExtensionType::GroupMemberPointer, + ExtensionType::TokenGroup => UiExtensionType::TokenGroup, + ExtensionType::TokenGroupMember => UiExtensionType::TokenGroupMember, } } } diff --git a/transaction-status/src/parse_token/extension/group_member_pointer.rs b/transaction-status/src/parse_token/extension/group_member_pointer.rs new file mode 100644 index 00000000000000..24d0503dc51ef7 --- /dev/null +++ b/transaction-status/src/parse_token/extension/group_member_pointer.rs @@ -0,0 +1,189 @@ +use { + super::*, + spl_token_2022::{ + extension::group_member_pointer::instruction::*, + instruction::{decode_instruction_data, decode_instruction_type}, + }, +}; + +pub(in crate::parse_token) fn parse_group_member_pointer_instruction( + instruction_data: &[u8], + account_indexes: &[u8], + account_keys: &AccountKeys, +) -> Result { + match decode_instruction_type(instruction_data) + .map_err(|_| ParseInstructionError::InstructionNotParsable(ParsableProgram::SplToken))? + { + GroupMemberPointerInstruction::Initialize => { + check_num_token_accounts(account_indexes, 1)?; + let InitializeInstructionData { + authority, + member_address, + } = *decode_instruction_data(instruction_data).map_err(|_| { + ParseInstructionError::InstructionNotParsable(ParsableProgram::SplToken) + })?; + let mut value = json!({ + "mint": account_keys[account_indexes[0] as usize].to_string(), + }); + let map = value.as_object_mut().unwrap(); + if let Some(authority) = Option::::from(authority) { + map.insert("authority".to_string(), json!(authority.to_string())); + } + if let Some(member_address) = Option::::from(member_address) { + map.insert( + "memberAddress".to_string(), + json!(member_address.to_string()), + ); + } + Ok(ParsedInstructionEnum { + instruction_type: "initializeGroupMemberPointer".to_string(), + info: value, + }) + } + GroupMemberPointerInstruction::Update => { + check_num_token_accounts(account_indexes, 2)?; + let UpdateInstructionData { member_address } = + *decode_instruction_data(instruction_data).map_err(|_| { + ParseInstructionError::InstructionNotParsable(ParsableProgram::SplToken) + })?; + let mut value = json!({ + "mint": account_keys[account_indexes[0] as usize].to_string(), + }); + let map = value.as_object_mut().unwrap(); + if let Some(member_address) = Option::::from(member_address) { + map.insert( + "memberAddress".to_string(), + json!(member_address.to_string()), + ); + } + parse_signers( + map, + 1, + account_keys, + account_indexes, + "authority", + "multisigAuthority", + ); + Ok(ParsedInstructionEnum { + instruction_type: "updateGroupMemberPointer".to_string(), + info: value, + }) + } + } +} + +#[cfg(test)] +mod test { + use {super::*, solana_sdk::pubkey::Pubkey, spl_token_2022::solana_program::message::Message}; + + #[test] + fn test_parse_group_member_pointer_instruction() { + let mint_pubkey = Pubkey::new_unique(); + let authority = Pubkey::new_unique(); + let member_address = Pubkey::new_unique(); + + // Initialize variations + let init_ix = initialize( + &spl_token_2022::id(), + &mint_pubkey, + Some(authority), + Some(member_address), + ) + .unwrap(); + let mut message = Message::new(&[init_ix], None); + let compiled_instruction = &mut message.instructions[0]; + assert_eq!( + parse_token( + compiled_instruction, + &AccountKeys::new(&message.account_keys, None) + ) + .unwrap(), + ParsedInstructionEnum { + instruction_type: "initializeGroupMemberPointer".to_string(), + info: json!({ + "mint": mint_pubkey.to_string(), + "authority": authority.to_string(), + "memberAddress": member_address.to_string(), + }) + } + ); + + let init_ix = initialize(&spl_token_2022::id(), &mint_pubkey, None, None).unwrap(); + let mut message = Message::new(&[init_ix], None); + let compiled_instruction = &mut message.instructions[0]; + assert_eq!( + parse_token( + compiled_instruction, + &AccountKeys::new(&message.account_keys, None) + ) + .unwrap(), + ParsedInstructionEnum { + instruction_type: "initializeGroupMemberPointer".to_string(), + info: json!({ + "mint": mint_pubkey.to_string(), + }) + } + ); + + // Single owner Update + let update_ix = update( + &spl_token_2022::id(), + &mint_pubkey, + &authority, + &[], + Some(member_address), + ) + .unwrap(); + let mut message = Message::new(&[update_ix], None); + let compiled_instruction = &mut message.instructions[0]; + assert_eq!( + parse_token( + compiled_instruction, + &AccountKeys::new(&message.account_keys, None) + ) + .unwrap(), + ParsedInstructionEnum { + instruction_type: "updateGroupMemberPointer".to_string(), + info: json!({ + "mint": mint_pubkey.to_string(), + "authority": authority.to_string(), + "memberAddress": member_address.to_string(), + }) + } + ); + + // Multisig Update + let multisig_pubkey = Pubkey::new_unique(); + let multisig_signer0 = Pubkey::new_unique(); + let multisig_signer1 = Pubkey::new_unique(); + let update_ix = update( + &spl_token_2022::id(), + &mint_pubkey, + &multisig_pubkey, + &[&multisig_signer0, &multisig_signer1], + Some(member_address), + ) + .unwrap(); + let mut message = Message::new(&[update_ix], None); + let compiled_instruction = &mut message.instructions[0]; + assert_eq!( + parse_token( + compiled_instruction, + &AccountKeys::new(&message.account_keys, None) + ) + .unwrap(), + ParsedInstructionEnum { + instruction_type: "updateGroupMemberPointer".to_string(), + info: json!({ + "mint": mint_pubkey.to_string(), + "memberAddress": member_address.to_string(), + "multisigAuthority": multisig_pubkey.to_string(), + "signers": vec![ + multisig_signer0.to_string(), + multisig_signer1.to_string(), + ], + }) + } + ); + } +} diff --git a/transaction-status/src/parse_token/extension/group_pointer.rs b/transaction-status/src/parse_token/extension/group_pointer.rs new file mode 100644 index 00000000000000..5800a2fd8850f9 --- /dev/null +++ b/transaction-status/src/parse_token/extension/group_pointer.rs @@ -0,0 +1,183 @@ +use { + super::*, + spl_token_2022::{ + extension::group_pointer::instruction::*, + instruction::{decode_instruction_data, decode_instruction_type}, + }, +}; + +pub(in crate::parse_token) fn parse_group_pointer_instruction( + instruction_data: &[u8], + account_indexes: &[u8], + account_keys: &AccountKeys, +) -> Result { + match decode_instruction_type(instruction_data) + .map_err(|_| ParseInstructionError::InstructionNotParsable(ParsableProgram::SplToken))? + { + GroupPointerInstruction::Initialize => { + check_num_token_accounts(account_indexes, 1)?; + let InitializeInstructionData { + authority, + group_address, + } = *decode_instruction_data(instruction_data).map_err(|_| { + ParseInstructionError::InstructionNotParsable(ParsableProgram::SplToken) + })?; + let mut value = json!({ + "mint": account_keys[account_indexes[0] as usize].to_string(), + }); + let map = value.as_object_mut().unwrap(); + if let Some(authority) = Option::::from(authority) { + map.insert("authority".to_string(), json!(authority.to_string())); + } + if let Some(group_address) = Option::::from(group_address) { + map.insert("groupAddress".to_string(), json!(group_address.to_string())); + } + Ok(ParsedInstructionEnum { + instruction_type: "initializeGroupPointer".to_string(), + info: value, + }) + } + GroupPointerInstruction::Update => { + check_num_token_accounts(account_indexes, 2)?; + let UpdateInstructionData { group_address } = + *decode_instruction_data(instruction_data).map_err(|_| { + ParseInstructionError::InstructionNotParsable(ParsableProgram::SplToken) + })?; + let mut value = json!({ + "mint": account_keys[account_indexes[0] as usize].to_string(), + }); + let map = value.as_object_mut().unwrap(); + if let Some(group_address) = Option::::from(group_address) { + map.insert("groupAddress".to_string(), json!(group_address.to_string())); + } + parse_signers( + map, + 1, + account_keys, + account_indexes, + "authority", + "multisigAuthority", + ); + Ok(ParsedInstructionEnum { + instruction_type: "updateGroupPointer".to_string(), + info: value, + }) + } + } +} + +#[cfg(test)] +mod test { + use {super::*, solana_sdk::pubkey::Pubkey, spl_token_2022::solana_program::message::Message}; + + #[test] + fn test_parse_group_pointer_instruction() { + let mint_pubkey = Pubkey::new_unique(); + let authority = Pubkey::new_unique(); + let group_address = Pubkey::new_unique(); + + // Initialize variations + let init_ix = initialize( + &spl_token_2022::id(), + &mint_pubkey, + Some(authority), + Some(group_address), + ) + .unwrap(); + let mut message = Message::new(&[init_ix], None); + let compiled_instruction = &mut message.instructions[0]; + assert_eq!( + parse_token( + compiled_instruction, + &AccountKeys::new(&message.account_keys, None) + ) + .unwrap(), + ParsedInstructionEnum { + instruction_type: "initializeGroupPointer".to_string(), + info: json!({ + "mint": mint_pubkey.to_string(), + "authority": authority.to_string(), + "groupAddress": group_address.to_string(), + }) + } + ); + + let init_ix = initialize(&spl_token_2022::id(), &mint_pubkey, None, None).unwrap(); + let mut message = Message::new(&[init_ix], None); + let compiled_instruction = &mut message.instructions[0]; + assert_eq!( + parse_token( + compiled_instruction, + &AccountKeys::new(&message.account_keys, None) + ) + .unwrap(), + ParsedInstructionEnum { + instruction_type: "initializeGroupPointer".to_string(), + info: json!({ + "mint": mint_pubkey.to_string(), + }) + } + ); + + // Single owner Update + let update_ix = update( + &spl_token_2022::id(), + &mint_pubkey, + &authority, + &[], + Some(group_address), + ) + .unwrap(); + let mut message = Message::new(&[update_ix], None); + let compiled_instruction = &mut message.instructions[0]; + assert_eq!( + parse_token( + compiled_instruction, + &AccountKeys::new(&message.account_keys, None) + ) + .unwrap(), + ParsedInstructionEnum { + instruction_type: "updateGroupPointer".to_string(), + info: json!({ + "mint": mint_pubkey.to_string(), + "authority": authority.to_string(), + "groupAddress": group_address.to_string(), + }) + } + ); + + // Multisig Update + let multisig_pubkey = Pubkey::new_unique(); + let multisig_signer0 = Pubkey::new_unique(); + let multisig_signer1 = Pubkey::new_unique(); + let update_ix = update( + &spl_token_2022::id(), + &mint_pubkey, + &multisig_pubkey, + &[&multisig_signer0, &multisig_signer1], + Some(group_address), + ) + .unwrap(); + let mut message = Message::new(&[update_ix], None); + let compiled_instruction = &mut message.instructions[0]; + assert_eq!( + parse_token( + compiled_instruction, + &AccountKeys::new(&message.account_keys, None) + ) + .unwrap(), + ParsedInstructionEnum { + instruction_type: "updateGroupPointer".to_string(), + info: json!({ + "mint": mint_pubkey.to_string(), + "groupAddress": group_address.to_string(), + "multisigAuthority": multisig_pubkey.to_string(), + "signers": vec![ + multisig_signer0.to_string(), + multisig_signer1.to_string(), + ], + }) + } + ); + } +} diff --git a/transaction-status/src/parse_token/extension/mod.rs b/transaction-status/src/parse_token/extension/mod.rs index 8e65ddfcfc691f..19dd4f14b2fd04 100644 --- a/transaction-status/src/parse_token/extension/mod.rs +++ b/transaction-status/src/parse_token/extension/mod.rs @@ -4,6 +4,8 @@ pub(super) mod confidential_transfer; pub(super) mod confidential_transfer_fee; pub(super) mod cpi_guard; pub(super) mod default_account_state; +pub(super) mod group_member_pointer; +pub(super) mod group_pointer; pub(super) mod interest_bearing_mint; pub(super) mod memo_transfer; pub(super) mod metadata_pointer; From 12d5be04e63debdb81b9e31d1da191519c8f5fc8 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 20:51:36 -0800 Subject: [PATCH 132/213] v1.17: Throttle unstaked quic streams for a given connection (backport of #34562) (#34574) --- bench-tps/src/send_batch.rs | 8 ++- local-cluster/tests/local_cluster.rs | 34 +++++----- quic-client/tests/quic_client.rs | 8 ++- streamer/src/nonblocking/quic.rs | 94 +++++++++++++++++++++++++--- 4 files changed, 113 insertions(+), 31 deletions(-) diff --git a/bench-tps/src/send_batch.rs b/bench-tps/src/send_batch.rs index b6f1fe776ff7dc..5ea916530ca23d 100644 --- a/bench-tps/src/send_batch.rs +++ b/bench-tps/src/send_batch.rs @@ -248,9 +248,13 @@ where fn send(&self, client: &Arc) { let mut send_txs = Measure::start("send_and_clone_txs"); let batch: Vec<_> = self.iter().map(|(_keypair, tx)| tx.clone()).collect(); - client.send_batch(batch).expect("transfer"); + let result = client.send_batch(batch); send_txs.stop(); - debug!("send {} {}", self.len(), send_txs); + if result.is_err() { + debug!("Failed to send batch {result:?}"); + } else { + debug!("send {} {}", self.len(), send_txs); + } } fn verify( diff --git a/local-cluster/tests/local_cluster.rs b/local-cluster/tests/local_cluster.rs index 90ffae34f10ee5..fc08389947d581 100644 --- a/local-cluster/tests/local_cluster.rs +++ b/local-cluster/tests/local_cluster.rs @@ -2918,24 +2918,26 @@ fn setup_transfer_scan_threads( .get_latest_blockhash_with_commitment(CommitmentConfig::processed()) .unwrap(); for i in 0..starting_keypairs_.len() { - client - .async_transfer( - 1, - &starting_keypairs_[i], - &target_keypairs_[i].pubkey(), - blockhash, - ) - .unwrap(); + let result = client.async_transfer( + 1, + &starting_keypairs_[i], + &target_keypairs_[i].pubkey(), + blockhash, + ); + if result.is_err() { + debug!("Failed in transfer for starting keypair: {:?}", result); + } } for i in 0..starting_keypairs_.len() { - client - .async_transfer( - 1, - &target_keypairs_[i], - &starting_keypairs_[i].pubkey(), - blockhash, - ) - .unwrap(); + let result = client.async_transfer( + 1, + &target_keypairs_[i], + &starting_keypairs_[i].pubkey(), + blockhash, + ); + if result.is_err() { + debug!("Failed in transfer for starting keypair: {:?}", result); + } } } }) diff --git a/quic-client/tests/quic_client.rs b/quic-client/tests/quic_client.rs index 7608e2b7b265c7..7986e7a3b728d7 100644 --- a/quic-client/tests/quic_client.rs +++ b/quic-client/tests/quic_client.rs @@ -46,7 +46,7 @@ mod tests { assert_eq!(p.meta().size, num_bytes); } } - assert_eq!(total_packets, num_expected_packets); + assert!(total_packets > 0); } fn server_args() -> (UdpSocket, Arc, Keypair, IpAddr) { @@ -135,7 +135,7 @@ mod tests { assert_eq!(p.meta().size, num_bytes); } } - assert_eq!(total_packets, num_expected_packets); + assert!(total_packets > 0); } #[tokio::test] @@ -178,7 +178,9 @@ mod tests { let num_bytes = PACKET_DATA_SIZE; let num_expected_packets: usize = 3000; let packets = vec![vec![0u8; PACKET_DATA_SIZE]; num_expected_packets]; - assert!(client.send_data_batch(&packets).await.is_ok()); + for packet in packets { + let _ = client.send_data(&packet).await; + } nonblocking_check_packets(receiver, num_bytes, num_expected_packets).await; exit.store(true, Ordering::Relaxed); diff --git a/streamer/src/nonblocking/quic.rs b/streamer/src/nonblocking/quic.rs index d238552abb0e7c..8f8adc506103ba 100644 --- a/streamer/src/nonblocking/quic.rs +++ b/streamer/src/nonblocking/quic.rs @@ -1,6 +1,6 @@ use { crate::{ - quic::{configure_server, QuicServerError, StreamStats}, + quic::{configure_server, QuicServerError, StreamStats, MAX_UNSTAKED_CONNECTIONS}, streamer::StakedNodes, tls_certificates::get_pubkey_from_tls_certificate, }, @@ -39,6 +39,10 @@ use { tokio::{task::JoinHandle, time::timeout}, }; +/// Limit to 500K PPS +const MAX_STREAMS_PER_100MS: u64 = 500_000 / 10; +const MAX_UNSTAKED_STREAMS_PERCENT: u64 = 20; +const STREAM_THROTTLING_INTERVAL: Duration = Duration::from_millis(100); const WAIT_FOR_STREAM_TIMEOUT: Duration = Duration::from_millis(100); pub const DEFAULT_WAIT_FOR_CHUNK_TIMEOUT: Duration = Duration::from_secs(10); @@ -55,6 +59,7 @@ const CONNECTION_CLOSE_REASON_EXCEED_MAX_STREAM_COUNT: &[u8] = b"exceed_max_stre const CONNECTION_CLOSE_CODE_TOO_MANY: u32 = 4; const CONNECTION_CLOSE_REASON_TOO_MANY: &[u8] = b"too_many"; +const STREAM_STOP_CODE_THROTTLING: u32 = 15; // A sequence of bytes that is part of a packet // along with where in the packet it is @@ -264,6 +269,7 @@ enum ConnectionHandlerError { MaxStreamError, } +#[derive(Clone)] struct NewConnectionHandlerParams { // In principle, the code can be made to work with a crossbeam channel // as long as we're careful never to use a blocking recv or send call @@ -348,13 +354,11 @@ fn handle_and_cache_new_connection( drop(connection_table_l); tokio::spawn(handle_connection( connection, - params.packet_sender.clone(), remote_addr, - params.remote_pubkey, last_update, connection_table, stream_exit, - params.stats.clone(), + params.clone(), peer_type, wait_for_chunk_timeout, )); @@ -681,19 +685,42 @@ async fn packet_batch_sender( } } -#[allow(clippy::too_many_arguments)] +fn max_streams_for_connection_in_100ms( + connection_type: ConnectionPeerType, + stake: u64, + total_stake: u64, +) -> u64 { + if matches!(connection_type, ConnectionPeerType::Unstaked) || stake == 0 { + Percentage::from(MAX_UNSTAKED_STREAMS_PERCENT) + .apply_to(MAX_STREAMS_PER_100MS) + .saturating_div(MAX_UNSTAKED_CONNECTIONS as u64) + } else { + let max_total_staked_streams: u64 = MAX_STREAMS_PER_100MS + - Percentage::from(MAX_UNSTAKED_STREAMS_PERCENT).apply_to(MAX_STREAMS_PER_100MS); + ((max_total_staked_streams as f64 / total_stake as f64) * stake as f64) as u64 + } +} + +fn reset_throttling_params_if_needed(last_instant: &mut tokio::time::Instant) -> bool { + if tokio::time::Instant::now().duration_since(*last_instant) > STREAM_THROTTLING_INTERVAL { + *last_instant = tokio::time::Instant::now(); + true + } else { + false + } +} + async fn handle_connection( connection: Connection, - packet_sender: AsyncSender, remote_addr: SocketAddr, - remote_pubkey: Option, last_update: Arc, connection_table: Arc>, stream_exit: Arc, - stats: Arc, + params: NewConnectionHandlerParams, peer_type: ConnectionPeerType, wait_for_chunk_timeout: Duration, ) { + let stats = params.stats; debug!( "quic new connection {} streams: {} connections: {}", remote_addr, @@ -702,17 +729,28 @@ async fn handle_connection( ); let stable_id = connection.stable_id(); stats.total_connections.fetch_add(1, Ordering::Relaxed); + let max_streams_per_100ms = + max_streams_for_connection_in_100ms(peer_type, params.stake, params.total_stake); + let mut last_throttling_instant = tokio::time::Instant::now(); + let mut streams_in_current_interval = 0; while !stream_exit.load(Ordering::Relaxed) { if let Ok(stream) = tokio::time::timeout(WAIT_FOR_STREAM_TIMEOUT, connection.accept_uni()).await { match stream { Ok(mut stream) => { + if reset_throttling_params_if_needed(&mut last_throttling_instant) { + streams_in_current_interval = 0; + } else if streams_in_current_interval >= max_streams_per_100ms { + let _ = stream.stop(VarInt::from_u32(STREAM_STOP_CODE_THROTTLING)); + continue; + } + streams_in_current_interval = streams_in_current_interval.saturating_add(1); stats.total_streams.fetch_add(1, Ordering::Relaxed); stats.total_new_streams.fetch_add(1, Ordering::Relaxed); let stream_exit = stream_exit.clone(); let stats = stats.clone(); - let packet_sender = packet_sender.clone(); + let packet_sender = params.packet_sender.clone(); let last_update = last_update.clone(); tokio::spawn(async move { let mut maybe_batch = None; @@ -765,7 +803,7 @@ async fn handle_connection( } let removed_connection_count = connection_table.lock().unwrap().remove_connection( - ConnectionTableKey::new(remote_addr.ip(), remote_pubkey), + ConnectionTableKey::new(remote_addr.ip(), params.remote_pubkey), remote_addr.port(), stable_id, ); @@ -1989,4 +2027,40 @@ pub mod test { compute_receive_window_ratio_for_staked_node(max_stake, min_stake, max_stake + 10); assert_eq!(ratio, max_ratio); } + + #[test] + fn test_max_streams_for_connection_in_100ms() { + // 50K packets per ms * 20% / 500 max unstaked connections + assert_eq!( + max_streams_for_connection_in_100ms(ConnectionPeerType::Unstaked, 0, 10000), + 20 + ); + + // 50K packets per ms * 20% / 500 max unstaked connections + assert_eq!( + max_streams_for_connection_in_100ms(ConnectionPeerType::Unstaked, 10, 10000), + 20 + ); + + // If stake is 0, same limits as unstaked connections will apply. + // 50K packets per ms * 20% / 500 max unstaked connections + assert_eq!( + max_streams_for_connection_in_100ms(ConnectionPeerType::Staked, 0, 10000), + 20 + ); + + // max staked streams = 50K packets per ms * 80% = 40K + // function = 40K * stake / total_stake + assert_eq!( + max_streams_for_connection_in_100ms(ConnectionPeerType::Staked, 15, 10000), + 60 + ); + + // max staked streams = 50K packets per ms * 80% = 40K + // function = 40K * stake / total_stake + assert_eq!( + max_streams_for_connection_in_100ms(ConnectionPeerType::Staked, 1000, 10000), + 4000 + ); + } } From 7f7ad61b7135855229eae59168dfbafa2a4e8a52 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 22 Dec 2023 06:41:19 -0600 Subject: [PATCH 133/213] v1.17: rekey stake limit feature (backport of #34503) (#34508) rekey stake limit feature (#34503) Co-authored-by: HaoranYi (cherry picked from commit 1ac017c409bfc4e1ee7918d2dbd1cbe19f95ebd0) Co-authored-by: HaoranYi --- sdk/src/feature_set.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 09937642d884c5..61b34cca167735 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -399,7 +399,7 @@ pub mod stake_raise_minimum_delegation_to_1_sol { } pub mod stake_minimum_delegation_for_rewards { - solana_sdk::declare_id!("ELjxSXwNsyXGfAh8TqX8ih22xeT8huF6UngQirbLKYKH"); + solana_sdk::declare_id!("G6ANXD6ptCSyNd9znZm7j4dEczAJCfx7Cy43oBx3rKHJ"); } pub mod add_set_compute_unit_price_ix { From 7d41bc489aed8d856397da796cdcd4b369e7acc5 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 22 Dec 2023 13:08:20 -0600 Subject: [PATCH 134/213] v1.17: rekey partitioned epoch rewards (backport of #34502) (#34571) rekey partitioned epoch rewards (#34502) Co-authored-by: HaoranYi (cherry picked from commit 2fd0bae71e2325105205bf7da57464d97b717ad1) Co-authored-by: HaoranYi --- sdk/src/feature_set.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 61b34cca167735..48dc7da2448d69 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -370,7 +370,7 @@ pub mod update_rewards_from_cached_accounts { solana_sdk::declare_id!("28s7i3htzhahXQKqmS2ExzbEoUypg9krwvtK2M9UWXh9"); } pub mod enable_partitioned_epoch_reward { - solana_sdk::declare_id!("HCnE3xQoZtDz9dSVm3jKwJXioTb6zMRbgwCmGg3PHHk8"); + solana_sdk::declare_id!("41tVp5qR1XwWRt5WifvtSQyuxtqQWJgEK8w91AtBqSwP"); } pub mod spl_token_v3_4_0 { From cc7c59af9f09932168bad4b3f94e3e09d336f6be Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 22 Dec 2023 21:14:01 -0800 Subject: [PATCH 135/213] v1.17: add metrics on throttled streams (backport of #34579) (#34582) add metrics on throttled streams (#34579) (cherry picked from commit 1a001751dd5631eb956eeed64c4ea07aa4cc41af) Co-authored-by: Lijun Wang <83639177+lijunwangs@users.noreply.github.com> --- streamer/src/nonblocking/quic.rs | 1 + streamer/src/quic.rs | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/streamer/src/nonblocking/quic.rs b/streamer/src/nonblocking/quic.rs index 8f8adc506103ba..951ec6cb317fcd 100644 --- a/streamer/src/nonblocking/quic.rs +++ b/streamer/src/nonblocking/quic.rs @@ -742,6 +742,7 @@ async fn handle_connection( if reset_throttling_params_if_needed(&mut last_throttling_instant) { streams_in_current_interval = 0; } else if streams_in_current_interval >= max_streams_per_100ms { + stats.throttled_streams.fetch_add(1, Ordering::Relaxed); let _ = stream.stop(VarInt::from_u32(STREAM_STOP_CODE_THROTTLING)); continue; } diff --git a/streamer/src/quic.rs b/streamer/src/quic.rs index fee0db110f11ec..8b2b4f9d852cac 100644 --- a/streamer/src/quic.rs +++ b/streamer/src/quic.rs @@ -156,6 +156,7 @@ pub struct StreamStats { pub(crate) connection_setup_error_locally_closed: AtomicUsize, pub(crate) connection_removed: AtomicUsize, pub(crate) connection_remove_failed: AtomicUsize, + pub(crate) throttled_streams: AtomicUsize, } impl StreamStats { @@ -386,6 +387,11 @@ impl StreamStats { self.total_stream_read_timeouts.swap(0, Ordering::Relaxed), i64 ), + ( + "throttled_streams", + self.throttled_streams.swap(0, Ordering::Relaxed), + i64 + ), ); } } From 731d42f2a299e76f53d10214da9428412148142b Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Tue, 2 Jan 2024 22:40:29 -0600 Subject: [PATCH 136/213] Update version to v1.17.15 (#34627) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a2a8c340e5af5b..7f081f32072102 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.14" +version = "1.17.15" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.14" +version = "1.17.15" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.14" +version = "1.17.15" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.14" +version = "1.17.15" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.14" +version = "1.17.15" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.14" +version = "1.17.15" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.14" +version = "1.17.15" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.14" +version = "1.17.15" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.14" +version = "1.17.15" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.14" +version = "1.17.15" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.14" +version = "1.17.15" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.14" +version = "1.17.15" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.14" +version = "1.17.15" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.14" +version = "1.17.15" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.14" +version = "1.17.15" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.14" +version = "1.17.15" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.14" +version = "1.17.15" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.14" +version = "1.17.15" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.14" +version = "1.17.15" [[package]] name = "solana-merkle-root-bench" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.14" +version = "1.17.15" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.14" +version = "1.17.15" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.14" +version = "1.17.15" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.14" +version = "1.17.15" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.14" +version = "1.17.15" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.14" +version = "1.17.15" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.14" +version = "1.17.15" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.14" +version = "1.17.15" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.14" +version = "1.17.15" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.14" +version = "1.17.15" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.14" +version = "1.17.15" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.14" +version = "1.17.15" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.14" +version = "1.17.15" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.14" +version = "1.17.15" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.14" +version = "1.17.15" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 40c7d7494f9ae2..ff7d47cdc2acfd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.14" +version = "1.17.15" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.14" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.14" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.14" } -solana-banks-client = { path = "banks-client", version = "=1.17.14" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.14" } -solana-banks-server = { path = "banks-server", version = "=1.17.14" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.14" } -solana-bloom = { path = "bloom", version = "=1.17.14" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.14" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.14" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.14", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.14" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.14" } -solana-cli = { path = "cli", version = "=1.17.14" } -solana-cli-config = { path = "cli-config", version = "=1.17.14" } -solana-cli-output = { path = "cli-output", version = "=1.17.14" } -solana-client = { path = "client", version = "=1.17.14" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.14" } -solana-config-program = { path = "programs/config", version = "=1.17.14" } -solana-core = { path = "core", version = "=1.17.14" } -solana-cost-model = { path = "cost-model", version = "=1.17.14" } -solana-download-utils = { path = "download-utils", version = "=1.17.14" } -solana-entry = { path = "entry", version = "=1.17.14" } -solana-faucet = { path = "faucet", version = "=1.17.14" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.14" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.14" } -solana-genesis = { path = "genesis", version = "=1.17.14" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.14" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.14" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.14" } -solana-gossip = { path = "gossip", version = "=1.17.14" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.14" } -solana-ledger = { path = "ledger", version = "=1.17.14" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.14" } -solana-logger = { path = "logger", version = "=1.17.14" } -solana-measure = { path = "measure", version = "=1.17.14" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.14" } -solana-metrics = { path = "metrics", version = "=1.17.14" } -solana-net-utils = { path = "net-utils", version = "=1.17.14" } -solana-notifier = { path = "notifier", version = "=1.17.14" } -solana-perf = { path = "perf", version = "=1.17.14" } -solana-poh = { path = "poh", version = "=1.17.14" } -solana-program = { path = "sdk/program", version = "=1.17.14" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.14" } -solana-program-test = { path = "program-test", version = "=1.17.14" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.14" } -solana-quic-client = { path = "quic-client", version = "=1.17.14" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.14" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.14", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.14" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.14", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.14" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.14" } -solana-runtime = { path = "runtime", version = "=1.17.14" } -solana-sdk = { path = "sdk", version = "=1.17.14" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.14" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.14" } -solana-stake-program = { path = "programs/stake", version = "=1.17.14" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.14" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.14" } -solana-streamer = { path = "streamer", version = "=1.17.14" } -solana-system-program = { path = "programs/system", version = "=1.17.14" } -solana-test-validator = { path = "test-validator", version = "=1.17.14" } -solana-thin-client = { path = "thin-client", version = "=1.17.14" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.14", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.14" } -solana-turbine = { path = "turbine", version = "=1.17.14" } -solana-udp-client = { path = "udp-client", version = "=1.17.14" } -solana-version = { path = "version", version = "=1.17.14" } -solana-vote = { path = "vote", version = "=1.17.14" } -solana-vote-program = { path = "programs/vote", version = "=1.17.14" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.14" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.14" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.14" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.15" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.15" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.15" } +solana-banks-client = { path = "banks-client", version = "=1.17.15" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.15" } +solana-banks-server = { path = "banks-server", version = "=1.17.15" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.15" } +solana-bloom = { path = "bloom", version = "=1.17.15" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.15" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.15" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.15", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.15" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.15" } +solana-cli = { path = "cli", version = "=1.17.15" } +solana-cli-config = { path = "cli-config", version = "=1.17.15" } +solana-cli-output = { path = "cli-output", version = "=1.17.15" } +solana-client = { path = "client", version = "=1.17.15" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.15" } +solana-config-program = { path = "programs/config", version = "=1.17.15" } +solana-core = { path = "core", version = "=1.17.15" } +solana-cost-model = { path = "cost-model", version = "=1.17.15" } +solana-download-utils = { path = "download-utils", version = "=1.17.15" } +solana-entry = { path = "entry", version = "=1.17.15" } +solana-faucet = { path = "faucet", version = "=1.17.15" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.15" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.15" } +solana-genesis = { path = "genesis", version = "=1.17.15" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.15" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.15" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.15" } +solana-gossip = { path = "gossip", version = "=1.17.15" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.15" } +solana-ledger = { path = "ledger", version = "=1.17.15" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.15" } +solana-logger = { path = "logger", version = "=1.17.15" } +solana-measure = { path = "measure", version = "=1.17.15" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.15" } +solana-metrics = { path = "metrics", version = "=1.17.15" } +solana-net-utils = { path = "net-utils", version = "=1.17.15" } +solana-notifier = { path = "notifier", version = "=1.17.15" } +solana-perf = { path = "perf", version = "=1.17.15" } +solana-poh = { path = "poh", version = "=1.17.15" } +solana-program = { path = "sdk/program", version = "=1.17.15" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.15" } +solana-program-test = { path = "program-test", version = "=1.17.15" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.15" } +solana-quic-client = { path = "quic-client", version = "=1.17.15" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.15" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.15", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.15" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.15", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.15" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.15" } +solana-runtime = { path = "runtime", version = "=1.17.15" } +solana-sdk = { path = "sdk", version = "=1.17.15" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.15" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.15" } +solana-stake-program = { path = "programs/stake", version = "=1.17.15" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.15" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.15" } +solana-streamer = { path = "streamer", version = "=1.17.15" } +solana-system-program = { path = "programs/system", version = "=1.17.15" } +solana-test-validator = { path = "test-validator", version = "=1.17.15" } +solana-thin-client = { path = "thin-client", version = "=1.17.15" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.15", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.15" } +solana-turbine = { path = "turbine", version = "=1.17.15" } +solana-udp-client = { path = "udp-client", version = "=1.17.15" } +solana-version = { path = "version", version = "=1.17.15" } +solana-vote = { path = "vote", version = "=1.17.15" } +solana-vote-program = { path = "programs/vote", version = "=1.17.15" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.15" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.15" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.15" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 4ff6fe0d537b38..892075ffe04c3f 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4447,7 +4447,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.14" +version = "1.17.15" dependencies = [ "Inflector", "base64 0.21.4", @@ -4470,7 +4470,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.14" +version = "1.17.15" dependencies = [ "arrayref", "bincode", @@ -4527,7 +4527,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "bytemuck", @@ -4546,7 +4546,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4561,7 +4561,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.14" +version = "1.17.15" dependencies = [ "serde", "solana-sdk", @@ -4570,7 +4570,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "crossbeam-channel", @@ -4588,7 +4588,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bv", "fnv", @@ -4605,7 +4605,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4622,7 +4622,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.14" +version = "1.17.15" dependencies = [ "array-bytes", "serde", @@ -4632,7 +4632,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bv", "bytemuck", @@ -4648,7 +4648,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "chrono", "clap 2.33.3", @@ -4663,7 +4663,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.14" +version = "1.17.15" dependencies = [ "dirs-next", "lazy_static", @@ -4677,7 +4677,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.14" +version = "1.17.15" dependencies = [ "Inflector", "base64 0.21.4", @@ -4702,7 +4702,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-trait", "bincode", @@ -4733,7 +4733,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4741,7 +4741,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "chrono", @@ -4753,7 +4753,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-trait", "bincode", @@ -4773,7 +4773,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.14" +version = "1.17.15" dependencies = [ "base64 0.21.4", "bincode", @@ -4845,7 +4845,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.14" +version = "1.17.15" dependencies = [ "lazy_static", "log", @@ -4867,7 +4867,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "console", "indicatif", @@ -4879,7 +4879,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "crossbeam-channel", @@ -4899,7 +4899,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4921,7 +4921,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.14" +version = "1.17.15" dependencies = [ "ahash 0.8.3", "blake3", @@ -4949,7 +4949,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.14" +version = "1.17.15" dependencies = [ "proc-macro2", "quote", @@ -4959,7 +4959,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "solana-accounts-db", @@ -4970,7 +4970,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "solana-sdk", @@ -4980,7 +4980,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bs58", "crossbeam-channel", @@ -5005,7 +5005,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -5053,7 +5053,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "bincode", @@ -5117,7 +5117,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "solana-measure", @@ -5128,7 +5128,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.14" +version = "1.17.15" dependencies = [ "env_logger", "lazy_static", @@ -5137,7 +5137,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "solana-sdk", @@ -5145,7 +5145,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.14" +version = "1.17.15" dependencies = [ "fast-math", "solana-program", @@ -5153,7 +5153,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.14" +version = "1.17.15" dependencies = [ "crossbeam-channel", "gethostname", @@ -5166,7 +5166,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "clap 3.1.6", @@ -5186,7 +5186,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.14" +version = "1.17.15" dependencies = [ "ahash 0.8.3", "bincode", @@ -5213,7 +5213,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.14" +version = "1.17.15" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5229,7 +5229,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "ark-bn254", "ark-ec", @@ -5281,7 +5281,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.14" +version = "1.17.15" dependencies = [ "base64 0.21.4", "bincode", @@ -5307,7 +5307,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "async-trait", @@ -5335,7 +5335,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "crossbeam-channel", "futures-util", @@ -5358,7 +5358,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-mutex", "async-trait", @@ -5383,7 +5383,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.14" +version = "1.17.15" dependencies = [ "lazy_static", "num_cpus", @@ -5391,7 +5391,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.14" +version = "1.17.15" dependencies = [ "console", "dialoguer", @@ -5408,7 +5408,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.14" +version = "1.17.15" dependencies = [ "base64 0.21.4", "bincode", @@ -5463,7 +5463,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-trait", "base64 0.21.4", @@ -5487,7 +5487,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.14" +version = "1.17.15" dependencies = [ "base64 0.21.4", "bs58", @@ -5507,7 +5507,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.14" +version = "1.17.15" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5518,7 +5518,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.14" +version = "1.17.15" dependencies = [ "arrayref", "base64 0.21.4", @@ -5593,7 +5593,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5630,21 +5630,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.14" +version = "1.17.15" dependencies = [ "array-bytes", "solana-program", @@ -5652,7 +5652,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.14" +version = "1.17.15" dependencies = [ "array-bytes", "solana-program", @@ -5660,21 +5660,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5682,14 +5682,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.14" +version = "1.17.15" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5697,21 +5697,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.14" +version = "1.17.15" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5721,42 +5721,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.14" +version = "1.17.15" dependencies = [ "rustversion", "solana-program", @@ -5766,49 +5766,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5816,14 +5816,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-program-runtime", @@ -5833,7 +5833,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5841,21 +5841,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5863,14 +5863,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.14" +version = "1.17.15" dependencies = [ "array-bytes", "solana-program", @@ -5878,7 +5878,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.14" +version = "1.17.15" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5887,14 +5887,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5902,7 +5902,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-program-runtime", @@ -5912,21 +5912,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-program-runtime", @@ -5936,7 +5936,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.14" +version = "1.17.15" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5944,7 +5944,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.14" +version = "1.17.15" dependencies = [ "blake3", "solana-program", @@ -5952,21 +5952,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-logger", "solana-program", @@ -5977,21 +5977,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", "solana-program-runtime", @@ -6001,21 +6001,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.14" +version = "1.17.15" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.14" +version = "1.17.15" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6067,7 +6067,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bs58", "proc-macro2", @@ -6084,7 +6084,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.14" +version = "1.17.15" dependencies = [ "crossbeam-channel", "log", @@ -6098,7 +6098,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "log", @@ -6111,7 +6111,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.14" +version = "1.17.15" dependencies = [ "backoff", "bincode", @@ -6143,7 +6143,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "bs58", @@ -6158,7 +6158,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-channel", "bytes", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "log", @@ -6200,7 +6200,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.14" +version = "1.17.15" dependencies = [ "base64 0.21.4", "bincode", @@ -6230,7 +6230,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "log", @@ -6243,7 +6243,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-trait", "bincode", @@ -6265,7 +6265,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.14" +version = "1.17.15" dependencies = [ "Inflector", "base64 0.21.4", @@ -6288,7 +6288,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "bytes", @@ -6323,7 +6323,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.14" +version = "1.17.15" dependencies = [ "async-trait", "solana-connection-cache", @@ -6336,7 +6336,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.14" +version = "1.17.15" dependencies = [ "chrono", "clap 2.33.3", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.14" +version = "1.17.15" dependencies = [ "log", "rustc_version", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.14" +version = "1.17.15" dependencies = [ "crossbeam-channel", "itertools", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bincode", "log", @@ -6449,7 +6449,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.14" +version = "1.17.15" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6461,7 +6461,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.14" +version = "1.17.15" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 0e4d01b5daf6dd..f5b14c92b28836 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.14" +version = "1.17.15" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.14" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.14" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.14" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.14" } -solana-ledger = { path = "../../ledger", version = "=1.17.14" } -solana-logger = { path = "../../logger", version = "=1.17.14" } -solana-measure = { path = "../../measure", version = "=1.17.14" } -solana-program = { path = "../../sdk/program", version = "=1.17.14" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.14" } -solana-program-test = { path = "../../program-test", version = "=1.17.14" } -solana-runtime = { path = "../../runtime", version = "=1.17.14" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.14" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.14" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.14", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.14" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.14" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.14" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.14", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.14" } -solana-sdk = { path = "../../sdk", version = "=1.17.14" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.14" } -solana-validator = { path = "../../validator", version = "=1.17.14" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.14" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.15" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.15" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.15" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.15" } +solana-ledger = { path = "../../ledger", version = "=1.17.15" } +solana-logger = { path = "../../logger", version = "=1.17.15" } +solana-measure = { path = "../../measure", version = "=1.17.15" } +solana-program = { path = "../../sdk/program", version = "=1.17.15" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.15" } +solana-program-test = { path = "../../program-test", version = "=1.17.15" } +solana-runtime = { path = "../../runtime", version = "=1.17.15" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.15" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.15" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.15", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.15" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.15" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.15" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.15", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.15" } +solana-sdk = { path = "../../sdk", version = "=1.17.15" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.15" } +solana-validator = { path = "../../validator", version = "=1.17.15" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.15" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 698a395fedebd3..3f007f789212e6 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.14" +version = "1.17.15" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.14" } +solana-program = { path = "../../../../program", version = "=1.17.15" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 9038ef28240c10..2adb61904cdfdd 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.14" +version = "1.17.15" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.14" } +solana-program = { path = "../../../../program", version = "=1.17.15" } [lib] crate-type = ["cdylib"] From 9c09b16f860733a836188ec1cab7bd03dcba5a93 Mon Sep 17 00:00:00 2001 From: Yihau Chen Date: Wed, 3 Jan 2024 14:31:02 +0800 Subject: [PATCH 137/213] v1.17: pin ahash to 0.8.4 (#34636) pin ahash to 0.8.4 --- Cargo.toml | 2 +- programs/sbf/Cargo.lock | 31 ++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ff7d47cdc2acfd..7a090c8ae2216c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -132,7 +132,7 @@ edition = "2021" [workspace.dependencies] aes-gcm-siv = "0.10.3" -ahash = "0.8.3" +ahash = "=0.8.4" anyhow = "1.0.75" ark-bn254 = "0.4.0" ark-ec = "0.4.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 892075ffe04c3f..b6917399b38d35 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -76,14 +76,15 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "72832d73be48bac96a5d7944568f305d829ed55b0ce3b483647089dfaf6cf704" dependencies = [ "cfg-if 1.0.0", "getrandom 0.2.10", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -1940,7 +1941,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.4", ] [[package]] @@ -4923,7 +4924,7 @@ dependencies = [ name = "solana-frozen-abi" version = "1.17.15" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.4", "blake3", "block-buffer 0.10.4", "bs58", @@ -5188,7 +5189,7 @@ dependencies = [ name = "solana-perf" version = "1.17.15" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.4", "bincode", "bv", "caps", @@ -7940,6 +7941,26 @@ dependencies = [ "time", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + [[package]] name = "zeroize" version = "1.3.0" From cc0e9a0e5a6b5c3e86d52ac105dac743826afd9a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 5 Jan 2024 18:36:19 -0500 Subject: [PATCH 138/213] v1.17: Logs the number of storages kept alive by fastboot (backport of #34667) (#34670) Logs the number of storages kept alive by fastboot (#34667) (cherry picked from commit e84974cf63403f7e836fe95d514a97e1120eb0f0) Co-authored-by: Brooks --- core/src/accounts_hash_verifier.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/core/src/accounts_hash_verifier.rs b/core/src/accounts_hash_verifier.rs index cb87cdc513a90c..4fbacabd7bf80e 100644 --- a/core/src/accounts_hash_verifier.rs +++ b/core/src/accounts_hash_verifier.rs @@ -104,12 +104,21 @@ impl AccountsHashVerifier { )); if let Some(snapshot_storages_for_fastboot) = snapshot_storages_for_fastboot { - let num_storages = snapshot_storages_for_fastboot.len(); + // Get the number of storages that are being kept alive for fastboot. + // Looking at the storage Arc's strong reference count, we know that one + // ref is for fastboot, and one ref is for snapshot packaging. If there + // are no others, then the storage will be kept alive because of fastboot. + let num_storages_kept_alive = snapshot_storages_for_fastboot + .iter() + .filter(|storage| Arc::strong_count(storage) == 2) + .count(); + let num_storages_total = snapshot_storages_for_fastboot.len(); fastboot_storages = Some(snapshot_storages_for_fastboot); datapoint_info!( "fastboot", ("slot", slot, i64), - ("num_storages", num_storages, i64), + ("num_storages_total", num_storages_total, i64), + ("num_storages_kept_alive", num_storages_kept_alive, i64), ); } From fc778555d976b76ebccfdeafaeae7fd7b128f3cd Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sun, 7 Jan 2024 05:23:10 -0600 Subject: [PATCH 139/213] Update version to v1.17.16 (#34680) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f081f32072102..7377eb704e9ce5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.15" +version = "1.17.16" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.15" +version = "1.17.16" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.15" +version = "1.17.16" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.15" +version = "1.17.16" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.15" +version = "1.17.16" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.15" +version = "1.17.16" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.15" +version = "1.17.16" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.15" +version = "1.17.16" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.15" +version = "1.17.16" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.15" +version = "1.17.16" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.15" +version = "1.17.16" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.15" +version = "1.17.16" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.15" +version = "1.17.16" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.15" +version = "1.17.16" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.15" +version = "1.17.16" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.15" +version = "1.17.16" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.15" +version = "1.17.16" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.15" +version = "1.17.16" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.15" +version = "1.17.16" [[package]] name = "solana-merkle-root-bench" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.15" +version = "1.17.16" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.15" +version = "1.17.16" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.15" +version = "1.17.16" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.15" +version = "1.17.16" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.15" +version = "1.17.16" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.15" +version = "1.17.16" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.15" +version = "1.17.16" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.15" +version = "1.17.16" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.15" +version = "1.17.16" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.15" +version = "1.17.16" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.15" +version = "1.17.16" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.15" +version = "1.17.16" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.15" +version = "1.17.16" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.15" +version = "1.17.16" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.15" +version = "1.17.16" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 7a090c8ae2216c..888bc5f34501ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.15" +version = "1.17.16" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.15" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.15" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.15" } -solana-banks-client = { path = "banks-client", version = "=1.17.15" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.15" } -solana-banks-server = { path = "banks-server", version = "=1.17.15" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.15" } -solana-bloom = { path = "bloom", version = "=1.17.15" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.15" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.15" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.15", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.15" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.15" } -solana-cli = { path = "cli", version = "=1.17.15" } -solana-cli-config = { path = "cli-config", version = "=1.17.15" } -solana-cli-output = { path = "cli-output", version = "=1.17.15" } -solana-client = { path = "client", version = "=1.17.15" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.15" } -solana-config-program = { path = "programs/config", version = "=1.17.15" } -solana-core = { path = "core", version = "=1.17.15" } -solana-cost-model = { path = "cost-model", version = "=1.17.15" } -solana-download-utils = { path = "download-utils", version = "=1.17.15" } -solana-entry = { path = "entry", version = "=1.17.15" } -solana-faucet = { path = "faucet", version = "=1.17.15" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.15" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.15" } -solana-genesis = { path = "genesis", version = "=1.17.15" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.15" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.15" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.15" } -solana-gossip = { path = "gossip", version = "=1.17.15" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.15" } -solana-ledger = { path = "ledger", version = "=1.17.15" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.15" } -solana-logger = { path = "logger", version = "=1.17.15" } -solana-measure = { path = "measure", version = "=1.17.15" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.15" } -solana-metrics = { path = "metrics", version = "=1.17.15" } -solana-net-utils = { path = "net-utils", version = "=1.17.15" } -solana-notifier = { path = "notifier", version = "=1.17.15" } -solana-perf = { path = "perf", version = "=1.17.15" } -solana-poh = { path = "poh", version = "=1.17.15" } -solana-program = { path = "sdk/program", version = "=1.17.15" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.15" } -solana-program-test = { path = "program-test", version = "=1.17.15" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.15" } -solana-quic-client = { path = "quic-client", version = "=1.17.15" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.15" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.15", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.15" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.15", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.15" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.15" } -solana-runtime = { path = "runtime", version = "=1.17.15" } -solana-sdk = { path = "sdk", version = "=1.17.15" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.15" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.15" } -solana-stake-program = { path = "programs/stake", version = "=1.17.15" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.15" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.15" } -solana-streamer = { path = "streamer", version = "=1.17.15" } -solana-system-program = { path = "programs/system", version = "=1.17.15" } -solana-test-validator = { path = "test-validator", version = "=1.17.15" } -solana-thin-client = { path = "thin-client", version = "=1.17.15" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.15", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.15" } -solana-turbine = { path = "turbine", version = "=1.17.15" } -solana-udp-client = { path = "udp-client", version = "=1.17.15" } -solana-version = { path = "version", version = "=1.17.15" } -solana-vote = { path = "vote", version = "=1.17.15" } -solana-vote-program = { path = "programs/vote", version = "=1.17.15" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.15" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.15" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.15" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.16" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.16" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.16" } +solana-banks-client = { path = "banks-client", version = "=1.17.16" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.16" } +solana-banks-server = { path = "banks-server", version = "=1.17.16" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.16" } +solana-bloom = { path = "bloom", version = "=1.17.16" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.16" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.16" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.16", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.16" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.16" } +solana-cli = { path = "cli", version = "=1.17.16" } +solana-cli-config = { path = "cli-config", version = "=1.17.16" } +solana-cli-output = { path = "cli-output", version = "=1.17.16" } +solana-client = { path = "client", version = "=1.17.16" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.16" } +solana-config-program = { path = "programs/config", version = "=1.17.16" } +solana-core = { path = "core", version = "=1.17.16" } +solana-cost-model = { path = "cost-model", version = "=1.17.16" } +solana-download-utils = { path = "download-utils", version = "=1.17.16" } +solana-entry = { path = "entry", version = "=1.17.16" } +solana-faucet = { path = "faucet", version = "=1.17.16" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.16" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.16" } +solana-genesis = { path = "genesis", version = "=1.17.16" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.16" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.16" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.16" } +solana-gossip = { path = "gossip", version = "=1.17.16" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.16" } +solana-ledger = { path = "ledger", version = "=1.17.16" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.16" } +solana-logger = { path = "logger", version = "=1.17.16" } +solana-measure = { path = "measure", version = "=1.17.16" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.16" } +solana-metrics = { path = "metrics", version = "=1.17.16" } +solana-net-utils = { path = "net-utils", version = "=1.17.16" } +solana-notifier = { path = "notifier", version = "=1.17.16" } +solana-perf = { path = "perf", version = "=1.17.16" } +solana-poh = { path = "poh", version = "=1.17.16" } +solana-program = { path = "sdk/program", version = "=1.17.16" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.16" } +solana-program-test = { path = "program-test", version = "=1.17.16" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.16" } +solana-quic-client = { path = "quic-client", version = "=1.17.16" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.16" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.16", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.16" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.16", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.16" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.16" } +solana-runtime = { path = "runtime", version = "=1.17.16" } +solana-sdk = { path = "sdk", version = "=1.17.16" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.16" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.16" } +solana-stake-program = { path = "programs/stake", version = "=1.17.16" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.16" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.16" } +solana-streamer = { path = "streamer", version = "=1.17.16" } +solana-system-program = { path = "programs/system", version = "=1.17.16" } +solana-test-validator = { path = "test-validator", version = "=1.17.16" } +solana-thin-client = { path = "thin-client", version = "=1.17.16" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.16", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.16" } +solana-turbine = { path = "turbine", version = "=1.17.16" } +solana-udp-client = { path = "udp-client", version = "=1.17.16" } +solana-version = { path = "version", version = "=1.17.16" } +solana-vote = { path = "vote", version = "=1.17.16" } +solana-vote-program = { path = "programs/vote", version = "=1.17.16" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.16" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.16" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.16" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index b6917399b38d35..9dca935700d5e6 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.15" +version = "1.17.16" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.15" +version = "1.17.16" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.15" +version = "1.17.16" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.15" +version = "1.17.16" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.15" +version = "1.17.16" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.15" +version = "1.17.16" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.15" +version = "1.17.16" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.15" +version = "1.17.16" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.15" +version = "1.17.16" dependencies = [ "ahash 0.8.4", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.15" +version = "1.17.16" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.15" +version = "1.17.16" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.15" +version = "1.17.16" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.15" +version = "1.17.16" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.15" +version = "1.17.16" dependencies = [ "ahash 0.8.4", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.15" +version = "1.17.16" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.15" +version = "1.17.16" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.15" +version = "1.17.16" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.15" +version = "1.17.16" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.15" +version = "1.17.16" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.15" +version = "1.17.16" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.15" +version = "1.17.16" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.15" +version = "1.17.16" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.15" +version = "1.17.16" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.15" +version = "1.17.16" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.15" +version = "1.17.16" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.15" +version = "1.17.16" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.15" +version = "1.17.16" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.15" +version = "1.17.16" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.15" +version = "1.17.16" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.15" +version = "1.17.16" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.15" +version = "1.17.16" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.15" +version = "1.17.16" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.15" +version = "1.17.16" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.15" +version = "1.17.16" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.15" +version = "1.17.16" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.15" +version = "1.17.16" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.15" +version = "1.17.16" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.15" +version = "1.17.16" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.15" +version = "1.17.16" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.15" +version = "1.17.16" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.15" +version = "1.17.16" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.15" +version = "1.17.16" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.15" +version = "1.17.16" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index f5b14c92b28836..6d17ad2b180243 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.15" +version = "1.17.16" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.15" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.15" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.15" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.15" } -solana-ledger = { path = "../../ledger", version = "=1.17.15" } -solana-logger = { path = "../../logger", version = "=1.17.15" } -solana-measure = { path = "../../measure", version = "=1.17.15" } -solana-program = { path = "../../sdk/program", version = "=1.17.15" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.15" } -solana-program-test = { path = "../../program-test", version = "=1.17.15" } -solana-runtime = { path = "../../runtime", version = "=1.17.15" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.15" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.15" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.15", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.15" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.15" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.15" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.15", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.15" } -solana-sdk = { path = "../../sdk", version = "=1.17.15" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.15" } -solana-validator = { path = "../../validator", version = "=1.17.15" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.15" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.16" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.16" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.16" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.16" } +solana-ledger = { path = "../../ledger", version = "=1.17.16" } +solana-logger = { path = "../../logger", version = "=1.17.16" } +solana-measure = { path = "../../measure", version = "=1.17.16" } +solana-program = { path = "../../sdk/program", version = "=1.17.16" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.16" } +solana-program-test = { path = "../../program-test", version = "=1.17.16" } +solana-runtime = { path = "../../runtime", version = "=1.17.16" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.16" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.16" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.16", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.16" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.16" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.16" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.16", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.16" } +solana-sdk = { path = "../../sdk", version = "=1.17.16" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.16" } +solana-validator = { path = "../../validator", version = "=1.17.16" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.16" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 3f007f789212e6..ee20385f6b03e4 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.15" +version = "1.17.16" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.15" } +solana-program = { path = "../../../../program", version = "=1.17.16" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 2adb61904cdfdd..5b048bc4f7d1ec 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.15" +version = "1.17.16" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.15" } +solana-program = { path = "../../../../program", version = "=1.17.16" } [lib] crate-type = ["cdylib"] From 66eacff58c7ea27dbf42e2772f32b3b0baeefe8c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 08:54:49 -0500 Subject: [PATCH 140/213] v1.17: Adds newline to fastboot's CLI help (backport of #34712) (#34719) Adds newline to fastboot's CLI help (#34712) (cherry picked from commit abe699b7b46e2921ac145a86cd8987578d872b73) Co-authored-by: Brooks --- ledger/src/use_snapshot_archives_at_startup.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/src/use_snapshot_archives_at_startup.rs b/ledger/src/use_snapshot_archives_at_startup.rs index e34abfb777967f..584b2e4a7d3fcf 100644 --- a/ledger/src/use_snapshot_archives_at_startup.rs +++ b/ledger/src/use_snapshot_archives_at_startup.rs @@ -38,7 +38,7 @@ pub mod cli { If there is no state already on disk, startup will fail. \ Note, this will use the latest state available, \ which may be newer than the latest snapshot archive. \ - Specifying \"when-newest\" will use snapshot-related state \ + \nSpecifying \"when-newest\" will use snapshot-related state \ already on disk unless there are snapshot archives newer than it. \ This can happen if a new snapshot archive is downloaded \ while the node is stopped."; From 6af8e3b00d15e56d2cbeb74022621af1532a2d86 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 15:00:40 -0800 Subject: [PATCH 141/213] v1.17: check plugin name on plugin_reload rpc call (backport of #33582) (#34668) check plugin name on plugin_reload rpc call --- .../src/geyser_plugin_manager.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/geyser-plugin-manager/src/geyser_plugin_manager.rs b/geyser-plugin-manager/src/geyser_plugin_manager.rs index 0698cf1a656363..92180d1991b56e 100644 --- a/geyser-plugin-manager/src/geyser_plugin_manager.rs +++ b/geyser-plugin-manager/src/geyser_plugin_manager.rs @@ -177,6 +177,22 @@ impl GeyserPluginManager { data: None, })?; + // Then see if a plugin with this name already exists. If so, abort + if self + .plugins + .iter() + .any(|plugin| plugin.name().eq(new_plugin.name())) + { + return Err(jsonrpc_core::Error { + code: ErrorCode::InvalidRequest, + message: format!( + "There already exists a plugin named {} loaded, while reloading {name}. Did not load requested plugin", + new_plugin.name() + ), + data: None, + }); + } + // Attempt to on_load with new plugin match new_plugin.on_load(new_parsed_config_file) { // On success, push plugin and library From 07acb46b6f7ab2857ed72c8a6fea395416f5751b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 05:25:19 +0000 Subject: [PATCH 142/213] v1.17: Bigtable: update google proto files and allow configuration of max_message_size (backport of #34740) (#34741) Bigtable: update google proto files and allow configuration of max_message_size (#34740) * Update proto files with tonic-build v0.9.2 * Manually ignore invalid doc-tests * Add new ReadRowsRequest fields * Add LedgerStorageConfig::max_message_size and default value * Add BigtableConnection::max_message_size and use on client creation * Add max_message_size to RpcBigtableConfig and make const pub * Add solana-validator cli arg (cherry picked from commit 166be2995ee76e51a343f04e41d348cfeb1cc8d9) Co-authored-by: Tyera --- ledger-tool/src/bigtable.rs | 1 + rpc/src/rpc.rs | 2 + rpc/src/rpc_service.rs | 2 + storage-bigtable/proto/google.api.rs | 1047 ++++++++++++++++-- storage-bigtable/proto/google.bigtable.v2.rs | 788 ++++++++++++- storage-bigtable/proto/google.rpc.rs | 6 +- storage-bigtable/src/bigtable.rs | 27 +- storage-bigtable/src/lib.rs | 6 + validator/src/bin/solana-test-validator.rs | 1 + validator/src/cli.rs | 12 + validator/src/main.rs | 1 + 11 files changed, 1777 insertions(+), 116 deletions(-) diff --git a/ledger-tool/src/bigtable.rs b/ledger-tool/src/bigtable.rs index 801b844e5219a5..59cf809a2c0a89 100644 --- a/ledger-tool/src/bigtable.rs +++ b/ledger-tool/src/bigtable.rs @@ -585,6 +585,7 @@ async fn get_bigtable( credential_type: CredentialType::Filepath(Some(args.crediential_path.unwrap())), instance_name: args.instance_name, app_profile_id: args.app_profile_id, + max_message_size: solana_storage_bigtable::DEFAULT_MAX_MESSAGE_SIZE, }, ) .await diff --git a/rpc/src/rpc.rs b/rpc/src/rpc.rs index 2d55d2bb2f2c02..aa1f6ee53f81dc 100644 --- a/rpc/src/rpc.rs +++ b/rpc/src/rpc.rs @@ -169,6 +169,7 @@ pub struct RpcBigtableConfig { pub bigtable_instance_name: String, pub bigtable_app_profile_id: String, pub timeout: Option, + pub max_message_size: usize, } impl Default for RpcBigtableConfig { @@ -180,6 +181,7 @@ impl Default for RpcBigtableConfig { bigtable_instance_name, bigtable_app_profile_id, timeout: None, + max_message_size: solana_storage_bigtable::DEFAULT_MAX_MESSAGE_SIZE, } } } diff --git a/rpc/src/rpc_service.rs b/rpc/src/rpc_service.rs index 9aac1f929bc29b..329de948e24a1a 100644 --- a/rpc/src/rpc_service.rs +++ b/rpc/src/rpc_service.rs @@ -406,6 +406,7 @@ impl JsonRpcService { ref bigtable_instance_name, ref bigtable_app_profile_id, timeout, + max_message_size, }) = config.rpc_bigtable_config { let bigtable_config = solana_storage_bigtable::LedgerStorageConfig { @@ -414,6 +415,7 @@ impl JsonRpcService { credential_type: CredentialType::Filepath(None), instance_name: bigtable_instance_name.clone(), app_profile_id: bigtable_app_profile_id.clone(), + max_message_size, }; runtime .block_on(solana_storage_bigtable::LedgerStorage::new_with_config( diff --git a/storage-bigtable/proto/google.api.rs b/storage-bigtable/proto/google.api.rs index 16b9ba5f26295b..96a336431a35e9 100644 --- a/storage-bigtable/proto/google.api.rs +++ b/storage-bigtable/proto/google.api.rs @@ -187,15 +187,18 @@ pub struct Http { /// 1. Leaf request fields (recursive expansion nested messages in the request /// message) are classified into three categories: /// - Fields referred by the path template. They are passed via the URL path. -/// - Fields referred by the \[HttpRule.body][google.api.HttpRule.body\]. They are passed via the HTTP +/// - Fields referred by the \[HttpRule.body][google.api.HttpRule.body\]. They +/// are passed via the HTTP /// request body. /// - All other fields are passed via the URL query parameters, and the /// parameter name is the field path in the request message. A repeated /// field can be represented as multiple query parameters under the same /// name. -/// 2. If \[HttpRule.body][google.api.HttpRule.body\] is "*", there is no URL query parameter, all fields +/// 2. If \[HttpRule.body][google.api.HttpRule.body\] is "*", there is no URL +/// query parameter, all fields /// are passed via URL path and HTTP request body. -/// 3. If \[HttpRule.body][google.api.HttpRule.body\] is omitted, there is no HTTP request body, all +/// 3. If \[HttpRule.body][google.api.HttpRule.body\] is omitted, there is no HTTP +/// request body, all /// fields are passed via URL path and URL query parameters. /// /// ### Path template syntax @@ -292,7 +295,8 @@ pub struct Http { pub struct HttpRule { /// Selects a method to which this rule applies. /// - /// Refer to \[selector][google.api.DocumentationRule.selector\] for syntax details. + /// Refer to \[selector][google.api.DocumentationRule.selector\] for syntax + /// details. #[prost(string, tag = "1")] pub selector: ::prost::alloc::string::String, /// The name of the request field whose value is mapped to the HTTP request @@ -365,6 +369,479 @@ pub struct CustomHttpPattern { #[prost(string, tag = "2")] pub path: ::prost::alloc::string::String, } +/// The launch stage as defined by [Google Cloud Platform +/// Launch Stages](). +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum LaunchStage { + /// Do not use this default value. + Unspecified = 0, + /// The feature is not yet implemented. Users can not use it. + Unimplemented = 6, + /// Prelaunch features are hidden from users and are only visible internally. + Prelaunch = 7, + /// Early Access features are limited to a closed group of testers. To use + /// these features, you must sign up in advance and sign a Trusted Tester + /// agreement (which includes confidentiality provisions). These features may + /// be unstable, changed in backward-incompatible ways, and are not + /// guaranteed to be released. + EarlyAccess = 1, + /// Alpha is a limited availability test for releases before they are cleared + /// for widespread use. By Alpha, all significant design issues are resolved + /// and we are in the process of verifying functionality. Alpha customers + /// need to apply for access, agree to applicable terms, and have their + /// projects allowlisted. Alpha releases don't have to be feature complete, + /// no SLAs are provided, and there are no technical support obligations, but + /// they will be far enough along that customers can actually use them in + /// test environments or for limited-use tests -- just like they would in + /// normal production cases. + Alpha = 2, + /// Beta is the point at which we are ready to open a release for any + /// customer to use. There are no SLA or technical support obligations in a + /// Beta release. Products will be complete from a feature perspective, but + /// may have some open outstanding issues. Beta releases are suitable for + /// limited production use cases. + Beta = 3, + /// GA features are open to all developers and are considered stable and + /// fully qualified for production use. + Ga = 4, + /// Deprecated features are scheduled to be shut down and removed. For more + /// information, see the "Deprecation Policy" section of our [Terms of + /// Service]() + /// and the [Google Cloud Platform Subject to the Deprecation + /// Policy]() documentation. + Deprecated = 5, +} +impl LaunchStage { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + LaunchStage::Unspecified => "LAUNCH_STAGE_UNSPECIFIED", + LaunchStage::Unimplemented => "UNIMPLEMENTED", + LaunchStage::Prelaunch => "PRELAUNCH", + LaunchStage::EarlyAccess => "EARLY_ACCESS", + LaunchStage::Alpha => "ALPHA", + LaunchStage::Beta => "BETA", + LaunchStage::Ga => "GA", + LaunchStage::Deprecated => "DEPRECATED", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "LAUNCH_STAGE_UNSPECIFIED" => Some(Self::Unspecified), + "UNIMPLEMENTED" => Some(Self::Unimplemented), + "PRELAUNCH" => Some(Self::Prelaunch), + "EARLY_ACCESS" => Some(Self::EarlyAccess), + "ALPHA" => Some(Self::Alpha), + "BETA" => Some(Self::Beta), + "GA" => Some(Self::Ga), + "DEPRECATED" => Some(Self::Deprecated), + _ => None, + } + } +} +/// Required information for every language. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CommonLanguageSettings { + /// Link to automatically generated reference documentation. Example: + /// + #[deprecated] + #[prost(string, tag = "1")] + pub reference_docs_uri: ::prost::alloc::string::String, + /// The destination where API teams want this client library to be published. + #[prost(enumeration = "ClientLibraryDestination", repeated, tag = "2")] + pub destinations: ::prost::alloc::vec::Vec, +} +/// Details about how and where to publish client libraries. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ClientLibrarySettings { + /// Version of the API to apply these settings to. This is the full protobuf + /// package for the API, ending in the version element. + /// Examples: "google.cloud.speech.v1" and "google.spanner.admin.database.v1". + #[prost(string, tag = "1")] + pub version: ::prost::alloc::string::String, + /// Launch stage of this version of the API. + #[prost(enumeration = "LaunchStage", tag = "2")] + pub launch_stage: i32, + /// When using transport=rest, the client request will encode enums as + /// numbers rather than strings. + #[prost(bool, tag = "3")] + pub rest_numeric_enums: bool, + /// Settings for legacy Java features, supported in the Service YAML. + #[prost(message, optional, tag = "21")] + pub java_settings: ::core::option::Option, + /// Settings for C++ client libraries. + #[prost(message, optional, tag = "22")] + pub cpp_settings: ::core::option::Option, + /// Settings for PHP client libraries. + #[prost(message, optional, tag = "23")] + pub php_settings: ::core::option::Option, + /// Settings for Python client libraries. + #[prost(message, optional, tag = "24")] + pub python_settings: ::core::option::Option, + /// Settings for Node client libraries. + #[prost(message, optional, tag = "25")] + pub node_settings: ::core::option::Option, + /// Settings for .NET client libraries. + #[prost(message, optional, tag = "26")] + pub dotnet_settings: ::core::option::Option, + /// Settings for Ruby client libraries. + #[prost(message, optional, tag = "27")] + pub ruby_settings: ::core::option::Option, + /// Settings for Go client libraries. + #[prost(message, optional, tag = "28")] + pub go_settings: ::core::option::Option, +} +/// This message configures the settings for publishing [Google Cloud Client +/// libraries]() +/// generated from the service config. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Publishing { + /// A list of API method settings, e.g. the behavior for methods that use the + /// long-running operation pattern. + #[prost(message, repeated, tag = "2")] + pub method_settings: ::prost::alloc::vec::Vec, + /// Link to a *public* URI where users can report issues. Example: + /// + #[prost(string, tag = "101")] + pub new_issue_uri: ::prost::alloc::string::String, + /// Link to product home page. Example: + /// + #[prost(string, tag = "102")] + pub documentation_uri: ::prost::alloc::string::String, + /// Used as a tracking tag when collecting data about the APIs developer + /// relations artifacts like docs, packages delivered to package managers, + /// etc. Example: "speech". + #[prost(string, tag = "103")] + pub api_short_name: ::prost::alloc::string::String, + /// GitHub label to apply to issues and pull requests opened for this API. + #[prost(string, tag = "104")] + pub github_label: ::prost::alloc::string::String, + /// GitHub teams to be added to CODEOWNERS in the directory in GitHub + /// containing source code for the client libraries for this API. + #[prost(string, repeated, tag = "105")] + pub codeowner_github_teams: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// A prefix used in sample code when demarking regions to be included in + /// documentation. + #[prost(string, tag = "106")] + pub doc_tag_prefix: ::prost::alloc::string::String, + /// For whom the client library is being published. + #[prost(enumeration = "ClientLibraryOrganization", tag = "107")] + pub organization: i32, + /// Client library settings. If the same version string appears multiple + /// times in this list, then the last one wins. Settings from earlier + /// settings with the same version string are discarded. + #[prost(message, repeated, tag = "109")] + pub library_settings: ::prost::alloc::vec::Vec, + /// Optional link to proto reference documentation. Example: + /// + #[prost(string, tag = "110")] + pub proto_reference_documentation_uri: ::prost::alloc::string::String, +} +/// Settings for Java client libraries. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct JavaSettings { + /// The package name to use in Java. Clobbers the java_package option + /// set in the protobuf. This should be used **only** by APIs + /// who have already set the language_settings.java.package_name" field + /// in gapic.yaml. API teams should use the protobuf java_package option + /// where possible. + /// + /// Example of a YAML configuration:: + /// + /// publishing: + /// java_settings: + /// library_package: com.google.cloud.pubsub.v1 + #[prost(string, tag = "1")] + pub library_package: ::prost::alloc::string::String, + /// Configure the Java class name to use instead of the service's for its + /// corresponding generated GAPIC client. Keys are fully-qualified + /// service names as they appear in the protobuf (including the full + /// the language_settings.java.interface_names" field in gapic.yaml. API + /// teams should otherwise use the service name as it appears in the + /// protobuf. + /// + /// Example of a YAML configuration:: + /// + /// publishing: + /// java_settings: + /// service_class_names: + /// - google.pubsub.v1.Publisher: TopicAdmin + /// - google.pubsub.v1.Subscriber: SubscriptionAdmin + #[prost(map = "string, string", tag = "2")] + pub service_class_names: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + /// Some settings. + #[prost(message, optional, tag = "3")] + pub common: ::core::option::Option, +} +/// Settings for C++ client libraries. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CppSettings { + /// Some settings. + #[prost(message, optional, tag = "1")] + pub common: ::core::option::Option, +} +/// Settings for Php client libraries. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PhpSettings { + /// Some settings. + #[prost(message, optional, tag = "1")] + pub common: ::core::option::Option, +} +/// Settings for Python client libraries. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PythonSettings { + /// Some settings. + #[prost(message, optional, tag = "1")] + pub common: ::core::option::Option, +} +/// Settings for Node client libraries. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct NodeSettings { + /// Some settings. + #[prost(message, optional, tag = "1")] + pub common: ::core::option::Option, +} +/// Settings for Dotnet client libraries. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DotnetSettings { + /// Some settings. + #[prost(message, optional, tag = "1")] + pub common: ::core::option::Option, + /// Map from original service names to renamed versions. + /// This is used when the default generated types + /// would cause a naming conflict. (Neither name is + /// fully-qualified.) + /// Example: Subscriber to SubscriberServiceApi. + #[prost(map = "string, string", tag = "2")] + pub renamed_services: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + /// Map from full resource types to the effective short name + /// for the resource. This is used when otherwise resource + /// named from different services would cause naming collisions. + /// Example entry: + /// "datalabeling.googleapis.com/Dataset": "DataLabelingDataset" + #[prost(map = "string, string", tag = "3")] + pub renamed_resources: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + /// List of full resource types to ignore during generation. + /// This is typically used for API-specific Location resources, + /// which should be handled by the generator as if they were actually + /// the common Location resources. + /// Example entry: "documentai.googleapis.com/Location" + #[prost(string, repeated, tag = "4")] + pub ignored_resources: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Namespaces which must be aliased in snippets due to + /// a known (but non-generator-predictable) naming collision + #[prost(string, repeated, tag = "5")] + pub forced_namespace_aliases: ::prost::alloc::vec::Vec< + ::prost::alloc::string::String, + >, + /// Method signatures (in the form "service.method(signature)") + /// which are provided separately, so shouldn't be generated. + /// Snippets *calling* these methods are still generated, however. + #[prost(string, repeated, tag = "6")] + pub handwritten_signatures: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Settings for Ruby client libraries. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RubySettings { + /// Some settings. + #[prost(message, optional, tag = "1")] + pub common: ::core::option::Option, +} +/// Settings for Go client libraries. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GoSettings { + /// Some settings. + #[prost(message, optional, tag = "1")] + pub common: ::core::option::Option, +} +/// Describes the generator configuration for a method. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MethodSettings { + /// The fully qualified name of the method, for which the options below apply. + /// This is used to find the method to apply the options. + #[prost(string, tag = "1")] + pub selector: ::prost::alloc::string::String, + /// Describes settings to use for long-running operations when generating + /// API methods for RPCs. Complements RPCs that use the annotations in + /// google/longrunning/operations.proto. + /// + /// Example of a YAML configuration:: + /// + /// publishing: + /// method_settings: + /// - selector: google.cloud.speech.v2.Speech.BatchRecognize + /// long_running: + /// initial_poll_delay: + /// seconds: 60 # 1 minute + /// poll_delay_multiplier: 1.5 + /// max_poll_delay: + /// seconds: 360 # 6 minutes + /// total_poll_timeout: + /// seconds: 54000 # 90 minutes + #[prost(message, optional, tag = "2")] + pub long_running: ::core::option::Option, + /// List of top-level fields of the request message, that should be + /// automatically populated by the client libraries based on their + /// (google.api.field_info).format. Currently supported format: UUID4. + /// + /// Example of a YAML configuration: + /// + /// publishing: + /// method_settings: + /// - selector: google.example.v1.ExampleService.CreateExample + /// auto_populated_fields: + /// - request_id + #[prost(string, repeated, tag = "3")] + pub auto_populated_fields: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Nested message and enum types in `MethodSettings`. +pub mod method_settings { + /// Describes settings to use when generating API methods that use the + /// long-running operation pattern. + /// All default values below are from those used in the client library + /// generators (e.g. + /// \[Java\]()). + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LongRunning { + /// Initial delay after which the first poll request will be made. + /// Default value: 5 seconds. + #[prost(message, optional, tag = "1")] + pub initial_poll_delay: ::core::option::Option<::prost_types::Duration>, + /// Multiplier to gradually increase delay between subsequent polls until it + /// reaches max_poll_delay. + /// Default value: 1.5. + #[prost(float, tag = "2")] + pub poll_delay_multiplier: f32, + /// Maximum time between two subsequent poll requests. + /// Default value: 45 seconds. + #[prost(message, optional, tag = "3")] + pub max_poll_delay: ::core::option::Option<::prost_types::Duration>, + /// Total polling timeout. + /// Default value: 5 minutes. + #[prost(message, optional, tag = "4")] + pub total_poll_timeout: ::core::option::Option<::prost_types::Duration>, + } +} +/// The organization for which the client libraries are being published. +/// Affects the url where generated docs are published, etc. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum ClientLibraryOrganization { + /// Not useful. + Unspecified = 0, + /// Google Cloud Platform Org. + Cloud = 1, + /// Ads (Advertising) Org. + Ads = 2, + /// Photos Org. + Photos = 3, + /// Street View Org. + StreetView = 4, + /// Shopping Org. + Shopping = 5, + /// Geo Org. + Geo = 6, + /// Generative AI - + GenerativeAi = 7, +} +impl ClientLibraryOrganization { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + ClientLibraryOrganization::Unspecified => { + "CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED" + } + ClientLibraryOrganization::Cloud => "CLOUD", + ClientLibraryOrganization::Ads => "ADS", + ClientLibraryOrganization::Photos => "PHOTOS", + ClientLibraryOrganization::StreetView => "STREET_VIEW", + ClientLibraryOrganization::Shopping => "SHOPPING", + ClientLibraryOrganization::Geo => "GEO", + ClientLibraryOrganization::GenerativeAi => "GENERATIVE_AI", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED" => Some(Self::Unspecified), + "CLOUD" => Some(Self::Cloud), + "ADS" => Some(Self::Ads), + "PHOTOS" => Some(Self::Photos), + "STREET_VIEW" => Some(Self::StreetView), + "SHOPPING" => Some(Self::Shopping), + "GEO" => Some(Self::Geo), + "GENERATIVE_AI" => Some(Self::GenerativeAi), + _ => None, + } + } +} +/// To where should client libraries be published? +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum ClientLibraryDestination { + /// Client libraries will neither be generated nor published to package + /// managers. + Unspecified = 0, + /// Generate the client library in a repo under github.com/googleapis, + /// but don't publish it to package managers. + Github = 10, + /// Publish the library to package managers like nuget.org and npmjs.com. + PackageManager = 20, +} +impl ClientLibraryDestination { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + ClientLibraryDestination::Unspecified => { + "CLIENT_LIBRARY_DESTINATION_UNSPECIFIED" + } + ClientLibraryDestination::Github => "GITHUB", + ClientLibraryDestination::PackageManager => "PACKAGE_MANAGER", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "CLIENT_LIBRARY_DESTINATION_UNSPECIFIED" => Some(Self::Unspecified), + "GITHUB" => Some(Self::Github), + "PACKAGE_MANAGER" => Some(Self::PackageManager), + _ => None, + } + } +} /// An indicator of the behavior of a given field (for example, that a field /// is required in requests, or given as output but ignored as input). /// This **does not** change the behavior in protocol buffers itself; it only @@ -407,6 +884,19 @@ pub enum FieldBehavior { /// a non-empty value will be returned. The user will not be aware of what /// non-empty value to expect. NonEmptyDefault = 7, + /// Denotes that the field in a resource (a message annotated with + /// google.api.resource) is used in the resource name to uniquely identify the + /// resource. For AIP-compliant APIs, this should only be applied to the + /// `name` field on the resource. + /// + /// This behavior should not be applied to references to other resources within + /// the message. + /// + /// The identifier field of resources often have different field behavior + /// depending on the request it is embedded in (e.g. for Create methods name + /// is optional and unused, while for Update methods it is required). Instead + /// of method-specific annotations, only `IDENTIFIER` is required. + Identifier = 8, } impl FieldBehavior { /// String value of the enum field names used in the ProtoBuf definition. @@ -423,6 +913,22 @@ impl FieldBehavior { FieldBehavior::Immutable => "IMMUTABLE", FieldBehavior::UnorderedList => "UNORDERED_LIST", FieldBehavior::NonEmptyDefault => "NON_EMPTY_DEFAULT", + FieldBehavior::Identifier => "IDENTIFIER", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "FIELD_BEHAVIOR_UNSPECIFIED" => Some(Self::Unspecified), + "OPTIONAL" => Some(Self::Optional), + "REQUIRED" => Some(Self::Required), + "OUTPUT_ONLY" => Some(Self::OutputOnly), + "INPUT_ONLY" => Some(Self::InputOnly), + "IMMUTABLE" => Some(Self::Immutable), + "UNORDERED_LIST" => Some(Self::UnorderedList), + "NON_EMPTY_DEFAULT" => Some(Self::NonEmptyDefault), + "IDENTIFIER" => Some(Self::Identifier), + _ => None, } } } @@ -440,11 +946,7 @@ impl FieldBehavior { /// // For Kubernetes resources, the format is {api group}/{kind}. /// option (google.api.resource) = { /// type: "pubsub.googleapis.com/Topic" -/// name_descriptor: { -/// pattern: "projects/{project}/topics/{topic}" -/// parent_type: "cloudresourcemanager.googleapis.com/Project" -/// parent_name_extractor: "projects/{project}" -/// } +/// pattern: "projects/{project}/topics/{topic}" /// }; /// } /// @@ -452,10 +954,7 @@ impl FieldBehavior { /// /// resources: /// - type: "pubsub.googleapis.com/Topic" -/// name_descriptor: -/// - pattern: "projects/{project}/topics/{topic}" -/// parent_type: "cloudresourcemanager.googleapis.com/Project" -/// parent_name_extractor: "projects/{project}" +/// pattern: "projects/{project}/topics/{topic}" /// /// Sometimes, resources have multiple patterns, typically because they can /// live under multiple parents. @@ -465,26 +964,10 @@ impl FieldBehavior { /// message LogEntry { /// option (google.api.resource) = { /// type: "logging.googleapis.com/LogEntry" -/// name_descriptor: { -/// pattern: "projects/{project}/logs/{log}" -/// parent_type: "cloudresourcemanager.googleapis.com/Project" -/// parent_name_extractor: "projects/{project}" -/// } -/// name_descriptor: { -/// pattern: "folders/{folder}/logs/{log}" -/// parent_type: "cloudresourcemanager.googleapis.com/Folder" -/// parent_name_extractor: "folders/{folder}" -/// } -/// name_descriptor: { -/// pattern: "organizations/{organization}/logs/{log}" -/// parent_type: "cloudresourcemanager.googleapis.com/Organization" -/// parent_name_extractor: "organizations/{organization}" -/// } -/// name_descriptor: { -/// pattern: "billingAccounts/{billing_account}/logs/{log}" -/// parent_type: "billing.googleapis.com/BillingAccount" -/// parent_name_extractor: "billingAccounts/{billing_account}" -/// } +/// pattern: "projects/{project}/logs/{log}" +/// pattern: "folders/{folder}/logs/{log}" +/// pattern: "organizations/{organization}/logs/{log}" +/// pattern: "billingAccounts/{billing_account}/logs/{log}" /// }; /// } /// @@ -492,48 +975,10 @@ impl FieldBehavior { /// /// resources: /// - type: 'logging.googleapis.com/LogEntry' -/// name_descriptor: -/// - pattern: "projects/{project}/logs/{log}" -/// parent_type: "cloudresourcemanager.googleapis.com/Project" -/// parent_name_extractor: "projects/{project}" -/// - pattern: "folders/{folder}/logs/{log}" -/// parent_type: "cloudresourcemanager.googleapis.com/Folder" -/// parent_name_extractor: "folders/{folder}" -/// - pattern: "organizations/{organization}/logs/{log}" -/// parent_type: "cloudresourcemanager.googleapis.com/Organization" -/// parent_name_extractor: "organizations/{organization}" -/// - pattern: "billingAccounts/{billing_account}/logs/{log}" -/// parent_type: "billing.googleapis.com/BillingAccount" -/// parent_name_extractor: "billingAccounts/{billing_account}" -/// -/// For flexible resources, the resource name doesn't contain parent names, but -/// the resource itself has parents for policy evaluation. -/// -/// Example: -/// -/// message Shelf { -/// option (google.api.resource) = { -/// type: "library.googleapis.com/Shelf" -/// name_descriptor: { -/// pattern: "shelves/{shelf}" -/// parent_type: "cloudresourcemanager.googleapis.com/Project" -/// } -/// name_descriptor: { -/// pattern: "shelves/{shelf}" -/// parent_type: "cloudresourcemanager.googleapis.com/Folder" -/// } -/// }; -/// } -/// -/// The ResourceDescriptor Yaml config will look like: -/// -/// resources: -/// - type: 'library.googleapis.com/Shelf' -/// name_descriptor: -/// - pattern: "shelves/{shelf}" -/// parent_type: "cloudresourcemanager.googleapis.com/Project" -/// - pattern: "shelves/{shelf}" -/// parent_type: "cloudresourcemanager.googleapis.com/Folder" +/// pattern: "projects/{project}/logs/{log}" +/// pattern: "folders/{folder}/logs/{log}" +/// pattern: "organizations/{organization}/logs/{log}" +/// pattern: "billingAccounts/{billing_account}/logs/{log}" #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ResourceDescriptor { @@ -651,6 +1096,15 @@ pub mod resource_descriptor { History::FutureMultiPattern => "FUTURE_MULTI_PATTERN", } } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "HISTORY_UNSPECIFIED" => Some(Self::Unspecified), + "ORIGINALLY_SINGLE_PATTERN" => Some(Self::OriginallySinglePattern), + "FUTURE_MULTI_PATTERN" => Some(Self::FutureMultiPattern), + _ => None, + } + } } /// A flag representing a specific style that a resource claims to conform to. #[derive( @@ -689,6 +1143,14 @@ pub mod resource_descriptor { Style::DeclarativeFriendly => "DECLARATIVE_FRIENDLY", } } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "STYLE_UNSPECIFIED" => Some(Self::Unspecified), + "DECLARATIVE_FRIENDLY" => Some(Self::DeclarativeFriendly), + _ => None, + } + } } } /// Defines a proto annotation that describes a string field that refers to @@ -732,3 +1194,438 @@ pub struct ResourceReference { #[prost(string, tag = "2")] pub child_type: ::prost::alloc::string::String, } +/// Specifies the routing information that should be sent along with the request +/// in the form of routing header. +/// **NOTE:** All service configuration rules follow the "last one wins" order. +/// +/// The examples below will apply to an RPC which has the following request type: +/// +/// Message Definition: +/// +/// message Request { +/// // The name of the Table +/// // Values can be of the following formats: +/// // - `projects//tables/` +/// // - `projects//instances//tables/
    ` +/// // - `region//zones//tables/
    ` +/// string table_name = 1; +/// +/// // This value specifies routing for replication. +/// // It can be in the following formats: +/// // - `profiles/` +/// // - a legacy `profile_id` that can be any string +/// string app_profile_id = 2; +/// } +/// +/// Example message: +/// +/// { +/// table_name: projects/proj_foo/instances/instance_bar/table/table_baz, +/// app_profile_id: profiles/prof_qux +/// } +/// +/// The routing header consists of one or multiple key-value pairs. Every key +/// and value must be percent-encoded, and joined together in the format of +/// `key1=value1&key2=value2`. +/// In the examples below I am skipping the percent-encoding for readablity. +/// +/// Example 1 +/// +/// Extracting a field from the request to put into the routing header +/// unchanged, with the key equal to the field name. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // Take the `app_profile_id`. +/// routing_parameters { +/// field: "app_profile_id" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: app_profile_id=profiles/prof_qux +/// +/// Example 2 +/// +/// Extracting a field from the request to put into the routing header +/// unchanged, with the key different from the field name. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // Take the `app_profile_id`, but name it `routing_id` in the header. +/// routing_parameters { +/// field: "app_profile_id" +/// path_template: "{routing_id=**}" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: routing_id=profiles/prof_qux +/// +/// Example 3 +/// +/// Extracting a field from the request to put into the routing +/// header, while matching a path template syntax on the field's value. +/// +/// NB: it is more useful to send nothing than to send garbage for the purpose +/// of dynamic routing, since garbage pollutes cache. Thus the matching. +/// +/// Sub-example 3a +/// +/// The field matches the template. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // Take the `table_name`, if it's well-formed (with project-based +/// // syntax). +/// routing_parameters { +/// field: "table_name" +/// path_template: "{table_name=projects/*/instances/*/**}" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: +/// table_name=projects/proj_foo/instances/instance_bar/table/table_baz +/// +/// Sub-example 3b +/// +/// The field does not match the template. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // Take the `table_name`, if it's well-formed (with region-based +/// // syntax). +/// routing_parameters { +/// field: "table_name" +/// path_template: "{table_name=regions/*/zones/*/**}" +/// } +/// }; +/// +/// result: +/// +/// +/// +/// Sub-example 3c +/// +/// Multiple alternative conflictingly named path templates are +/// specified. The one that matches is used to construct the header. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // Take the `table_name`, if it's well-formed, whether +/// // using the region- or projects-based syntax. +/// +/// routing_parameters { +/// field: "table_name" +/// path_template: "{table_name=regions/*/zones/*/**}" +/// } +/// routing_parameters { +/// field: "table_name" +/// path_template: "{table_name=projects/*/instances/*/**}" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: +/// table_name=projects/proj_foo/instances/instance_bar/table/table_baz +/// +/// Example 4 +/// +/// Extracting a single routing header key-value pair by matching a +/// template syntax on (a part of) a single request field. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // Take just the project id from the `table_name` field. +/// routing_parameters { +/// field: "table_name" +/// path_template: "{routing_id=projects/*}/**" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: routing_id=projects/proj_foo +/// +/// Example 5 +/// +/// Extracting a single routing header key-value pair by matching +/// several conflictingly named path templates on (parts of) a single request +/// field. The last template to match "wins" the conflict. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // If the `table_name` does not have instances information, +/// // take just the project id for routing. +/// // Otherwise take project + instance. +/// +/// routing_parameters { +/// field: "table_name" +/// path_template: "{routing_id=projects/*}/**" +/// } +/// routing_parameters { +/// field: "table_name" +/// path_template: "{routing_id=projects/*/instances/*}/**" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: +/// routing_id=projects/proj_foo/instances/instance_bar +/// +/// Example 6 +/// +/// Extracting multiple routing header key-value pairs by matching +/// several non-conflicting path templates on (parts of) a single request field. +/// +/// Sub-example 6a +/// +/// Make the templates strict, so that if the `table_name` does not +/// have an instance information, nothing is sent. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // The routing code needs two keys instead of one composite +/// // but works only for the tables with the "project-instance" name +/// // syntax. +/// +/// routing_parameters { +/// field: "table_name" +/// path_template: "{project_id=projects/*}/instances/*/**" +/// } +/// routing_parameters { +/// field: "table_name" +/// path_template: "projects/*/{instance_id=instances/*}/**" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: +/// project_id=projects/proj_foo&instance_id=instances/instance_bar +/// +/// Sub-example 6b +/// +/// Make the templates loose, so that if the `table_name` does not +/// have an instance information, just the project id part is sent. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // The routing code wants two keys instead of one composite +/// // but will work with just the `project_id` for tables without +/// // an instance in the `table_name`. +/// +/// routing_parameters { +/// field: "table_name" +/// path_template: "{project_id=projects/*}/**" +/// } +/// routing_parameters { +/// field: "table_name" +/// path_template: "projects/*/{instance_id=instances/*}/**" +/// } +/// }; +/// +/// result (is the same as 6a for our example message because it has the instance +/// information): +/// +/// x-goog-request-params: +/// project_id=projects/proj_foo&instance_id=instances/instance_bar +/// +/// Example 7 +/// +/// Extracting multiple routing header key-value pairs by matching +/// several path templates on multiple request fields. +/// +/// NB: note that here there is no way to specify sending nothing if one of the +/// fields does not match its template. E.g. if the `table_name` is in the wrong +/// format, the `project_id` will not be sent, but the `routing_id` will be. +/// The backend routing code has to be aware of that and be prepared to not +/// receive a full complement of keys if it expects multiple. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // The routing needs both `project_id` and `routing_id` +/// // (from the `app_profile_id` field) for routing. +/// +/// routing_parameters { +/// field: "table_name" +/// path_template: "{project_id=projects/*}/**" +/// } +/// routing_parameters { +/// field: "app_profile_id" +/// path_template: "{routing_id=**}" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: +/// project_id=projects/proj_foo&routing_id=profiles/prof_qux +/// +/// Example 8 +/// +/// Extracting a single routing header key-value pair by matching +/// several conflictingly named path templates on several request fields. The +/// last template to match "wins" the conflict. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // The `routing_id` can be a project id or a region id depending on +/// // the table name format, but only if the `app_profile_id` is not set. +/// // If `app_profile_id` is set it should be used instead. +/// +/// routing_parameters { +/// field: "table_name" +/// path_template: "{routing_id=projects/*}/**" +/// } +/// routing_parameters { +/// field: "table_name" +/// path_template: "{routing_id=regions/*}/**" +/// } +/// routing_parameters { +/// field: "app_profile_id" +/// path_template: "{routing_id=**}" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: routing_id=profiles/prof_qux +/// +/// Example 9 +/// +/// Bringing it all together. +/// +/// annotation: +/// +/// option (google.api.routing) = { +/// // For routing both `table_location` and a `routing_id` are needed. +/// // +/// // table_location can be either an instance id or a region+zone id. +/// // +/// // For `routing_id`, take the value of `app_profile_id` +/// // - If it's in the format `profiles/`, send +/// // just the `` part. +/// // - If it's any other literal, send it as is. +/// // If the `app_profile_id` is empty, and the `table_name` starts with +/// // the project_id, send that instead. +/// +/// routing_parameters { +/// field: "table_name" +/// path_template: "projects/*/{table_location=instances/*}/tables/*" +/// } +/// routing_parameters { +/// field: "table_name" +/// path_template: "{table_location=regions/*/zones/*}/tables/*" +/// } +/// routing_parameters { +/// field: "table_name" +/// path_template: "{routing_id=projects/*}/**" +/// } +/// routing_parameters { +/// field: "app_profile_id" +/// path_template: "{routing_id=**}" +/// } +/// routing_parameters { +/// field: "app_profile_id" +/// path_template: "profiles/{routing_id=*}" +/// } +/// }; +/// +/// result: +/// +/// x-goog-request-params: +/// table_location=instances/instance_bar&routing_id=prof_qux +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RoutingRule { + /// A collection of Routing Parameter specifications. + /// **NOTE:** If multiple Routing Parameters describe the same key + /// (via the `path_template` field or via the `field` field when + /// `path_template` is not provided), "last one wins" rule + /// determines which Parameter gets used. + /// See the examples for more details. + #[prost(message, repeated, tag = "2")] + pub routing_parameters: ::prost::alloc::vec::Vec, +} +/// A projection from an input message to the GRPC or REST header. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RoutingParameter { + /// A request field to extract the header key-value pair from. + #[prost(string, tag = "1")] + pub field: ::prost::alloc::string::String, + /// A pattern matching the key-value field. Optional. + /// If not specified, the whole field specified in the `field` field will be + /// taken as value, and its name used as key. If specified, it MUST contain + /// exactly one named segment (along with any number of unnamed segments) The + /// pattern will be matched over the field specified in the `field` field, then + /// if the match is successful: + /// - the name of the single named segment will be used as a header name, + /// - the match value of the segment will be used as a header value; + /// if the match is NOT successful, nothing will be sent. + /// + /// Example: + /// + /// -- This is a field in the request message + /// | that the header value will be extracted from. + /// | + /// | -- This is the key name in the + /// | | routing header. + /// V | + /// field: "table_name" v + /// path_template: "projects/*/{table_location=instances/*}/tables/*" + /// ^ ^ + /// | | + /// In the {} brackets is the pattern that -- | + /// specifies what to extract from the | + /// field as a value to be sent. | + /// | + /// The string in the field must match the whole pattern -- + /// before brackets, inside brackets, after brackets. + /// + /// When looking at this specific example, we can see that: + /// - A key-value pair with the key `table_location` + /// and the value matching `instances/*` should be added + /// to the x-goog-request-params routing header. + /// - The value is extracted from the request message's `table_name` field + /// if it matches the full pattern specified: + /// `projects/*/instances/*/tables/*`. + /// + /// **NB:** If the `path_template` field is not provided, the key name is + /// equal to the field name, and the whole field should be sent as a value. + /// This makes the pattern for the field and the value functionally equivalent + /// to `**`, and the configuration + /// + /// { + /// field: "table_name" + /// } + /// + /// is a functionally equivalent shorthand to: + /// + /// { + /// field: "table_name" + /// path_template: "{table_name=**}" + /// } + /// + /// See Example 1 for more details. + #[prost(string, tag = "2")] + pub path_template: ::prost::alloc::string::String, +} diff --git a/storage-bigtable/proto/google.bigtable.v2.rs b/storage-bigtable/proto/google.bigtable.v2.rs index 362d06070dcb6f..4b23bf0e77b1e5 100644 --- a/storage-bigtable/proto/google.bigtable.v2.rs +++ b/storage-bigtable/proto/google.bigtable.v2.rs @@ -246,7 +246,7 @@ pub mod value_range { /// RowFilter.Chain and RowFilter.Interleave documentation. /// /// The total serialized size of a RowFilter message must not -/// exceed 4096 bytes, and RowFilters may not be nested within each other +/// exceed 20480 bytes, and RowFilters may not be nested within each other /// (in Chains or Interleaves) to a depth of more than 20. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -623,6 +623,130 @@ pub mod read_modify_write_rule { IncrementAmount(i64), } } +/// NOTE: This API is intended to be used by Apache Beam BigtableIO. +/// A partition of a change stream. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamPartition { + /// The row range covered by this partition and is specified by + /// [`start_key_closed`, `end_key_open`). + #[prost(message, optional, tag = "1")] + pub row_range: ::core::option::Option, +} +/// NOTE: This API is intended to be used by Apache Beam BigtableIO. +/// The information required to continue reading the data from multiple +/// `StreamPartitions` from where a previous read left off. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamContinuationTokens { + /// List of continuation tokens. + #[prost(message, repeated, tag = "1")] + pub tokens: ::prost::alloc::vec::Vec, +} +/// NOTE: This API is intended to be used by Apache Beam BigtableIO. +/// The information required to continue reading the data from a +/// `StreamPartition` from where a previous read left off. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamContinuationToken { + /// The partition that this token applies to. + #[prost(message, optional, tag = "1")] + pub partition: ::core::option::Option, + /// An encoded position in the stream to restart reading from. + #[prost(string, tag = "2")] + pub token: ::prost::alloc::string::String, +} +/// ReadIterationStats captures information about the iteration of rows or cells +/// over the course of a read, e.g. how many results were scanned in a read +/// operation versus the results returned. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ReadIterationStats { + /// The rows seen (scanned) as part of the request. This includes the count of + /// rows returned, as captured below. + #[prost(int64, tag = "1")] + pub rows_seen_count: i64, + /// The rows returned as part of the request. + #[prost(int64, tag = "2")] + pub rows_returned_count: i64, + /// The cells seen (scanned) as part of the request. This includes the count of + /// cells returned, as captured below. + #[prost(int64, tag = "3")] + pub cells_seen_count: i64, + /// The cells returned as part of the request. + #[prost(int64, tag = "4")] + pub cells_returned_count: i64, +} +/// RequestLatencyStats provides a measurement of the latency of the request as +/// it interacts with different systems over its lifetime, e.g. how long the +/// request took to execute within a frontend server. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RequestLatencyStats { + /// The latency measured by the frontend server handling this request, from + /// when the request was received, to when this value is sent back in the + /// response. For more context on the component that is measuring this latency, + /// see: + /// + /// Note: This value may be slightly shorter than the value reported into + /// aggregate latency metrics in Monitoring for this request + /// () as this value + /// needs to be sent in the response before the latency measurement including + /// that transmission is finalized. + /// + /// Note: This value includes the end-to-end latency of contacting nodes in + /// the targeted cluster, e.g. measuring from when the first byte arrives at + /// the frontend server, to when this value is sent back as the last value in + /// the response, including any latency incurred by contacting nodes, waiting + /// for results from nodes, and finally sending results from nodes back to the + /// caller. + #[prost(message, optional, tag = "1")] + pub frontend_server_latency: ::core::option::Option<::prost_types::Duration>, +} +/// FullReadStatsView captures all known information about a read. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct FullReadStatsView { + /// Iteration stats describe how efficient the read is, e.g. comparing + /// rows seen vs. rows returned or cells seen vs cells returned can provide an + /// indication of read efficiency (the higher the ratio of seen to retuned the + /// better). + #[prost(message, optional, tag = "1")] + pub read_iteration_stats: ::core::option::Option, + /// Request latency stats describe the time taken to complete a request, from + /// the server side. + #[prost(message, optional, tag = "2")] + pub request_latency_stats: ::core::option::Option, +} +/// RequestStats is the container for additional information pertaining to a +/// single request, helpful for evaluating the performance of the sent request. +/// Currently, there are the following supported methods: +/// * google.bigtable.v2.ReadRows +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RequestStats { + /// Information pertaining to each request type received. The type is chosen + /// based on the requested view. + /// + /// See the messages above for additional context. + #[prost(oneof = "request_stats::StatsView", tags = "1")] + pub stats_view: ::core::option::Option, +} +/// Nested message and enum types in `RequestStats`. +pub mod request_stats { + /// Information pertaining to each request type received. The type is chosen + /// based on the requested view. + /// + /// See the messages above for additional context. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum StatsView { + /// Available with the ReadRowsRequest.RequestStatsView.REQUEST_STATS_FULL + /// view, see package google.bigtable.v2. + #[prost(message, tag = "1")] + FullReadStatsView(super::FullReadStatsView), + } +} /// Request message for Bigtable.ReadRows. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -636,17 +760,85 @@ pub struct ReadRowsRequest { /// "default" application profile will be used. #[prost(string, tag = "5")] pub app_profile_id: ::prost::alloc::string::String, - /// The row keys and/or ranges to read. If not specified, reads from all rows. + /// The row keys and/or ranges to read sequentially. If not specified, reads + /// from all rows. #[prost(message, optional, tag = "2")] pub rows: ::core::option::Option, /// The filter to apply to the contents of the specified row(s). If unset, /// reads the entirety of each row. #[prost(message, optional, tag = "3")] pub filter: ::core::option::Option, - /// The read will terminate after committing to N rows' worth of results. The + /// The read will stop after committing to N rows' worth of results. The /// default (zero) is to return all results. #[prost(int64, tag = "4")] pub rows_limit: i64, + /// The view into RequestStats, as described above. + #[prost(enumeration = "read_rows_request::RequestStatsView", tag = "6")] + pub request_stats_view: i32, + /// Experimental API - Please note that this API is currently experimental + /// and can change in the future. + /// + /// Return rows in lexiographical descending order of the row keys. The row + /// contents will not be affected by this flag. + /// + /// Example result set: + ///```ignore + /// [ + /// {key: "k2", "f:col1": "v1", "f:col2": "v1"}, + /// {key: "k1", "f:col1": "v2", "f:col2": "v2"} + /// ] + #[prost(bool, tag = "7")] + pub reversed: bool, +} +/// Nested message and enum types in `ReadRowsRequest`. +pub mod read_rows_request { + /// The desired view into RequestStats that should be returned in the response. + /// + /// See also: RequestStats message. + #[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + PartialOrd, + Ord, + ::prost::Enumeration + )] + #[repr(i32)] + pub enum RequestStatsView { + /// The default / unset value. The API will default to the NONE option below. + Unspecified = 0, + /// Do not include any RequestStats in the response. This will leave the + /// RequestStats embedded message unset in the response. + RequestStatsNone = 1, + /// Include the full set of available RequestStats in the response, + /// applicable to this read. + RequestStatsFull = 2, + } + impl RequestStatsView { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + RequestStatsView::Unspecified => "REQUEST_STATS_VIEW_UNSPECIFIED", + RequestStatsView::RequestStatsNone => "REQUEST_STATS_NONE", + RequestStatsView::RequestStatsFull => "REQUEST_STATS_FULL", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "REQUEST_STATS_VIEW_UNSPECIFIED" => Some(Self::Unspecified), + "REQUEST_STATS_NONE" => Some(Self::RequestStatsNone), + "REQUEST_STATS_FULL" => Some(Self::RequestStatsFull), + _ => None, + } + } + } } /// Response message for Bigtable.ReadRows. #[allow(clippy::derive_partial_eq_without_eq)] @@ -664,6 +856,28 @@ pub struct ReadRowsResponse { /// key, allowing the client to skip that work on a retry. #[prost(bytes = "vec", tag = "2")] pub last_scanned_row_key: ::prost::alloc::vec::Vec, + /// + /// If requested, provide enhanced query performance statistics. The semantics + /// dictate: + /// * request_stats is empty on every (streamed) response, except + /// * request_stats has non-empty information after all chunks have been + /// streamed, where the ReadRowsResponse message only contains + /// request_stats. + /// * For example, if a read request would have returned an empty + /// response instead a single ReadRowsResponse is streamed with empty + /// chunks and request_stats filled. + /// + /// Visually, response messages will stream as follows: + /// ... -> {chunks: \[...\]} -> {chunks: [], request_stats: {...}} + /// \______________________/ \________________________________/ + /// Primary response Trailer of RequestStats info + /// + /// Or if the read did not return any values: + /// {chunks: [], request_stats: {...}} + /// \________________________________/ + /// Trailer of RequestStats info + #[prost(message, optional, tag = "3")] + pub request_stats: ::core::option::Option, } /// Nested message and enum types in `ReadRowsResponse`. pub mod read_rows_response { @@ -780,8 +994,8 @@ pub struct SampleRowKeysResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MutateRowRequest { - /// Required. The unique name of the table to which the mutation should be applied. - /// Values are of the form + /// Required. The unique name of the table to which the mutation should be + /// applied. Values are of the form /// `projects//instances//tables/
    `. #[prost(string, tag = "1")] pub table_name: ::prost::alloc::string::String, @@ -792,9 +1006,9 @@ pub struct MutateRowRequest { /// Required. The key of the row to which the mutation should be applied. #[prost(bytes = "vec", tag = "2")] pub row_key: ::prost::alloc::vec::Vec, - /// Required. Changes to be atomically applied to the specified row. Entries are applied - /// in order, meaning that earlier mutations can be masked by later ones. - /// Must contain at least one entry and at most 100000. + /// Required. Changes to be atomically applied to the specified row. Entries + /// are applied in order, meaning that earlier mutations can be masked by later + /// ones. Must contain at least one entry and at most 100000. #[prost(message, repeated, tag = "3")] pub mutations: ::prost::alloc::vec::Vec, } @@ -806,7 +1020,8 @@ pub struct MutateRowResponse {} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MutateRowsRequest { - /// Required. The unique name of the table to which the mutations should be applied. + /// Required. The unique name of the table to which the mutations should be + /// applied. #[prost(string, tag = "1")] pub table_name: ::prost::alloc::string::String, /// This value specifies routing for replication. If not specified, the @@ -830,10 +1045,9 @@ pub mod mutate_rows_request { /// The key of the row to which the `mutations` should be applied. #[prost(bytes = "vec", tag = "1")] pub row_key: ::prost::alloc::vec::Vec, - /// Required. Changes to be atomically applied to the specified row. Mutations are - /// applied in order, meaning that earlier mutations can be masked by - /// later ones. - /// You must specify at least one mutation. + /// Required. Changes to be atomically applied to the specified row. + /// Mutations are applied in order, meaning that earlier mutations can be + /// masked by later ones. You must specify at least one mutation. #[prost(message, repeated, tag = "2")] pub mutations: ::prost::alloc::vec::Vec, } @@ -845,6 +1059,11 @@ pub struct MutateRowsResponse { /// One or more results for Entries from the batch request. #[prost(message, repeated, tag = "1")] pub entries: ::prost::alloc::vec::Vec, + /// Information about how client should limit the rate (QPS). Primirily used by + /// supported official Cloud Bigtable clients. If unset, the rate limit info is + /// not provided by the server. + #[prost(message, optional, tag = "3")] + pub rate_limit_info: ::core::option::Option, } /// Nested message and enum types in `MutateRowsResponse`. pub mod mutate_rows_response { @@ -864,13 +1083,36 @@ pub mod mutate_rows_response { pub status: ::core::option::Option, } } +/// Information about how client should adjust the load to Bigtable. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RateLimitInfo { + /// Time that clients should wait before adjusting the target rate again. + /// If clients adjust rate too frequently, the impact of the previous + /// adjustment may not have been taken into account and may + /// over-throttle or under-throttle. If clients adjust rate too slowly, they + /// will not be responsive to load changes on server side, and may + /// over-throttle or under-throttle. + #[prost(message, optional, tag = "1")] + pub period: ::core::option::Option<::prost_types::Duration>, + /// If it has been at least one `period` since the last load adjustment, the + /// client should multiply the current load by this value to get the new target + /// load. For example, if the current load is 100 and `factor` is 0.8, the new + /// target load should be 80. After adjusting, the client should ignore + /// `factor` until another `period` has passed. + /// + /// The client can measure its load using any unit that's comparable over time + /// For example, QPS can be used as long as each request involves a similar + /// amount of work. + #[prost(double, tag = "2")] + pub factor: f64, +} /// Request message for Bigtable.CheckAndMutateRow. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CheckAndMutateRowRequest { - /// Required. The unique name of the table to which the conditional mutation should be - /// applied. - /// Values are of the form + /// Required. The unique name of the table to which the conditional mutation + /// should be applied. Values are of the form /// `projects//instances//tables/
    `. #[prost(string, tag = "1")] pub table_name: ::prost::alloc::string::String, @@ -878,7 +1120,8 @@ pub struct CheckAndMutateRowRequest { /// "default" application profile will be used. #[prost(string, tag = "7")] pub app_profile_id: ::prost::alloc::string::String, - /// Required. The key of the row to which the conditional mutation should be applied. + /// Required. The key of the row to which the conditional mutation should be + /// applied. #[prost(bytes = "vec", tag = "2")] pub row_key: ::prost::alloc::vec::Vec, /// The filter to be applied to the contents of the specified row. Depending @@ -911,13 +1154,30 @@ pub struct CheckAndMutateRowResponse { #[prost(bool, tag = "1")] pub predicate_matched: bool, } +/// Request message for client connection keep-alive and warming. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PingAndWarmRequest { + /// Required. The unique name of the instance to check permissions for as well + /// as respond. Values are of the form + /// `projects//instances/`. + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + /// This value specifies routing for replication. If not specified, the + /// "default" application profile will be used. + #[prost(string, tag = "2")] + pub app_profile_id: ::prost::alloc::string::String, +} +/// Response message for Bigtable.PingAndWarm connection keepalive and warming. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PingAndWarmResponse {} /// Request message for Bigtable.ReadModifyWriteRow. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ReadModifyWriteRowRequest { - /// Required. The unique name of the table to which the read/modify/write rules should be - /// applied. - /// Values are of the form + /// Required. The unique name of the table to which the read/modify/write rules + /// should be applied. Values are of the form /// `projects//instances//tables/
    `. #[prost(string, tag = "1")] pub table_name: ::prost::alloc::string::String, @@ -925,12 +1185,13 @@ pub struct ReadModifyWriteRowRequest { /// "default" application profile will be used. #[prost(string, tag = "4")] pub app_profile_id: ::prost::alloc::string::String, - /// Required. The key of the row to which the read/modify/write rules should be applied. + /// Required. The key of the row to which the read/modify/write rules should be + /// applied. #[prost(bytes = "vec", tag = "2")] pub row_key: ::prost::alloc::vec::Vec, - /// Required. Rules specifying how the specified row's contents are to be transformed - /// into writes. Entries are applied in order, meaning that earlier rules will - /// affect the results of later ones. + /// Required. Rules specifying how the specified row's contents are to be + /// transformed into writes. Entries are applied in order, meaning that earlier + /// rules will affect the results of later ones. #[prost(message, repeated, tag = "3")] pub rules: ::prost::alloc::vec::Vec, } @@ -942,6 +1203,312 @@ pub struct ReadModifyWriteRowResponse { #[prost(message, optional, tag = "1")] pub row: ::core::option::Option, } +/// NOTE: This API is intended to be used by Apache Beam BigtableIO. +/// Request message for Bigtable.GenerateInitialChangeStreamPartitions. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GenerateInitialChangeStreamPartitionsRequest { + /// Required. The unique name of the table from which to get change stream + /// partitions. Values are of the form + /// `projects//instances//tables/
    `. + /// Change streaming must be enabled on the table. + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, + /// This value specifies routing for replication. If not specified, the + /// "default" application profile will be used. + /// Single cluster routing must be configured on the profile. + #[prost(string, tag = "2")] + pub app_profile_id: ::prost::alloc::string::String, +} +/// NOTE: This API is intended to be used by Apache Beam BigtableIO. +/// Response message for Bigtable.GenerateInitialChangeStreamPartitions. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GenerateInitialChangeStreamPartitionsResponse { + /// A partition of the change stream. + #[prost(message, optional, tag = "1")] + pub partition: ::core::option::Option, +} +/// NOTE: This API is intended to be used by Apache Beam BigtableIO. +/// Request message for Bigtable.ReadChangeStream. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ReadChangeStreamRequest { + /// Required. The unique name of the table from which to read a change stream. + /// Values are of the form + /// `projects//instances//tables/
    `. + /// Change streaming must be enabled on the table. + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, + /// This value specifies routing for replication. If not specified, the + /// "default" application profile will be used. + /// Single cluster routing must be configured on the profile. + #[prost(string, tag = "2")] + pub app_profile_id: ::prost::alloc::string::String, + /// The partition to read changes from. + #[prost(message, optional, tag = "3")] + pub partition: ::core::option::Option, + /// If specified, OK will be returned when the stream advances beyond + /// this time. Otherwise, changes will be continuously delivered on the stream. + /// This value is inclusive and will be truncated to microsecond granularity. + #[prost(message, optional, tag = "5")] + pub end_time: ::core::option::Option<::prost_types::Timestamp>, + /// If specified, the duration between `Heartbeat` messages on the stream. + /// Otherwise, defaults to 5 seconds. + #[prost(message, optional, tag = "7")] + pub heartbeat_duration: ::core::option::Option<::prost_types::Duration>, + /// Options for describing where we want to start reading from the stream. + #[prost(oneof = "read_change_stream_request::StartFrom", tags = "4, 6")] + pub start_from: ::core::option::Option, +} +/// Nested message and enum types in `ReadChangeStreamRequest`. +pub mod read_change_stream_request { + /// Options for describing where we want to start reading from the stream. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum StartFrom { + /// Start reading the stream at the specified timestamp. This timestamp must + /// be within the change stream retention period, less than or equal to the + /// current time, and after change stream creation, whichever is greater. + /// This value is inclusive and will be truncated to microsecond granularity. + #[prost(message, tag = "4")] + StartTime(::prost_types::Timestamp), + /// Tokens that describe how to resume reading a stream where reading + /// previously left off. If specified, changes will be read starting at the + /// the position. Tokens are delivered on the stream as part of `Heartbeat` + /// and `CloseStream` messages. + /// + /// If a single token is provided, the token’s partition must exactly match + /// the request’s partition. If multiple tokens are provided, as in the case + /// of a partition merge, the union of the token partitions must exactly + /// cover the request’s partition. Otherwise, INVALID_ARGUMENT will be + /// returned. + #[prost(message, tag = "6")] + ContinuationTokens(super::StreamContinuationTokens), + } +} +/// NOTE: This API is intended to be used by Apache Beam BigtableIO. +/// Response message for Bigtable.ReadChangeStream. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ReadChangeStreamResponse { + /// The data or control message on the stream. + #[prost(oneof = "read_change_stream_response::StreamRecord", tags = "1, 2, 3")] + pub stream_record: ::core::option::Option, +} +/// Nested message and enum types in `ReadChangeStreamResponse`. +pub mod read_change_stream_response { + /// A partial or complete mutation. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MutationChunk { + /// If set, then the mutation is a `SetCell` with a chunked value across + /// multiple messages. + #[prost(message, optional, tag = "1")] + pub chunk_info: ::core::option::Option, + /// If this is a continuation of a chunked message (`chunked_value_offset` > + /// 0), ignore all fields except the `SetCell`'s value and merge it with + /// the previous message by concatenating the value fields. + #[prost(message, optional, tag = "2")] + pub mutation: ::core::option::Option, + } + /// Nested message and enum types in `MutationChunk`. + pub mod mutation_chunk { + /// Information about the chunking of this mutation. + /// Only `SetCell` mutations can be chunked, and all chunks for a `SetCell` + /// will be delivered contiguously with no other mutation types interleaved. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ChunkInfo { + /// The total value size of all the chunks that make up the `SetCell`. + #[prost(int32, tag = "1")] + pub chunked_value_size: i32, + /// The byte offset of this chunk into the total value size of the + /// mutation. + #[prost(int32, tag = "2")] + pub chunked_value_offset: i32, + /// When true, this is the last chunk of a chunked `SetCell`. + #[prost(bool, tag = "3")] + pub last_chunk: bool, + } + } + /// A message corresponding to one or more mutations to the partition + /// being streamed. A single logical `DataChange` message may also be split + /// across a sequence of multiple individual messages. Messages other than + /// the first in a sequence will only have the `type` and `chunks` fields + /// populated, with the final message in the sequence also containing `done` + /// set to true. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DataChange { + /// The type of the mutation. + #[prost(enumeration = "data_change::Type", tag = "1")] + pub r#type: i32, + /// The cluster where the mutation was applied. + /// Not set when `type` is `GARBAGE_COLLECTION`. + #[prost(string, tag = "2")] + pub source_cluster_id: ::prost::alloc::string::String, + /// The row key for all mutations that are part of this `DataChange`. + /// If the `DataChange` is chunked across multiple messages, then this field + /// will only be set for the first message. + #[prost(bytes = "vec", tag = "3")] + pub row_key: ::prost::alloc::vec::Vec, + /// The timestamp at which the mutation was applied on the Bigtable server. + #[prost(message, optional, tag = "4")] + pub commit_timestamp: ::core::option::Option<::prost_types::Timestamp>, + /// A value that lets stream consumers reconstruct Bigtable's + /// conflict resolution semantics. + /// + /// In the event that the same row key, column family, column qualifier, + /// timestamp are modified on different clusters at the same + /// `commit_timestamp`, the mutation with the larger `tiebreaker` will be the + /// one chosen for the eventually consistent state of the system. + #[prost(int32, tag = "5")] + pub tiebreaker: i32, + /// The mutations associated with this change to the partition. + /// May contain complete mutations or chunks of a multi-message chunked + /// `DataChange` record. + #[prost(message, repeated, tag = "6")] + pub chunks: ::prost::alloc::vec::Vec, + /// When true, indicates that the entire `DataChange` has been read + /// and the client can safely process the message. + #[prost(bool, tag = "8")] + pub done: bool, + /// An encoded position for this stream's partition to restart reading from. + /// This token is for the StreamPartition from the request. + #[prost(string, tag = "9")] + pub token: ::prost::alloc::string::String, + /// An estimate of the commit timestamp that is usually lower than or equal + /// to any timestamp for a record that will be delivered in the future on the + /// stream. It is possible that, under particular circumstances that a future + /// record has a timestamp is is lower than a previously seen timestamp. For + /// an example usage see + /// + #[prost(message, optional, tag = "10")] + pub estimated_low_watermark: ::core::option::Option<::prost_types::Timestamp>, + } + /// Nested message and enum types in `DataChange`. + pub mod data_change { + /// The type of mutation. + #[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + PartialOrd, + Ord, + ::prost::Enumeration + )] + #[repr(i32)] + pub enum Type { + /// The type is unspecified. + Unspecified = 0, + /// A user-initiated mutation. + User = 1, + /// A system-initiated mutation as part of garbage collection. + /// + GarbageCollection = 2, + /// This is a continuation of a multi-message change. + Continuation = 3, + } + impl Type { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Type::Unspecified => "TYPE_UNSPECIFIED", + Type::User => "USER", + Type::GarbageCollection => "GARBAGE_COLLECTION", + Type::Continuation => "CONTINUATION", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "TYPE_UNSPECIFIED" => Some(Self::Unspecified), + "USER" => Some(Self::User), + "GARBAGE_COLLECTION" => Some(Self::GarbageCollection), + "CONTINUATION" => Some(Self::Continuation), + _ => None, + } + } + } + } + /// A periodic message with information that can be used to checkpoint + /// the state of a stream. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Heartbeat { + /// A token that can be provided to a subsequent `ReadChangeStream` call + /// to pick up reading at the current stream position. + #[prost(message, optional, tag = "1")] + pub continuation_token: ::core::option::Option, + /// An estimate of the commit timestamp that is usually lower than or equal + /// to any timestamp for a record that will be delivered in the future on the + /// stream. It is possible that, under particular circumstances that a future + /// record has a timestamp is is lower than a previously seen timestamp. For + /// an example usage see + /// + #[prost(message, optional, tag = "2")] + pub estimated_low_watermark: ::core::option::Option<::prost_types::Timestamp>, + } + /// A message indicating that the client should stop reading from the stream. + /// If status is OK and `continuation_tokens` & `new_partitions` are empty, the + /// stream has finished (for example if there was an `end_time` specified). + /// If `continuation_tokens` & `new_partitions` are present, then a change in + /// partitioning requires the client to open a new stream for each token to + /// resume reading. Example: + /// [B, D) ends + /// | + /// v + /// new_partitions: [A, C) [C, E) + /// continuation_tokens.partitions: [B,C) [C,D) + /// ^---^ ^---^ + /// ^ ^ + /// | | + /// | StreamContinuationToken 2 + /// | + /// StreamContinuationToken 1 + /// To read the new partition [A,C), supply the continuation tokens whose + /// ranges cover the new partition, for example ContinuationToken[A,B) & + /// ContinuationToken[B,C). + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct CloseStream { + /// The status of the stream. + #[prost(message, optional, tag = "1")] + pub status: ::core::option::Option, + /// If non-empty, contains the information needed to resume reading their + /// associated partitions. + #[prost(message, repeated, tag = "2")] + pub continuation_tokens: ::prost::alloc::vec::Vec< + super::StreamContinuationToken, + >, + /// If non-empty, contains the new partitions to start reading from, which + /// are related to but not necessarily identical to the partitions for the + /// above `continuation_tokens`. + #[prost(message, repeated, tag = "3")] + pub new_partitions: ::prost::alloc::vec::Vec, + } + /// The data or control message on the stream. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum StreamRecord { + /// A mutation to the partition. + #[prost(message, tag = "1")] + DataChange(DataChange), + /// A periodic heartbeat message. + #[prost(message, tag = "2")] + Heartbeat(Heartbeat), + /// An indication that the stream should be closed. + #[prost(message, tag = "3")] + CloseStream(CloseStream), + } +} /// Generated client implementations. pub mod bigtable_client { #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] @@ -956,7 +1523,7 @@ pub mod bigtable_client { /// Attempt to create a new client by connecting to a given endpoint. pub async fn connect(dst: D) -> Result where - D: std::convert::TryInto, + D: TryInto, D::Error: Into, { let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; @@ -1012,6 +1579,22 @@ pub mod bigtable_client { self.inner = self.inner.accept_compressed(encoding); self } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } /// Streams back the contents of all requested rows in key order, optionally /// applying the same Reader filter to each. Depending on their size, /// rows and cells may be broken up across multiple responses, but @@ -1020,7 +1603,7 @@ pub mod bigtable_client { pub async fn read_rows( &mut self, request: impl tonic::IntoRequest, - ) -> Result< + ) -> std::result::Result< tonic::Response>, tonic::Status, > { @@ -1037,7 +1620,10 @@ pub mod bigtable_client { let path = http::uri::PathAndQuery::from_static( "/google.bigtable.v2.Bigtable/ReadRows", ); - self.inner.server_streaming(request.into_request(), path, codec).await + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("google.bigtable.v2.Bigtable", "ReadRows")); + self.inner.server_streaming(req, path, codec).await } /// Returns a sample of row keys in the table. The returned row keys will /// delimit contiguous sections of the table of approximately equal size, @@ -1046,7 +1632,7 @@ pub mod bigtable_client { pub async fn sample_row_keys( &mut self, request: impl tonic::IntoRequest, - ) -> Result< + ) -> std::result::Result< tonic::Response>, tonic::Status, > { @@ -1063,14 +1649,20 @@ pub mod bigtable_client { let path = http::uri::PathAndQuery::from_static( "/google.bigtable.v2.Bigtable/SampleRowKeys", ); - self.inner.server_streaming(request.into_request(), path, codec).await + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("google.bigtable.v2.Bigtable", "SampleRowKeys")); + self.inner.server_streaming(req, path, codec).await } /// Mutates a row atomically. Cells already present in the row are left /// unchanged unless explicitly changed by `mutation`. pub async fn mutate_row( &mut self, request: impl tonic::IntoRequest, - ) -> Result, tonic::Status> { + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { self.inner .ready() .await @@ -1084,7 +1676,10 @@ pub mod bigtable_client { let path = http::uri::PathAndQuery::from_static( "/google.bigtable.v2.Bigtable/MutateRow", ); - self.inner.unary(request.into_request(), path, codec).await + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("google.bigtable.v2.Bigtable", "MutateRow")); + self.inner.unary(req, path, codec).await } /// Mutates multiple rows in a batch. Each individual row is mutated /// atomically as in MutateRow, but the entire batch is not executed @@ -1092,7 +1687,7 @@ pub mod bigtable_client { pub async fn mutate_rows( &mut self, request: impl tonic::IntoRequest, - ) -> Result< + ) -> std::result::Result< tonic::Response>, tonic::Status, > { @@ -1109,13 +1704,19 @@ pub mod bigtable_client { let path = http::uri::PathAndQuery::from_static( "/google.bigtable.v2.Bigtable/MutateRows", ); - self.inner.server_streaming(request.into_request(), path, codec).await + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("google.bigtable.v2.Bigtable", "MutateRows")); + self.inner.server_streaming(req, path, codec).await } /// Mutates a row atomically based on the output of a predicate Reader filter. pub async fn check_and_mutate_row( &mut self, request: impl tonic::IntoRequest, - ) -> Result, tonic::Status> { + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { self.inner .ready() .await @@ -1129,7 +1730,39 @@ pub mod bigtable_client { let path = http::uri::PathAndQuery::from_static( "/google.bigtable.v2.Bigtable/CheckAndMutateRow", ); - self.inner.unary(request.into_request(), path, codec).await + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("google.bigtable.v2.Bigtable", "CheckAndMutateRow"), + ); + self.inner.unary(req, path, codec).await + } + /// Warm up associated instance metadata for this connection. + /// This call is not required but may be useful for connection keep-alive. + pub async fn ping_and_warm( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/google.bigtable.v2.Bigtable/PingAndWarm", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("google.bigtable.v2.Bigtable", "PingAndWarm")); + self.inner.unary(req, path, codec).await } /// Modifies a row atomically on the server. The method reads the latest /// existing timestamp and value from the specified columns and writes a new @@ -1139,7 +1772,10 @@ pub mod bigtable_client { pub async fn read_modify_write_row( &mut self, request: impl tonic::IntoRequest, - ) -> Result, tonic::Status> { + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { self.inner .ready() .await @@ -1153,7 +1789,85 @@ pub mod bigtable_client { let path = http::uri::PathAndQuery::from_static( "/google.bigtable.v2.Bigtable/ReadModifyWriteRow", ); - self.inner.unary(request.into_request(), path, codec).await + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("google.bigtable.v2.Bigtable", "ReadModifyWriteRow"), + ); + self.inner.unary(req, path, codec).await + } + /// NOTE: This API is intended to be used by Apache Beam BigtableIO. + /// Returns the current list of partitions that make up the table's + /// change stream. The union of partitions will cover the entire keyspace. + /// Partitions can be read with `ReadChangeStream`. + pub async fn generate_initial_change_stream_partitions( + &mut self, + request: impl tonic::IntoRequest< + super::GenerateInitialChangeStreamPartitionsRequest, + >, + ) -> std::result::Result< + tonic::Response< + tonic::codec::Streaming< + super::GenerateInitialChangeStreamPartitionsResponse, + >, + >, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/google.bigtable.v2.Bigtable/GenerateInitialChangeStreamPartitions", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "google.bigtable.v2.Bigtable", + "GenerateInitialChangeStreamPartitions", + ), + ); + self.inner.server_streaming(req, path, codec).await + } + /// NOTE: This API is intended to be used by Apache Beam BigtableIO. + /// Reads changes from a table's change stream. Changes will + /// reflect both user-initiated mutations and mutations that are caused by + /// garbage collection. + pub async fn read_change_stream( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response< + tonic::codec::Streaming, + >, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/google.bigtable.v2.Bigtable/ReadChangeStream", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("google.bigtable.v2.Bigtable", "ReadChangeStream"), + ); + self.inner.server_streaming(req, path, codec).await } } } diff --git a/storage-bigtable/proto/google.rpc.rs b/storage-bigtable/proto/google.rpc.rs index 8f3d2b98eee10e..e20cb14834952c 100644 --- a/storage-bigtable/proto/google.rpc.rs +++ b/storage-bigtable/proto/google.rpc.rs @@ -8,12 +8,14 @@ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Status { - /// The status code, which should be an enum value of \[google.rpc.Code][google.rpc.Code\]. + /// The status code, which should be an enum value of + /// \[google.rpc.Code][google.rpc.Code\]. #[prost(int32, tag = "1")] pub code: i32, /// A developer-facing error message, which should be in English. Any /// user-facing error message should be localized and sent in the - /// \[google.rpc.Status.details][google.rpc.Status.details\] field, or localized by the client. + /// \[google.rpc.Status.details][google.rpc.Status.details\] field, or localized + /// by the client. #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, /// A list of messages that carry the error details. There is a common set of diff --git a/storage-bigtable/src/bigtable.rs b/storage-bigtable/src/bigtable.rs index e777caaebb0906..3b5b46d08257a3 100644 --- a/storage-bigtable/src/bigtable.rs +++ b/storage-bigtable/src/bigtable.rs @@ -112,6 +112,7 @@ pub struct BigTableConnection { table_prefix: String, app_profile_id: String, timeout: Option, + max_message_size: usize, } impl BigTableConnection { @@ -132,11 +133,18 @@ impl BigTableConnection { read_only: bool, timeout: Option, credential_type: CredentialType, + max_message_size: usize, ) -> Result { match std::env::var("BIGTABLE_EMULATOR_HOST") { Ok(endpoint) => { info!("Connecting to bigtable emulator at {}", endpoint); - Self::new_for_emulator(instance_name, app_profile_id, &endpoint, timeout) + Self::new_for_emulator( + instance_name, + app_profile_id, + &endpoint, + timeout, + max_message_size, + ) } Err(_) => { @@ -201,6 +209,7 @@ impl BigTableConnection { table_prefix, app_profile_id: app_profile_id.to_string(), timeout, + max_message_size, }) } } @@ -211,6 +220,7 @@ impl BigTableConnection { app_profile_id: &str, endpoint: &str, timeout: Option, + max_message_size: usize, ) -> Result { Ok(Self { access_token: None, @@ -220,6 +230,7 @@ impl BigTableConnection { table_prefix: format!("projects/emulator/instances/{instance_name}/tables/"), app_profile_id: app_profile_id.to_string(), timeout, + max_message_size, }) } @@ -245,7 +256,9 @@ impl BigTableConnection { } Ok(req) }, - ); + ) + .max_decoding_message_size(self.max_message_size) + .max_encoding_message_size(self.max_message_size); BigTable { access_token: self.access_token.clone(), client, @@ -458,6 +471,8 @@ impl) -> InterceptedRequestResult> BigTable { ], })), }), + request_stats_view: 0, + reversed: false, }) .await? .into_inner(); @@ -483,6 +498,8 @@ impl) -> InterceptedRequestResult> BigTable { filter: Some(RowFilter { filter: Some(row_filter::Filter::StripValueTransformer(true)), }), + request_stats_view: 0, + reversed: false, }) .await? .into_inner(); @@ -534,6 +551,8 @@ impl) -> InterceptedRequestResult> BigTable { // Only return the latest version of each cell filter: Some(row_filter::Filter::CellsPerColumnLimitFilter(1)), }), + request_stats_view: 0, + reversed: false, }) .await? .into_inner(); @@ -566,6 +585,8 @@ impl) -> InterceptedRequestResult> BigTable { // Only return the latest version of each cell filter: Some(row_filter::Filter::CellsPerColumnLimitFilter(1)), }), + request_stats_view: 0, + reversed: false, }) .await? .into_inner(); @@ -599,6 +620,8 @@ impl) -> InterceptedRequestResult> BigTable { // Only return the latest version of each cell filter: Some(row_filter::Filter::CellsPerColumnLimitFilter(1)), }), + request_stats_view: 0, + reversed: false, }) .await? .into_inner(); diff --git a/storage-bigtable/src/lib.rs b/storage-bigtable/src/lib.rs index 0b8ed4d3a593c3..1b6b769f0402f9 100644 --- a/storage-bigtable/src/lib.rs +++ b/storage-bigtable/src/lib.rs @@ -376,6 +376,7 @@ impl From for TransactionByAddrInfo { pub const DEFAULT_INSTANCE_NAME: &str = "solana-ledger"; pub const DEFAULT_APP_PROFILE_ID: &str = "default"; +pub const DEFAULT_MAX_MESSAGE_SIZE: usize = 64 * 1024 * 1024; // 64MB #[derive(Debug)] pub enum CredentialType { @@ -390,6 +391,7 @@ pub struct LedgerStorageConfig { pub credential_type: CredentialType, pub instance_name: String, pub app_profile_id: String, + pub max_message_size: usize, } impl Default for LedgerStorageConfig { @@ -400,6 +402,7 @@ impl Default for LedgerStorageConfig { credential_type: CredentialType::Filepath(None), instance_name: DEFAULT_INSTANCE_NAME.to_string(), app_profile_id: DEFAULT_APP_PROFILE_ID.to_string(), + max_message_size: DEFAULT_MAX_MESSAGE_SIZE, } } } @@ -466,6 +469,7 @@ impl LedgerStorage { app_profile_id, endpoint, timeout, + LedgerStorageConfig::default().max_message_size, )?, stats, }) @@ -479,6 +483,7 @@ impl LedgerStorage { instance_name, app_profile_id, credential_type, + max_message_size, } = config; let connection = bigtable::BigTableConnection::new( instance_name.as_str(), @@ -486,6 +491,7 @@ impl LedgerStorage { read_only, timeout, credential_type, + max_message_size, ) .await?; Ok(Self { stats, connection }) diff --git a/validator/src/bin/solana-test-validator.rs b/validator/src/bin/solana-test-validator.rs index 39f206116ecaf7..aee5fc039df410 100644 --- a/validator/src/bin/solana-test-validator.rs +++ b/validator/src/bin/solana-test-validator.rs @@ -430,6 +430,7 @@ fn main() { String ), timeout: None, + ..RpcBigtableConfig::default() }) } else { None diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 0ce27ba6bea367..2e40751840edf8 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -878,6 +878,15 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .default_value(&default_args.rpc_bigtable_app_profile_id) .help("Bigtable application profile id to use in requests") ) + .arg( + Arg::with_name("rpc_bigtable_max_message_size") + .long("rpc-bigtable-max-message-size") + .value_name("BYTES") + .validator(is_parsable::) + .takes_value(true) + .default_value(&default_args.rpc_bigtable_max_message_size) + .help("Max encoding and decoding message size used in Bigtable Grpc client"), + ) .arg( Arg::with_name("rpc_pubsub_worker_threads") .long("rpc-pubsub-worker-threads") @@ -1908,6 +1917,7 @@ pub struct DefaultArgs { pub rpc_bigtable_timeout: String, pub rpc_bigtable_instance_name: String, pub rpc_bigtable_app_profile_id: String, + pub rpc_bigtable_max_message_size: String, pub rpc_max_request_body_size: String, pub rpc_pubsub_worker_threads: String, @@ -1993,6 +2003,8 @@ impl DefaultArgs { rpc_bigtable_instance_name: solana_storage_bigtable::DEFAULT_INSTANCE_NAME.to_string(), rpc_bigtable_app_profile_id: solana_storage_bigtable::DEFAULT_APP_PROFILE_ID .to_string(), + rpc_bigtable_max_message_size: solana_storage_bigtable::DEFAULT_MAX_MESSAGE_SIZE + .to_string(), rpc_pubsub_worker_threads: "4".to_string(), accountsdb_repl_threads: num_cpus::get().to_string(), accounts_filler_count: "0".to_string(), diff --git a/validator/src/main.rs b/validator/src/main.rs index 38bb9813ab3a70..f5b0ce1a0609e7 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -1237,6 +1237,7 @@ pub fn main() { timeout: value_t!(matches, "rpc_bigtable_timeout", u64) .ok() .map(Duration::from_secs), + max_message_size: value_t_or_exit!(matches, "rpc_bigtable_max_message_size", usize), }) } else { None From 0aea75aaf57ef143e382d7c555daf5c1774835d3 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 23:28:05 +0900 Subject: [PATCH 143/213] v1.17: [zk-token-proof] include `VerifyBatchRangeProofU256` in the `enable_zk_transfer_with_fee` feature gate (backport of #34747) (#34765) [zk-token-proof] include `VerifyBatchRangeProofU256` in the `enable_zk_transfer_with_fee` feature gate (#34747) include `VerifyBatchRangeProofU256` in the `enable_zk_transfer_with_fee` feature (cherry picked from commit bc136423b4a6f4609e2d07a0b863bc452b84a3ea) Co-authored-by: samkim-crypto --- programs/zk-token-proof/src/lib.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/programs/zk-token-proof/src/lib.rs b/programs/zk-token-proof/src/lib.rs index 9a9396b15f1fdb..e262950201181a 100644 --- a/programs/zk-token-proof/src/lib.rs +++ b/programs/zk-token-proof/src/lib.rs @@ -257,6 +257,11 @@ declare_process_instruction!(Entrypoint, 0, |invoke_context| { ) } ProofInstruction::VerifyBatchedRangeProofU256 => { + // transfer with fee related proofs are not enabled + if !enable_zk_transfer_with_fee { + return Err(InstructionError::InvalidInstructionData); + } + if native_programs_consume_cu { invoke_context .consume_checked(VERIFY_BATCHED_RANGE_PROOF_U256_COMPUTE_UNITS) From cb6aef7c0472d0f3b913aeb779cde754e1aeb867 Mon Sep 17 00:00:00 2001 From: Yihau Chen Date: Wed, 17 Jan 2024 13:24:26 +0800 Subject: [PATCH 144/213] Bump version to v1.17.17 (#34804) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7377eb704e9ce5..0c919d70b5802b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.16" +version = "1.17.17" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.16" +version = "1.17.17" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.16" +version = "1.17.17" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.16" +version = "1.17.17" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.16" +version = "1.17.17" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.16" +version = "1.17.17" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.16" +version = "1.17.17" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.16" +version = "1.17.17" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.16" +version = "1.17.17" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.16" +version = "1.17.17" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.16" +version = "1.17.17" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.16" +version = "1.17.17" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.16" +version = "1.17.17" dependencies = [ "ahash 0.8.4", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.16" +version = "1.17.17" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.16" +version = "1.17.17" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.16" +version = "1.17.17" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.16" +version = "1.17.17" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.16" +version = "1.17.17" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.16" +version = "1.17.17" [[package]] name = "solana-merkle-root-bench" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.16" +version = "1.17.17" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.16" +version = "1.17.17" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.16" +version = "1.17.17" dependencies = [ "ahash 0.8.4", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.16" +version = "1.17.17" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.16" +version = "1.17.17" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.16" +version = "1.17.17" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.16" +version = "1.17.17" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.16" +version = "1.17.17" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.16" +version = "1.17.17" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.16" +version = "1.17.17" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.16" +version = "1.17.17" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.16" +version = "1.17.17" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.16" +version = "1.17.17" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.16" +version = "1.17.17" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.16" +version = "1.17.17" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 888bc5f34501ba..c78e825bf99d5b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.16" +version = "1.17.17" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.16" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.16" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.16" } -solana-banks-client = { path = "banks-client", version = "=1.17.16" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.16" } -solana-banks-server = { path = "banks-server", version = "=1.17.16" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.16" } -solana-bloom = { path = "bloom", version = "=1.17.16" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.16" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.16" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.16", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.16" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.16" } -solana-cli = { path = "cli", version = "=1.17.16" } -solana-cli-config = { path = "cli-config", version = "=1.17.16" } -solana-cli-output = { path = "cli-output", version = "=1.17.16" } -solana-client = { path = "client", version = "=1.17.16" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.16" } -solana-config-program = { path = "programs/config", version = "=1.17.16" } -solana-core = { path = "core", version = "=1.17.16" } -solana-cost-model = { path = "cost-model", version = "=1.17.16" } -solana-download-utils = { path = "download-utils", version = "=1.17.16" } -solana-entry = { path = "entry", version = "=1.17.16" } -solana-faucet = { path = "faucet", version = "=1.17.16" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.16" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.16" } -solana-genesis = { path = "genesis", version = "=1.17.16" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.16" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.16" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.16" } -solana-gossip = { path = "gossip", version = "=1.17.16" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.16" } -solana-ledger = { path = "ledger", version = "=1.17.16" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.16" } -solana-logger = { path = "logger", version = "=1.17.16" } -solana-measure = { path = "measure", version = "=1.17.16" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.16" } -solana-metrics = { path = "metrics", version = "=1.17.16" } -solana-net-utils = { path = "net-utils", version = "=1.17.16" } -solana-notifier = { path = "notifier", version = "=1.17.16" } -solana-perf = { path = "perf", version = "=1.17.16" } -solana-poh = { path = "poh", version = "=1.17.16" } -solana-program = { path = "sdk/program", version = "=1.17.16" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.16" } -solana-program-test = { path = "program-test", version = "=1.17.16" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.16" } -solana-quic-client = { path = "quic-client", version = "=1.17.16" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.16" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.16", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.16" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.16", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.16" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.16" } -solana-runtime = { path = "runtime", version = "=1.17.16" } -solana-sdk = { path = "sdk", version = "=1.17.16" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.16" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.16" } -solana-stake-program = { path = "programs/stake", version = "=1.17.16" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.16" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.16" } -solana-streamer = { path = "streamer", version = "=1.17.16" } -solana-system-program = { path = "programs/system", version = "=1.17.16" } -solana-test-validator = { path = "test-validator", version = "=1.17.16" } -solana-thin-client = { path = "thin-client", version = "=1.17.16" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.16", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.16" } -solana-turbine = { path = "turbine", version = "=1.17.16" } -solana-udp-client = { path = "udp-client", version = "=1.17.16" } -solana-version = { path = "version", version = "=1.17.16" } -solana-vote = { path = "vote", version = "=1.17.16" } -solana-vote-program = { path = "programs/vote", version = "=1.17.16" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.16" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.16" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.16" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.17" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.17" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.17" } +solana-banks-client = { path = "banks-client", version = "=1.17.17" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.17" } +solana-banks-server = { path = "banks-server", version = "=1.17.17" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.17" } +solana-bloom = { path = "bloom", version = "=1.17.17" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.17" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.17" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.17", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.17" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.17" } +solana-cli = { path = "cli", version = "=1.17.17" } +solana-cli-config = { path = "cli-config", version = "=1.17.17" } +solana-cli-output = { path = "cli-output", version = "=1.17.17" } +solana-client = { path = "client", version = "=1.17.17" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.17" } +solana-config-program = { path = "programs/config", version = "=1.17.17" } +solana-core = { path = "core", version = "=1.17.17" } +solana-cost-model = { path = "cost-model", version = "=1.17.17" } +solana-download-utils = { path = "download-utils", version = "=1.17.17" } +solana-entry = { path = "entry", version = "=1.17.17" } +solana-faucet = { path = "faucet", version = "=1.17.17" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.17" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.17" } +solana-genesis = { path = "genesis", version = "=1.17.17" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.17" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.17" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.17" } +solana-gossip = { path = "gossip", version = "=1.17.17" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.17" } +solana-ledger = { path = "ledger", version = "=1.17.17" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.17" } +solana-logger = { path = "logger", version = "=1.17.17" } +solana-measure = { path = "measure", version = "=1.17.17" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.17" } +solana-metrics = { path = "metrics", version = "=1.17.17" } +solana-net-utils = { path = "net-utils", version = "=1.17.17" } +solana-notifier = { path = "notifier", version = "=1.17.17" } +solana-perf = { path = "perf", version = "=1.17.17" } +solana-poh = { path = "poh", version = "=1.17.17" } +solana-program = { path = "sdk/program", version = "=1.17.17" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.17" } +solana-program-test = { path = "program-test", version = "=1.17.17" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.17" } +solana-quic-client = { path = "quic-client", version = "=1.17.17" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.17" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.17", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.17" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.17", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.17" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.17" } +solana-runtime = { path = "runtime", version = "=1.17.17" } +solana-sdk = { path = "sdk", version = "=1.17.17" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.17" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.17" } +solana-stake-program = { path = "programs/stake", version = "=1.17.17" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.17" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.17" } +solana-streamer = { path = "streamer", version = "=1.17.17" } +solana-system-program = { path = "programs/system", version = "=1.17.17" } +solana-test-validator = { path = "test-validator", version = "=1.17.17" } +solana-thin-client = { path = "thin-client", version = "=1.17.17" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.17", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.17" } +solana-turbine = { path = "turbine", version = "=1.17.17" } +solana-udp-client = { path = "udp-client", version = "=1.17.17" } +solana-version = { path = "version", version = "=1.17.17" } +solana-vote = { path = "vote", version = "=1.17.17" } +solana-vote-program = { path = "programs/vote", version = "=1.17.17" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.17" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.17" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.17" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 9dca935700d5e6..3b9f90085aa76f 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.16" +version = "1.17.17" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.16" +version = "1.17.17" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.16" +version = "1.17.17" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.16" +version = "1.17.17" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.16" +version = "1.17.17" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.16" +version = "1.17.17" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.16" +version = "1.17.17" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.16" +version = "1.17.17" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.16" +version = "1.17.17" dependencies = [ "ahash 0.8.4", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.16" +version = "1.17.17" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.16" +version = "1.17.17" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.16" +version = "1.17.17" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.16" +version = "1.17.17" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.16" +version = "1.17.17" dependencies = [ "ahash 0.8.4", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.16" +version = "1.17.17" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.16" +version = "1.17.17" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.16" +version = "1.17.17" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.16" +version = "1.17.17" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.16" +version = "1.17.17" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.16" +version = "1.17.17" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.16" +version = "1.17.17" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.16" +version = "1.17.17" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.16" +version = "1.17.17" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.16" +version = "1.17.17" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.16" +version = "1.17.17" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.16" +version = "1.17.17" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.16" +version = "1.17.17" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.16" +version = "1.17.17" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.16" +version = "1.17.17" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.16" +version = "1.17.17" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.16" +version = "1.17.17" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.16" +version = "1.17.17" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.16" +version = "1.17.17" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.16" +version = "1.17.17" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.16" +version = "1.17.17" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.16" +version = "1.17.17" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.16" +version = "1.17.17" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.16" +version = "1.17.17" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.16" +version = "1.17.17" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.16" +version = "1.17.17" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.16" +version = "1.17.17" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.16" +version = "1.17.17" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.16" +version = "1.17.17" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 6d17ad2b180243..ccc1afc205a00d 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.16" +version = "1.17.17" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.16" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.16" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.16" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.16" } -solana-ledger = { path = "../../ledger", version = "=1.17.16" } -solana-logger = { path = "../../logger", version = "=1.17.16" } -solana-measure = { path = "../../measure", version = "=1.17.16" } -solana-program = { path = "../../sdk/program", version = "=1.17.16" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.16" } -solana-program-test = { path = "../../program-test", version = "=1.17.16" } -solana-runtime = { path = "../../runtime", version = "=1.17.16" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.16" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.16" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.16", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.16" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.16" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.16" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.16", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.16" } -solana-sdk = { path = "../../sdk", version = "=1.17.16" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.16" } -solana-validator = { path = "../../validator", version = "=1.17.16" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.16" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.17" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.17" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.17" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.17" } +solana-ledger = { path = "../../ledger", version = "=1.17.17" } +solana-logger = { path = "../../logger", version = "=1.17.17" } +solana-measure = { path = "../../measure", version = "=1.17.17" } +solana-program = { path = "../../sdk/program", version = "=1.17.17" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.17" } +solana-program-test = { path = "../../program-test", version = "=1.17.17" } +solana-runtime = { path = "../../runtime", version = "=1.17.17" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.17" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.17" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.17", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.17" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.17" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.17" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.17", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.17" } +solana-sdk = { path = "../../sdk", version = "=1.17.17" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.17" } +solana-validator = { path = "../../validator", version = "=1.17.17" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.17" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index ee20385f6b03e4..f3fe06be5e284f 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.16" +version = "1.17.17" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.16" } +solana-program = { path = "../../../../program", version = "=1.17.17" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 5b048bc4f7d1ec..3b4370f6f55285 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.16" +version = "1.17.17" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.16" } +solana-program = { path = "../../../../program", version = "=1.17.17" } [lib] crate-type = ["cdylib"] From 35b7df1cc1cc9e132f4ebcb0dcfa40bbce9d11c3 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:07:31 +0000 Subject: [PATCH 145/213] v1.17: ci: use openssl 3.1.1 for Windows build (backport of #34795) (#34797) ci: use openssl 3.1.1 for Windows build (#34795) (cherry picked from commit 0e90e985dd36044b2e3274e783735ed5b1c33679) Co-authored-by: Yihau Chen --- .github/workflows/release-artifacts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml index 3e5ab89fe33c57..98dc697920262c 100644 --- a/.github/workflows/release-artifacts.yml +++ b/.github/workflows/release-artifacts.yml @@ -47,7 +47,7 @@ jobs: id: build shell: bash run: | - choco install openssl + choco install openssl --version=3.1.1 if [[ -d "C:\Program Files\OpenSSL" ]]; then echo "OPENSSL_DIR: C:\Program Files\OpenSSL" export OPENSSL_DIR="C:\Program Files\OpenSSL" From fbb11a8fe31bf6e409651495962a5638817dcb72 Mon Sep 17 00:00:00 2001 From: Tyera Date: Wed, 17 Jan 2024 20:13:31 -0700 Subject: [PATCH 146/213] v1.17: Bump h2 to v0.3.24 (#34823) Bump h2 to v0.3.24 --- Cargo.lock | 34 ++++++++++++++++++++-------------- programs/sbf/Cargo.lock | 27 +++++++++++++-------------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c919d70b5802b..a652325f92e318 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2263,9 +2263,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.18" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -2273,7 +2273,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.0.2", "slab", "tokio", "tokio-util 0.7.1", @@ -3797,9 +3797,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -8451,11 +8451,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", "log", "pin-project-lite", "tracing-attributes", @@ -8464,22 +8463,23 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.18" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.38", ] [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ - "lazy_static", + "once_cell", + "valuable", ] [[package]] @@ -8673,6 +8673,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cf7d77f457ef8dfa11e4cd5933c5ddb5dc52a94664071951219a97710f0a32b" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 3b9f90085aa76f..f56f90943615fc 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -1891,9 +1891,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.18" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -1901,7 +1901,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.0.1", "slab", "tokio", "tokio-util 0.7.1", @@ -3378,9 +3378,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -7301,11 +7301,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", "log", "pin-project-lite", "tracing-attributes", @@ -7314,22 +7313,22 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.18" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] name = "tracing-core" -version = "0.1.26" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ - "lazy_static", + "once_cell", "valuable", ] From 3eae1c4e70bf429c0b66e0ff57bd20f1f58ae6e8 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 04:46:07 +0000 Subject: [PATCH 147/213] v1.17: sdk: add bounds check when instantiating `Keypair` from byte array (backport of #34817) (#34822) sdk: add bounds check when instantiating `Keypair` from byte array (#34817) (cherry picked from commit 6dbcdc063f894dfd38313426dbe7bc4d62529b30) Co-authored-by: Trent Nelson --- sdk/src/signer/keypair.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sdk/src/signer/keypair.rs b/sdk/src/signer/keypair.rs index 3183dac88e8b70..1873996a399391 100644 --- a/sdk/src/signer/keypair.rs +++ b/sdk/src/signer/keypair.rs @@ -44,6 +44,11 @@ impl Keypair { /// Recovers a `Keypair` from a byte array pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < ed25519_dalek::KEYPAIR_LENGTH { + return Err(ed25519_dalek::SignatureError::from_source(String::from( + "candidate keypair byte array is too short", + ))); + } let secret = ed25519_dalek::SecretKey::from_bytes(&bytes[..ed25519_dalek::SECRET_KEY_LENGTH])?; let public = From 407dfba6dbeba298e2dc8353b7fc6fd92c5131df Mon Sep 17 00:00:00 2001 From: Yihau Chen Date: Fri, 19 Jan 2024 01:19:23 +0800 Subject: [PATCH 148/213] v1.17: pin ahash to 0.8.5 (#34802) --- Cargo.lock | 10 +++++----- Cargo.toml | 2 +- programs/sbf/Cargo.lock | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a652325f92e318..81e3b0d967535f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,9 +76,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72832d73be48bac96a5d7944568f305d829ed55b0ce3b483647089dfaf6cf704" +checksum = "cd7d5a2cecb58716e47d67d5703a249964b14c7be1ec3cad3affc295b2d1c35d" dependencies = [ "cfg-if 1.0.0", "getrandom 0.2.10", @@ -2319,7 +2319,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.5", ] [[package]] @@ -5937,7 +5937,7 @@ dependencies = [ name = "solana-frozen-abi" version = "1.17.17" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.5", "bitflags 2.3.3", "blake3", "block-buffer 0.10.4", @@ -6431,7 +6431,7 @@ dependencies = [ name = "solana-perf" version = "1.17.17" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.5", "assert_matches", "bincode", "bv", diff --git a/Cargo.toml b/Cargo.toml index c78e825bf99d5b..602225ef49b8f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -132,7 +132,7 @@ edition = "2021" [workspace.dependencies] aes-gcm-siv = "0.10.3" -ahash = "=0.8.4" +ahash = "=0.8.5" anyhow = "1.0.75" ark-bn254 = "0.4.0" ark-ec = "0.4.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index f56f90943615fc..47985502019e26 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -76,9 +76,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72832d73be48bac96a5d7944568f305d829ed55b0ce3b483647089dfaf6cf704" +checksum = "cd7d5a2cecb58716e47d67d5703a249964b14c7be1ec3cad3affc295b2d1c35d" dependencies = [ "cfg-if 1.0.0", "getrandom 0.2.10", @@ -1941,7 +1941,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.5", ] [[package]] @@ -4924,7 +4924,7 @@ dependencies = [ name = "solana-frozen-abi" version = "1.17.17" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.5", "blake3", "block-buffer 0.10.4", "bs58", @@ -5189,7 +5189,7 @@ dependencies = [ name = "solana-perf" version = "1.17.17" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.5", "bincode", "bv", "caps", From d878262bb73c123fee0d3cb5a1a85874ee1b840c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 17:03:35 -0700 Subject: [PATCH 149/213] v1.17: rpc: parse token accounts in simulate_transaction (backport of #34619) (#34852) * rpc: parse token accounts in simulate_transaction (#34619) * rpc: parse token accounts in simulate_transaction * add overwrite_accounts into get_encoded_account and get_parsed_token_account * revert get_mint_decimals scope changes * move common.rs to rpc/account_resolver.rs * rename get_account to get_account_from_overwrites_or_bank * add a comment * clippy * add comment Co-authored-by: Tyera --------- Co-authored-by: Tyera (cherry picked from commit 7470c3d68b5a493a9255c13113cd29335dcb0b09) * remove innerInstructions --------- Co-authored-by: Yihau Chen Co-authored-by: yihau --- rpc/src/parsed_token_accounts.rs | 15 ++- rpc/src/rpc.rs | 175 ++++++++++++++++++++++++++++--- rpc/src/rpc/account_resolver.rs | 15 +++ rpc/src/rpc_subscriptions.rs | 2 +- 4 files changed, 191 insertions(+), 16 deletions(-) create mode 100644 rpc/src/rpc/account_resolver.rs diff --git a/rpc/src/parsed_token_accounts.rs b/rpc/src/parsed_token_accounts.rs index 597ffb249dee47..d93cda521e65bd 100644 --- a/rpc/src/parsed_token_accounts.rs +++ b/rpc/src/parsed_token_accounts.rs @@ -1,4 +1,5 @@ use { + crate::rpc::account_resolver, jsonrpc_core::{Error, Result}, solana_account_decoder::{ parse_account_data::AccountAdditionalData, parse_token::get_token_account_mint, UiAccount, @@ -18,11 +19,19 @@ pub fn get_parsed_token_account( bank: &Bank, pubkey: &Pubkey, account: AccountSharedData, + // only used for simulation results + overwrite_accounts: Option<&HashMap>, ) -> UiAccount { let additional_data = get_token_account_mint(account.data()) - .and_then(|mint_pubkey| get_mint_owner_and_decimals(bank, &mint_pubkey).ok()) - .map(|(_, decimals)| AccountAdditionalData { - spl_token_decimals: Some(decimals), + .and_then(|mint_pubkey| { + account_resolver::get_account_from_overwrites_or_bank( + &mint_pubkey, + bank, + overwrite_accounts, + ) + }) + .map(|mint_account| AccountAdditionalData { + spl_token_decimals: get_mint_decimals(mint_account.data()).ok(), }); UiAccount::encode( diff --git a/rpc/src/rpc.rs b/rpc/src/rpc.rs index aa1f6ee53f81dc..d7d0d8b6cc172d 100644 --- a/rpc/src/rpc.rs +++ b/rpc/src/rpc.rs @@ -112,6 +112,8 @@ use { }, }; +pub mod account_resolver; + type RpcCustomResult = std::result::Result; pub const MAX_REQUEST_BODY_SIZE: usize = 50 * (1 << 10); // 50kB @@ -429,7 +431,7 @@ impl JsonRpcRequestProcessor { })?; let encoding = encoding.unwrap_or(UiAccountEncoding::Binary); - let response = get_encoded_account(&bank, pubkey, encoding, data_slice)?; + let response = get_encoded_account(&bank, pubkey, encoding, data_slice, None)?; Ok(new_response(&bank, response)) } @@ -452,7 +454,7 @@ impl JsonRpcRequestProcessor { let accounts = pubkeys .into_iter() - .map(|pubkey| get_encoded_account(&bank, &pubkey, encoding, data_slice)) + .map(|pubkey| get_encoded_account(&bank, &pubkey, encoding, data_slice, None)) .collect::>>()?; Ok(new_response(&bank, accounts)) } @@ -2285,13 +2287,15 @@ fn get_encoded_account( pubkey: &Pubkey, encoding: UiAccountEncoding, data_slice: Option, + // only used for simulation results + overwrite_accounts: Option<&HashMap>, ) -> Result> { - match bank.get_account(pubkey) { + match account_resolver::get_account_from_overwrites_or_bank(pubkey, bank, overwrite_accounts) { Some(account) => { let response = if is_known_spl_token_id(account.owner()) && encoding == UiAccountEncoding::JsonParsed { - get_parsed_token_account(bank, pubkey, account) + get_parsed_token_account(bank, pubkey, account, overwrite_accounts) } else { encode_account(&account, pubkey, encoding, data_slice)? }; @@ -3783,19 +3787,24 @@ pub mod rpc_full { if result.is_err() { Some(vec![None; config_accounts.addresses.len()]) } else { + let mut post_simulation_accounts_map = HashMap::new(); + for (pubkey, data) in post_simulation_accounts { + post_simulation_accounts_map.insert(pubkey, data); + } + Some( config_accounts .addresses .iter() .map(|address_str| { - let address = verify_pubkey(address_str)?; - post_simulation_accounts - .iter() - .find(|(key, _account)| key == &address) - .map(|(pubkey, account)| { - encode_account(account, pubkey, accounts_encoding, None) - }) - .transpose() + let pubkey = verify_pubkey(address_str)?; + get_encoded_account( + bank, + &pubkey, + accounts_encoding, + None, + Some(&post_simulation_accounts_map), + ) }) .collect::>>()?, ) @@ -6112,6 +6121,148 @@ pub mod tests { assert_eq!(result, expected); } + #[test] + fn test_rpc_simulate_transaction_with_parsing_token_accounts() { + let rpc = RpcHandler::start(); + let bank = rpc.working_bank(); + let RpcHandler { + ref meta, ref io, .. + } = rpc; + + // init mint + let mint_rent_exempt_amount = + bank.get_minimum_balance_for_rent_exemption(spl_token::state::Mint::LEN); + let mint_pubkey = Pubkey::from_str("mint111111111111111111111111111111111111111").unwrap(); + let mut mint_data = [0u8; spl_token::state::Mint::LEN]; + Pack::pack_into_slice( + &spl_token::state::Mint { + mint_authority: COption::None, + supply: 0, + decimals: 8, + is_initialized: true, + freeze_authority: COption::None, + }, + &mut mint_data, + ); + let account = AccountSharedData::create( + mint_rent_exempt_amount, + mint_data.into(), + spl_token::id(), + false, + 0, + ); + bank.store_account(&mint_pubkey, &account); + + // init token account + let token_account_rent_exempt_amount = + bank.get_minimum_balance_for_rent_exemption(spl_token::state::Account::LEN); + let token_account_pubkey = Pubkey::new_unique(); + let owner_pubkey = Pubkey::from_str("owner11111111111111111111111111111111111111").unwrap(); + let mut token_account_data = [0u8; spl_token::state::Account::LEN]; + Pack::pack_into_slice( + &spl_token::state::Account { + mint: mint_pubkey, + owner: owner_pubkey, + amount: 1, + delegate: COption::None, + state: spl_token::state::AccountState::Initialized, + is_native: COption::None, + delegated_amount: 0, + close_authority: COption::None, + }, + &mut token_account_data, + ); + let account = AccountSharedData::create( + token_account_rent_exempt_amount, + token_account_data.into(), + spl_token::id(), + false, + 0, + ); + bank.store_account(&token_account_pubkey, &account); + + // prepare tx + let fee_payer = rpc.mint_keypair; + let recent_blockhash = bank.confirmed_last_blockhash(); + let tx = + system_transaction::transfer(&fee_payer, &token_account_pubkey, 1, recent_blockhash); + let tx_serialized_encoded = bs58::encode(serialize(&tx).unwrap()).into_string(); + + // Simulation bank must be frozen + bank.freeze(); + + let req = format!( + r#"{{"jsonrpc":"2.0", + "id":1, + "method":"simulateTransaction", + "params":[ + "{}", + {{ + "sigVerify": true, + "accounts": {{ + "encoding": "jsonParsed", + "addresses": ["{}", "{}"] + }} + }} + ] + }}"#, + tx_serialized_encoded, + solana_sdk::pubkey::new_rand(), + token_account_pubkey, + ); + let res = io.handle_request_sync(&req, meta.clone()); + let expected = json!({ + "jsonrpc": "2.0", + "result": { + "context": {"slot": 0, "apiVersion": RpcApiVersion::default()}, + "value":{ + "accounts": [ + null, + { + "data": { + "parsed": { + "info": { + "isNative": false, + "mint": "mint111111111111111111111111111111111111111", + "owner": "owner11111111111111111111111111111111111111", + "state": "initialized", + "tokenAmount": { + "amount": "1", + "decimals": 8, + "uiAmount": 0.00000001, + "uiAmountString": "0.00000001" + } + }, + "type": "account" + }, + "program": "spl-token", + "space": 165 + }, + "executable": false, + "lamports": (token_account_rent_exempt_amount + 1), + "owner": bs58::encode(spl_token::id()).into_string(), + "rentEpoch": u64::MAX, + "space": spl_token::state::Account::LEN + }, + ], + "err": null, + "logs":[ + "Program 11111111111111111111111111111111 invoke [1]", + "Program 11111111111111111111111111111111 success" + ], + "returnData": null, + "unitsConsumed": 150, + } + }, + "id": 1, + }); + let expected: Response = + serde_json::from_value(expected).expect("expected response deserialization"); + let result: Response = serde_json::from_str(&res.expect("actual response")) + .expect("actual response deserialization"); + assert_eq!(result, expected); + } + #[test] #[should_panic(expected = "simulation bank must be frozen")] fn test_rpc_simulate_transaction_panic_on_unfrozen_bank() { diff --git a/rpc/src/rpc/account_resolver.rs b/rpc/src/rpc/account_resolver.rs new file mode 100644 index 00000000000000..44d232a24b1bc2 --- /dev/null +++ b/rpc/src/rpc/account_resolver.rs @@ -0,0 +1,15 @@ +use { + solana_runtime::bank::Bank, + solana_sdk::{account::AccountSharedData, pubkey::Pubkey}, + std::collections::HashMap, +}; + +pub(crate) fn get_account_from_overwrites_or_bank( + pubkey: &Pubkey, + bank: &Bank, + overwrite_accounts: Option<&HashMap>, +) -> Option { + overwrite_accounts + .and_then(|accounts| accounts.get(pubkey).cloned()) + .or_else(|| bank.get_account(pubkey)) +} diff --git a/rpc/src/rpc_subscriptions.rs b/rpc/src/rpc_subscriptions.rs index 04f551bfe0b9ff..7910e539fad46f 100644 --- a/rpc/src/rpc_subscriptions.rs +++ b/rpc/src/rpc_subscriptions.rs @@ -383,7 +383,7 @@ fn filter_account_result( if is_known_spl_token_id(account.owner()) && params.encoding == UiAccountEncoding::JsonParsed { - get_parsed_token_account(&bank, ¶ms.pubkey, account) + get_parsed_token_account(&bank, ¶ms.pubkey, account, None) } else { UiAccount::encode(¶ms.pubkey, &account, params.encoding, None, None) } From 7e18276b39a5ff71377efb321a62a988b27e2816 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 20 Jan 2024 09:53:28 +0900 Subject: [PATCH 150/213] v1.17: [zk-token-sdk] Restrict Edwards and Ristretto multiscalar multiplication vector length to at most 512 (backport of #34763) (#34849) * [zk-token-sdk] Restrict Edwards and Ristretto multiscalar multiplication vector length to at most 512 (#34763) * restrict curve25519 multiscalar multiplication vector length to 512 * add syscall tests for msm vector length * add new feature gate `curve25519_restrict_msm_length` * update tests for feature new gate * Update programs/bpf_loader/src/syscalls/mod.rs Co-authored-by: Trent Nelson * remove length guard on the multisicalar mult lib function --------- Co-authored-by: Trent Nelson (cherry picked from commit 73218595c603cabde45cf8ddbc51e80e70e60e38) # Conflicts: # sdk/src/feature_set.rs * resolve conflict --------- Co-authored-by: samkim-crypto --- programs/bpf_loader/src/syscalls/mod.rs | 127 ++++++++++++++++++++++++ sdk/src/feature_set.rs | 5 + 2 files changed, 132 insertions(+) diff --git a/programs/bpf_loader/src/syscalls/mod.rs b/programs/bpf_loader/src/syscalls/mod.rs index fa7d99cabe3757..6346b4919b97a3 100644 --- a/programs/bpf_loader/src/syscalls/mod.rs +++ b/programs/bpf_loader/src/syscalls/mod.rs @@ -1171,6 +1171,17 @@ declare_builtin_function!( use solana_zk_token_sdk::curve25519::{ curve_syscall_traits::*, edwards, ristretto, scalar, }; + + let restrict_msm_length = invoke_context + .feature_set + .is_active(&feature_set::curve25519_restrict_msm_length::id()); + #[allow(clippy::collapsible_if)] + if restrict_msm_length { + if points_len > 512 { + return Err(Box::new(SyscallError::InvalidLength)); + } + } + match curve_id { CURVE25519_EDWARDS => { let cost = invoke_context @@ -3211,6 +3222,122 @@ mod tests { assert_eq!(expected_product, result_point); } + #[test] + fn test_syscall_multiscalar_multiplication_maximum_length_exceeded() { + use solana_zk_token_sdk::curve25519::curve_syscall_traits::{ + CURVE25519_EDWARDS, CURVE25519_RISTRETTO, + }; + + let config = Config::default(); + prepare_mockup!(invoke_context, program_id, bpf_loader::id()); + + let scalar: [u8; 32] = [ + 254, 198, 23, 138, 67, 243, 184, 110, 236, 115, 236, 205, 205, 215, 79, 114, 45, 250, + 78, 137, 3, 107, 136, 237, 49, 126, 117, 223, 37, 191, 88, 6, + ]; + let scalars = [scalar; 513]; + let scalars_va = 0x100000000; + + let edwards_point: [u8; 32] = [ + 252, 31, 230, 46, 173, 95, 144, 148, 158, 157, 63, 10, 8, 68, 58, 176, 142, 192, 168, + 53, 61, 105, 194, 166, 43, 56, 246, 236, 28, 146, 114, 133, + ]; + let edwards_points = [edwards_point; 513]; + let edwards_points_va = 0x200000000; + + let ristretto_point: [u8; 32] = [ + 130, 35, 97, 25, 18, 199, 33, 239, 85, 143, 119, 111, 49, 51, 224, 40, 167, 185, 240, + 179, 25, 194, 213, 41, 14, 155, 104, 18, 181, 197, 15, 112, + ]; + let ristretto_points = [ristretto_point; 513]; + let ristretto_points_va = 0x300000000; + + let mut result_point: [u8; 32] = [0; 32]; + let result_point_va = 0x400000000; + + let mut memory_mapping = MemoryMapping::new( + vec![ + MemoryRegion::new_readonly(bytes_of_slice(&scalars), scalars_va), + MemoryRegion::new_readonly(bytes_of_slice(&edwards_points), edwards_points_va), + MemoryRegion::new_readonly(bytes_of_slice(&ristretto_points), ristretto_points_va), + MemoryRegion::new_writable(bytes_of_slice_mut(&mut result_point), result_point_va), + ], + &config, + &SBPFVersion::V2, + ) + .unwrap(); + + // test Edwards + invoke_context.mock_set_remaining(500_000); + let result = SyscallCurveMultiscalarMultiplication::rust( + &mut invoke_context, + CURVE25519_EDWARDS, + scalars_va, + edwards_points_va, + 512, // below maximum vector length + result_point_va, + &mut memory_mapping, + ); + + assert_eq!(0, result.unwrap()); + let expected_product = [ + 20, 146, 226, 37, 22, 61, 86, 249, 208, 40, 38, 11, 126, 101, 10, 82, 81, 77, 88, 209, + 15, 76, 82, 251, 180, 133, 84, 243, 162, 0, 11, 145, + ]; + assert_eq!(expected_product, result_point); + + invoke_context.mock_set_remaining(500_000); + let result = SyscallCurveMultiscalarMultiplication::rust( + &mut invoke_context, + CURVE25519_EDWARDS, + scalars_va, + edwards_points_va, + 513, // above maximum vector length + result_point_va, + &mut memory_mapping, + ) + .unwrap_err() + .downcast::() + .unwrap(); + + assert_eq!(*result, SyscallError::InvalidLength); + + // test Ristretto + invoke_context.mock_set_remaining(500_000); + let result = SyscallCurveMultiscalarMultiplication::rust( + &mut invoke_context, + CURVE25519_RISTRETTO, + scalars_va, + ristretto_points_va, + 512, // below maximum vector length + result_point_va, + &mut memory_mapping, + ); + + assert_eq!(0, result.unwrap()); + let expected_product = [ + 146, 224, 127, 193, 252, 64, 196, 181, 246, 104, 27, 116, 183, 52, 200, 239, 2, 108, + 21, 27, 97, 44, 95, 65, 26, 218, 223, 39, 197, 132, 51, 49, + ]; + assert_eq!(expected_product, result_point); + + invoke_context.mock_set_remaining(500_000); + let result = SyscallCurveMultiscalarMultiplication::rust( + &mut invoke_context, + CURVE25519_RISTRETTO, + scalars_va, + ristretto_points_va, + 513, // above maximum vector length + result_point_va, + &mut memory_mapping, + ) + .unwrap_err() + .downcast::() + .unwrap(); + + assert_eq!(*result, SyscallError::InvalidLength); + } + fn create_filled_type(zero_init: bool) -> T { let mut val = T::default(); let p = &mut val as *mut _ as *mut u8; diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 48dc7da2448d69..d779f02fa41c9f 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -146,6 +146,10 @@ pub mod curve25519_syscall_enabled { solana_sdk::declare_id!("7rcw5UtqgDTBBv2EcynNfYckgdAaH1MAsCjKgXMkN7Ri"); } +pub mod curve25519_restrict_msm_length { + solana_sdk::declare_id!("eca6zf6JJRjQsYYPkBHF3N32MTzur4n2WL4QiiacPCL"); +} + pub mod versioned_tx_message_enabled { solana_sdk::declare_id!("3KZZ6Ks1885aGBQ45fwRcPXVBCtzUvxhUTkwKMR41Tca"); } @@ -920,6 +924,7 @@ lazy_static! { (drop_legacy_shreds::id(), "drops legacy shreds #34328"), (consume_blockstore_duplicate_proofs::id(), "consume duplicate proofs from blockstore in consensus #34372"), (index_erasure_conflict_duplicate_proofs::id(), "generate duplicate proofs for index and erasure conflicts #34360"), + (curve25519_restrict_msm_length::id(), "restrict curve25519 multiscalar multiplication vector lengths #34763"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() From 27a438007568eae350ea83432727f347d1aaecdc Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 20:46:15 -0800 Subject: [PATCH 151/213] v1.17: geyser: allow custom name in config file (backport of #33550) (#34669) * geyser: allow custom name in config file (#33550) Allow loading the plugin name from the json config file as opposed to use plugin.name which is called before config file is passed to it. Allowing different plugins using the same executable to use different names. (cherry picked from commit c82fc6c98e050f62974bb2158f93269706e83deb) # Conflicts: # geyser-plugin-manager/src/geyser_plugin_manager.rs * Fixed merge conflicts --------- Co-authored-by: Kirill Fomichev Co-authored-by: Lijun Wang <83639177+lijunwangs@users.noreply.github.com> --- .../src/geyser_plugin_manager.rs | 58 ++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/geyser-plugin-manager/src/geyser_plugin_manager.rs b/geyser-plugin-manager/src/geyser_plugin_manager.rs index 92180d1991b56e..c5da56859e2b36 100644 --- a/geyser-plugin-manager/src/geyser_plugin_manager.rs +++ b/geyser-plugin-manager/src/geyser_plugin_manager.rs @@ -4,12 +4,48 @@ use { libloading::Library, log::*, solana_geyser_plugin_interface::geyser_plugin_interface::GeyserPlugin, - std::path::Path, + std::{ + ops::{Deref, DerefMut}, + path::Path, + }, }; +#[derive(Debug)] +pub struct LoadedGeyserPlugin { + name: String, + plugin: Box, +} + +impl LoadedGeyserPlugin { + pub fn new(plugin: Box, name: Option) -> Self { + Self { + name: name.unwrap_or_else(|| plugin.name().to_owned()), + plugin, + } + } + + pub fn name(&self) -> &str { + &self.name + } +} + +impl Deref for LoadedGeyserPlugin { + type Target = Box; + + fn deref(&self) -> &Self::Target { + &self.plugin + } +} + +impl DerefMut for LoadedGeyserPlugin { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.plugin + } +} + #[derive(Default, Debug)] pub struct GeyserPluginManager { - pub plugins: Vec>, + pub plugins: Vec, libs: Vec, } @@ -280,7 +316,7 @@ pub enum GeyserPluginManagerError { #[cfg(not(test))] pub(crate) fn load_plugin_from_config( geyser_plugin_config_file: &Path, -) -> Result<(Box, Library, &str), GeyserPluginManagerError> { +) -> Result<(LoadedGeyserPlugin, Library, &str), GeyserPluginManagerError> { use std::{fs::File, io::Read, path::PathBuf}; type PluginConstructor = unsafe fn() -> *mut dyn GeyserPlugin; use libloading::Symbol; @@ -323,6 +359,8 @@ pub(crate) fn load_plugin_from_config( libpath = config_dir.join(libpath); } + let plugin_name = result["name"].as_str().map(|s| s.to_owned()); + let config_file = geyser_plugin_config_file .as_os_str() .to_str() @@ -337,7 +375,11 @@ pub(crate) fn load_plugin_from_config( let plugin_raw = constructor(); (Box::from_raw(plugin_raw), lib) }; - Ok((plugin, lib, config_file)) + Ok(( + LoadedGeyserPlugin::new(plugin, plugin_name), + lib, + config_file, + )) } #[cfg(test)] @@ -353,7 +395,7 @@ const TESTPLUGIN2_CONFIG: &str = "TESTPLUGIN2_CONFIG"; #[cfg(test)] pub(crate) fn load_plugin_from_config( geyser_plugin_config_file: &Path, -) -> Result<(Box, Library, &str), GeyserPluginManagerError> { +) -> Result<(LoadedGeyserPlugin, Library, &str), GeyserPluginManagerError> { if geyser_plugin_config_file.ends_with(TESTPLUGIN_CONFIG) { Ok(tests::dummy_plugin_and_library( tests::TestPlugin, @@ -375,7 +417,7 @@ pub(crate) fn load_plugin_from_config( mod tests { use { crate::geyser_plugin_manager::{ - GeyserPluginManager, TESTPLUGIN2_CONFIG, TESTPLUGIN_CONFIG, + GeyserPluginManager, LoadedGeyserPlugin, TESTPLUGIN2_CONFIG, TESTPLUGIN_CONFIG, }, libloading::Library, solana_geyser_plugin_interface::geyser_plugin_interface::GeyserPlugin, @@ -385,9 +427,9 @@ mod tests { pub(super) fn dummy_plugin_and_library( plugin: P, config_path: &'static str, - ) -> (Box, Library, &'static str) { + ) -> (LoadedGeyserPlugin, Library, &'static str) { ( - Box::new(plugin), + LoadedGeyserPlugin::new(Box::new(plugin), None), Library::from(libloading::os::unix::Library::this()), config_path, ) From 3261de4cd68e0360e855031b157acbe65f408733 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sun, 21 Jan 2024 09:24:54 +0800 Subject: [PATCH 152/213] v1.17: Fix versioned message json deserialization (backport of #34808) (#34824) --- sdk/program/src/message/versions/mod.rs | 54 ++++++++++++++++--------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/sdk/program/src/message/versions/mod.rs b/sdk/program/src/message/versions/mod.rs index ccef565fd51022..301490a2aa7e7d 100644 --- a/sdk/program/src/message/versions/mod.rs +++ b/sdk/program/src/message/versions/mod.rs @@ -8,7 +8,7 @@ use { short_vec, }, serde::{ - de::{self, Deserializer, SeqAccess, Visitor}, + de::{self, Deserializer, SeqAccess, Unexpected, Visitor}, ser::{SerializeTuple, Serializer}, Deserialize, Serialize, }, @@ -198,7 +198,16 @@ impl<'de> Deserialize<'de> for MessagePrefix { formatter.write_str("message prefix byte") } - fn visit_u8(self, byte: u8) -> Result { + // Serde's integer visitors bubble up to u64 so check the prefix + // with this function instead of visit_u8. This approach is + // necessary because serde_json directly calls visit_u64 for + // unsigned integers. + fn visit_u64(self, value: u64) -> Result { + if value > u8::MAX as u64 { + Err(de::Error::invalid_type(Unexpected::Unsigned(value), &self))?; + } + + let byte = value as u8; if byte & MESSAGE_VERSION_PREFIX != 0 { Ok(MessagePrefix::Versioned(byte & !MESSAGE_VERSION_PREFIX)) } else { @@ -331,26 +340,32 @@ mod tests { let mut message = LegacyMessage::new(&instructions, Some(&id1)); message.recent_blockhash = Hash::new_unique(); + let wrapped_message = VersionedMessage::Legacy(message.clone()); - let bytes1 = bincode::serialize(&message).unwrap(); - let bytes2 = bincode::serialize(&VersionedMessage::Legacy(message.clone())).unwrap(); + // bincode + { + let bytes = bincode::serialize(&message).unwrap(); + assert_eq!(bytes, bincode::serialize(&wrapped_message).unwrap()); - assert_eq!(bytes1, bytes2); + let message_from_bytes: LegacyMessage = bincode::deserialize(&bytes).unwrap(); + let wrapped_message_from_bytes: VersionedMessage = + bincode::deserialize(&bytes).unwrap(); - let message1: LegacyMessage = bincode::deserialize(&bytes1).unwrap(); - let message2: VersionedMessage = bincode::deserialize(&bytes2).unwrap(); + assert_eq!(message, message_from_bytes); + assert_eq!(wrapped_message, wrapped_message_from_bytes); + } - if let VersionedMessage::Legacy(message2) = message2 { - assert_eq!(message, message1); - assert_eq!(message1, message2); - } else { - panic!("should deserialize to legacy message"); + // serde_json + { + let string = serde_json::to_string(&message).unwrap(); + let message_from_string: LegacyMessage = serde_json::from_str(&string).unwrap(); + assert_eq!(message, message_from_string); } } #[test] fn test_versioned_message_serialization() { - let message = v0::Message { + let message = VersionedMessage::V0(v0::Message { header: MessageHeader { num_required_signatures: 1, num_readonly_signed_accounts: 0, @@ -375,15 +390,14 @@ mod tests { accounts: vec![0, 2, 3, 4], data: vec![], }], - }; + }); - let bytes = bincode::serialize(&VersionedMessage::V0(message.clone())).unwrap(); + let bytes = bincode::serialize(&message).unwrap(); let message_from_bytes: VersionedMessage = bincode::deserialize(&bytes).unwrap(); + assert_eq!(message, message_from_bytes); - if let VersionedMessage::V0(message_from_bytes) = message_from_bytes { - assert_eq!(message, message_from_bytes); - } else { - panic!("should deserialize to versioned message"); - } + let string = serde_json::to_string(&message).unwrap(); + let message_from_string: VersionedMessage = serde_json::from_str(&string).unwrap(); + assert_eq!(message, message_from_string); } } From 6c8a23a0f343773054b53cefec9f2ddbb048e354 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sun, 21 Jan 2024 08:57:59 -0600 Subject: [PATCH 153/213] Update version to v1.17.18 (#34866) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 81e3b0d967535f..955e384023d90f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.17" +version = "1.17.18" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.17" +version = "1.17.18" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.17" +version = "1.17.18" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.17" +version = "1.17.18" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.17" +version = "1.17.18" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.17" +version = "1.17.18" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.17" +version = "1.17.18" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.17" +version = "1.17.18" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.17" +version = "1.17.18" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.17" +version = "1.17.18" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.17" +version = "1.17.18" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.17" +version = "1.17.18" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.17" +version = "1.17.18" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.17" +version = "1.17.18" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.17" +version = "1.17.18" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.17" +version = "1.17.18" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.17" +version = "1.17.18" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.17" +version = "1.17.18" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.17" +version = "1.17.18" [[package]] name = "solana-merkle-root-bench" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.17" +version = "1.17.18" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.17" +version = "1.17.18" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.17" +version = "1.17.18" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.17" +version = "1.17.18" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.17" +version = "1.17.18" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.17" +version = "1.17.18" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.17" +version = "1.17.18" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.17" +version = "1.17.18" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.17" +version = "1.17.18" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.17" +version = "1.17.18" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.17" +version = "1.17.18" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.17" +version = "1.17.18" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.17" +version = "1.17.18" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.17" +version = "1.17.18" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.17" +version = "1.17.18" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 602225ef49b8f0..08b2bc75391a83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.17" +version = "1.17.18" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.17" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.17" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.17" } -solana-banks-client = { path = "banks-client", version = "=1.17.17" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.17" } -solana-banks-server = { path = "banks-server", version = "=1.17.17" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.17" } -solana-bloom = { path = "bloom", version = "=1.17.17" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.17" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.17" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.17", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.17" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.17" } -solana-cli = { path = "cli", version = "=1.17.17" } -solana-cli-config = { path = "cli-config", version = "=1.17.17" } -solana-cli-output = { path = "cli-output", version = "=1.17.17" } -solana-client = { path = "client", version = "=1.17.17" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.17" } -solana-config-program = { path = "programs/config", version = "=1.17.17" } -solana-core = { path = "core", version = "=1.17.17" } -solana-cost-model = { path = "cost-model", version = "=1.17.17" } -solana-download-utils = { path = "download-utils", version = "=1.17.17" } -solana-entry = { path = "entry", version = "=1.17.17" } -solana-faucet = { path = "faucet", version = "=1.17.17" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.17" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.17" } -solana-genesis = { path = "genesis", version = "=1.17.17" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.17" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.17" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.17" } -solana-gossip = { path = "gossip", version = "=1.17.17" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.17" } -solana-ledger = { path = "ledger", version = "=1.17.17" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.17" } -solana-logger = { path = "logger", version = "=1.17.17" } -solana-measure = { path = "measure", version = "=1.17.17" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.17" } -solana-metrics = { path = "metrics", version = "=1.17.17" } -solana-net-utils = { path = "net-utils", version = "=1.17.17" } -solana-notifier = { path = "notifier", version = "=1.17.17" } -solana-perf = { path = "perf", version = "=1.17.17" } -solana-poh = { path = "poh", version = "=1.17.17" } -solana-program = { path = "sdk/program", version = "=1.17.17" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.17" } -solana-program-test = { path = "program-test", version = "=1.17.17" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.17" } -solana-quic-client = { path = "quic-client", version = "=1.17.17" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.17" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.17", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.17" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.17", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.17" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.17" } -solana-runtime = { path = "runtime", version = "=1.17.17" } -solana-sdk = { path = "sdk", version = "=1.17.17" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.17" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.17" } -solana-stake-program = { path = "programs/stake", version = "=1.17.17" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.17" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.17" } -solana-streamer = { path = "streamer", version = "=1.17.17" } -solana-system-program = { path = "programs/system", version = "=1.17.17" } -solana-test-validator = { path = "test-validator", version = "=1.17.17" } -solana-thin-client = { path = "thin-client", version = "=1.17.17" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.17", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.17" } -solana-turbine = { path = "turbine", version = "=1.17.17" } -solana-udp-client = { path = "udp-client", version = "=1.17.17" } -solana-version = { path = "version", version = "=1.17.17" } -solana-vote = { path = "vote", version = "=1.17.17" } -solana-vote-program = { path = "programs/vote", version = "=1.17.17" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.17" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.17" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.17" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.18" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.18" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.18" } +solana-banks-client = { path = "banks-client", version = "=1.17.18" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.18" } +solana-banks-server = { path = "banks-server", version = "=1.17.18" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.18" } +solana-bloom = { path = "bloom", version = "=1.17.18" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.18" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.18" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.18", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.18" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.18" } +solana-cli = { path = "cli", version = "=1.17.18" } +solana-cli-config = { path = "cli-config", version = "=1.17.18" } +solana-cli-output = { path = "cli-output", version = "=1.17.18" } +solana-client = { path = "client", version = "=1.17.18" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.18" } +solana-config-program = { path = "programs/config", version = "=1.17.18" } +solana-core = { path = "core", version = "=1.17.18" } +solana-cost-model = { path = "cost-model", version = "=1.17.18" } +solana-download-utils = { path = "download-utils", version = "=1.17.18" } +solana-entry = { path = "entry", version = "=1.17.18" } +solana-faucet = { path = "faucet", version = "=1.17.18" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.18" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.18" } +solana-genesis = { path = "genesis", version = "=1.17.18" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.18" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.18" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.18" } +solana-gossip = { path = "gossip", version = "=1.17.18" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.18" } +solana-ledger = { path = "ledger", version = "=1.17.18" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.18" } +solana-logger = { path = "logger", version = "=1.17.18" } +solana-measure = { path = "measure", version = "=1.17.18" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.18" } +solana-metrics = { path = "metrics", version = "=1.17.18" } +solana-net-utils = { path = "net-utils", version = "=1.17.18" } +solana-notifier = { path = "notifier", version = "=1.17.18" } +solana-perf = { path = "perf", version = "=1.17.18" } +solana-poh = { path = "poh", version = "=1.17.18" } +solana-program = { path = "sdk/program", version = "=1.17.18" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.18" } +solana-program-test = { path = "program-test", version = "=1.17.18" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.18" } +solana-quic-client = { path = "quic-client", version = "=1.17.18" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.18" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.18", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.18" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.18", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.18" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.18" } +solana-runtime = { path = "runtime", version = "=1.17.18" } +solana-sdk = { path = "sdk", version = "=1.17.18" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.18" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.18" } +solana-stake-program = { path = "programs/stake", version = "=1.17.18" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.18" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.18" } +solana-streamer = { path = "streamer", version = "=1.17.18" } +solana-system-program = { path = "programs/system", version = "=1.17.18" } +solana-test-validator = { path = "test-validator", version = "=1.17.18" } +solana-thin-client = { path = "thin-client", version = "=1.17.18" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.18", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.18" } +solana-turbine = { path = "turbine", version = "=1.17.18" } +solana-udp-client = { path = "udp-client", version = "=1.17.18" } +solana-version = { path = "version", version = "=1.17.18" } +solana-vote = { path = "vote", version = "=1.17.18" } +solana-vote-program = { path = "programs/vote", version = "=1.17.18" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.18" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.18" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.18" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 47985502019e26..df2f5accc1bc2c 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.17" +version = "1.17.18" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.17" +version = "1.17.18" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.17" +version = "1.17.18" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.17" +version = "1.17.18" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.17" +version = "1.17.18" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.17" +version = "1.17.18" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.17" +version = "1.17.18" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.17" +version = "1.17.18" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.17" +version = "1.17.18" dependencies = [ "ahash 0.8.5", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.17" +version = "1.17.18" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.17" +version = "1.17.18" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.17" +version = "1.17.18" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.17" +version = "1.17.18" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.17" +version = "1.17.18" dependencies = [ "ahash 0.8.5", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.17" +version = "1.17.18" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.17" +version = "1.17.18" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.17" +version = "1.17.18" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.17" +version = "1.17.18" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.17" +version = "1.17.18" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.17" +version = "1.17.18" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.17" +version = "1.17.18" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.17" +version = "1.17.18" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.17" +version = "1.17.18" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.17" +version = "1.17.18" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.17" +version = "1.17.18" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.17" +version = "1.17.18" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.17" +version = "1.17.18" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.17" +version = "1.17.18" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.17" +version = "1.17.18" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.17" +version = "1.17.18" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.17" +version = "1.17.18" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.17" +version = "1.17.18" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.17" +version = "1.17.18" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.17" +version = "1.17.18" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.17" +version = "1.17.18" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.17" +version = "1.17.18" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.17" +version = "1.17.18" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.17" +version = "1.17.18" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.17" +version = "1.17.18" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.17" +version = "1.17.18" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.17" +version = "1.17.18" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.17" +version = "1.17.18" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.17" +version = "1.17.18" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index ccc1afc205a00d..d2213a27c02a09 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.17" +version = "1.17.18" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.17" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.17" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.17" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.17" } -solana-ledger = { path = "../../ledger", version = "=1.17.17" } -solana-logger = { path = "../../logger", version = "=1.17.17" } -solana-measure = { path = "../../measure", version = "=1.17.17" } -solana-program = { path = "../../sdk/program", version = "=1.17.17" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.17" } -solana-program-test = { path = "../../program-test", version = "=1.17.17" } -solana-runtime = { path = "../../runtime", version = "=1.17.17" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.17" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.17" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.17", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.17" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.17" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.17" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.17", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.17" } -solana-sdk = { path = "../../sdk", version = "=1.17.17" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.17" } -solana-validator = { path = "../../validator", version = "=1.17.17" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.17" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.18" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.18" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.18" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.18" } +solana-ledger = { path = "../../ledger", version = "=1.17.18" } +solana-logger = { path = "../../logger", version = "=1.17.18" } +solana-measure = { path = "../../measure", version = "=1.17.18" } +solana-program = { path = "../../sdk/program", version = "=1.17.18" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.18" } +solana-program-test = { path = "../../program-test", version = "=1.17.18" } +solana-runtime = { path = "../../runtime", version = "=1.17.18" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.18" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.18" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.18", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.18" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.18" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.18" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.18", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.18" } +solana-sdk = { path = "../../sdk", version = "=1.17.18" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.18" } +solana-validator = { path = "../../validator", version = "=1.17.18" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.18" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index f3fe06be5e284f..3bd77e93c18294 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.17" +version = "1.17.18" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.17" } +solana-program = { path = "../../../../program", version = "=1.17.18" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 3b4370f6f55285..9aba825b1af541 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.17" +version = "1.17.18" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.17" } +solana-program = { path = "../../../../program", version = "=1.17.18" } [lib] crate-type = ["cdylib"] From cdda274e924a0c9c81ba98377751e3491bcb43b2 Mon Sep 17 00:00:00 2001 From: Yihau Chen Date: Wed, 24 Jan 2024 06:26:52 +0800 Subject: [PATCH 154/213] v1.17: bump shlex to 1.3.0 (#34880) --- Cargo.lock | 4 ++-- programs/sbf/Cargo.lock | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 955e384023d90f..0a8782670dfaac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4983,9 +4983,9 @@ checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" [[package]] name = "shlex" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index df2f5accc1bc2c..bc81a6fdca844b 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4332,9 +4332,9 @@ checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" [[package]] name = "shlex" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" From 74b083059cd3da5054b0bcddf6e0aeac13f94772 Mon Sep 17 00:00:00 2001 From: Jon C Date: Wed, 24 Jan 2024 01:34:49 +0100 Subject: [PATCH 155/213] v1.17: Pin spl-token-cli to 3.3.0 (#34920) --- scripts/spl-token-cli-version.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/spl-token-cli-version.sh b/scripts/spl-token-cli-version.sh index 82559c5bc4bbb6..cbee878c44342f 100644 --- a/scripts/spl-token-cli-version.sh +++ b/scripts/spl-token-cli-version.sh @@ -1,5 +1,5 @@ # populate this on the stable branch -splTokenCliVersion= +splTokenCliVersion=3.3.0 maybeSplTokenCliVersionArg= if [[ -n "$splTokenCliVersion" ]]; then From de8415ccf56ff53d69a0114aa1f4cdd6927a1f35 Mon Sep 17 00:00:00 2001 From: Pankaj Garg Date: Tue, 23 Jan 2024 18:14:30 -0800 Subject: [PATCH 156/213] Allow some minimum number of streams for a staked connection - v1.17 (#34894) Allow some minimum number of streams for a staked connection --- streamer/src/nonblocking/quic.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/streamer/src/nonblocking/quic.rs b/streamer/src/nonblocking/quic.rs index 951ec6cb317fcd..04b2e66e8f319e 100644 --- a/streamer/src/nonblocking/quic.rs +++ b/streamer/src/nonblocking/quic.rs @@ -695,9 +695,13 @@ fn max_streams_for_connection_in_100ms( .apply_to(MAX_STREAMS_PER_100MS) .saturating_div(MAX_UNSTAKED_CONNECTIONS as u64) } else { + const MIN_STAKED_STREAMS: u64 = 8; let max_total_staked_streams: u64 = MAX_STREAMS_PER_100MS - Percentage::from(MAX_UNSTAKED_STREAMS_PERCENT).apply_to(MAX_STREAMS_PER_100MS); - ((max_total_staked_streams as f64 / total_stake as f64) * stake as f64) as u64 + std::cmp::max( + MIN_STAKED_STREAMS, + ((max_total_staked_streams as f64 / total_stake as f64) * stake as f64) as u64, + ) } } @@ -2063,5 +2067,12 @@ pub mod test { max_streams_for_connection_in_100ms(ConnectionPeerType::Staked, 1000, 10000), 4000 ); + + // max staked streams = 50K packets per ms * 80% = 40K + // minimum staked streams. + assert_eq!( + max_streams_for_connection_in_100ms(ConnectionPeerType::Staked, 1, 50000), + 8 + ); } } From dd28fd52a61c96601b0ede68328d9a9a0be2374f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 16:52:47 -0500 Subject: [PATCH 157/213] v1.17: Cleans up stale accounts hash cache files (backport of #34933) (#34937) * Cleans up stale accounts hash cache files (#34933) (cherry picked from commit 5898b9a2f70c6cc7878510f5da0d70d4602a5f30) # Conflicts: # accounts-db/src/cache_hash_data.rs * resolves merge conflicts --------- Co-authored-by: Brooks --- accounts-db/src/accounts_db.rs | 16 +++-- accounts-db/src/cache_hash_data.rs | 110 ++++++++++++++++++++++++++--- 2 files changed, 110 insertions(+), 16 deletions(-) diff --git a/accounts-db/src/accounts_db.rs b/accounts-db/src/accounts_db.rs index 9750ebd78d09d8..e33176a6e74393 100644 --- a/accounts-db/src/accounts_db.rs +++ b/accounts-db/src/accounts_db.rs @@ -7637,6 +7637,7 @@ impl AccountsDb { config: &CalcAccountsHashConfig<'_>, kind: CalcAccountsHashKind, slot: Slot, + storages_start_slot: Slot, ) -> CacheHashData { let accounts_hash_cache_path = if !config.store_detailed_debug_info_on_failure { accounts_hash_cache_path @@ -7648,7 +7649,10 @@ impl AccountsDb { _ = std::fs::remove_dir_all(&failed_dir); failed_dir }; - CacheHashData::new(accounts_hash_cache_path, kind == CalcAccountsHashKind::Full) + CacheHashData::new( + accounts_hash_cache_path, + (kind == CalcAccountsHashKind::Incremental).then_some(storages_start_slot), + ) } // modeled after calculate_accounts_delta_hash @@ -7707,7 +7711,8 @@ impl AccountsDb { ) -> Result<(AccountsHashKind, u64), AccountsHashVerificationError> { let total_time = Measure::start(""); let _guard = self.active_stats.activate(ActiveStatItem::Hash); - stats.oldest_root = storages.range().start; + let storages_start_slot = storages.range().start; + stats.oldest_root = storages_start_slot; self.mark_old_slots_as_dirty(storages, config.epoch_schedule.slots_per_epoch, &mut stats); @@ -7723,7 +7728,8 @@ impl AccountsDb { accounts_hash_cache_path, config, kind, - slot + slot, + storages_start_slot, )); stats.cache_hash_data_us += cache_hash_data_us; @@ -9963,7 +9969,7 @@ pub mod tests { let temp_dir = TempDir::new().unwrap(); let accounts_hash_cache_path = temp_dir.path().to_path_buf(); self.scan_snapshot_stores_with_cache( - &CacheHashData::new(accounts_hash_cache_path, true), + &CacheHashData::new(accounts_hash_cache_path, None), storage, stats, bins, @@ -11083,7 +11089,7 @@ pub mod tests { }; let result = accounts_db.scan_account_storage_no_bank( - &CacheHashData::new(accounts_hash_cache_path, true), + &CacheHashData::new(accounts_hash_cache_path, None), &CalcAccountsHashConfig::default(), &get_storage_refs(&[storage]), test_scan, diff --git a/accounts-db/src/cache_hash_data.rs b/accounts-db/src/cache_hash_data.rs index 630d650b36f2b9..ce5ff5f3aa6180 100644 --- a/accounts-db/src/cache_hash_data.rs +++ b/accounts-db/src/cache_hash_data.rs @@ -6,6 +6,7 @@ use { bytemuck::{Pod, Zeroable}, memmap2::MmapMut, solana_measure::measure::Measure, + solana_sdk::clock::Slot, std::{ collections::HashSet, fs::{self, remove_file, File, OpenOptions}, @@ -192,24 +193,20 @@ impl CacheHashDataFile { pub(crate) struct CacheHashData { cache_dir: PathBuf, pre_existing_cache_files: Arc>>, - should_delete_old_cache_files_on_drop: bool, + /// Decides which old cache files to delete. See `delete_old_cache_files()` for more info. + storages_start_slot: Option, pub stats: Arc, } impl Drop for CacheHashData { fn drop(&mut self) { - if self.should_delete_old_cache_files_on_drop { - self.delete_old_cache_files(); - } + self.delete_old_cache_files(); self.stats.report(); } } impl CacheHashData { - pub(crate) fn new( - cache_dir: PathBuf, - should_delete_old_cache_files_on_drop: bool, - ) -> CacheHashData { + pub(crate) fn new(cache_dir: PathBuf, storages_start_slot: Option) -> CacheHashData { std::fs::create_dir_all(&cache_dir).unwrap_or_else(|err| { panic!("error creating cache dir {}: {err}", cache_dir.display()) }); @@ -217,15 +214,38 @@ impl CacheHashData { let result = CacheHashData { cache_dir, pre_existing_cache_files: Arc::new(Mutex::new(HashSet::default())), - should_delete_old_cache_files_on_drop, + storages_start_slot, stats: Arc::default(), }; result.get_cache_files(); result } + + /// delete all pre-existing files that will not be used fn delete_old_cache_files(&self) { - let old_cache_files = std::mem::take(&mut *self.pre_existing_cache_files.lock().unwrap()); + // all the renaming files in `pre_existing_cache_files` were *not* used for this + // accounts hash calculation + let mut old_cache_files = + std::mem::take(&mut *self.pre_existing_cache_files.lock().unwrap()); + + // If `storages_start_slot` is None, we're doing a full accounts hash calculation, and thus + // all unused cache files can be deleted. + // If `storages_start_slot` is Some, we're doing an incremental accounts hash calculation, + // and we only want to delete the unused cache files *that IAH considered*. + if let Some(storages_start_slot) = self.storages_start_slot { + old_cache_files.retain(|old_cache_file| { + let Some(parsed_filename) = parse_filename(old_cache_file) else { + // if parsing the cache filename fails, we *do* want to delete it + return true; + }; + + // if the old cache file is in the incremental accounts hash calculation range, + // then delete it + parsed_filename.slot_range_start >= storages_start_slot + }); + } + if !old_cache_files.is_empty() { self.stats .unused_cache_files @@ -356,6 +376,39 @@ impl CacheHashData { } } +/// The values of each part of a cache hash data filename +#[derive(Debug)] +pub struct ParsedFilename { + pub slot_range_start: Slot, + pub slot_range_end: Slot, + pub bin_range_start: u64, + pub bin_range_end: u64, + pub hash: u64, +} + +/// Parses a cache hash data filename into its parts +/// +/// Returns None if the filename is invalid +fn parse_filename(cache_filename: impl AsRef) -> Option { + let filename = cache_filename.as_ref().to_string_lossy().to_string(); + let parts: Vec<_> = filename.split('.').collect(); // The parts are separated by a `.` + if parts.len() != 5 { + return None; + } + let slot_range_start = parts.first()?.parse().ok()?; + let slot_range_end = parts.get(1)?.parse().ok()?; + let bin_range_start = parts.get(2)?.parse().ok()?; + let bin_range_end = parts.get(3)?.parse().ok()?; + let hash = u64::from_str_radix(parts.get(4)?, 16).ok()?; // the hash is in hex + Some(ParsedFilename { + slot_range_start, + slot_range_end, + bin_range_start, + bin_range_end, + hash, + }) +} + #[cfg(test)] mod tests { use {super::*, rand::Rng}; @@ -423,7 +476,7 @@ mod tests { data_this_pass.push(this_bin_data); } } - let cache = CacheHashData::new(cache_dir.clone(), true); + let cache = CacheHashData::new(cache_dir.clone(), None); let file_name = PathBuf::from("test"); cache.save(&file_name, &data_this_pass).unwrap(); cache.get_cache_files(); @@ -513,4 +566,39 @@ mod tests { ct, ) } + + #[test] + fn test_parse_filename() { + let good_filename = "123.456.0.65536.537d65697d9b2baa"; + let parsed_filename = parse_filename(good_filename).unwrap(); + assert_eq!(parsed_filename.slot_range_start, 123); + assert_eq!(parsed_filename.slot_range_end, 456); + assert_eq!(parsed_filename.bin_range_start, 0); + assert_eq!(parsed_filename.bin_range_end, 65536); + assert_eq!(parsed_filename.hash, 0x537d65697d9b2baa); + + let bad_filenames = [ + // bad separator + "123-456-0-65536.537d65697d9b2baa", + // bad values + "abc.456.0.65536.537d65697d9b2baa", + "123.xyz.0.65536.537d65697d9b2baa", + "123.456.?.65536.537d65697d9b2baa", + "123.456.0.@#$%^.537d65697d9b2baa", + "123.456.0.65536.base19shouldfail", + "123.456.0.65536.123456789012345678901234567890", + // missing values + "123.456.0.65536.", + "123.456.0.65536", + // extra junk + "123.456.0.65536.537d65697d9b2baa.42", + "123.456.0.65536.537d65697d9b2baa.", + "123.456.0.65536.537d65697d9b2baa/", + ".123.456.0.65536.537d65697d9b2baa", + "/123.456.0.65536.537d65697d9b2baa", + ]; + for bad_filename in bad_filenames { + assert!(parse_filename(bad_filename).is_none()); + } + } } From 11be41d60bfe3421564ec957c14a130e8a0ed817 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sat, 27 Jan 2024 02:00:15 -0600 Subject: [PATCH 158/213] Update version to v1.17.19 (#34986) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0a8782670dfaac..cbea066f3eea1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.18" +version = "1.17.19" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.18" +version = "1.17.19" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.18" +version = "1.17.19" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.18" +version = "1.17.19" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.18" +version = "1.17.19" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.18" +version = "1.17.19" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.18" +version = "1.17.19" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.18" +version = "1.17.19" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.18" +version = "1.17.19" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.18" +version = "1.17.19" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.18" +version = "1.17.19" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.18" +version = "1.17.19" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.18" +version = "1.17.19" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.18" +version = "1.17.19" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.18" +version = "1.17.19" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.18" +version = "1.17.19" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.18" +version = "1.17.19" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.18" +version = "1.17.19" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.18" +version = "1.17.19" [[package]] name = "solana-merkle-root-bench" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.18" +version = "1.17.19" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.18" +version = "1.17.19" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.18" +version = "1.17.19" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.18" +version = "1.17.19" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.18" +version = "1.17.19" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.18" +version = "1.17.19" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.18" +version = "1.17.19" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.18" +version = "1.17.19" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.18" +version = "1.17.19" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.18" +version = "1.17.19" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.18" +version = "1.17.19" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.18" +version = "1.17.19" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.18" +version = "1.17.19" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.18" +version = "1.17.19" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.18" +version = "1.17.19" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 08b2bc75391a83..939dd9dbc51f74 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.18" +version = "1.17.19" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.18" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.18" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.18" } -solana-banks-client = { path = "banks-client", version = "=1.17.18" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.18" } -solana-banks-server = { path = "banks-server", version = "=1.17.18" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.18" } -solana-bloom = { path = "bloom", version = "=1.17.18" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.18" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.18" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.18", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.18" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.18" } -solana-cli = { path = "cli", version = "=1.17.18" } -solana-cli-config = { path = "cli-config", version = "=1.17.18" } -solana-cli-output = { path = "cli-output", version = "=1.17.18" } -solana-client = { path = "client", version = "=1.17.18" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.18" } -solana-config-program = { path = "programs/config", version = "=1.17.18" } -solana-core = { path = "core", version = "=1.17.18" } -solana-cost-model = { path = "cost-model", version = "=1.17.18" } -solana-download-utils = { path = "download-utils", version = "=1.17.18" } -solana-entry = { path = "entry", version = "=1.17.18" } -solana-faucet = { path = "faucet", version = "=1.17.18" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.18" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.18" } -solana-genesis = { path = "genesis", version = "=1.17.18" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.18" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.18" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.18" } -solana-gossip = { path = "gossip", version = "=1.17.18" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.18" } -solana-ledger = { path = "ledger", version = "=1.17.18" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.18" } -solana-logger = { path = "logger", version = "=1.17.18" } -solana-measure = { path = "measure", version = "=1.17.18" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.18" } -solana-metrics = { path = "metrics", version = "=1.17.18" } -solana-net-utils = { path = "net-utils", version = "=1.17.18" } -solana-notifier = { path = "notifier", version = "=1.17.18" } -solana-perf = { path = "perf", version = "=1.17.18" } -solana-poh = { path = "poh", version = "=1.17.18" } -solana-program = { path = "sdk/program", version = "=1.17.18" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.18" } -solana-program-test = { path = "program-test", version = "=1.17.18" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.18" } -solana-quic-client = { path = "quic-client", version = "=1.17.18" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.18" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.18", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.18" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.18", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.18" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.18" } -solana-runtime = { path = "runtime", version = "=1.17.18" } -solana-sdk = { path = "sdk", version = "=1.17.18" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.18" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.18" } -solana-stake-program = { path = "programs/stake", version = "=1.17.18" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.18" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.18" } -solana-streamer = { path = "streamer", version = "=1.17.18" } -solana-system-program = { path = "programs/system", version = "=1.17.18" } -solana-test-validator = { path = "test-validator", version = "=1.17.18" } -solana-thin-client = { path = "thin-client", version = "=1.17.18" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.18", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.18" } -solana-turbine = { path = "turbine", version = "=1.17.18" } -solana-udp-client = { path = "udp-client", version = "=1.17.18" } -solana-version = { path = "version", version = "=1.17.18" } -solana-vote = { path = "vote", version = "=1.17.18" } -solana-vote-program = { path = "programs/vote", version = "=1.17.18" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.18" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.18" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.18" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.19" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.19" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.19" } +solana-banks-client = { path = "banks-client", version = "=1.17.19" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.19" } +solana-banks-server = { path = "banks-server", version = "=1.17.19" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.19" } +solana-bloom = { path = "bloom", version = "=1.17.19" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.19" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.19" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.19", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.19" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.19" } +solana-cli = { path = "cli", version = "=1.17.19" } +solana-cli-config = { path = "cli-config", version = "=1.17.19" } +solana-cli-output = { path = "cli-output", version = "=1.17.19" } +solana-client = { path = "client", version = "=1.17.19" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.19" } +solana-config-program = { path = "programs/config", version = "=1.17.19" } +solana-core = { path = "core", version = "=1.17.19" } +solana-cost-model = { path = "cost-model", version = "=1.17.19" } +solana-download-utils = { path = "download-utils", version = "=1.17.19" } +solana-entry = { path = "entry", version = "=1.17.19" } +solana-faucet = { path = "faucet", version = "=1.17.19" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.19" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.19" } +solana-genesis = { path = "genesis", version = "=1.17.19" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.19" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.19" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.19" } +solana-gossip = { path = "gossip", version = "=1.17.19" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.19" } +solana-ledger = { path = "ledger", version = "=1.17.19" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.19" } +solana-logger = { path = "logger", version = "=1.17.19" } +solana-measure = { path = "measure", version = "=1.17.19" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.19" } +solana-metrics = { path = "metrics", version = "=1.17.19" } +solana-net-utils = { path = "net-utils", version = "=1.17.19" } +solana-notifier = { path = "notifier", version = "=1.17.19" } +solana-perf = { path = "perf", version = "=1.17.19" } +solana-poh = { path = "poh", version = "=1.17.19" } +solana-program = { path = "sdk/program", version = "=1.17.19" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.19" } +solana-program-test = { path = "program-test", version = "=1.17.19" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.19" } +solana-quic-client = { path = "quic-client", version = "=1.17.19" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.19" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.19", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.19" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.19", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.19" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.19" } +solana-runtime = { path = "runtime", version = "=1.17.19" } +solana-sdk = { path = "sdk", version = "=1.17.19" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.19" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.19" } +solana-stake-program = { path = "programs/stake", version = "=1.17.19" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.19" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.19" } +solana-streamer = { path = "streamer", version = "=1.17.19" } +solana-system-program = { path = "programs/system", version = "=1.17.19" } +solana-test-validator = { path = "test-validator", version = "=1.17.19" } +solana-thin-client = { path = "thin-client", version = "=1.17.19" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.19", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.19" } +solana-turbine = { path = "turbine", version = "=1.17.19" } +solana-udp-client = { path = "udp-client", version = "=1.17.19" } +solana-version = { path = "version", version = "=1.17.19" } +solana-vote = { path = "vote", version = "=1.17.19" } +solana-vote-program = { path = "programs/vote", version = "=1.17.19" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.19" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.19" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.19" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index bc81a6fdca844b..ad699e828e963e 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.18" +version = "1.17.19" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.18" +version = "1.17.19" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.18" +version = "1.17.19" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.18" +version = "1.17.19" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.18" +version = "1.17.19" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.18" +version = "1.17.19" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.18" +version = "1.17.19" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.18" +version = "1.17.19" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.18" +version = "1.17.19" dependencies = [ "ahash 0.8.5", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.18" +version = "1.17.19" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.18" +version = "1.17.19" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.18" +version = "1.17.19" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.18" +version = "1.17.19" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.18" +version = "1.17.19" dependencies = [ "ahash 0.8.5", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.18" +version = "1.17.19" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.18" +version = "1.17.19" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.18" +version = "1.17.19" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.18" +version = "1.17.19" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.18" +version = "1.17.19" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.18" +version = "1.17.19" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.18" +version = "1.17.19" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.18" +version = "1.17.19" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.18" +version = "1.17.19" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.18" +version = "1.17.19" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.18" +version = "1.17.19" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.18" +version = "1.17.19" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.18" +version = "1.17.19" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.18" +version = "1.17.19" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.18" +version = "1.17.19" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.18" +version = "1.17.19" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.18" +version = "1.17.19" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.18" +version = "1.17.19" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.18" +version = "1.17.19" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.18" +version = "1.17.19" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.18" +version = "1.17.19" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.18" +version = "1.17.19" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.18" +version = "1.17.19" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.18" +version = "1.17.19" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.18" +version = "1.17.19" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.18" +version = "1.17.19" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.18" +version = "1.17.19" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.18" +version = "1.17.19" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.18" +version = "1.17.19" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index d2213a27c02a09..f56e0f87816358 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.18" +version = "1.17.19" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.18" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.18" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.18" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.18" } -solana-ledger = { path = "../../ledger", version = "=1.17.18" } -solana-logger = { path = "../../logger", version = "=1.17.18" } -solana-measure = { path = "../../measure", version = "=1.17.18" } -solana-program = { path = "../../sdk/program", version = "=1.17.18" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.18" } -solana-program-test = { path = "../../program-test", version = "=1.17.18" } -solana-runtime = { path = "../../runtime", version = "=1.17.18" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.18" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.18" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.18", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.18" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.18" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.18" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.18", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.18" } -solana-sdk = { path = "../../sdk", version = "=1.17.18" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.18" } -solana-validator = { path = "../../validator", version = "=1.17.18" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.18" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.19" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.19" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.19" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.19" } +solana-ledger = { path = "../../ledger", version = "=1.17.19" } +solana-logger = { path = "../../logger", version = "=1.17.19" } +solana-measure = { path = "../../measure", version = "=1.17.19" } +solana-program = { path = "../../sdk/program", version = "=1.17.19" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.19" } +solana-program-test = { path = "../../program-test", version = "=1.17.19" } +solana-runtime = { path = "../../runtime", version = "=1.17.19" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.19" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.19" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.19", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.19" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.19" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.19" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.19", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.19" } +solana-sdk = { path = "../../sdk", version = "=1.17.19" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.19" } +solana-validator = { path = "../../validator", version = "=1.17.19" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.19" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 3bd77e93c18294..1819037f947fcf 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.18" +version = "1.17.19" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.18" } +solana-program = { path = "../../../../program", version = "=1.17.19" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 9aba825b1af541..cef90ba4a0ac8b 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.18" +version = "1.17.19" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.18" } +solana-program = { path = "../../../../program", version = "=1.17.19" } [lib] crate-type = ["cdylib"] From b8ac42552b7b084e60221905c239124b8135bc36 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sun, 28 Jan 2024 13:15:11 +0800 Subject: [PATCH 159/213] v1.17: ci: publish crates directly (backport of #34794) (#34868) ci: publish crates directly (#34794) (cherry picked from commit f9bfb60c8333eee59c5a3f81968e604cdbafa729) Co-authored-by: Yihau Chen --- ci/publish-crate.sh | 46 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/ci/publish-crate.sh b/ci/publish-crate.sh index fb13ec1d53dc9d..099d02129e3cb8 100755 --- a/ci/publish-crate.sh +++ b/ci/publish-crate.sh @@ -63,37 +63,27 @@ for Cargo_toml in $Cargo_tomls; do ( set -x + crate=$(dirname "$Cargo_toml") - # The rocksdb package does not build with the stock rust docker image so use - # the solana rust docker image cargoCommand="cargo publish --token $CRATES_IO_TOKEN" - ci/docker-run.sh "$rust_stable_docker_image" bash -exc "cd $crate; $cargoCommand" - ) || true # <-- Don't fail. We want to be able to retry the job in cases when a publish fails halfway due to network/cloud issues - - numRetries=30 - for ((i = 1 ; i <= numRetries ; i++)); do - echo "Attempt ${i} of ${numRetries}" - if [[ $(is_crate_version_uploaded "$crate_name" "$expectedCrateVersion") = True ]] ; then - echo "Found ${crate_name} version ${expectedCrateVersion} on crates.io REST API" - - really_uploaded=0 - ( - set -x - rm -rf crate-test - cargo init crate-test - cd crate-test/ - echo "${crate_name} = \"=${expectedCrateVersion}\"" >> Cargo.toml - echo "[workspace]" >> Cargo.toml - cargo check - ) && really_uploaded=1 - if ((really_uploaded)); then - break; + + numRetries=10 + for ((i = 1; i <= numRetries; i++)); do + echo "Attempt ${i} of ${numRetries}" + # The rocksdb package does not build with the stock rust docker image so use + # the solana rust docker image + if ci/docker-run.sh "$rust_stable_docker_image" bash -exc "cd $crate; $cargoCommand"; then + break + fi + + if [ "$i" -lt "$numRetries" ]; then + sleep 3 + else + echo "couldn't publish '$crate_name'" + exit 1 fi - echo "${crate_name} not yet available for download from crates.io" - fi - echo "Did not find ${crate_name} version ${expectedCrateVersion} on crates.io. Sleeping for 2 seconds." - sleep 2 - done + done + ) done exit 0 From a4621d8cd9b98cb6b03e2dead72f1f5bd7c1dd8c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 18:01:12 +0100 Subject: [PATCH 160/213] v1.17: Fix - LoadedPrograms statistics (backport of #35026) (#35050) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix - LoadedPrograms statistics (#35026) Fixes hits, misses. Adds reloads, lost_insertions. Removes prunes_expired. (cherry picked from commit 5dd9609aeae4d302298a23005291675feca88a25) Co-authored-by: Alexander Meißner --- program-runtime/src/loaded_programs.rs | 117 ++++++++++++++++--------- runtime/src/bank.rs | 4 +- 2 files changed, 78 insertions(+), 43 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index dc6dcd9b03c798..f353e361bb6b2c 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -143,17 +143,30 @@ pub struct LoadedProgram { pub ix_usage_counter: AtomicU64, } +/// Global cache statistics for [LoadedPrograms]. #[derive(Debug, Default)] pub struct Stats { + /// a program was already in the cache pub hits: AtomicU64, + /// a program was not found and loaded instead pub misses: AtomicU64, + /// a compiled executable was unloaded pub evictions: HashMap, + /// an unloaded program was loaded again (opposite of eviction) + pub reloads: AtomicU64, + /// a program was loaded or un/re/deployed pub insertions: AtomicU64, + /// a program was loaded but can not be extracted on its own fork anymore + pub lost_insertions: AtomicU64, + /// a program which was already in the cache was reloaded by mistake pub replacements: AtomicU64, + /// a program was only used once before being unloaded pub one_hit_wonders: AtomicU64, + /// a program became unreachable in the fork graph because of rerooting pub prunes_orphan: AtomicU64, - pub prunes_expired: AtomicU64, + /// a program got pruned because it was not recompiled for the next epoch pub prunes_environment: AtomicU64, + /// the [SecondLevel] was empty because all slot versions got pruned pub empty_entries: AtomicU64, } @@ -162,12 +175,13 @@ impl Stats { pub fn submit(&self, slot: Slot) { let hits = self.hits.load(Ordering::Relaxed); let misses = self.misses.load(Ordering::Relaxed); + let evictions: u64 = self.evictions.values().sum(); + let reloads = self.reloads.load(Ordering::Relaxed); let insertions = self.insertions.load(Ordering::Relaxed); + let lost_insertions = self.insertions.load(Ordering::Relaxed); let replacements = self.replacements.load(Ordering::Relaxed); let one_hit_wonders = self.one_hit_wonders.load(Ordering::Relaxed); - let evictions: u64 = self.evictions.values().sum(); let prunes_orphan = self.prunes_orphan.load(Ordering::Relaxed); - let prunes_expired = self.prunes_expired.load(Ordering::Relaxed); let prunes_environment = self.prunes_environment.load(Ordering::Relaxed); let empty_entries = self.empty_entries.load(Ordering::Relaxed); datapoint_info!( @@ -176,17 +190,18 @@ impl Stats { ("hits", hits, i64), ("misses", misses, i64), ("evictions", evictions, i64), + ("reloads", reloads, i64), ("insertions", insertions, i64), + ("lost_insertions", lost_insertions, i64), ("replacements", replacements, i64), ("one_hit_wonders", one_hit_wonders, i64), ("prunes_orphan", prunes_orphan, i64), - ("prunes_expired", prunes_expired, i64), ("prunes_environment", prunes_environment, i64), ("empty_entries", empty_entries, i64), ); debug!( - "Loaded Programs Cache Stats -- Hits: {}, Misses: {}, Evictions: {}, Insertions: {}, Replacements: {}, One-Hit-Wonders: {}, Prunes-Orphan: {}, Prunes-Expired: {}, Prunes-Environment: {}, Empty: {}", - hits, misses, evictions, insertions, replacements, one_hit_wonders, prunes_orphan, prunes_expired, prunes_environment, empty_entries + "Loaded Programs Cache Stats -- Hits: {}, Misses: {}, Evictions: {}, Reloads: {}, Insertions: {} Lost-Insertions: {}, Replacements: {}, One-Hit-Wonders: {}, Prunes-Orphan: {}, Prunes-Environment: {}, Empty: {}", + hits, misses, evictions, reloads, insertions, lost_insertions, replacements, one_hit_wonders, prunes_orphan, prunes_environment, empty_entries ); if log_enabled!(log::Level::Trace) && !self.evictions.is_empty() { let mut evictions = self.evictions.iter().collect::>(); @@ -640,9 +655,7 @@ impl LoadedPrograms { let index = slot_versions .iter() .position(|at| at.effective_slot >= entry.effective_slot); - if let Some((existing, entry_index)) = - index.and_then(|index| slot_versions.get(index).map(|value| (value, index))) - { + if let Some(existing) = index.and_then(|index| slot_versions.get_mut(index)) { if existing.deployment_slot == entry.deployment_slot && existing.effective_slot == entry.effective_slot { @@ -657,17 +670,19 @@ impl LoadedPrograms { existing.ix_usage_counter.load(Ordering::Relaxed), Ordering::Relaxed, ); - slot_versions.remove(entry_index); + self.stats.reloads.fetch_add(1, Ordering::Relaxed); } else if existing.is_tombstone() != entry.is_tombstone() { // Either the old entry is tombstone and the new one is not. // (Let's give the new entry a chance). // Or, the old entry is not a tombstone and the new one is a tombstone. // (Remove the old entry, as the tombstone makes it obsolete). - slot_versions.remove(entry_index); + self.stats.insertions.fetch_add(1, Ordering::Relaxed); } else { self.stats.replacements.fetch_add(1, Ordering::Relaxed); return (true, existing.clone()); } + *existing = entry.clone(); + return (false, entry); } } self.stats.insertions.fetch_add(1, Ordering::Relaxed); @@ -757,7 +772,6 @@ impl LoadedPrograms { // Remove expired if let Some(expiration) = entry.maybe_expiration_slot { if expiration <= new_root_slot { - self.stats.prunes_expired.fetch_add(1, Ordering::Relaxed); return false; } } @@ -831,6 +845,7 @@ impl LoadedPrograms { working_slot: &S, search_for: &mut Vec<(Pubkey, (LoadedProgramMatchCriteria, u64))>, loaded_programs_for_tx_batch: &mut LoadedProgramsForTxBatch, + is_first_round: bool, ) -> Option<(Pubkey, u64)> { let mut cooperative_loading_task = None; search_for.retain(|(key, (match_criteria, usage_count))| { @@ -910,13 +925,15 @@ impl LoadedPrograms { } true }); - self.stats - .misses - .fetch_add(search_for.len() as u64, Ordering::Relaxed); - self.stats.hits.fetch_add( - loaded_programs_for_tx_batch.entries.len() as u64, - Ordering::Relaxed, - ); + if is_first_round { + self.stats + .misses + .fetch_add(search_for.len() as u64, Ordering::Relaxed); + self.stats.hits.fetch_add( + loaded_programs_for_tx_batch.entries.len() as u64, + Ordering::Relaxed, + ); + } cooperative_loading_task } @@ -933,6 +950,22 @@ impl LoadedPrograms { Some((slot, std::thread::current().id())) ); second_level.cooperative_loading_lock = None; + // Check that it will be visible to our own fork once inserted + if loaded_program.deployment_slot > self.latest_root_slot + && !self + .fork_graph + .as_ref() + .and_then(|fork_graph| fork_graph.read().ok()) + .map(|fork_graph_r| { + matches!( + fork_graph_r.relationship(loaded_program.deployment_slot, slot), + BlockRelation::Equal | BlockRelation::Ancestor + ) + }) + .unwrap_or(true) + { + self.stats.lost_insertions.fetch_add(1, Ordering::Relaxed); + } self.assign_program(key, loaded_program); self.loading_task_waiter.notify(); } @@ -1804,7 +1837,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 4)), ]; let mut extracted = LoadedProgramsForTxBatch::new(22, cache.environments.clone()); - cache.extract(&TestWorkingSlot(22), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(22), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 20, 22)); assert!(match_slot(&extracted, &program4, 0, 22)); @@ -1820,7 +1853,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(15, cache.environments.clone()); - cache.extract(&TestWorkingSlot(15), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(15), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 15)); assert!(match_slot(&extracted, &program2, 11, 15)); @@ -1843,7 +1876,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(18, cache.environments.clone()); - cache.extract(&TestWorkingSlot(18), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(18), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 18)); assert!(match_slot(&extracted, &program2, 11, 18)); @@ -1861,7 +1894,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(23, cache.environments.clone()); - cache.extract(&TestWorkingSlot(23), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(23), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 23)); assert!(match_slot(&extracted, &program2, 11, 23)); @@ -1879,7 +1912,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(11, cache.environments.clone()); - cache.extract(&TestWorkingSlot(11), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(11), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 11)); // program2 was updated at slot 11, but is not effective till slot 12. The result should contain a tombstone. @@ -1912,7 +1945,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(19, cache.environments.clone()); - cache.extract(&TestWorkingSlot(19), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(19), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 19)); assert!(match_slot(&extracted, &program2, 11, 19)); @@ -1930,7 +1963,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(21, cache.environments.clone()); - cache.extract(&TestWorkingSlot(21), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(21), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 21)); assert!(match_slot(&extracted, &program2, 11, 21)); @@ -1968,7 +2001,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(21, cache.environments.clone()); - cache.extract(&TestWorkingSlot(21), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(21), &mut missing, &mut extracted, true); // Since the fork was pruned, we should not find the entry deployed at slot 20. assert!(match_slot(&extracted, &program1, 0, 21)); @@ -1985,7 +2018,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(27, cache.environments.clone()); - cache.extract(&TestWorkingSlot(27), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(27), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 27)); assert!(match_slot(&extracted, &program2, 11, 27)); @@ -2017,7 +2050,7 @@ mod tests { (program4, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(23, cache.environments.clone()); - cache.extract(&TestWorkingSlot(23), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(23), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 23)); assert!(match_slot(&extracted, &program2, 11, 23)); @@ -2072,7 +2105,7 @@ mod tests { (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(12, cache.environments.clone()); - cache.extract(&TestWorkingSlot(12), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(12), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 12)); assert!(match_slot(&extracted, &program2, 11, 12)); @@ -2092,7 +2125,7 @@ mod tests { (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(12, cache.environments.clone()); - cache.extract(&TestWorkingSlot(12), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(12), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program2, 11, 12)); @@ -2162,7 +2195,7 @@ mod tests { (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(19, cache.environments.clone()); - cache.extract(&TestWorkingSlot(19), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(19), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 19)); assert!(match_slot(&extracted, &program2, 11, 19)); @@ -2176,7 +2209,7 @@ mod tests { (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(27, cache.environments.clone()); - cache.extract(&TestWorkingSlot(27), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(27), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 27)); assert!(match_slot(&extracted, &program2, 11, 27)); @@ -2190,7 +2223,7 @@ mod tests { (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(22, cache.environments.clone()); - cache.extract(&TestWorkingSlot(22), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(22), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 20, 22)); @@ -2254,7 +2287,7 @@ mod tests { (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(12, cache.environments.clone()); - cache.extract(&TestWorkingSlot(12), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(12), &mut missing, &mut extracted, true); // Program1 deployed at slot 11 should not be expired yet assert!(match_slot(&extracted, &program1, 11, 12)); @@ -2270,7 +2303,7 @@ mod tests { (program3, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(15, cache.environments.clone()); - cache.extract(&TestWorkingSlot(15), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(15), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program2, 11, 15)); @@ -2336,7 +2369,7 @@ mod tests { let mut missing = vec![(program1, (LoadedProgramMatchCriteria::NoCriteria, 1))]; let mut extracted = LoadedProgramsForTxBatch::new(20, cache.environments.clone()); - cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted, true); // The cache should have the program deployed at slot 0 assert_eq!( @@ -2380,7 +2413,7 @@ mod tests { (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(20, cache.environments.clone()); - cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 20)); assert!(match_slot(&extracted, &program2, 10, 20)); @@ -2390,7 +2423,7 @@ mod tests { (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(6, cache.environments.clone()); - cache.extract(&TestWorkingSlot(6), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(6), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 5, 6)); assert!(match_missing(&missing, &program2, false)); @@ -2404,7 +2437,7 @@ mod tests { (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(20, cache.environments.clone()); - cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 20)); assert!(match_slot(&extracted, &program2, 10, 20)); @@ -2414,7 +2447,7 @@ mod tests { (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(6, cache.environments.clone()); - cache.extract(&TestWorkingSlot(6), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(6), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 6)); assert!(match_missing(&missing, &program2, false)); @@ -2428,7 +2461,7 @@ mod tests { (program2, (LoadedProgramMatchCriteria::NoCriteria, 1)), ]; let mut extracted = LoadedProgramsForTxBatch::new(20, cache.environments.clone()); - cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted); + cache.extract(&TestWorkingSlot(20), &mut missing, &mut extracted, true); assert!(match_slot(&extracted, &program1, 0, 20)); assert!(match_missing(&missing, &program2, false)); diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index f30b368480f609..b53f037db4c3d3 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -5081,7 +5081,8 @@ impl Bank { // Lock the global cache. let mut loaded_programs_cache = self.loaded_programs_cache.write().unwrap(); // Initialize our local cache. - if loaded_programs_for_txs.is_none() { + let is_first_round = loaded_programs_for_txs.is_none(); + if is_first_round { loaded_programs_for_txs = Some(LoadedProgramsForTxBatch::new( self.slot, loaded_programs_cache @@ -5102,6 +5103,7 @@ impl Bank { self, &mut missing_programs, loaded_programs_for_txs.as_mut().unwrap(), + is_first_round, ); let task_waiter = Arc::clone(&loaded_programs_cache.loading_task_waiter); (program_to_load, task_waiter.cookie(), task_waiter) From fad585eda4f313c98a33eb9080ae17caf66fe8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Mei=C3=9Fner?= Date: Tue, 6 Feb 2024 10:05:07 +0100 Subject: [PATCH 161/213] Backport - feature `disable_bpf_loader_instructions` to v1.17 (#35093) * Adds the feature disable_bpf_loader_instructions. * Deactivates the feature in the tests and benches. --- programs/bpf_loader/src/lib.rs | 35 +++- programs/sbf/benches/bpf_loader.rs | 11 +- programs/sbf/tests/programs.rs | 269 +++++++++++++++++++++++++---- sdk/src/feature_set.rs | 5 + 4 files changed, 279 insertions(+), 41 deletions(-) diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index 768567187175c1..a7ec6d9bc5817b 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -36,9 +36,10 @@ use { feature_set::{ bpf_account_data_direct_mapping, cap_accounts_data_allocations_per_transaction, cap_bpf_program_instruction_accounts, delay_visibility_of_program_deployment, - enable_bpf_loader_extend_program_ix, enable_bpf_loader_set_authority_checked_ix, - enable_program_redeployment_cooldown, limit_max_instruction_trace_length, - native_programs_consume_cu, remove_bpf_loader_incorrect_program_id, + disable_bpf_loader_instructions, enable_bpf_loader_extend_program_ix, + enable_bpf_loader_set_authority_checked_ix, enable_program_redeployment_cooldown, + limit_max_instruction_trace_length, native_programs_consume_cu, + remove_bpf_loader_incorrect_program_id, }, instruction::{AccountMeta, InstructionError}, loader_instruction::LoaderInstruction, @@ -509,7 +510,20 @@ pub fn process_instruction_inner( if native_programs_consume_cu { invoke_context.consume_checked(DEFAULT_LOADER_COMPUTE_UNITS)?; } - process_loader_instruction(invoke_context) + // Return `UnsupportedProgramId` error for bpf_loader when + // `disable_bpf_loader_instruction` feature is activated. + if invoke_context + .feature_set + .is_active(&disable_bpf_loader_instructions::id()) + { + ic_logger_msg!( + log_collector, + "BPF loader management instructions are no longer supported" + ); + Err(InstructionError::UnsupportedProgramId) + } else { + process_loader_instruction(invoke_context) + } } else if bpf_loader_deprecated::check_id(program_id) { if native_programs_consume_cu { invoke_context.consume_checked(DEPRECATED_LOADER_COMPUTE_UNITS)?; @@ -1773,6 +1787,7 @@ mod tests { }, account_utils::StateMut, clock::Clock, + feature_set::FeatureSet, instruction::{AccountMeta, InstructionError}, pubkey::Pubkey, rent::Rent, @@ -1811,6 +1826,9 @@ mod tests { expected_result, Entrypoint::vm, |invoke_context| { + let mut features = FeatureSet::all_enabled(); + features.deactivate(&disable_bpf_loader_instructions::id()); + invoke_context.feature_set = Arc::new(features); test_utils::load_all_invoked_programs(invoke_context); }, |_invoke_context| {}, @@ -2030,6 +2048,9 @@ mod tests { Err(InstructionError::ProgramFailedToComplete), Entrypoint::vm, |invoke_context| { + let mut features = FeatureSet::all_enabled(); + features.deactivate(&disable_bpf_loader_instructions::id()); + invoke_context.feature_set = Arc::new(features); invoke_context.mock_set_remaining(0); test_utils::load_all_invoked_programs(invoke_context); }, @@ -2575,7 +2596,11 @@ mod tests { instruction_accounts, expected_result, Entrypoint::vm, - |_invoke_context| {}, + |invoke_context| { + let mut features = FeatureSet::all_enabled(); + features.deactivate(&disable_bpf_loader_instructions::id()); + invoke_context.feature_set = Arc::new(features); + }, |_invoke_context| {}, ) } diff --git a/programs/sbf/benches/bpf_loader.rs b/programs/sbf/benches/bpf_loader.rs index cfb20868b81094..8fb1ec74ba40c0 100644 --- a/programs/sbf/benches/bpf_loader.rs +++ b/programs/sbf/benches/bpf_loader.rs @@ -33,7 +33,7 @@ use { bpf_loader, client::SyncClient, entrypoint::SUCCESS, - feature_set::FeatureSet, + feature_set::{self, FeatureSet}, instruction::{AccountMeta, Instruction}, message::Message, native_loader, @@ -183,10 +183,17 @@ fn bench_program_alu(bencher: &mut Bencher) { #[bench] fn bench_program_execute_noop(bencher: &mut Bencher) { let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and benched. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_benches(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); diff --git a/programs/sbf/tests/programs.rs b/programs/sbf/tests/programs.rs index 8df7a01a8cdbc8..9aac20bdc7d410 100644 --- a/programs/sbf/tests/programs.rs +++ b/programs/sbf/tests/programs.rs @@ -327,11 +327,17 @@ fn test_program_sbf_sanity() { println!("Test program: {:?}", program.0); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); @@ -406,10 +412,17 @@ fn test_sol_alloc_free_no_longer_deployable() { let program_address = program_keypair.pubkey(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let mut bank = Bank::new_for_tests(&genesis_config); // Populate loader account with elf that depends on _sol_alloc_free syscall @@ -499,10 +512,17 @@ fn test_program_sbf_duplicate_accounts() { println!("Test program: {:?}", program); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -603,10 +623,17 @@ fn test_program_sbf_error_handling() { println!("Test program: {:?}", program); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); let (_, program_id) = load_program_and_advance_slot( @@ -708,10 +735,17 @@ fn test_return_data_and_log_data_syscall() { for program in programs.iter() { let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -776,10 +810,17 @@ fn test_program_sbf_invoke_sanity() { println!("Test program: {:?}", program); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -1173,10 +1214,17 @@ fn test_program_sbf_invoke_sanity() { #[cfg(feature = "sbf_rust")] fn test_program_sbf_program_id_spoofing() { let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -1224,10 +1272,17 @@ fn test_program_sbf_program_id_spoofing() { #[cfg(feature = "sbf_rust")] fn test_program_sbf_caller_has_access_to_cpi_program() { let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -1262,10 +1317,17 @@ fn test_program_sbf_ro_modify() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -1317,10 +1379,17 @@ fn test_program_sbf_call_depth() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); let (_, program_id) = load_program_and_advance_slot( @@ -1350,10 +1419,17 @@ fn test_program_sbf_compute_budget() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); let (_, program_id) = load_program_and_advance_slot( @@ -1477,10 +1553,17 @@ fn test_program_sbf_instruction_introspection() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50_000); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -1535,10 +1618,17 @@ fn test_program_sbf_test_use_latest_executor() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); let panic_id = load_program( @@ -2222,10 +2312,17 @@ fn test_program_sbf_invoke_upgradeable_via_cpi() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); let invoke_and_return = load_program( @@ -2361,6 +2458,7 @@ fn test_program_sbf_disguised_as_sbf_loader() { bank.deactivate_feature( &solana_sdk::feature_set::remove_bpf_loader_incorrect_program_id::id(), ); + bank.deactivate_feature(&feature_set::disable_bpf_loader_instructions::id()); let bank_client = BankClient::new(bank); let program_id = load_program(&bank_client, &bpf_loader::id(), &mint_keypair, program); @@ -2380,10 +2478,17 @@ fn test_program_reads_from_program_account() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); @@ -2406,10 +2511,17 @@ fn test_program_sbf_c_dup() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let account_address = Pubkey::new_unique(); @@ -2436,10 +2548,17 @@ fn test_program_sbf_upgrade_via_cpi() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); let invoke_and_return = load_program( @@ -2546,10 +2665,17 @@ fn test_program_sbf_set_upgrade_authority_via_cpi() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); @@ -2762,10 +2888,17 @@ fn test_program_sbf_finalize() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -2810,10 +2943,17 @@ fn test_program_sbf_ro_account_modify() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -2872,10 +3012,17 @@ fn test_program_sbf_realloc() { const START_BALANCE: u64 = 100_000_000_000; let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(1_000_000_000_000); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let mint_pubkey = mint_keypair.pubkey(); let signer = &[&mint_keypair]; for direct_mapping in [false, true] { @@ -3210,6 +3357,13 @@ fn test_program_sbf_realloc_invoke() { .. } = create_genesis_config(1_000_000_000_000); genesis_config.rent = Rent::default(); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let mint_pubkey = mint_keypair.pubkey(); let signer = &[&mint_keypair]; @@ -3725,10 +3879,17 @@ fn test_program_sbf_processed_inner_instruction() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(50); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -3805,12 +3966,18 @@ fn test_program_fees() { mint_keypair, .. } = create_genesis_config(500_000_000); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + genesis_config.fee_rate_governor = FeeRateGovernor::new(congestion_multiplier, 0); let mut bank = Bank::new_for_tests(&genesis_config); let fee_structure = FeeStructure::new(0.000005, 0.0, vec![(200, 0.0000005), (1400000, 0.000005)]); bank.fee_structure = fee_structure.clone(); - bank.feature_set = Arc::new(FeatureSet::all_enabled()); let mut bank_client = BankClient::new(bank); let (_, program_id) = load_program_and_advance_slot( @@ -3880,12 +4047,18 @@ fn test_program_fees() { #[cfg(feature = "sbf_rust")] fn test_get_minimum_delegation() { let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(100_123_456_789); - let mut bank = Bank::new_for_tests(&genesis_config); - bank.feature_set = Arc::new(FeatureSet::all_enabled()); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); @@ -3956,6 +4129,9 @@ fn test_cpi_account_ownership_writability() { if !direct_mapping { feature_set.deactivate(&feature_set::bpf_account_data_direct_mapping::id()); } + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + feature_set.deactivate(&feature_set::disable_bpf_loader_instructions::id()); bank.feature_set = Arc::new(feature_set); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank); @@ -4137,6 +4313,10 @@ fn test_cpi_account_data_updates() { if !direct_mapping { feature_set.deactivate(&feature_set::bpf_account_data_direct_mapping::id()); } + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + feature_set.deactivate(&feature_set::disable_bpf_loader_instructions::id()); + bank.feature_set = Arc::new(feature_set); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank); @@ -4284,6 +4464,11 @@ fn test_cpi_deprecated_loader_realloc() { if !direct_mapping { feature_set.deactivate(&feature_set::bpf_account_data_direct_mapping::id()); } + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + feature_set.deactivate(&feature_set::disable_bpf_loader_instructions::id()); + bank.feature_set = Arc::new(feature_set); let bank = Arc::new(bank); @@ -4387,13 +4572,18 @@ fn test_cpi_change_account_data_memory_allocation() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(100_123_456_789); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + let mut bank = Bank::new_for_tests(&genesis_config); - let feature_set = FeatureSet::all_enabled(); - bank.feature_set = Arc::new(feature_set); declare_process_instruction!(MockBuiltin, 42, |invoke_context| { let transaction_context = &invoke_context.transaction_context; @@ -4472,13 +4662,18 @@ fn test_cpi_invalid_account_info_pointers() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(100_123_456_789); - let mut bank = Bank::new_for_tests(&genesis_config); - let feature_set = FeatureSet::all_enabled(); - bank.feature_set = Arc::new(feature_set); + + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + + let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank); @@ -4534,11 +4729,17 @@ fn test_deny_executable_write() { solana_logger::setup(); let GenesisConfigInfo { - genesis_config, + mut genesis_config, mint_keypair, .. } = create_genesis_config(100_123_456_789); + // deactivate `disable_bpf_loader_instructions` feature so that the program + // can be loaded, finalized and tested. + genesis_config + .accounts + .remove(&feature_set::disable_bpf_loader_instructions::id()); + for direct_mapping in [false, true] { let mut bank = Bank::new_for_tests(&genesis_config); let feature_set = Arc::make_mut(&mut bank.feature_set); diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index d779f02fa41c9f..4b8289d7c995b7 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -744,6 +744,10 @@ pub mod index_erasure_conflict_duplicate_proofs { solana_sdk::declare_id!("dupPajaLy2SSn8ko42aZz4mHANDNrLe8Nw8VQgFecLa"); } +pub mod disable_bpf_loader_instructions { + solana_sdk::declare_id!("7WeS1vfPRgeeoXArLh7879YcB9mgE9ktjPDtajXeWfXn"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -925,6 +929,7 @@ lazy_static! { (consume_blockstore_duplicate_proofs::id(), "consume duplicate proofs from blockstore in consensus #34372"), (index_erasure_conflict_duplicate_proofs::id(), "generate duplicate proofs for index and erasure conflicts #34360"), (curve25519_restrict_msm_length::id(), "restrict curve25519 multiscalar multiplication vector lengths #34763"), + (disable_bpf_loader_instructions::id(), "disable bpf loader management instructions #34194"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() From 4f00402c90cc9ee2e8575c781bbfbe9c70bc6ada Mon Sep 17 00:00:00 2001 From: Yihau Chen Date: Tue, 6 Feb 2024 19:15:54 +0800 Subject: [PATCH 162/213] Version bump v1.17.20 (#35105) * Bump version to v1.17.20 * revert hashbrown bump --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cbea066f3eea1c..27db6fa66e0955 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.19" +version = "1.17.20" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.19" +version = "1.17.20" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.19" +version = "1.17.20" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.19" +version = "1.17.20" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.19" +version = "1.17.20" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.19" +version = "1.17.20" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.19" +version = "1.17.20" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.19" +version = "1.17.20" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.19" +version = "1.17.20" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.19" +version = "1.17.20" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.19" +version = "1.17.20" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.19" +version = "1.17.20" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.19" +version = "1.17.20" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.19" +version = "1.17.20" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.19" +version = "1.17.20" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.19" +version = "1.17.20" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.19" +version = "1.17.20" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.19" +version = "1.17.20" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.19" +version = "1.17.20" [[package]] name = "solana-merkle-root-bench" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.19" +version = "1.17.20" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.19" +version = "1.17.20" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.19" +version = "1.17.20" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.19" +version = "1.17.20" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.19" +version = "1.17.20" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.19" +version = "1.17.20" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.19" +version = "1.17.20" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.19" +version = "1.17.20" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.19" +version = "1.17.20" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.19" +version = "1.17.20" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.19" +version = "1.17.20" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.19" +version = "1.17.20" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.19" +version = "1.17.20" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.19" +version = "1.17.20" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.19" +version = "1.17.20" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 939dd9dbc51f74..a5880956903eb9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.19" +version = "1.17.20" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.19" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.19" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.19" } -solana-banks-client = { path = "banks-client", version = "=1.17.19" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.19" } -solana-banks-server = { path = "banks-server", version = "=1.17.19" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.19" } -solana-bloom = { path = "bloom", version = "=1.17.19" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.19" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.19" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.19", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.19" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.19" } -solana-cli = { path = "cli", version = "=1.17.19" } -solana-cli-config = { path = "cli-config", version = "=1.17.19" } -solana-cli-output = { path = "cli-output", version = "=1.17.19" } -solana-client = { path = "client", version = "=1.17.19" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.19" } -solana-config-program = { path = "programs/config", version = "=1.17.19" } -solana-core = { path = "core", version = "=1.17.19" } -solana-cost-model = { path = "cost-model", version = "=1.17.19" } -solana-download-utils = { path = "download-utils", version = "=1.17.19" } -solana-entry = { path = "entry", version = "=1.17.19" } -solana-faucet = { path = "faucet", version = "=1.17.19" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.19" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.19" } -solana-genesis = { path = "genesis", version = "=1.17.19" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.19" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.19" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.19" } -solana-gossip = { path = "gossip", version = "=1.17.19" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.19" } -solana-ledger = { path = "ledger", version = "=1.17.19" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.19" } -solana-logger = { path = "logger", version = "=1.17.19" } -solana-measure = { path = "measure", version = "=1.17.19" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.19" } -solana-metrics = { path = "metrics", version = "=1.17.19" } -solana-net-utils = { path = "net-utils", version = "=1.17.19" } -solana-notifier = { path = "notifier", version = "=1.17.19" } -solana-perf = { path = "perf", version = "=1.17.19" } -solana-poh = { path = "poh", version = "=1.17.19" } -solana-program = { path = "sdk/program", version = "=1.17.19" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.19" } -solana-program-test = { path = "program-test", version = "=1.17.19" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.19" } -solana-quic-client = { path = "quic-client", version = "=1.17.19" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.19" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.19", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.19" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.19", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.19" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.19" } -solana-runtime = { path = "runtime", version = "=1.17.19" } -solana-sdk = { path = "sdk", version = "=1.17.19" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.19" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.19" } -solana-stake-program = { path = "programs/stake", version = "=1.17.19" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.19" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.19" } -solana-streamer = { path = "streamer", version = "=1.17.19" } -solana-system-program = { path = "programs/system", version = "=1.17.19" } -solana-test-validator = { path = "test-validator", version = "=1.17.19" } -solana-thin-client = { path = "thin-client", version = "=1.17.19" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.19", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.19" } -solana-turbine = { path = "turbine", version = "=1.17.19" } -solana-udp-client = { path = "udp-client", version = "=1.17.19" } -solana-version = { path = "version", version = "=1.17.19" } -solana-vote = { path = "vote", version = "=1.17.19" } -solana-vote-program = { path = "programs/vote", version = "=1.17.19" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.19" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.19" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.19" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.20" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.20" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.20" } +solana-banks-client = { path = "banks-client", version = "=1.17.20" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.20" } +solana-banks-server = { path = "banks-server", version = "=1.17.20" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.20" } +solana-bloom = { path = "bloom", version = "=1.17.20" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.20" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.20" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.20", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.20" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.20" } +solana-cli = { path = "cli", version = "=1.17.20" } +solana-cli-config = { path = "cli-config", version = "=1.17.20" } +solana-cli-output = { path = "cli-output", version = "=1.17.20" } +solana-client = { path = "client", version = "=1.17.20" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.20" } +solana-config-program = { path = "programs/config", version = "=1.17.20" } +solana-core = { path = "core", version = "=1.17.20" } +solana-cost-model = { path = "cost-model", version = "=1.17.20" } +solana-download-utils = { path = "download-utils", version = "=1.17.20" } +solana-entry = { path = "entry", version = "=1.17.20" } +solana-faucet = { path = "faucet", version = "=1.17.20" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.20" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.20" } +solana-genesis = { path = "genesis", version = "=1.17.20" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.20" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.20" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.20" } +solana-gossip = { path = "gossip", version = "=1.17.20" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.20" } +solana-ledger = { path = "ledger", version = "=1.17.20" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.20" } +solana-logger = { path = "logger", version = "=1.17.20" } +solana-measure = { path = "measure", version = "=1.17.20" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.20" } +solana-metrics = { path = "metrics", version = "=1.17.20" } +solana-net-utils = { path = "net-utils", version = "=1.17.20" } +solana-notifier = { path = "notifier", version = "=1.17.20" } +solana-perf = { path = "perf", version = "=1.17.20" } +solana-poh = { path = "poh", version = "=1.17.20" } +solana-program = { path = "sdk/program", version = "=1.17.20" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.20" } +solana-program-test = { path = "program-test", version = "=1.17.20" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.20" } +solana-quic-client = { path = "quic-client", version = "=1.17.20" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.20" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.20", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.20" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.20", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.20" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.20" } +solana-runtime = { path = "runtime", version = "=1.17.20" } +solana-sdk = { path = "sdk", version = "=1.17.20" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.20" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.20" } +solana-stake-program = { path = "programs/stake", version = "=1.17.20" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.20" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.20" } +solana-streamer = { path = "streamer", version = "=1.17.20" } +solana-system-program = { path = "programs/system", version = "=1.17.20" } +solana-test-validator = { path = "test-validator", version = "=1.17.20" } +solana-thin-client = { path = "thin-client", version = "=1.17.20" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.20", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.20" } +solana-turbine = { path = "turbine", version = "=1.17.20" } +solana-udp-client = { path = "udp-client", version = "=1.17.20" } +solana-version = { path = "version", version = "=1.17.20" } +solana-vote = { path = "vote", version = "=1.17.20" } +solana-vote-program = { path = "programs/vote", version = "=1.17.20" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.20" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.20" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.20" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index ad699e828e963e..6468e9bc4b35b8 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.19" +version = "1.17.20" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.19" +version = "1.17.20" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.19" +version = "1.17.20" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.19" +version = "1.17.20" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.19" +version = "1.17.20" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.19" +version = "1.17.20" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.19" +version = "1.17.20" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.19" +version = "1.17.20" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.19" +version = "1.17.20" dependencies = [ "ahash 0.8.5", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.19" +version = "1.17.20" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.19" +version = "1.17.20" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.19" +version = "1.17.20" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.19" +version = "1.17.20" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.19" +version = "1.17.20" dependencies = [ "ahash 0.8.5", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.19" +version = "1.17.20" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.19" +version = "1.17.20" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.19" +version = "1.17.20" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.19" +version = "1.17.20" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.19" +version = "1.17.20" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.19" +version = "1.17.20" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.19" +version = "1.17.20" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.19" +version = "1.17.20" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.19" +version = "1.17.20" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.19" +version = "1.17.20" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.19" +version = "1.17.20" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.19" +version = "1.17.20" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.19" +version = "1.17.20" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.19" +version = "1.17.20" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.19" +version = "1.17.20" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.19" +version = "1.17.20" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.19" +version = "1.17.20" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.19" +version = "1.17.20" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.19" +version = "1.17.20" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.19" +version = "1.17.20" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.19" +version = "1.17.20" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.19" +version = "1.17.20" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.19" +version = "1.17.20" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.19" +version = "1.17.20" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.19" +version = "1.17.20" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.19" +version = "1.17.20" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.19" +version = "1.17.20" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.19" +version = "1.17.20" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.19" +version = "1.17.20" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index f56e0f87816358..a07936f7ce3557 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.19" +version = "1.17.20" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.19" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.19" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.19" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.19" } -solana-ledger = { path = "../../ledger", version = "=1.17.19" } -solana-logger = { path = "../../logger", version = "=1.17.19" } -solana-measure = { path = "../../measure", version = "=1.17.19" } -solana-program = { path = "../../sdk/program", version = "=1.17.19" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.19" } -solana-program-test = { path = "../../program-test", version = "=1.17.19" } -solana-runtime = { path = "../../runtime", version = "=1.17.19" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.19" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.19" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.19", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.19" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.19" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.19" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.19", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.19" } -solana-sdk = { path = "../../sdk", version = "=1.17.19" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.19" } -solana-validator = { path = "../../validator", version = "=1.17.19" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.19" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.20" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.20" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.20" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.20" } +solana-ledger = { path = "../../ledger", version = "=1.17.20" } +solana-logger = { path = "../../logger", version = "=1.17.20" } +solana-measure = { path = "../../measure", version = "=1.17.20" } +solana-program = { path = "../../sdk/program", version = "=1.17.20" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.20" } +solana-program-test = { path = "../../program-test", version = "=1.17.20" } +solana-runtime = { path = "../../runtime", version = "=1.17.20" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.20" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.20" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.20", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.20" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.20" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.20" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.20", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.20" } +solana-sdk = { path = "../../sdk", version = "=1.17.20" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.20" } +solana-validator = { path = "../../validator", version = "=1.17.20" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.20" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 1819037f947fcf..9e4b1e404119c8 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.19" +version = "1.17.20" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.19" } +solana-program = { path = "../../../../program", version = "=1.17.20" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index cef90ba4a0ac8b..352ec43429c35a 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.19" +version = "1.17.20" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.19" } +solana-program = { path = "../../../../program", version = "=1.17.20" } [lib] crate-type = ["cdylib"] From 09e0300b0624098ad35dfa284a37abc20c07b6a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Mei=C3=9Fner?= Date: Tue, 6 Feb 2024 12:35:21 +0100 Subject: [PATCH 163/213] Feature - `disable_bpf_loader_instructions` (#35104) * Remove feature gate for disable_bpf_loader_instructions. * Disables related tests. --- programs/bpf_loader/src/lib.rs | 44 ++++++++++------------------------ 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index a7ec6d9bc5817b..25e69ae62db228 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -36,10 +36,9 @@ use { feature_set::{ bpf_account_data_direct_mapping, cap_accounts_data_allocations_per_transaction, cap_bpf_program_instruction_accounts, delay_visibility_of_program_deployment, - disable_bpf_loader_instructions, enable_bpf_loader_extend_program_ix, - enable_bpf_loader_set_authority_checked_ix, enable_program_redeployment_cooldown, - limit_max_instruction_trace_length, native_programs_consume_cu, - remove_bpf_loader_incorrect_program_id, + enable_bpf_loader_extend_program_ix, enable_bpf_loader_set_authority_checked_ix, + enable_program_redeployment_cooldown, limit_max_instruction_trace_length, + native_programs_consume_cu, remove_bpf_loader_incorrect_program_id, }, instruction::{AccountMeta, InstructionError}, loader_instruction::LoaderInstruction, @@ -510,20 +509,11 @@ pub fn process_instruction_inner( if native_programs_consume_cu { invoke_context.consume_checked(DEFAULT_LOADER_COMPUTE_UNITS)?; } - // Return `UnsupportedProgramId` error for bpf_loader when - // `disable_bpf_loader_instruction` feature is activated. - if invoke_context - .feature_set - .is_active(&disable_bpf_loader_instructions::id()) - { - ic_logger_msg!( - log_collector, - "BPF loader management instructions are no longer supported" - ); - Err(InstructionError::UnsupportedProgramId) - } else { - process_loader_instruction(invoke_context) - } + ic_logger_msg!( + log_collector, + "BPF loader management instructions are no longer supported" + ); + Err(InstructionError::UnsupportedProgramId) } else if bpf_loader_deprecated::check_id(program_id) { if native_programs_consume_cu { invoke_context.consume_checked(DEPRECATED_LOADER_COMPUTE_UNITS)?; @@ -1486,7 +1476,7 @@ fn common_close_account( Ok(()) } -fn process_loader_instruction(invoke_context: &mut InvokeContext) -> Result<(), InstructionError> { +fn _process_loader_instruction(invoke_context: &mut InvokeContext) -> Result<(), InstructionError> { let transaction_context = &invoke_context.transaction_context; let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_data = instruction_context.get_instruction_data(); @@ -1787,7 +1777,6 @@ mod tests { }, account_utils::StateMut, clock::Clock, - feature_set::FeatureSet, instruction::{AccountMeta, InstructionError}, pubkey::Pubkey, rent::Rent, @@ -1826,9 +1815,6 @@ mod tests { expected_result, Entrypoint::vm, |invoke_context| { - let mut features = FeatureSet::all_enabled(); - features.deactivate(&disable_bpf_loader_instructions::id()); - invoke_context.feature_set = Arc::new(features); test_utils::load_all_invoked_programs(invoke_context); }, |_invoke_context| {}, @@ -1847,6 +1833,7 @@ mod tests { program_account } + #[ignore] #[test] fn test_bpf_loader_write() { let loader_id = bpf_loader::id(); @@ -1914,6 +1901,7 @@ mod tests { ); } + #[ignore] #[test] fn test_bpf_loader_finalize() { let loader_id = bpf_loader::id(); @@ -1978,6 +1966,7 @@ mod tests { ); } + #[ignore] #[test] fn test_bpf_loader_invoke_main() { let loader_id = bpf_loader::id(); @@ -2048,9 +2037,6 @@ mod tests { Err(InstructionError::ProgramFailedToComplete), Entrypoint::vm, |invoke_context| { - let mut features = FeatureSet::all_enabled(); - features.deactivate(&disable_bpf_loader_instructions::id()); - invoke_context.feature_set = Arc::new(features); invoke_context.mock_set_remaining(0); test_utils::load_all_invoked_programs(invoke_context); }, @@ -2596,11 +2582,7 @@ mod tests { instruction_accounts, expected_result, Entrypoint::vm, - |invoke_context| { - let mut features = FeatureSet::all_enabled(); - features.deactivate(&disable_bpf_loader_instructions::id()); - invoke_context.feature_set = Arc::new(features); - }, + |_invoke_context| {}, |_invoke_context| {}, ) } From 4ae690dc5aa936165751ff98dd7c3dfc8c61c40a Mon Sep 17 00:00:00 2001 From: Yihau Chen Date: Tue, 6 Feb 2024 22:00:38 +0800 Subject: [PATCH 164/213] Bump version to v1.17.21 (#35106) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 27db6fa66e0955..d3b6cdbb0bab95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.20" +version = "1.17.21" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.20" +version = "1.17.21" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.20" +version = "1.17.21" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.20" +version = "1.17.21" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.20" +version = "1.17.21" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.20" +version = "1.17.21" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.20" +version = "1.17.21" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.20" +version = "1.17.21" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.20" +version = "1.17.21" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.20" +version = "1.17.21" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.20" +version = "1.17.21" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.20" +version = "1.17.21" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.20" +version = "1.17.21" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.20" +version = "1.17.21" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.20" +version = "1.17.21" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.20" +version = "1.17.21" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.20" +version = "1.17.21" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.20" +version = "1.17.21" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.20" +version = "1.17.21" [[package]] name = "solana-merkle-root-bench" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.20" +version = "1.17.21" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.20" +version = "1.17.21" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.20" +version = "1.17.21" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.20" +version = "1.17.21" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.20" +version = "1.17.21" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.20" +version = "1.17.21" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.20" +version = "1.17.21" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.20" +version = "1.17.21" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.20" +version = "1.17.21" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.20" +version = "1.17.21" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.20" +version = "1.17.21" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.20" +version = "1.17.21" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.20" +version = "1.17.21" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.20" +version = "1.17.21" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.20" +version = "1.17.21" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index a5880956903eb9..2696124d4e80b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.20" +version = "1.17.21" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.20" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.20" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.20" } -solana-banks-client = { path = "banks-client", version = "=1.17.20" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.20" } -solana-banks-server = { path = "banks-server", version = "=1.17.20" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.20" } -solana-bloom = { path = "bloom", version = "=1.17.20" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.20" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.20" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.20", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.20" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.20" } -solana-cli = { path = "cli", version = "=1.17.20" } -solana-cli-config = { path = "cli-config", version = "=1.17.20" } -solana-cli-output = { path = "cli-output", version = "=1.17.20" } -solana-client = { path = "client", version = "=1.17.20" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.20" } -solana-config-program = { path = "programs/config", version = "=1.17.20" } -solana-core = { path = "core", version = "=1.17.20" } -solana-cost-model = { path = "cost-model", version = "=1.17.20" } -solana-download-utils = { path = "download-utils", version = "=1.17.20" } -solana-entry = { path = "entry", version = "=1.17.20" } -solana-faucet = { path = "faucet", version = "=1.17.20" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.20" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.20" } -solana-genesis = { path = "genesis", version = "=1.17.20" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.20" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.20" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.20" } -solana-gossip = { path = "gossip", version = "=1.17.20" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.20" } -solana-ledger = { path = "ledger", version = "=1.17.20" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.20" } -solana-logger = { path = "logger", version = "=1.17.20" } -solana-measure = { path = "measure", version = "=1.17.20" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.20" } -solana-metrics = { path = "metrics", version = "=1.17.20" } -solana-net-utils = { path = "net-utils", version = "=1.17.20" } -solana-notifier = { path = "notifier", version = "=1.17.20" } -solana-perf = { path = "perf", version = "=1.17.20" } -solana-poh = { path = "poh", version = "=1.17.20" } -solana-program = { path = "sdk/program", version = "=1.17.20" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.20" } -solana-program-test = { path = "program-test", version = "=1.17.20" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.20" } -solana-quic-client = { path = "quic-client", version = "=1.17.20" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.20" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.20", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.20" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.20", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.20" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.20" } -solana-runtime = { path = "runtime", version = "=1.17.20" } -solana-sdk = { path = "sdk", version = "=1.17.20" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.20" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.20" } -solana-stake-program = { path = "programs/stake", version = "=1.17.20" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.20" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.20" } -solana-streamer = { path = "streamer", version = "=1.17.20" } -solana-system-program = { path = "programs/system", version = "=1.17.20" } -solana-test-validator = { path = "test-validator", version = "=1.17.20" } -solana-thin-client = { path = "thin-client", version = "=1.17.20" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.20", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.20" } -solana-turbine = { path = "turbine", version = "=1.17.20" } -solana-udp-client = { path = "udp-client", version = "=1.17.20" } -solana-version = { path = "version", version = "=1.17.20" } -solana-vote = { path = "vote", version = "=1.17.20" } -solana-vote-program = { path = "programs/vote", version = "=1.17.20" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.20" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.20" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.20" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.21" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.21" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.21" } +solana-banks-client = { path = "banks-client", version = "=1.17.21" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.21" } +solana-banks-server = { path = "banks-server", version = "=1.17.21" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.21" } +solana-bloom = { path = "bloom", version = "=1.17.21" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.21" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.21" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.21", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.21" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.21" } +solana-cli = { path = "cli", version = "=1.17.21" } +solana-cli-config = { path = "cli-config", version = "=1.17.21" } +solana-cli-output = { path = "cli-output", version = "=1.17.21" } +solana-client = { path = "client", version = "=1.17.21" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.21" } +solana-config-program = { path = "programs/config", version = "=1.17.21" } +solana-core = { path = "core", version = "=1.17.21" } +solana-cost-model = { path = "cost-model", version = "=1.17.21" } +solana-download-utils = { path = "download-utils", version = "=1.17.21" } +solana-entry = { path = "entry", version = "=1.17.21" } +solana-faucet = { path = "faucet", version = "=1.17.21" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.21" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.21" } +solana-genesis = { path = "genesis", version = "=1.17.21" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.21" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.21" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.21" } +solana-gossip = { path = "gossip", version = "=1.17.21" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.21" } +solana-ledger = { path = "ledger", version = "=1.17.21" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.21" } +solana-logger = { path = "logger", version = "=1.17.21" } +solana-measure = { path = "measure", version = "=1.17.21" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.21" } +solana-metrics = { path = "metrics", version = "=1.17.21" } +solana-net-utils = { path = "net-utils", version = "=1.17.21" } +solana-notifier = { path = "notifier", version = "=1.17.21" } +solana-perf = { path = "perf", version = "=1.17.21" } +solana-poh = { path = "poh", version = "=1.17.21" } +solana-program = { path = "sdk/program", version = "=1.17.21" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.21" } +solana-program-test = { path = "program-test", version = "=1.17.21" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.21" } +solana-quic-client = { path = "quic-client", version = "=1.17.21" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.21" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.21", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.21" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.21", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.21" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.21" } +solana-runtime = { path = "runtime", version = "=1.17.21" } +solana-sdk = { path = "sdk", version = "=1.17.21" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.21" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.21" } +solana-stake-program = { path = "programs/stake", version = "=1.17.21" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.21" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.21" } +solana-streamer = { path = "streamer", version = "=1.17.21" } +solana-system-program = { path = "programs/system", version = "=1.17.21" } +solana-test-validator = { path = "test-validator", version = "=1.17.21" } +solana-thin-client = { path = "thin-client", version = "=1.17.21" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.21", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.21" } +solana-turbine = { path = "turbine", version = "=1.17.21" } +solana-udp-client = { path = "udp-client", version = "=1.17.21" } +solana-version = { path = "version", version = "=1.17.21" } +solana-vote = { path = "vote", version = "=1.17.21" } +solana-vote-program = { path = "programs/vote", version = "=1.17.21" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.21" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.21" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.21" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 6468e9bc4b35b8..4a6d20fdb9581c 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.20" +version = "1.17.21" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.20" +version = "1.17.21" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.20" +version = "1.17.21" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.20" +version = "1.17.21" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.20" +version = "1.17.21" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.20" +version = "1.17.21" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.20" +version = "1.17.21" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.20" +version = "1.17.21" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.20" +version = "1.17.21" dependencies = [ "ahash 0.8.5", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.20" +version = "1.17.21" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.20" +version = "1.17.21" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.20" +version = "1.17.21" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.20" +version = "1.17.21" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.20" +version = "1.17.21" dependencies = [ "ahash 0.8.5", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.20" +version = "1.17.21" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.20" +version = "1.17.21" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.20" +version = "1.17.21" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.20" +version = "1.17.21" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.20" +version = "1.17.21" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.20" +version = "1.17.21" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.20" +version = "1.17.21" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.20" +version = "1.17.21" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.20" +version = "1.17.21" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.20" +version = "1.17.21" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.20" +version = "1.17.21" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.20" +version = "1.17.21" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.20" +version = "1.17.21" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.20" +version = "1.17.21" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.20" +version = "1.17.21" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.20" +version = "1.17.21" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.20" +version = "1.17.21" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.20" +version = "1.17.21" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.20" +version = "1.17.21" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.20" +version = "1.17.21" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.20" +version = "1.17.21" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.20" +version = "1.17.21" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.20" +version = "1.17.21" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.20" +version = "1.17.21" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.20" +version = "1.17.21" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.20" +version = "1.17.21" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.20" +version = "1.17.21" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.20" +version = "1.17.21" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.20" +version = "1.17.21" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index a07936f7ce3557..1bcc8b28a1e832 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.20" +version = "1.17.21" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.20" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.20" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.20" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.20" } -solana-ledger = { path = "../../ledger", version = "=1.17.20" } -solana-logger = { path = "../../logger", version = "=1.17.20" } -solana-measure = { path = "../../measure", version = "=1.17.20" } -solana-program = { path = "../../sdk/program", version = "=1.17.20" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.20" } -solana-program-test = { path = "../../program-test", version = "=1.17.20" } -solana-runtime = { path = "../../runtime", version = "=1.17.20" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.20" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.20" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.20", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.20" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.20" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.20" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.20", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.20" } -solana-sdk = { path = "../../sdk", version = "=1.17.20" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.20" } -solana-validator = { path = "../../validator", version = "=1.17.20" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.20" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.21" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.21" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.21" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.21" } +solana-ledger = { path = "../../ledger", version = "=1.17.21" } +solana-logger = { path = "../../logger", version = "=1.17.21" } +solana-measure = { path = "../../measure", version = "=1.17.21" } +solana-program = { path = "../../sdk/program", version = "=1.17.21" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.21" } +solana-program-test = { path = "../../program-test", version = "=1.17.21" } +solana-runtime = { path = "../../runtime", version = "=1.17.21" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.21" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.21" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.21", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.21" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.21" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.21" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.21", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.21" } +solana-sdk = { path = "../../sdk", version = "=1.17.21" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.21" } +solana-validator = { path = "../../validator", version = "=1.17.21" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.21" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 9e4b1e404119c8..c442e99e1409fc 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.20" +version = "1.17.21" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.20" } +solana-program = { path = "../../../../program", version = "=1.17.21" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 352ec43429c35a..385157da667218 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.20" +version = "1.17.21" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.20" } +solana-program = { path = "../../../../program", version = "=1.17.21" } [lib] crate-type = ["cdylib"] From 5bf32b4d5b4a73865dfbfe952e19683b250aadbc Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 10 Feb 2024 22:27:13 +0100 Subject: [PATCH 165/213] v1.17: Upgrade sbf tests to use bpf loader v3 (backport of #34691) (#35162) * Upgrade sbf tests to use bpf loader v3 (#34691) * update sbf test to use bpf_loader v2 * update test_program_sbf_invoke_sanity test * update test bpf program owner * update test_program_sbf_invoke_upgradeable_via_cpi * update test_program_sbf_disguised_as_sbf_loader * update test_program_reads_from_program_account * update test_program_sbf_program_id_spoofing * update test_program_sbf_caller_has_access_to_cpi_program * update 3 more tests * fix program buffer size in minimul for rent exempt calculation * more test updates * more update * more test updates * comments * undo c format * typo * add sol_alloc_free not deployable and deployable tests * comments * review feedback - move buffer_keypair and program_keypair inside callee fn. * more refactor * delete sof_alloc_free_syscall enabled tests * revert lamport change --------- Co-authored-by: HaoranYi (cherry picked from commit 8869d0c8a0b56c4294fe9292bf856e79d16989b5) # Conflicts: # programs/sbf/tests/programs.rs * fix merge conflicts * update tests to avoid using the new test api from 1.18 * manually backport #34722 to fix a test * Ignore failing benchmark tests and fix compilation --------- Co-authored-by: HaoranYi Co-authored-by: HaoranYi Co-authored-by: haoran Co-authored-by: Stephen Akridge --- programs/sbf/benches/bpf_loader.rs | 9 +- programs/sbf/c/src/invoked/invoked.c | 11 +- .../sbf/c/src/read_program/read_program.c | 2 +- programs/sbf/rust/invoked/src/processor.rs | 7 +- programs/sbf/tests/programs.rs | 743 ++++++------------ runtime/src/loader_utils.rs | 3 +- 6 files changed, 250 insertions(+), 525 deletions(-) diff --git a/programs/sbf/benches/bpf_loader.rs b/programs/sbf/benches/bpf_loader.rs index 8fb1ec74ba40c0..bec2106708aad9 100644 --- a/programs/sbf/benches/bpf_loader.rs +++ b/programs/sbf/benches/bpf_loader.rs @@ -101,6 +101,7 @@ fn bench_program_create_executable(bencher: &mut Bencher) { } #[bench] +#[ignore] fn bench_program_alu(bencher: &mut Bencher) { let ns_per_s = 1000000000; let one_million = 1000000; @@ -118,13 +119,18 @@ fn bench_program_alu(bencher: &mut Bencher) { true, false, ); + #[allow(unused_mut)] let mut executable = Executable::::from_elf(&elf, Arc::new(program_runtime_environment.unwrap())) .unwrap(); executable.verify::().unwrap(); - executable.jit_compile().unwrap(); + #[cfg(all(not(target_os = "windows"), target_arch = "x86_64"))] + { + executable.jit_compile().unwrap(); + } + create_vm!( vm, &executable, @@ -181,6 +187,7 @@ fn bench_program_alu(bencher: &mut Bencher) { } #[bench] +#[ignore] fn bench_program_execute_noop(bencher: &mut Bencher) { let GenesisConfigInfo { mut genesis_config, diff --git a/programs/sbf/c/src/invoked/invoked.c b/programs/sbf/c/src/invoked/invoked.c index f57896c47bf44c..37671cfb9fe51b 100644 --- a/programs/sbf/c/src/invoked/invoked.c +++ b/programs/sbf/c/src/invoked/invoked.c @@ -31,10 +31,11 @@ extern uint64_t entrypoint(const uint8_t *input) { static const int INVOKED_PROGRAM_DUP_INDEX = 3; sol_assert(sol_deserialize(input, ¶ms, 4)); - SolPubkey sbf_loader_id = - (SolPubkey){.x = {2, 168, 246, 145, 78, 136, 161, 110, 57, 90, 225, - 40, 148, 143, 250, 105, 86, 147, 55, 104, 24, 221, - 71, 67, 82, 33, 243, 198, 0, 0, 0, 0}}; + SolPubkey sbf_loader_upgradeable_id = + (SolPubkey){.x = { + 2, 168, 246, 145, 78, 136, 161, 176, 226, 16, 21, 62, + 247, 99, 174, 43, 0, 194, 185, 61, 22, 193, 36, 210, 192, + 83, 122, 16, 4, 128, 0, 0}}; for (int i = 0; i < params.data_len; i++) { sol_assert(params.data[i] == i); @@ -63,7 +64,7 @@ extern uint64_t entrypoint(const uint8_t *input) { sol_assert( SolPubkey_same(accounts[INVOKED_PROGRAM_INDEX].key, params.program_id)) sol_assert(SolPubkey_same(accounts[INVOKED_PROGRAM_INDEX].owner, - &sbf_loader_id)); + &sbf_loader_upgradeable_id)); sol_assert(!accounts[INVOKED_PROGRAM_INDEX].is_signer); sol_assert(!accounts[INVOKED_PROGRAM_INDEX].is_writable); sol_assert(accounts[INVOKED_PROGRAM_INDEX].rent_epoch == UINT64_MAX); diff --git a/programs/sbf/c/src/read_program/read_program.c b/programs/sbf/c/src/read_program/read_program.c index 47e5a22d4c1c76..28d242efa7f8be 100644 --- a/programs/sbf/c/src/read_program/read_program.c +++ b/programs/sbf/c/src/read_program/read_program.c @@ -10,7 +10,7 @@ extern uint64_t entrypoint(const uint8_t *input) { return ERROR_INVALID_ARGUMENT; } - char ka_data[] = {0x7F, 0x45, 0x4C, 0x46}; + char ka_data[] = {0x02, 0x00, 0x00, 0x00}; sol_assert(params.ka_num == 1); sol_assert(!sol_memcmp(params.ka[0].data, ka_data, 4)); diff --git a/programs/sbf/rust/invoked/src/processor.rs b/programs/sbf/rust/invoked/src/processor.rs index 52d02dc99a6c21..8f60a90c15cf4e 100644 --- a/programs/sbf/rust/invoked/src/processor.rs +++ b/programs/sbf/rust/invoked/src/processor.rs @@ -7,7 +7,7 @@ use { crate::instructions::*, solana_program::{ account_info::AccountInfo, - bpf_loader, + bpf_loader_upgradeable, entrypoint::{ProgramResult, MAX_PERMITTED_DATA_INCREASE}, log::sol_log_64, msg, @@ -70,7 +70,10 @@ fn process_instruction( assert!(!accounts[INVOKED_ARGUMENT_INDEX].executable); assert_eq!(accounts[INVOKED_PROGRAM_INDEX].key, program_id); - assert_eq!(accounts[INVOKED_PROGRAM_INDEX].owner, &bpf_loader::id()); + assert_eq!( + accounts[INVOKED_PROGRAM_INDEX].owner, + &bpf_loader_upgradeable::id() + ); assert!(!accounts[INVOKED_PROGRAM_INDEX].is_signer); assert!(!accounts[INVOKED_PROGRAM_INDEX].is_writable); assert_eq!(accounts[INVOKED_PROGRAM_INDEX].rent_epoch, u64::MAX); diff --git a/programs/sbf/tests/programs.rs b/programs/sbf/tests/programs.rs index 9aac20bdc7d410..8da4cdc18f4310 100644 --- a/programs/sbf/tests/programs.rs +++ b/programs/sbf/tests/programs.rs @@ -25,9 +25,8 @@ use { solana_runtime::{ bank::TransactionBalancesSet, loader_utils::{ - create_program, load_and_finalize_program, load_program, load_program_from_file, - load_upgradeable_buffer, load_upgradeable_program, set_upgrade_authority, - upgrade_program, + create_program, load_program_from_file, load_upgradeable_buffer, + load_upgradeable_program, set_upgrade_authority, upgrade_program, }, }, solana_sbf_rust_invoke::instructions::*, @@ -42,12 +41,11 @@ use { entrypoint::MAX_PERMITTED_DATA_INCREASE, feature_set::{self, remove_deprecated_request_unit_ix, FeatureSet}, fee::FeeStructure, - loader_instruction, message::{v0::LoadedAddresses, SanitizedMessage}, signature::keypair_from_seed, stake, system_instruction::{self, MAX_PERMITTED_DATA_LENGTH}, - sysvar::{self, clock, rent}, + sysvar::{self, clock}, transaction::VersionedTransaction, }, solana_transaction_status::{ @@ -253,19 +251,45 @@ fn execute_transactions( .collect() } -fn load_program_and_advance_slot( +fn load_upgradeable_program_wrapper( + bank_client: &BankClient, + mint_keypair: &Keypair, + authority_keypair: &Keypair, + name: &str, +) -> Pubkey { + let buffer_keypair = Keypair::new(); + let program_keypair = Keypair::new(); + load_upgradeable_program( + bank_client, + mint_keypair, + &buffer_keypair, + &program_keypair, + authority_keypair, + name, + ); + program_keypair.pubkey() +} + +fn load_upgradeable_program_and_advance_slot( bank_client: &mut BankClient, - loader_id: &Pubkey, - payer_keypair: &Keypair, + mint_keypair: &Keypair, + authority_keypair: &Keypair, name: &str, ) -> (Arc, Pubkey) { - let pubkey = load_program(bank_client, loader_id, payer_keypair, name); - ( - bank_client - .advance_slot(1, &Pubkey::default()) - .expect("Failed to advance the slot"), - pubkey, - ) + let program_id = + load_upgradeable_program_wrapper(bank_client, mint_keypair, authority_keypair, name); + + // load_upgradeable_program sets clock sysvar to 1, which causes the program to be effective + // after 2 slots. They need to be called individually to create the correct fork graph in between. + bank_client + .advance_slot(1, &Pubkey::default()) + .expect("Failed to advance the slot"); + + let bank = bank_client + .advance_slot(1, &Pubkey::default()) + .expect("Failed to advance the slot"); + + (bank, program_id) } #[test] @@ -327,25 +351,20 @@ fn test_program_sbf_sanity() { println!("Test program: {:?}", program.0); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); + let authority_keypair = Keypair::new(); // Call user program - let (_, program_id) = load_program_and_advance_slot( + let (_, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, program.0, ); let account_metas = vec![ @@ -405,92 +424,42 @@ fn test_program_sbf_loader_deprecated() { #[test] #[cfg(feature = "sbf_rust")] -fn test_sol_alloc_free_no_longer_deployable() { +#[should_panic( + expected = "called `Result::unwrap()` on an `Err` value: TransactionError(InstructionError(1, InvalidAccountData))" +)] +fn test_sol_alloc_free_no_longer_deployable_with_upgradeable_loader() { solana_logger::setup(); - let program_keypair = Keypair::new(); - let program_address = program_keypair.pubkey(); - let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - - let mut bank = Bank::new_for_tests(&genesis_config); - - // Populate loader account with elf that depends on _sol_alloc_free syscall - let elf = load_program_from_file("solana_sbf_rust_deprecated_loader"); - let mut program_account = AccountSharedData::new(1, elf.len(), &bpf_loader::id()); - program_account - .data_as_mut_slice() - .get_mut(..) - .unwrap() - .copy_from_slice(&elf); - bank.store_account(&program_address, &program_account); - - let finalize_tx = Transaction::new( - &[&mint_keypair, &program_keypair], - Message::new( - &[loader_instruction::finalize( - &program_keypair.pubkey(), - &bpf_loader::id(), - )], - Some(&mint_keypair.pubkey()), - ), - bank.last_blockhash(), - ); - - let invoke_tx = Transaction::new( - &[&mint_keypair], - Message::new( - &[Instruction::new_with_bytes( - program_address, - &[255], - vec![AccountMeta::new(mint_keypair.pubkey(), true)], - )], - Some(&mint_keypair.pubkey()), - ), - bank.last_blockhash(), - ); + let bank = Bank::new_for_tests(&genesis_config); + let bank = Arc::new(bank); + let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - // Try and deploy a program that depends on _sol_alloc_free - assert_eq!( - bank.process_transaction(&finalize_tx).unwrap_err(), - TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + // Populate loader account with `solana_sbf_rust_deprecated_loader` elf, which + // depends on `sol_alloc_free_` syscall. This can be verified with + // $ elfdump solana_sbf_rust_deprecated_loader.so + // : 0000000000001ab8 000000070000000a R_BPF_64_32 0000000000000000 sol_alloc_free_ + // In the symbol table, there is `sol_alloc_free_`. + // In fact, `sol_alloc_free_` is called from sbf allocator, which is originated from + // AccountInfo::realloc() in the program code. + + // Expect that deployment to fail. B/C during deployment, there is an elf + // verification step, which uses the runtime to look up relocatable symbols + // in elf inside syscall table. In this case, `sol_alloc_free_` can't be + // found in syscall table. Hence, the verification fails and the deployment + // fails. + let (_bank, _program_id) = load_upgradeable_program_and_advance_slot( + &mut bank_client, + &mint_keypair, + &authority_keypair, + "solana_sbf_rust_deprecated_loader", ); - - // Enable _sol_alloc_free syscall - bank.deactivate_feature(&solana_sdk::feature_set::disable_deploy_of_alloc_free_syscall::id()); - bank.clear_signatures(); - bank.clear_program_cache(); - - // Try and finalize the program now that sol_alloc_free is re-enabled - assert!(bank.process_transaction(&finalize_tx).is_ok()); - let new_slot = bank.slot() + 1; - let mut bank = Bank::new_from_parent(Arc::new(bank), &Pubkey::default(), new_slot); - - // invoke the program - assert!(bank.process_transaction(&invoke_tx).is_ok()); - - // disable _sol_alloc_free - bank.activate_feature(&solana_sdk::feature_set::disable_deploy_of_alloc_free_syscall::id()); - bank.clear_signatures(); - - // invoke should still succeed because cached - assert!(bank.process_transaction(&invoke_tx).is_ok()); - - bank.clear_signatures(); - bank.clear_program_cache(); - - // invoke should still succeed on execute because the program is already deployed - assert!(bank.process_transaction(&invoke_tx).is_ok()); } #[test] @@ -512,24 +481,19 @@ fn test_program_sbf_duplicate_accounts() { println!("Test program: {:?}", program); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); - let (bank, program_id) = load_program_and_advance_slot( + let authority_keypair = Keypair::new(); + let (bank, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, program, ); let payee_account = AccountSharedData::new(10, 1, &program_id); @@ -623,23 +587,18 @@ fn test_program_sbf_error_handling() { println!("Test program: {:?}", program); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); - let (_, program_id) = load_program_and_advance_slot( + let authority_keypair = Keypair::new(); + let (_bank, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, program, ); let account_metas = vec![AccountMeta::new(mint_keypair.pubkey(), true)]; @@ -735,25 +694,20 @@ fn test_return_data_and_log_data_syscall() { for program in programs.iter() { let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let (bank, program_id) = load_program_and_advance_slot( + let (bank, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, program, ); @@ -810,29 +764,34 @@ fn test_program_sbf_invoke_sanity() { println!("Test program: {:?}", program); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); + + let invoke_program_id = load_upgradeable_program_wrapper( + &bank_client, + &mint_keypair, + &authority_keypair, + program.1, + ); - let invoke_program_id = - load_program(&bank_client, &bpf_loader::id(), &mint_keypair, program.1); - let invoked_program_id = - load_program(&bank_client, &bpf_loader::id(), &mint_keypair, program.2); - let (bank, noop_program_id) = load_program_and_advance_slot( + let invoked_program_id = load_upgradeable_program_wrapper( + &bank_client, + &mint_keypair, + &authority_keypair, + program.2, + ); + + let (bank, noop_program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, program.3, ); @@ -1214,31 +1173,26 @@ fn test_program_sbf_invoke_sanity() { #[cfg(feature = "sbf_rust")] fn test_program_sbf_program_id_spoofing() { let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let malicious_swap_pubkey = load_program( + let malicious_swap_pubkey = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_spoof1", ); - let (bank, malicious_system_pubkey) = load_program_and_advance_slot( + let (bank, malicious_system_pubkey) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_spoof1_system", ); @@ -1272,31 +1226,26 @@ fn test_program_sbf_program_id_spoofing() { #[cfg(feature = "sbf_rust")] fn test_program_sbf_caller_has_access_to_cpi_program() { let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let caller_pubkey = load_program( + let caller_pubkey = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_caller_access", ); - let (_, caller2_pubkey) = load_program_and_advance_slot( + let (_bank, caller2_pubkey) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_caller_access", ); let account_metas = vec![ @@ -1317,25 +1266,20 @@ fn test_program_sbf_ro_modify() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let (bank, program_pubkey) = load_program_and_advance_slot( + let (bank, program_pubkey) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_ro_modify", ); @@ -1379,23 +1323,18 @@ fn test_program_sbf_call_depth() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); - let (_, program_id) = load_program_and_advance_slot( + let authority_keypair = Keypair::new(); + let (_, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_call_depth", ); @@ -1419,23 +1358,18 @@ fn test_program_sbf_compute_budget() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); - let (_, program_id) = load_program_and_advance_slot( + let authority_keypair = Keypair::new(); + let (_, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_noop", ); let message = Message::new( @@ -1553,25 +1487,20 @@ fn test_program_sbf_instruction_introspection() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50_000); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let (bank, program_id) = load_program_and_advance_slot( + let (bank, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_instruction_introspection", ); @@ -1612,90 +1541,6 @@ fn test_program_sbf_instruction_introspection() { assert!(bank.get_account(&sysvar::instructions::id()).is_none()); } -#[test] -#[cfg(feature = "sbf_rust")] -fn test_program_sbf_test_use_latest_executor() { - solana_logger::setup(); - - let GenesisConfigInfo { - mut genesis_config, - mint_keypair, - .. - } = create_genesis_config(50); - - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - - let bank = Bank::new_for_tests(&genesis_config); - let mut bank_client = BankClient::new(bank); - let panic_id = load_program( - &bank_client, - &bpf_loader::id(), - &mint_keypair, - "solana_sbf_rust_panic", - ); - - // Write the panic program into the program account - let (program_keypair, instruction) = load_and_finalize_program( - &bank_client, - &bpf_loader::id(), - None, - &mint_keypair, - "solana_sbf_rust_panic", - ); - - // Finalize the panic program, but fail the tx - let message = Message::new( - &[ - instruction, - Instruction::new_with_bytes(panic_id, &[0], vec![]), - ], - Some(&mint_keypair.pubkey()), - ); - - bank_client - .advance_slot(1, &Pubkey::default()) - .expect("Failed to advance the slot"); - assert!(bank_client - .send_and_confirm_message(&[&mint_keypair, &program_keypair], message) - .is_err()); - - // Write the noop program into the same program account - let (program_keypair, instruction) = load_and_finalize_program( - &bank_client, - &bpf_loader::id(), - Some(program_keypair), - &mint_keypair, - "solana_sbf_rust_noop", - ); - bank_client - .advance_slot(1, &Pubkey::default()) - .expect("Failed to advance the slot"); - let message = Message::new(&[instruction], Some(&mint_keypair.pubkey())); - bank_client - .send_and_confirm_message(&[&mint_keypair, &program_keypair], message) - .unwrap(); - - // Call the noop program, should get noop not panic - let message = Message::new( - &[Instruction::new_with_bytes( - program_keypair.pubkey(), - &[0], - vec![], - )], - Some(&mint_keypair.pubkey()), - ); - bank_client - .advance_slot(1, &Pubkey::default()) - .expect("Failed to advance the slot"); - assert!(bank_client - .send_and_confirm_message(&[&mint_keypair], message) - .is_ok()); -} - #[test] #[cfg(feature = "sbf_rust")] fn test_program_sbf_upgrade() { @@ -2312,39 +2157,32 @@ fn test_program_sbf_invoke_upgradeable_via_cpi() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); - let invoke_and_return = load_program( - &bank_client, - &bpf_loader::id(), + let authority_keypair = Keypair::new(); + let (_bank, invoke_and_return) = load_upgradeable_program_and_advance_slot( + &mut bank_client, &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke_and_return", ); // Deploy upgradeable program - let buffer_keypair = Keypair::new(); - let program_keypair = Keypair::new(); - let program_id = program_keypair.pubkey(); - let authority_keypair = Keypair::new(); - load_upgradeable_program( + let program_id = load_upgradeable_program_wrapper( &bank_client, &mint_keypair, - &buffer_keypair, - &program_keypair, &authority_keypair, "solana_sbf_rust_upgradeable", ); + bank_client.set_sysvar_for_tests(&clock::Clock { + slot: 2, + ..clock::Clock::default() + }); bank_client .advance_slot(1, &Pubkey::default()) @@ -2378,7 +2216,7 @@ fn test_program_sbf_invoke_upgradeable_via_cpi() { "solana_sbf_rust_upgraded", ); bank_client.set_sysvar_for_tests(&clock::Clock { - slot: 2, + slot: 3, ..clock::Clock::default() }); bank_client @@ -2458,10 +2296,15 @@ fn test_program_sbf_disguised_as_sbf_loader() { bank.deactivate_feature( &solana_sdk::feature_set::remove_bpf_loader_incorrect_program_id::id(), ); - bank.deactivate_feature(&feature_set::disable_bpf_loader_instructions::id()); - let bank_client = BankClient::new(bank); + let mut bank_client = BankClient::new(bank); + let authority_keypair = Keypair::new(); - let program_id = load_program(&bank_client, &bpf_loader::id(), &mint_keypair, program); + let (_bank, program_id) = load_upgradeable_program_and_advance_slot( + &mut bank_client, + &mint_keypair, + &authority_keypair, + program, + ); let account_metas = vec![AccountMeta::new_readonly(program_id, false)]; let instruction = Instruction::new_with_bytes(bpf_loader::id(), &[1], account_metas); let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction); @@ -2478,24 +2321,19 @@ fn test_program_reads_from_program_account() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); + let authority_keypair = Keypair::new(); - let (_, program_id) = load_program_and_advance_slot( + let (_bank, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "read_program", ); let account_metas = vec![AccountMeta::new_readonly(program_id, false)]; @@ -2511,17 +2349,11 @@ fn test_program_sbf_c_dup() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let account_address = Pubkey::new_unique(); @@ -2529,9 +2361,13 @@ fn test_program_sbf_c_dup() { bank.store_account(&account_address, &account); let mut bank_client = BankClient::new(bank); - - let (_, program_id) = - load_program_and_advance_slot(&mut bank_client, &bpf_loader::id(), &mint_keypair, "ser"); + let authority_keypair = Keypair::new(); + let (_, program_id) = load_upgradeable_program_and_advance_slot( + &mut bank_client, + &mint_keypair, + &authority_keypair, + "ser", + ); let account_metas = vec![ AccountMeta::new_readonly(account_address, false), AccountMeta::new_readonly(account_address, false), @@ -2548,23 +2384,18 @@ fn test_program_sbf_upgrade_via_cpi() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); - let invoke_and_return = load_program( - &bank_client, - &bpf_loader::id(), + let authority_keypair = Keypair::new(); + let (_bank, invoke_and_return) = load_upgradeable_program_and_advance_slot( + &mut bank_client, &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke_and_return", ); @@ -2665,38 +2496,27 @@ fn test_program_sbf_set_upgrade_authority_via_cpi() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let mut bank_client = BankClient::new(bank); + let authority_keypair = Keypair::new(); // Deploy CPI invoker program - let invoke_and_return = load_program( + let invoke_and_return = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke_and_return", ); // Deploy upgradeable program - let buffer_keypair = Keypair::new(); - let program_keypair = Keypair::new(); - let program_id = program_keypair.pubkey(); - let authority_keypair = Keypair::new(); - load_upgradeable_program( + let program_id = load_upgradeable_program_wrapper( &bank_client, &mint_keypair, - &buffer_keypair, - &program_keypair, &authority_keypair, "solana_sbf_rust_upgradeable", ); @@ -2882,86 +2702,26 @@ fn test_program_upgradeable_locks() { assert_eq!(results2[1], Err(TransactionError::AccountInUse)); } -#[test] -#[cfg(feature = "sbf_rust")] -fn test_program_sbf_finalize() { - solana_logger::setup(); - - let GenesisConfigInfo { - mut genesis_config, - mint_keypair, - .. - } = create_genesis_config(50); - - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - - let bank = Bank::new_for_tests(&genesis_config); - let bank = Arc::new(bank); - let mut bank_client = BankClient::new_shared(bank.clone()); - - let (_, program_pubkey) = load_program_and_advance_slot( - &mut bank_client, - &bpf_loader::id(), - &mint_keypair, - "solana_sbf_rust_finalize", - ); - - // Write the noop program into the same program account - let (program_keypair, _instruction) = load_and_finalize_program( - &bank_client, - &bpf_loader::id(), - None, - &mint_keypair, - "solana_sbf_rust_noop", - ); - - bank_client - .advance_slot(1, &Pubkey::default()) - .expect("Failed to advance the slot"); - - let account_metas = vec![ - AccountMeta::new(program_keypair.pubkey(), true), - AccountMeta::new_readonly(bpf_loader::id(), false), - AccountMeta::new(rent::id(), false), - ]; - let instruction = Instruction::new_with_bytes(program_pubkey, &[], account_metas.clone()); - let message = Message::new(&[instruction], Some(&mint_keypair.pubkey())); - let result = bank_client.send_and_confirm_message(&[&mint_keypair, &program_keypair], message); - assert_eq!( - result.unwrap_err().unwrap(), - TransactionError::InstructionError(0, InstructionError::ProgramFailedToComplete) - ); -} - #[test] #[cfg(feature = "sbf_rust")] fn test_program_sbf_ro_account_modify() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let (bank, program_id) = load_program_and_advance_slot( + let (bank, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_ro_account_modify", ); @@ -3012,17 +2772,11 @@ fn test_program_sbf_realloc() { const START_BALANCE: u64 = 100_000_000_000; let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(1_000_000_000_000); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let mint_pubkey = mint_keypair.pubkey(); let signer = &[&mint_keypair]; for direct_mapping in [false, true] { @@ -3035,11 +2789,12 @@ fn test_program_sbf_realloc() { } let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let (bank, program_id) = load_program_and_advance_slot( + let (bank, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_realloc", ); @@ -3358,30 +3113,25 @@ fn test_program_sbf_realloc_invoke() { } = create_genesis_config(1_000_000_000_000); genesis_config.rent = Rent::default(); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let mint_pubkey = mint_keypair.pubkey(); let signer = &[&mint_keypair]; let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let realloc_program_id = load_program( + let realloc_program_id = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_realloc", ); - let (bank, realloc_invoke_program_id) = load_program_and_advance_slot( + let (bank, realloc_invoke_program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_realloc_invoke", ); @@ -3836,7 +3586,7 @@ fn test_program_sbf_realloc_invoke() { TransactionError::InstructionError(0, InstructionError::InvalidRealloc) ); - // Realloc rescursively and fill data + // Realloc recursively and fill data let invoke_keypair = Keypair::new(); let invoke_pubkey = invoke_keypair.pubkey().clone(); let invoke_account = AccountSharedData::new(START_BALANCE, 0, &realloc_invoke_program_id); @@ -3879,43 +3629,38 @@ fn test_program_sbf_processed_inner_instruction() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(50); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let sibling_program_id = load_program( + let sibling_program_id = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_sibling_instructions", ); - let sibling_inner_program_id = load_program( + let sibling_inner_program_id = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_sibling_inner_instructions", ); - let noop_program_id = load_program( + let noop_program_id = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_noop", ); - let (_, invoke_and_return_program_id) = load_program_and_advance_slot( + let (_, invoke_and_return_program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke_and_return", ); @@ -3967,23 +3712,18 @@ fn test_program_fees() { .. } = create_genesis_config(500_000_000); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - genesis_config.fee_rate_governor = FeeRateGovernor::new(congestion_multiplier, 0); let mut bank = Bank::new_for_tests(&genesis_config); let fee_structure = FeeStructure::new(0.000005, 0.0, vec![(200, 0.0000005), (1400000, 0.000005)]); bank.fee_structure = fee_structure.clone(); let mut bank_client = BankClient::new(bank); + let authority_keypair = Keypair::new(); - let (_, program_id) = load_program_and_advance_slot( + let (_bank, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_noop", ); @@ -4047,25 +3787,20 @@ fn test_program_fees() { #[cfg(feature = "sbf_rust")] fn test_get_minimum_delegation() { let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(100_123_456_789); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank.clone()); + let authority_keypair = Keypair::new(); - let (_, program_id) = load_program_and_advance_slot( + let (_bank, program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_get_minimum_delegation", ); @@ -4129,31 +3864,29 @@ fn test_cpi_account_ownership_writability() { if !direct_mapping { feature_set.deactivate(&feature_set::bpf_account_data_direct_mapping::id()); } - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - feature_set.deactivate(&feature_set::disable_bpf_loader_instructions::id()); bank.feature_set = Arc::new(feature_set); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank); + let authority_keypair = Keypair::new(); - let invoke_program_id = load_program( + let invoke_program_id = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke", ); - let invoked_program_id = load_program( + let invoked_program_id = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoked", ); - let (bank, realloc_program_id) = load_program_and_advance_slot( + let (bank, realloc_program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_realloc", ); @@ -4313,25 +4046,23 @@ fn test_cpi_account_data_updates() { if !direct_mapping { feature_set.deactivate(&feature_set::bpf_account_data_direct_mapping::id()); } - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - feature_set.deactivate(&feature_set::disable_bpf_loader_instructions::id()); bank.feature_set = Arc::new(feature_set); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank); + let authority_keypair = Keypair::new(); - let invoke_program_id = load_program( + let invoke_program_id = load_upgradeable_program_wrapper( &bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke", ); - let (bank, realloc_program_id) = load_program_and_advance_slot( + let (bank, realloc_program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_realloc", ); @@ -4465,10 +4196,6 @@ fn test_cpi_deprecated_loader_realloc() { feature_set.deactivate(&feature_set::bpf_account_data_direct_mapping::id()); } - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - feature_set.deactivate(&feature_set::disable_bpf_loader_instructions::id()); - bank.feature_set = Arc::new(feature_set); let bank = Arc::new(bank); @@ -4479,11 +4206,12 @@ fn test_cpi_deprecated_loader_realloc() { ); let mut bank_client = BankClient::new_shared(bank); + let authority_keypair = Keypair::new(); - let (bank, invoke_program_id) = load_program_and_advance_slot( + let (bank, invoke_program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke", ); @@ -4572,17 +4300,11 @@ fn test_cpi_change_account_data_memory_allocation() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(100_123_456_789); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let mut bank = Bank::new_for_tests(&genesis_config); declare_process_instruction!(MockBuiltin, 42, |invoke_context| { @@ -4627,11 +4349,12 @@ fn test_cpi_change_account_data_memory_allocation() { let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank); + let authority_keypair = Keypair::new(); - let (bank, invoke_program_id) = load_program_and_advance_slot( + let (bank, invoke_program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke", ); @@ -4662,28 +4385,23 @@ fn test_cpi_invalid_account_info_pointers() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(100_123_456_789); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - let bank = Bank::new_for_tests(&genesis_config); let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank); + let authority_keypair = Keypair::new(); let c_invoke_program_id = - load_program(&bank_client, &bpf_loader::id(), &mint_keypair, "invoke"); + load_upgradeable_program_wrapper(&bank_client, &mint_keypair, &authority_keypair, "invoke"); - let (bank, invoke_program_id) = load_program_and_advance_slot( + let (bank, invoke_program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke", ); @@ -4729,17 +4447,11 @@ fn test_deny_executable_write() { solana_logger::setup(); let GenesisConfigInfo { - mut genesis_config, + genesis_config, mint_keypair, .. } = create_genesis_config(100_123_456_789); - // deactivate `disable_bpf_loader_instructions` feature so that the program - // can be loaded, finalized and tested. - genesis_config - .accounts - .remove(&feature_set::disable_bpf_loader_instructions::id()); - for direct_mapping in [false, true] { let mut bank = Bank::new_for_tests(&genesis_config); let feature_set = Arc::make_mut(&mut bank.feature_set); @@ -4750,11 +4462,12 @@ fn test_deny_executable_write() { } let bank = Arc::new(bank); let mut bank_client = BankClient::new_shared(bank); + let authority_keypair = Keypair::new(); - let (_bank, invoke_program_id) = load_program_and_advance_slot( + let (_bank, invoke_program_id) = load_upgradeable_program_and_advance_slot( &mut bank_client, - &bpf_loader::id(), &mint_keypair, + &authority_keypair, "solana_sbf_rust_invoke", ); diff --git a/runtime/src/loader_utils.rs b/runtime/src/loader_utils.rs index cddb37595cef91..7f4650ae561d3f 100644 --- a/runtime/src/loader_utils.rs +++ b/runtime/src/loader_utils.rs @@ -116,6 +116,7 @@ pub fn load_upgradeable_buffer( let program = load_program_from_file(name); let buffer_pubkey = buffer_keypair.pubkey(); let buffer_authority_pubkey = buffer_authority_keypair.pubkey(); + let program_buffer_bytes = UpgradeableLoaderState::size_of_buffer(program.len()); bank_client .send_and_confirm_message( @@ -127,7 +128,7 @@ pub fn load_upgradeable_buffer( &buffer_authority_pubkey, 1.max( bank_client - .get_minimum_balance_for_rent_exemption(program.len()) + .get_minimum_balance_for_rent_exemption(program_buffer_bytes) .unwrap(), ), program.len(), From 113eca2facc6c422bc0b7423d24ac714d8848c3b Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Mon, 12 Feb 2024 16:05:01 -0600 Subject: [PATCH 166/213] Update version to v1.17.22 (#35184) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3b6cdbb0bab95..bd9f369ec70798 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.21" +version = "1.17.22" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.21" +version = "1.17.22" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.21" +version = "1.17.22" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.21" +version = "1.17.22" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.21" +version = "1.17.22" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.21" +version = "1.17.22" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.21" +version = "1.17.22" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.21" +version = "1.17.22" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.21" +version = "1.17.22" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.21" +version = "1.17.22" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.21" +version = "1.17.22" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.21" +version = "1.17.22" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.21" +version = "1.17.22" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.21" +version = "1.17.22" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.21" +version = "1.17.22" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.21" +version = "1.17.22" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.21" +version = "1.17.22" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.21" +version = "1.17.22" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.21" +version = "1.17.22" [[package]] name = "solana-merkle-root-bench" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.21" +version = "1.17.22" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.21" +version = "1.17.22" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.21" +version = "1.17.22" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.21" +version = "1.17.22" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.21" +version = "1.17.22" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.21" +version = "1.17.22" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.21" +version = "1.17.22" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.21" +version = "1.17.22" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.21" +version = "1.17.22" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.21" +version = "1.17.22" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.21" +version = "1.17.22" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.21" +version = "1.17.22" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.21" +version = "1.17.22" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.21" +version = "1.17.22" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.21" +version = "1.17.22" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 2696124d4e80b2..eea675a6f25657 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.21" +version = "1.17.22" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.21" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.21" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.21" } -solana-banks-client = { path = "banks-client", version = "=1.17.21" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.21" } -solana-banks-server = { path = "banks-server", version = "=1.17.21" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.21" } -solana-bloom = { path = "bloom", version = "=1.17.21" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.21" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.21" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.21", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.21" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.21" } -solana-cli = { path = "cli", version = "=1.17.21" } -solana-cli-config = { path = "cli-config", version = "=1.17.21" } -solana-cli-output = { path = "cli-output", version = "=1.17.21" } -solana-client = { path = "client", version = "=1.17.21" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.21" } -solana-config-program = { path = "programs/config", version = "=1.17.21" } -solana-core = { path = "core", version = "=1.17.21" } -solana-cost-model = { path = "cost-model", version = "=1.17.21" } -solana-download-utils = { path = "download-utils", version = "=1.17.21" } -solana-entry = { path = "entry", version = "=1.17.21" } -solana-faucet = { path = "faucet", version = "=1.17.21" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.21" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.21" } -solana-genesis = { path = "genesis", version = "=1.17.21" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.21" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.21" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.21" } -solana-gossip = { path = "gossip", version = "=1.17.21" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.21" } -solana-ledger = { path = "ledger", version = "=1.17.21" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.21" } -solana-logger = { path = "logger", version = "=1.17.21" } -solana-measure = { path = "measure", version = "=1.17.21" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.21" } -solana-metrics = { path = "metrics", version = "=1.17.21" } -solana-net-utils = { path = "net-utils", version = "=1.17.21" } -solana-notifier = { path = "notifier", version = "=1.17.21" } -solana-perf = { path = "perf", version = "=1.17.21" } -solana-poh = { path = "poh", version = "=1.17.21" } -solana-program = { path = "sdk/program", version = "=1.17.21" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.21" } -solana-program-test = { path = "program-test", version = "=1.17.21" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.21" } -solana-quic-client = { path = "quic-client", version = "=1.17.21" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.21" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.21", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.21" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.21", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.21" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.21" } -solana-runtime = { path = "runtime", version = "=1.17.21" } -solana-sdk = { path = "sdk", version = "=1.17.21" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.21" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.21" } -solana-stake-program = { path = "programs/stake", version = "=1.17.21" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.21" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.21" } -solana-streamer = { path = "streamer", version = "=1.17.21" } -solana-system-program = { path = "programs/system", version = "=1.17.21" } -solana-test-validator = { path = "test-validator", version = "=1.17.21" } -solana-thin-client = { path = "thin-client", version = "=1.17.21" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.21", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.21" } -solana-turbine = { path = "turbine", version = "=1.17.21" } -solana-udp-client = { path = "udp-client", version = "=1.17.21" } -solana-version = { path = "version", version = "=1.17.21" } -solana-vote = { path = "vote", version = "=1.17.21" } -solana-vote-program = { path = "programs/vote", version = "=1.17.21" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.21" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.21" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.21" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.22" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.22" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.22" } +solana-banks-client = { path = "banks-client", version = "=1.17.22" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.22" } +solana-banks-server = { path = "banks-server", version = "=1.17.22" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.22" } +solana-bloom = { path = "bloom", version = "=1.17.22" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.22" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.22" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.22", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.22" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.22" } +solana-cli = { path = "cli", version = "=1.17.22" } +solana-cli-config = { path = "cli-config", version = "=1.17.22" } +solana-cli-output = { path = "cli-output", version = "=1.17.22" } +solana-client = { path = "client", version = "=1.17.22" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.22" } +solana-config-program = { path = "programs/config", version = "=1.17.22" } +solana-core = { path = "core", version = "=1.17.22" } +solana-cost-model = { path = "cost-model", version = "=1.17.22" } +solana-download-utils = { path = "download-utils", version = "=1.17.22" } +solana-entry = { path = "entry", version = "=1.17.22" } +solana-faucet = { path = "faucet", version = "=1.17.22" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.22" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.22" } +solana-genesis = { path = "genesis", version = "=1.17.22" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.22" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.22" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.22" } +solana-gossip = { path = "gossip", version = "=1.17.22" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.22" } +solana-ledger = { path = "ledger", version = "=1.17.22" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.22" } +solana-logger = { path = "logger", version = "=1.17.22" } +solana-measure = { path = "measure", version = "=1.17.22" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.22" } +solana-metrics = { path = "metrics", version = "=1.17.22" } +solana-net-utils = { path = "net-utils", version = "=1.17.22" } +solana-notifier = { path = "notifier", version = "=1.17.22" } +solana-perf = { path = "perf", version = "=1.17.22" } +solana-poh = { path = "poh", version = "=1.17.22" } +solana-program = { path = "sdk/program", version = "=1.17.22" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.22" } +solana-program-test = { path = "program-test", version = "=1.17.22" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.22" } +solana-quic-client = { path = "quic-client", version = "=1.17.22" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.22" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.22", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.22" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.22", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.22" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.22" } +solana-runtime = { path = "runtime", version = "=1.17.22" } +solana-sdk = { path = "sdk", version = "=1.17.22" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.22" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.22" } +solana-stake-program = { path = "programs/stake", version = "=1.17.22" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.22" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.22" } +solana-streamer = { path = "streamer", version = "=1.17.22" } +solana-system-program = { path = "programs/system", version = "=1.17.22" } +solana-test-validator = { path = "test-validator", version = "=1.17.22" } +solana-thin-client = { path = "thin-client", version = "=1.17.22" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.22", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.22" } +solana-turbine = { path = "turbine", version = "=1.17.22" } +solana-udp-client = { path = "udp-client", version = "=1.17.22" } +solana-version = { path = "version", version = "=1.17.22" } +solana-vote = { path = "vote", version = "=1.17.22" } +solana-vote-program = { path = "programs/vote", version = "=1.17.22" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.22" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.22" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.22" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 4a6d20fdb9581c..7748b95b7a092b 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.21" +version = "1.17.22" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.21" +version = "1.17.22" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.21" +version = "1.17.22" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.21" +version = "1.17.22" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.21" +version = "1.17.22" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.21" +version = "1.17.22" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.21" +version = "1.17.22" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.21" +version = "1.17.22" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.21" +version = "1.17.22" dependencies = [ "ahash 0.8.5", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.21" +version = "1.17.22" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.21" +version = "1.17.22" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.21" +version = "1.17.22" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.21" +version = "1.17.22" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.21" +version = "1.17.22" dependencies = [ "ahash 0.8.5", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.21" +version = "1.17.22" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.21" +version = "1.17.22" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.21" +version = "1.17.22" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.21" +version = "1.17.22" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.21" +version = "1.17.22" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.21" +version = "1.17.22" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.21" +version = "1.17.22" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.21" +version = "1.17.22" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.21" +version = "1.17.22" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.21" +version = "1.17.22" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.21" +version = "1.17.22" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.21" +version = "1.17.22" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.21" +version = "1.17.22" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.21" +version = "1.17.22" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.21" +version = "1.17.22" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.21" +version = "1.17.22" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.21" +version = "1.17.22" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.21" +version = "1.17.22" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.21" +version = "1.17.22" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.21" +version = "1.17.22" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.21" +version = "1.17.22" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.21" +version = "1.17.22" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.21" +version = "1.17.22" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.21" +version = "1.17.22" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.21" +version = "1.17.22" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.21" +version = "1.17.22" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.21" +version = "1.17.22" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.21" +version = "1.17.22" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.21" +version = "1.17.22" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 1bcc8b28a1e832..caabf3657452e0 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.21" +version = "1.17.22" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.21" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.21" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.21" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.21" } -solana-ledger = { path = "../../ledger", version = "=1.17.21" } -solana-logger = { path = "../../logger", version = "=1.17.21" } -solana-measure = { path = "../../measure", version = "=1.17.21" } -solana-program = { path = "../../sdk/program", version = "=1.17.21" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.21" } -solana-program-test = { path = "../../program-test", version = "=1.17.21" } -solana-runtime = { path = "../../runtime", version = "=1.17.21" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.21" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.21" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.21", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.21" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.21" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.21" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.21", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.21" } -solana-sdk = { path = "../../sdk", version = "=1.17.21" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.21" } -solana-validator = { path = "../../validator", version = "=1.17.21" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.21" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.22" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.22" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.22" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.22" } +solana-ledger = { path = "../../ledger", version = "=1.17.22" } +solana-logger = { path = "../../logger", version = "=1.17.22" } +solana-measure = { path = "../../measure", version = "=1.17.22" } +solana-program = { path = "../../sdk/program", version = "=1.17.22" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.22" } +solana-program-test = { path = "../../program-test", version = "=1.17.22" } +solana-runtime = { path = "../../runtime", version = "=1.17.22" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.22" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.22" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.22", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.22" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.22" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.22" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.22", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.22" } +solana-sdk = { path = "../../sdk", version = "=1.17.22" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.22" } +solana-validator = { path = "../../validator", version = "=1.17.22" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.22" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index c442e99e1409fc..15aa75427c749d 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.21" +version = "1.17.22" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.21" } +solana-program = { path = "../../../../program", version = "=1.17.22" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 385157da667218..57085ed92f2d31 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.21" +version = "1.17.22" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.21" } +solana-program = { path = "../../../../program", version = "=1.17.22" } [lib] crate-type = ["cdylib"] From 08c78a528e806eede6e446711aeb94915d3ef1ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Mei=C3=9Fner?= Date: Sat, 10 Feb 2024 14:20:04 +0000 Subject: [PATCH 167/213] Implements a proper insertion sort with a two key comparison operator. Allows replacements of different types of entries, disallows identical replacements. --- program-runtime/src/loaded_programs.rs | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index f353e361bb6b2c..4c685851475b8c 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -645,22 +645,24 @@ impl LoadedPrograms { /// Refill the cache with a single entry. It's typically called during transaction loading, /// when the cache doesn't contain the entry corresponding to program `key`. - /// The function dedupes the cache, in case some other thread replenished the entry in parallel. pub fn replenish( &mut self, key: Pubkey, entry: Arc, ) -> (bool, Arc) { let slot_versions = &mut self.entries.entry(key).or_default().slot_versions; - let index = slot_versions - .iter() - .position(|at| at.effective_slot >= entry.effective_slot); + let index = slot_versions.binary_search_by(|at| { + at.effective_slot + .cmp(&entry.effective_slot) + .then(at.deployment_slot.cmp(&entry.deployment_slot)) + }); if let Some(existing) = index.and_then(|index| slot_versions.get_mut(index)) { if existing.deployment_slot == entry.deployment_slot && existing.effective_slot == entry.effective_slot { - if matches!(existing.program, LoadedProgramType::Unloaded(_)) { - // The unloaded program is getting reloaded + if std::mem::discriminant(&existing.program) + != std::mem::discriminant(&entry.program) + { // Copy over the usage counter to the new entry entry.tx_usage_counter.fetch_add( existing.tx_usage_counter.load(Ordering::Relaxed), @@ -671,13 +673,8 @@ impl LoadedPrograms { Ordering::Relaxed, ); self.stats.reloads.fetch_add(1, Ordering::Relaxed); - } else if existing.is_tombstone() != entry.is_tombstone() { - // Either the old entry is tombstone and the new one is not. - // (Let's give the new entry a chance). - // Or, the old entry is not a tombstone and the new one is a tombstone. - // (Remove the old entry, as the tombstone makes it obsolete). - self.stats.insertions.fetch_add(1, Ordering::Relaxed); } else { + // Something is wrong, I can feel it ... self.stats.replacements.fetch_add(1, Ordering::Relaxed); return (true, existing.clone()); } From 62a809f3f3b4c943a05c4a5624ebebbf017410ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Mei=C3=9Fner?= Date: Sat, 10 Feb 2024 14:20:04 +0000 Subject: [PATCH 168/213] Reformulates the controlflow to use less nesting. --- program-runtime/src/loaded_programs.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 4c685851475b8c..72482c76cd160a 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -651,15 +651,13 @@ impl LoadedPrograms { entry: Arc, ) -> (bool, Arc) { let slot_versions = &mut self.entries.entry(key).or_default().slot_versions; - let index = slot_versions.binary_search_by(|at| { + match slot_versions.binary_search_by(|at| { at.effective_slot .cmp(&entry.effective_slot) .then(at.deployment_slot.cmp(&entry.deployment_slot)) - }); - if let Some(existing) = index.and_then(|index| slot_versions.get_mut(index)) { - if existing.deployment_slot == entry.deployment_slot - && existing.effective_slot == entry.effective_slot - { + }) { + Ok(index) => { + let existing = slot_versions.get_mut(index).unwrap(); if std::mem::discriminant(&existing.program) != std::mem::discriminant(&entry.program) { @@ -673,18 +671,20 @@ impl LoadedPrograms { Ordering::Relaxed, ); self.stats.reloads.fetch_add(1, Ordering::Relaxed); + *existing = entry.clone(); + (false, entry) } else { // Something is wrong, I can feel it ... self.stats.replacements.fetch_add(1, Ordering::Relaxed); - return (true, existing.clone()); + (true, existing.clone()) } - *existing = entry.clone(); - return (false, entry); + } + Err(index) => { + self.stats.insertions.fetch_add(1, Ordering::Relaxed); + slot_versions.insert(index, entry.clone()); + (false, entry) } } - self.stats.insertions.fetch_add(1, Ordering::Relaxed); - slot_versions.insert(index.unwrap_or(slot_versions.len()), entry.clone()); - (false, entry) } /// Assign the program `entry` to the given `key` in the cache. From 0895cb8c032a753f99488ba4c5072963b80d36cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Mei=C3=9Fner?= Date: Sat, 10 Feb 2024 22:11:04 +0000 Subject: [PATCH 169/213] Add slot based feature --- program-runtime/src/loaded_programs.rs | 307 +++++++++++++++++++------ runtime/src/bank.rs | 11 +- 2 files changed, 242 insertions(+), 76 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 72482c76cd160a..60f9c36088c018 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -649,41 +649,81 @@ impl LoadedPrograms { &mut self, key: Pubkey, entry: Arc, + current_slot: Slot, ) -> (bool, Arc) { let slot_versions = &mut self.entries.entry(key).or_default().slot_versions; - match slot_versions.binary_search_by(|at| { - at.effective_slot - .cmp(&entry.effective_slot) - .then(at.deployment_slot.cmp(&entry.deployment_slot)) - }) { - Ok(index) => { - let existing = slot_versions.get_mut(index).unwrap(); - if std::mem::discriminant(&existing.program) - != std::mem::discriminant(&entry.program) - { - // Copy over the usage counter to the new entry - entry.tx_usage_counter.fetch_add( - existing.tx_usage_counter.load(Ordering::Relaxed), - Ordering::Relaxed, - ); - entry.ix_usage_counter.fetch_add( - existing.ix_usage_counter.load(Ordering::Relaxed), - Ordering::Relaxed, - ); - self.stats.reloads.fetch_add(1, Ordering::Relaxed); - *existing = entry.clone(); + if current_slot > 247806000 { + match slot_versions.binary_search_by(|at| { + at.effective_slot + .cmp(&entry.effective_slot) + .then(at.deployment_slot.cmp(&entry.deployment_slot)) + }) { + Ok(index) => { + let existing = slot_versions.get_mut(index).unwrap(); + if std::mem::discriminant(&existing.program) + != std::mem::discriminant(&entry.program) + { + // Copy over the usage counter to the new entry + entry.tx_usage_counter.fetch_add( + existing.tx_usage_counter.load(Ordering::Relaxed), + Ordering::Relaxed, + ); + entry.ix_usage_counter.fetch_add( + existing.ix_usage_counter.load(Ordering::Relaxed), + Ordering::Relaxed, + ); + self.stats.reloads.fetch_add(1, Ordering::Relaxed); + *existing = entry.clone(); + (false, entry) + } else { + // Something is wrong, I can feel it ... + self.stats.replacements.fetch_add(1, Ordering::Relaxed); + (true, existing.clone()) + } + } + Err(index) => { + self.stats.insertions.fetch_add(1, Ordering::Relaxed); + slot_versions.insert(index, entry.clone()); (false, entry) - } else { - // Something is wrong, I can feel it ... - self.stats.replacements.fetch_add(1, Ordering::Relaxed); - (true, existing.clone()) } } - Err(index) => { - self.stats.insertions.fetch_add(1, Ordering::Relaxed); - slot_versions.insert(index, entry.clone()); - (false, entry) + } else { + let index = slot_versions + .iter() + .position(|at| at.effective_slot >= entry.effective_slot); + if let Some(existing) = index.and_then(|index| slot_versions.get_mut(index)) { + if existing.deployment_slot == entry.deployment_slot + && existing.effective_slot == entry.effective_slot + { + if matches!(existing.program, LoadedProgramType::Unloaded(_)) { + // The unloaded program is getting reloaded + // Copy over the usage counter to the new entry + entry.tx_usage_counter.fetch_add( + existing.tx_usage_counter.load(Ordering::Relaxed), + Ordering::Relaxed, + ); + entry.ix_usage_counter.fetch_add( + existing.ix_usage_counter.load(Ordering::Relaxed), + Ordering::Relaxed, + ); + self.stats.reloads.fetch_add(1, Ordering::Relaxed); + } else if existing.is_tombstone() != entry.is_tombstone() { + // Either the old entry is tombstone and the new one is not. + // (Let's give the new entry a chance). + // Or, the old entry is not a tombstone and the new one is a tombstone. + // (Remove the old entry, as the tombstone makes it obsolete). + self.stats.insertions.fetch_add(1, Ordering::Relaxed); + } else { + self.stats.replacements.fetch_add(1, Ordering::Relaxed); + return (true, existing.clone()); + } + *existing = entry.clone(); + return (false, entry); + } } + self.stats.insertions.fetch_add(1, Ordering::Relaxed); + slot_versions.insert(index.unwrap_or(slot_versions.len()), entry.clone()); + (false, entry) } } @@ -691,8 +731,13 @@ impl LoadedPrograms { /// This is typically called when a deployed program is managed (un-/re-/deployed) via /// loader instructions. Because of the cooldown, entires can not have the same /// deployment_slot and effective_slot. - pub fn assign_program(&mut self, key: Pubkey, entry: Arc) -> Arc { - let (was_occupied, entry) = self.replenish(key, entry); + pub fn assign_program( + &mut self, + key: Pubkey, + entry: Arc, + current_slot: Slot, + ) -> Arc { + let (was_occupied, entry) = self.replenish(key, entry, current_slot); debug_assert!(!was_occupied); entry } @@ -963,13 +1008,13 @@ impl LoadedPrograms { { self.stats.lost_insertions.fetch_add(1, Ordering::Relaxed); } - self.assign_program(key, loaded_program); + self.assign_program(key, loaded_program, slot); self.loading_task_waiter.notify(); } pub fn merge(&mut self, tx_batch_cache: &LoadedProgramsForTxBatch) { tx_batch_cache.entries.iter().for_each(|(key, entry)| { - self.replenish(*key, entry.clone()); + self.replenish(*key, entry.clone(), tx_batch_cache.slot); }) } @@ -1187,7 +1232,11 @@ mod tests { slot: Slot, reason: LoadedProgramType, ) -> Arc { - cache.assign_program(key, Arc::new(LoadedProgram::new_tombstone(slot, reason))) + cache.assign_program( + key, + Arc::new(LoadedProgram::new_tombstone(slot, reason)), + u64::MAX, + ) } fn insert_unloaded_program( @@ -1210,7 +1259,7 @@ mod tests { .to_unloaded() .expect("Failed to unload the program"), ); - cache.replenish(key, unloaded).1 + cache.replenish(key, unloaded, u64::MAX).1 } fn num_matching_entries(cache: &LoadedPrograms, predicate: P) -> usize @@ -1252,6 +1301,7 @@ mod tests { (*deployment_slot) + 2, AtomicU64::new(usage_counter), ), + u64::MAX, ); programs.push((program1, *deployment_slot, usage_counter)); }); @@ -1285,6 +1335,7 @@ mod tests { (*deployment_slot) + 2, AtomicU64::new(usage_counter), ), + u64::MAX, ); programs.push((program2, *deployment_slot, usage_counter)); }); @@ -1317,6 +1368,7 @@ mod tests { (*deployment_slot) + 2, AtomicU64::new(usage_counter), ), + u64::MAX, ); programs.push((program3, *deployment_slot, usage_counter)); }); @@ -1406,6 +1458,7 @@ mod tests { cache.replenish( program, new_test_loaded_program_with_usage(i, i + 2, AtomicU64::new(i + 10)), + u64::MAX, ); }); @@ -1433,6 +1486,7 @@ mod tests { cache.replenish( program, new_test_loaded_program_with_usage(0, 2, AtomicU64::new(0)), + u64::MAX, ); cache.entries.values().for_each(|second_level| { @@ -1461,7 +1515,7 @@ mod tests { ); let loaded_program = new_test_loaded_program(10, 10); - let (existing, program) = cache.replenish(program1, loaded_program.clone()); + let (existing, program) = cache.replenish(program1, loaded_program.clone(), u64::MAX); assert!(!existing); assert_eq!(program, loaded_program); } @@ -1503,7 +1557,7 @@ mod tests { let program2 = Pubkey::new_unique(); assert!( !cache - .replenish(program2, new_test_builtin_program(50, 51)) + .replenish(program2, new_test_builtin_program(50, 51), u64::MAX) .0 ); let second_level = &cache @@ -1606,7 +1660,7 @@ mod tests { let program1 = Pubkey::new_unique(); let loaded_program = new_test_loaded_program(10, 10); - let (existing, program) = cache.replenish(program1, loaded_program.clone()); + let (existing, program) = cache.replenish(program1, loaded_program.clone(), u64::MAX); assert!(!existing); assert_eq!(program, loaded_program); @@ -1624,7 +1678,7 @@ mod tests { tx_usage_counter: AtomicU64::default(), ix_usage_counter: AtomicU64::default(), }); - let (existing, program) = cache.replenish(program1, updated_program.clone()); + let (existing, program) = cache.replenish(program1, updated_program.clone(), u64::MAX); assert!(!existing); assert_eq!(program, updated_program); @@ -1777,36 +1831,70 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); - assert!(!cache.replenish(program1, new_test_loaded_program(10, 11)).0); - assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); + assert!( + !cache + .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program1, new_test_loaded_program(10, 11), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) + .0 + ); // Test: inserting duplicate entry return pre existing entry from the cache - assert!(cache.replenish(program1, new_test_loaded_program(20, 21)).0); + assert!( + cache + .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) + .0 + ); let program2 = Pubkey::new_unique(); - assert!(!cache.replenish(program2, new_test_loaded_program(5, 6)).0); + assert!( + !cache + .replenish(program2, new_test_loaded_program(5, 6), u64::MAX) + .0 + ); assert!( !cache .replenish( program2, - new_test_loaded_program(11, 11 + DELAY_VISIBILITY_SLOT_OFFSET) + new_test_loaded_program(11, 11 + DELAY_VISIBILITY_SLOT_OFFSET), + u64::MAX ) .0 ); let program3 = Pubkey::new_unique(); - assert!(!cache.replenish(program3, new_test_loaded_program(25, 26)).0); + assert!( + !cache + .replenish(program3, new_test_loaded_program(25, 26), u64::MAX) + .0 + ); let program4 = Pubkey::new_unique(); - assert!(!cache.replenish(program4, new_test_loaded_program(0, 1)).0); - assert!(!cache.replenish(program4, new_test_loaded_program(5, 6)).0); + assert!( + !cache + .replenish(program4, new_test_loaded_program(0, 1), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program4, new_test_loaded_program(5, 6), u64::MAX) + .0 + ); // The following is a special case, where effective slot is 3 slots in the future assert!( !cache .replenish( program4, - new_test_loaded_program(15, 15 + DELAY_VISIBILITY_SLOT_OFFSET) + new_test_loaded_program(15, 15 + DELAY_VISIBILITY_SLOT_OFFSET), + u64::MAX ) .0 ); @@ -1932,7 +2020,7 @@ mod tests { tx_usage_counter: AtomicU64::default(), ix_usage_counter: AtomicU64::default(), }); - assert!(!cache.replenish(program4, test_program).0); + assert!(!cache.replenish(program4, test_program, u64::MAX).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 let mut missing = vec![ @@ -2085,15 +2173,35 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); - assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); + assert!( + !cache + .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) + .0 + ); let program2 = Pubkey::new_unique(); - assert!(!cache.replenish(program2, new_test_loaded_program(5, 6)).0); - assert!(!cache.replenish(program2, new_test_loaded_program(11, 12)).0); + assert!( + !cache + .replenish(program2, new_test_loaded_program(5, 6), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program2, new_test_loaded_program(11, 12), u64::MAX) + .0 + ); let program3 = Pubkey::new_unique(); - assert!(!cache.replenish(program3, new_test_loaded_program(25, 26)).0); + assert!( + !cache + .replenish(program3, new_test_loaded_program(25, 26), u64::MAX) + .0 + ); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 let mut missing = vec![ @@ -2158,12 +2266,28 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); - assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); + assert!( + !cache + .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) + .0 + ); let program2 = Pubkey::new_unique(); - assert!(!cache.replenish(program2, new_test_loaded_program(5, 6)).0); - assert!(!cache.replenish(program2, new_test_loaded_program(11, 12)).0); + assert!( + !cache + .replenish(program2, new_test_loaded_program(5, 6), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program2, new_test_loaded_program(11, 12), u64::MAX) + .0 + ); let program3 = Pubkey::new_unique(); // Insert an unloaded program with correct/cache's environment at slot 25 @@ -2180,7 +2304,8 @@ mod tests { new_test_loaded_program(20, 21) .to_unloaded() .expect("Failed to create unloaded program") - ) + ), + u64::MAX ) .0 ); @@ -2255,15 +2380,35 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!(!cache.replenish(program1, new_test_loaded_program(10, 11)).0); - assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); + assert!( + !cache + .replenish(program1, new_test_loaded_program(10, 11), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) + .0 + ); let program2 = Pubkey::new_unique(); - assert!(!cache.replenish(program2, new_test_loaded_program(5, 6)).0); - assert!(!cache.replenish(program2, new_test_loaded_program(11, 12)).0); + assert!( + !cache + .replenish(program2, new_test_loaded_program(5, 6), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program2, new_test_loaded_program(11, 12), u64::MAX) + .0 + ); let program3 = Pubkey::new_unique(); - assert!(!cache.replenish(program3, new_test_loaded_program(25, 26)).0); + assert!( + !cache + .replenish(program3, new_test_loaded_program(25, 26), u64::MAX) + .0 + ); // The following is a special case, where there's an expiration slot let test_program = Arc::new(LoadedProgram { @@ -2275,7 +2420,7 @@ mod tests { tx_usage_counter: AtomicU64::default(), ix_usage_counter: AtomicU64::default(), }); - assert!(!cache.replenish(program1, test_program).0); + assert!(!cache.replenish(program1, test_program, u64::MAX).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 let mut missing = vec![ @@ -2359,8 +2504,16 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); - assert!(!cache.replenish(program1, new_test_loaded_program(5, 6)).0); + assert!( + !cache + .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program1, new_test_loaded_program(5, 6), u64::MAX) + .0 + ); cache.prune(10, 0); @@ -2399,11 +2552,23 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); - assert!(!cache.replenish(program1, new_test_loaded_program(5, 6)).0); + assert!( + !cache + .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) + .0 + ); + assert!( + !cache + .replenish(program1, new_test_loaded_program(5, 6), u64::MAX) + .0 + ); let program2 = Pubkey::new_unique(); - assert!(!cache.replenish(program2, new_test_loaded_program(10, 11)).0); + assert!( + !cache + .replenish(program2, new_test_loaded_program(10, 11), u64::MAX) + .0 + ); let mut missing = vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index b53f037db4c3d3..4b80070f69e2d7 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -1472,7 +1472,7 @@ impl Bank { drop(loaded_programs_cache); let recompiled = new.load_program(&key, false, Some(program_to_recompile)); let mut loaded_programs_cache = new.loaded_programs_cache.write().unwrap(); - loaded_programs_cache.replenish(key, recompiled); + loaded_programs_cache.replenish(key, recompiled, new.slot()); } } else if new.epoch() != loaded_programs_cache.latest_root_epoch || slot_index.saturating_add(slots_in_recompilation_phase) >= slots_in_epoch @@ -7772,10 +7772,11 @@ impl Bank { debug!("Adding program {} under {:?}", name, program_id); self.add_builtin_account(name.as_str(), &program_id, false); self.builtin_programs.insert(program_id); - self.loaded_programs_cache - .write() - .unwrap() - .replenish(program_id, Arc::new(builtin)); + self.loaded_programs_cache.write().unwrap().replenish( + program_id, + Arc::new(builtin), + self.slot, + ); debug!("Added program {} under {:?}", name, program_id); } From da2078d4a07cd10dea97def1a54e5d5a71a8bd20 Mon Sep 17 00:00:00 2001 From: Stephen Akridge Date: Sat, 10 Feb 2024 12:29:46 +0100 Subject: [PATCH 170/213] Add limit to looping in banking-stage --- core/src/banking_stage/consumer.rs | 3 ++- program-runtime/src/loaded_programs.rs | 25 ++++++++++++--------- runtime/src/bank.rs | 30 ++++++++++++++++++++++---- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/core/src/banking_stage/consumer.rs b/core/src/banking_stage/consumer.rs index ebdfeeacf07140..c8624a96aad7d4 100644 --- a/core/src/banking_stage/consumer.rs +++ b/core/src/banking_stage/consumer.rs @@ -554,7 +554,8 @@ impl Consumer { transaction_status_sender_enabled, &mut execute_and_commit_timings.execute_timings, None, // account_overrides - self.log_messages_bytes_limit + self.log_messages_bytes_limit, + true, )); execute_and_commit_timings.load_execute_us = load_execute_us; diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 60f9c36088c018..f9505e1c83424c 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -193,7 +193,7 @@ impl Stats { ("reloads", reloads, i64), ("insertions", insertions, i64), ("lost_insertions", lost_insertions, i64), - ("replacements", replacements, i64), + ("replace_entry", replacements, i64), ("one_hit_wonders", one_hit_wonders, i64), ("prunes_orphan", prunes_orphan, i64), ("prunes_environment", prunes_environment, i64), @@ -553,6 +553,7 @@ pub struct LoadedProgramsForTxBatch { entries: HashMap>, slot: Slot, pub environments: ProgramRuntimeEnvironments, + pub hit_max_limit: bool, } impl LoadedProgramsForTxBatch { @@ -561,6 +562,7 @@ impl LoadedProgramsForTxBatch { entries: HashMap::new(), slot, environments, + hit_max_limit: false, } } @@ -736,10 +738,10 @@ impl LoadedPrograms { key: Pubkey, entry: Arc, current_slot: Slot, - ) -> Arc { + ) -> (bool, Arc) { let (was_occupied, entry) = self.replenish(key, entry, current_slot); debug_assert!(!was_occupied); - entry + (was_occupied, entry) } pub fn prune_by_deployment_slot(&mut self, slot: Slot) { @@ -985,7 +987,7 @@ impl LoadedPrograms { slot: Slot, key: Pubkey, loaded_program: Arc, - ) { + ) -> bool { let second_level = self.entries.entry(key).or_default(); debug_assert_eq!( second_level.cooperative_loading_lock, @@ -1008,8 +1010,9 @@ impl LoadedPrograms { { self.stats.lost_insertions.fetch_add(1, Ordering::Relaxed); } - self.assign_program(key, loaded_program, slot); + let (was_replaced, _) = self.assign_program(key, loaded_program, slot); self.loading_task_waiter.notify(); + was_replaced } pub fn merge(&mut self, tx_batch_cache: &LoadedProgramsForTxBatch) { @@ -1232,11 +1235,13 @@ mod tests { slot: Slot, reason: LoadedProgramType, ) -> Arc { - cache.assign_program( - key, - Arc::new(LoadedProgram::new_tombstone(slot, reason)), - u64::MAX, - ) + cache + .assign_program( + key, + Arc::new(LoadedProgram::new_tombstone(slot, reason)), + u64::MAX, + ) + .1 } fn insert_unloaded_program( diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 4b80070f69e2d7..8ed13611e855a5 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -4378,6 +4378,7 @@ impl Bank { &mut timings, Some(&account_overrides), None, + true, ); let post_simulation_accounts = loaded_transactions @@ -5047,6 +5048,7 @@ impl Bank { fn replenish_program_cache( &self, program_accounts_map: &HashMap, + limit_to_load_programs: bool, ) -> LoadedProgramsForTxBatch { let mut missing_programs: Vec<(Pubkey, (LoadedProgramMatchCriteria, u64))> = if self.check_program_modification_slot { @@ -5092,11 +5094,16 @@ impl Bank { } // Submit our last completed loading task. if let Some((key, program)) = program_to_store.take() { - loaded_programs_cache.finish_cooperative_loading_task( + if loaded_programs_cache.finish_cooperative_loading_task( self.slot(), key, program, - ); + ) && limit_to_load_programs + { + let mut ret = LoadedProgramsForTxBatch::default(); + ret.hit_max_limit = true; + return ret; + } } // Figure out which program needs to be loaded next. let program_to_load = loaded_programs_cache.extract( @@ -5128,7 +5135,7 @@ impl Bank { loaded_programs_for_txs.unwrap() } - #[allow(clippy::type_complexity)] + #[allow(clippy::too_many_arguments, clippy::type_complexity)] pub fn load_and_execute_transactions( &self, batch: &TransactionBatch, @@ -5139,6 +5146,7 @@ impl Bank { timings: &mut ExecuteTimings, account_overrides: Option<&AccountOverrides>, log_messages_bytes_limit: Option, + limit_to_load_programs: bool, ) -> LoadAndExecuteTransactionsOutput { let sanitized_txs = batch.sanitized_transactions(); debug!("processing transactions: {}", sanitized_txs.len()); @@ -5208,9 +5216,22 @@ impl Bank { } let programs_loaded_for_tx_batch = Rc::new(RefCell::new( - self.replenish_program_cache(&program_accounts_map), + self.replenish_program_cache(&program_accounts_map, limit_to_load_programs), )); + if programs_loaded_for_tx_batch.borrow().hit_max_limit { + return LoadAndExecuteTransactionsOutput { + loaded_transactions: vec![], + execution_results: vec![], + retryable_transaction_indexes: vec![], + executed_transactions_count: 0, + executed_non_vote_transactions_count: 0, + executed_with_successful_result_count: 0, + signature_count: 0, + error_counters, + }; + } + let mut load_time = Measure::start("accounts_load"); let mut loaded_transactions = self.rc.accounts.load_accounts( &self.ancestors, @@ -6309,6 +6330,7 @@ impl Bank { timings, None, log_messages_bytes_limit, + false, ); let (last_blockhash, lamports_per_signature) = From dbf06e258ae418097049e845035d7d5502fe1327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Mei=C3=9Fner?= Date: Mon, 12 Feb 2024 20:26:37 +0000 Subject: [PATCH 171/213] Revert "Add slot based feature" 0c403697ca9cb0a18d93acf25a09c9c344c9c03b --- program-runtime/src/loaded_programs.rs | 301 ++++++------------------- runtime/src/bank.rs | 11 +- 2 files changed, 75 insertions(+), 237 deletions(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index f9505e1c83424c..c08d2689acfaaa 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -651,81 +651,41 @@ impl LoadedPrograms { &mut self, key: Pubkey, entry: Arc, - current_slot: Slot, ) -> (bool, Arc) { let slot_versions = &mut self.entries.entry(key).or_default().slot_versions; - if current_slot > 247806000 { - match slot_versions.binary_search_by(|at| { - at.effective_slot - .cmp(&entry.effective_slot) - .then(at.deployment_slot.cmp(&entry.deployment_slot)) - }) { - Ok(index) => { - let existing = slot_versions.get_mut(index).unwrap(); - if std::mem::discriminant(&existing.program) - != std::mem::discriminant(&entry.program) - { - // Copy over the usage counter to the new entry - entry.tx_usage_counter.fetch_add( - existing.tx_usage_counter.load(Ordering::Relaxed), - Ordering::Relaxed, - ); - entry.ix_usage_counter.fetch_add( - existing.ix_usage_counter.load(Ordering::Relaxed), - Ordering::Relaxed, - ); - self.stats.reloads.fetch_add(1, Ordering::Relaxed); - *existing = entry.clone(); - (false, entry) - } else { - // Something is wrong, I can feel it ... - self.stats.replacements.fetch_add(1, Ordering::Relaxed); - (true, existing.clone()) - } - } - Err(index) => { - self.stats.insertions.fetch_add(1, Ordering::Relaxed); - slot_versions.insert(index, entry.clone()); - (false, entry) - } - } - } else { - let index = slot_versions - .iter() - .position(|at| at.effective_slot >= entry.effective_slot); - if let Some(existing) = index.and_then(|index| slot_versions.get_mut(index)) { - if existing.deployment_slot == entry.deployment_slot - && existing.effective_slot == entry.effective_slot + match slot_versions.binary_search_by(|at| { + at.effective_slot + .cmp(&entry.effective_slot) + .then(at.deployment_slot.cmp(&entry.deployment_slot)) + }) { + Ok(index) => { + let existing = slot_versions.get_mut(index).unwrap(); + if std::mem::discriminant(&existing.program) + != std::mem::discriminant(&entry.program) { - if matches!(existing.program, LoadedProgramType::Unloaded(_)) { - // The unloaded program is getting reloaded - // Copy over the usage counter to the new entry - entry.tx_usage_counter.fetch_add( - existing.tx_usage_counter.load(Ordering::Relaxed), - Ordering::Relaxed, - ); - entry.ix_usage_counter.fetch_add( - existing.ix_usage_counter.load(Ordering::Relaxed), - Ordering::Relaxed, - ); - self.stats.reloads.fetch_add(1, Ordering::Relaxed); - } else if existing.is_tombstone() != entry.is_tombstone() { - // Either the old entry is tombstone and the new one is not. - // (Let's give the new entry a chance). - // Or, the old entry is not a tombstone and the new one is a tombstone. - // (Remove the old entry, as the tombstone makes it obsolete). - self.stats.insertions.fetch_add(1, Ordering::Relaxed); - } else { - self.stats.replacements.fetch_add(1, Ordering::Relaxed); - return (true, existing.clone()); - } + // Copy over the usage counter to the new entry + entry.tx_usage_counter.fetch_add( + existing.tx_usage_counter.load(Ordering::Relaxed), + Ordering::Relaxed, + ); + entry.ix_usage_counter.fetch_add( + existing.ix_usage_counter.load(Ordering::Relaxed), + Ordering::Relaxed, + ); + self.stats.reloads.fetch_add(1, Ordering::Relaxed); *existing = entry.clone(); - return (false, entry); + (false, entry) + } else { + // Something is wrong, I can feel it ... + self.stats.replacements.fetch_add(1, Ordering::Relaxed); + (true, existing.clone()) } } - self.stats.insertions.fetch_add(1, Ordering::Relaxed); - slot_versions.insert(index.unwrap_or(slot_versions.len()), entry.clone()); - (false, entry) + Err(index) => { + self.stats.insertions.fetch_add(1, Ordering::Relaxed); + slot_versions.insert(index, entry.clone()); + (false, entry) + } } } @@ -737,9 +697,8 @@ impl LoadedPrograms { &mut self, key: Pubkey, entry: Arc, - current_slot: Slot, ) -> (bool, Arc) { - let (was_occupied, entry) = self.replenish(key, entry, current_slot); + let (was_occupied, entry) = self.replenish(key, entry); debug_assert!(!was_occupied); (was_occupied, entry) } @@ -1010,14 +969,14 @@ impl LoadedPrograms { { self.stats.lost_insertions.fetch_add(1, Ordering::Relaxed); } - let (was_replaced, _) = self.assign_program(key, loaded_program, slot); + let (was_replaced, _) = self.assign_program(key, loaded_program); self.loading_task_waiter.notify(); was_replaced } pub fn merge(&mut self, tx_batch_cache: &LoadedProgramsForTxBatch) { tx_batch_cache.entries.iter().for_each(|(key, entry)| { - self.replenish(*key, entry.clone(), tx_batch_cache.slot); + self.replenish(*key, entry.clone()); }) } @@ -1236,11 +1195,7 @@ mod tests { reason: LoadedProgramType, ) -> Arc { cache - .assign_program( - key, - Arc::new(LoadedProgram::new_tombstone(slot, reason)), - u64::MAX, - ) + .assign_program(key, Arc::new(LoadedProgram::new_tombstone(slot, reason))) .1 } @@ -1264,7 +1219,7 @@ mod tests { .to_unloaded() .expect("Failed to unload the program"), ); - cache.replenish(key, unloaded, u64::MAX).1 + cache.replenish(key, unloaded).1 } fn num_matching_entries(cache: &LoadedPrograms, predicate: P) -> usize @@ -1306,7 +1261,6 @@ mod tests { (*deployment_slot) + 2, AtomicU64::new(usage_counter), ), - u64::MAX, ); programs.push((program1, *deployment_slot, usage_counter)); }); @@ -1340,7 +1294,6 @@ mod tests { (*deployment_slot) + 2, AtomicU64::new(usage_counter), ), - u64::MAX, ); programs.push((program2, *deployment_slot, usage_counter)); }); @@ -1373,7 +1326,6 @@ mod tests { (*deployment_slot) + 2, AtomicU64::new(usage_counter), ), - u64::MAX, ); programs.push((program3, *deployment_slot, usage_counter)); }); @@ -1463,7 +1415,6 @@ mod tests { cache.replenish( program, new_test_loaded_program_with_usage(i, i + 2, AtomicU64::new(i + 10)), - u64::MAX, ); }); @@ -1491,7 +1442,6 @@ mod tests { cache.replenish( program, new_test_loaded_program_with_usage(0, 2, AtomicU64::new(0)), - u64::MAX, ); cache.entries.values().for_each(|second_level| { @@ -1520,7 +1470,7 @@ mod tests { ); let loaded_program = new_test_loaded_program(10, 10); - let (existing, program) = cache.replenish(program1, loaded_program.clone(), u64::MAX); + let (existing, program) = cache.replenish(program1, loaded_program.clone()); assert!(!existing); assert_eq!(program, loaded_program); } @@ -1562,7 +1512,7 @@ mod tests { let program2 = Pubkey::new_unique(); assert!( !cache - .replenish(program2, new_test_builtin_program(50, 51), u64::MAX) + .replenish(program2, new_test_builtin_program(50, 51)) .0 ); let second_level = &cache @@ -1665,7 +1615,7 @@ mod tests { let program1 = Pubkey::new_unique(); let loaded_program = new_test_loaded_program(10, 10); - let (existing, program) = cache.replenish(program1, loaded_program.clone(), u64::MAX); + let (existing, program) = cache.replenish(program1, loaded_program.clone()); assert!(!existing); assert_eq!(program, loaded_program); @@ -1683,7 +1633,7 @@ mod tests { tx_usage_counter: AtomicU64::default(), ix_usage_counter: AtomicU64::default(), }); - let (existing, program) = cache.replenish(program1, updated_program.clone(), u64::MAX); + let (existing, program) = cache.replenish(program1, updated_program.clone()); assert!(!existing); assert_eq!(program, updated_program); @@ -1836,70 +1786,36 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program1, new_test_loaded_program(10, 11), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) - .0 - ); + assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); + assert!(!cache.replenish(program1, new_test_loaded_program(10, 11)).0); + assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); // Test: inserting duplicate entry return pre existing entry from the cache - assert!( - cache - .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) - .0 - ); + assert!(cache.replenish(program1, new_test_loaded_program(20, 21)).0); let program2 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program2, new_test_loaded_program(5, 6), u64::MAX) - .0 - ); + assert!(!cache.replenish(program2, new_test_loaded_program(5, 6)).0); assert!( !cache .replenish( program2, - new_test_loaded_program(11, 11 + DELAY_VISIBILITY_SLOT_OFFSET), - u64::MAX + new_test_loaded_program(11, 11 + DELAY_VISIBILITY_SLOT_OFFSET) ) .0 ); let program3 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program3, new_test_loaded_program(25, 26), u64::MAX) - .0 - ); + assert!(!cache.replenish(program3, new_test_loaded_program(25, 26)).0); let program4 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program4, new_test_loaded_program(0, 1), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program4, new_test_loaded_program(5, 6), u64::MAX) - .0 - ); + assert!(!cache.replenish(program4, new_test_loaded_program(0, 1)).0); + assert!(!cache.replenish(program4, new_test_loaded_program(5, 6)).0); // The following is a special case, where effective slot is 3 slots in the future assert!( !cache .replenish( program4, - new_test_loaded_program(15, 15 + DELAY_VISIBILITY_SLOT_OFFSET), - u64::MAX + new_test_loaded_program(15, 15 + DELAY_VISIBILITY_SLOT_OFFSET) ) .0 ); @@ -2025,7 +1941,7 @@ mod tests { tx_usage_counter: AtomicU64::default(), ix_usage_counter: AtomicU64::default(), }); - assert!(!cache.replenish(program4, test_program, u64::MAX).0); + assert!(!cache.replenish(program4, test_program).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 let mut missing = vec![ @@ -2178,35 +2094,15 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) - .0 - ); + assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); + assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); let program2 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program2, new_test_loaded_program(5, 6), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program2, new_test_loaded_program(11, 12), u64::MAX) - .0 - ); + assert!(!cache.replenish(program2, new_test_loaded_program(5, 6)).0); + assert!(!cache.replenish(program2, new_test_loaded_program(11, 12)).0); let program3 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program3, new_test_loaded_program(25, 26), u64::MAX) - .0 - ); + assert!(!cache.replenish(program3, new_test_loaded_program(25, 26)).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 let mut missing = vec![ @@ -2271,28 +2167,12 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) - .0 - ); + assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); + assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); let program2 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program2, new_test_loaded_program(5, 6), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program2, new_test_loaded_program(11, 12), u64::MAX) - .0 - ); + assert!(!cache.replenish(program2, new_test_loaded_program(5, 6)).0); + assert!(!cache.replenish(program2, new_test_loaded_program(11, 12)).0); let program3 = Pubkey::new_unique(); // Insert an unloaded program with correct/cache's environment at slot 25 @@ -2309,8 +2189,7 @@ mod tests { new_test_loaded_program(20, 21) .to_unloaded() .expect("Failed to create unloaded program") - ), - u64::MAX + ) ) .0 ); @@ -2385,35 +2264,15 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program1, new_test_loaded_program(10, 11), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program1, new_test_loaded_program(20, 21), u64::MAX) - .0 - ); + assert!(!cache.replenish(program1, new_test_loaded_program(10, 11)).0); + assert!(!cache.replenish(program1, new_test_loaded_program(20, 21)).0); let program2 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program2, new_test_loaded_program(5, 6), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program2, new_test_loaded_program(11, 12), u64::MAX) - .0 - ); + assert!(!cache.replenish(program2, new_test_loaded_program(5, 6)).0); + assert!(!cache.replenish(program2, new_test_loaded_program(11, 12)).0); let program3 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program3, new_test_loaded_program(25, 26), u64::MAX) - .0 - ); + assert!(!cache.replenish(program3, new_test_loaded_program(25, 26)).0); // The following is a special case, where there's an expiration slot let test_program = Arc::new(LoadedProgram { @@ -2425,7 +2284,7 @@ mod tests { tx_usage_counter: AtomicU64::default(), ix_usage_counter: AtomicU64::default(), }); - assert!(!cache.replenish(program1, test_program, u64::MAX).0); + assert!(!cache.replenish(program1, test_program).0); // Testing fork 0 - 5 - 11 - 15 - 16 - 19 - 21 - 23 with current slot at 19 let mut missing = vec![ @@ -2509,16 +2368,8 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program1, new_test_loaded_program(5, 6), u64::MAX) - .0 - ); + assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); + assert!(!cache.replenish(program1, new_test_loaded_program(5, 6)).0); cache.prune(10, 0); @@ -2557,23 +2408,11 @@ mod tests { cache.set_fork_graph(fork_graph); let program1 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program1, new_test_loaded_program(0, 1), u64::MAX) - .0 - ); - assert!( - !cache - .replenish(program1, new_test_loaded_program(5, 6), u64::MAX) - .0 - ); + assert!(!cache.replenish(program1, new_test_loaded_program(0, 1)).0); + assert!(!cache.replenish(program1, new_test_loaded_program(5, 6)).0); let program2 = Pubkey::new_unique(); - assert!( - !cache - .replenish(program2, new_test_loaded_program(10, 11), u64::MAX) - .0 - ); + assert!(!cache.replenish(program2, new_test_loaded_program(10, 11)).0); let mut missing = vec![ (program1, (LoadedProgramMatchCriteria::NoCriteria, 1)), diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 8ed13611e855a5..4f2260f72ea17c 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -1472,7 +1472,7 @@ impl Bank { drop(loaded_programs_cache); let recompiled = new.load_program(&key, false, Some(program_to_recompile)); let mut loaded_programs_cache = new.loaded_programs_cache.write().unwrap(); - loaded_programs_cache.replenish(key, recompiled, new.slot()); + loaded_programs_cache.replenish(key, recompiled); } } else if new.epoch() != loaded_programs_cache.latest_root_epoch || slot_index.saturating_add(slots_in_recompilation_phase) >= slots_in_epoch @@ -7794,11 +7794,10 @@ impl Bank { debug!("Adding program {} under {:?}", name, program_id); self.add_builtin_account(name.as_str(), &program_id, false); self.builtin_programs.insert(program_id); - self.loaded_programs_cache.write().unwrap().replenish( - program_id, - Arc::new(builtin), - self.slot, - ); + self.loaded_programs_cache + .write() + .unwrap() + .replenish(program_id, Arc::new(builtin)); debug!("Added program {} under {:?}", name, program_id); } From 04941eed46452e0fa6245cfc4eae1ff426d02299 Mon Sep 17 00:00:00 2001 From: steviez Date: Tue, 13 Feb 2024 08:34:52 -0700 Subject: [PATCH 172/213] v1.17.22 ==> v1.17.23 version bump (#35188) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd9f369ec70798..49c4372bb316c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.22" +version = "1.17.23" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.22" +version = "1.17.23" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.22" +version = "1.17.23" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.22" +version = "1.17.23" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.22" +version = "1.17.23" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.22" +version = "1.17.23" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.22" +version = "1.17.23" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.22" +version = "1.17.23" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.22" +version = "1.17.23" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.22" +version = "1.17.23" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.22" +version = "1.17.23" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.22" +version = "1.17.23" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.22" +version = "1.17.23" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.22" +version = "1.17.23" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.22" +version = "1.17.23" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.22" +version = "1.17.23" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.22" +version = "1.17.23" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.22" +version = "1.17.23" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.22" +version = "1.17.23" [[package]] name = "solana-merkle-root-bench" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.22" +version = "1.17.23" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.22" +version = "1.17.23" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.22" +version = "1.17.23" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.22" +version = "1.17.23" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.22" +version = "1.17.23" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.22" +version = "1.17.23" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.22" +version = "1.17.23" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.22" +version = "1.17.23" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.22" +version = "1.17.23" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.22" +version = "1.17.23" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.22" +version = "1.17.23" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.22" +version = "1.17.23" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.22" +version = "1.17.23" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.22" +version = "1.17.23" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.22" +version = "1.17.23" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index eea675a6f25657..b40dbd3510bc20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.22" +version = "1.17.23" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.22" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.22" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.22" } -solana-banks-client = { path = "banks-client", version = "=1.17.22" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.22" } -solana-banks-server = { path = "banks-server", version = "=1.17.22" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.22" } -solana-bloom = { path = "bloom", version = "=1.17.22" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.22" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.22" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.22", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.22" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.22" } -solana-cli = { path = "cli", version = "=1.17.22" } -solana-cli-config = { path = "cli-config", version = "=1.17.22" } -solana-cli-output = { path = "cli-output", version = "=1.17.22" } -solana-client = { path = "client", version = "=1.17.22" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.22" } -solana-config-program = { path = "programs/config", version = "=1.17.22" } -solana-core = { path = "core", version = "=1.17.22" } -solana-cost-model = { path = "cost-model", version = "=1.17.22" } -solana-download-utils = { path = "download-utils", version = "=1.17.22" } -solana-entry = { path = "entry", version = "=1.17.22" } -solana-faucet = { path = "faucet", version = "=1.17.22" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.22" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.22" } -solana-genesis = { path = "genesis", version = "=1.17.22" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.22" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.22" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.22" } -solana-gossip = { path = "gossip", version = "=1.17.22" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.22" } -solana-ledger = { path = "ledger", version = "=1.17.22" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.22" } -solana-logger = { path = "logger", version = "=1.17.22" } -solana-measure = { path = "measure", version = "=1.17.22" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.22" } -solana-metrics = { path = "metrics", version = "=1.17.22" } -solana-net-utils = { path = "net-utils", version = "=1.17.22" } -solana-notifier = { path = "notifier", version = "=1.17.22" } -solana-perf = { path = "perf", version = "=1.17.22" } -solana-poh = { path = "poh", version = "=1.17.22" } -solana-program = { path = "sdk/program", version = "=1.17.22" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.22" } -solana-program-test = { path = "program-test", version = "=1.17.22" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.22" } -solana-quic-client = { path = "quic-client", version = "=1.17.22" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.22" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.22", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.22" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.22", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.22" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.22" } -solana-runtime = { path = "runtime", version = "=1.17.22" } -solana-sdk = { path = "sdk", version = "=1.17.22" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.22" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.22" } -solana-stake-program = { path = "programs/stake", version = "=1.17.22" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.22" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.22" } -solana-streamer = { path = "streamer", version = "=1.17.22" } -solana-system-program = { path = "programs/system", version = "=1.17.22" } -solana-test-validator = { path = "test-validator", version = "=1.17.22" } -solana-thin-client = { path = "thin-client", version = "=1.17.22" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.22", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.22" } -solana-turbine = { path = "turbine", version = "=1.17.22" } -solana-udp-client = { path = "udp-client", version = "=1.17.22" } -solana-version = { path = "version", version = "=1.17.22" } -solana-vote = { path = "vote", version = "=1.17.22" } -solana-vote-program = { path = "programs/vote", version = "=1.17.22" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.22" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.22" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.22" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.23" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.23" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.23" } +solana-banks-client = { path = "banks-client", version = "=1.17.23" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.23" } +solana-banks-server = { path = "banks-server", version = "=1.17.23" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.23" } +solana-bloom = { path = "bloom", version = "=1.17.23" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.23" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.23" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.23", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.23" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.23" } +solana-cli = { path = "cli", version = "=1.17.23" } +solana-cli-config = { path = "cli-config", version = "=1.17.23" } +solana-cli-output = { path = "cli-output", version = "=1.17.23" } +solana-client = { path = "client", version = "=1.17.23" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.23" } +solana-config-program = { path = "programs/config", version = "=1.17.23" } +solana-core = { path = "core", version = "=1.17.23" } +solana-cost-model = { path = "cost-model", version = "=1.17.23" } +solana-download-utils = { path = "download-utils", version = "=1.17.23" } +solana-entry = { path = "entry", version = "=1.17.23" } +solana-faucet = { path = "faucet", version = "=1.17.23" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.23" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.23" } +solana-genesis = { path = "genesis", version = "=1.17.23" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.23" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.23" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.23" } +solana-gossip = { path = "gossip", version = "=1.17.23" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.23" } +solana-ledger = { path = "ledger", version = "=1.17.23" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.23" } +solana-logger = { path = "logger", version = "=1.17.23" } +solana-measure = { path = "measure", version = "=1.17.23" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.23" } +solana-metrics = { path = "metrics", version = "=1.17.23" } +solana-net-utils = { path = "net-utils", version = "=1.17.23" } +solana-notifier = { path = "notifier", version = "=1.17.23" } +solana-perf = { path = "perf", version = "=1.17.23" } +solana-poh = { path = "poh", version = "=1.17.23" } +solana-program = { path = "sdk/program", version = "=1.17.23" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.23" } +solana-program-test = { path = "program-test", version = "=1.17.23" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.23" } +solana-quic-client = { path = "quic-client", version = "=1.17.23" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.23" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.23", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.23" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.23", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.23" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.23" } +solana-runtime = { path = "runtime", version = "=1.17.23" } +solana-sdk = { path = "sdk", version = "=1.17.23" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.23" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.23" } +solana-stake-program = { path = "programs/stake", version = "=1.17.23" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.23" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.23" } +solana-streamer = { path = "streamer", version = "=1.17.23" } +solana-system-program = { path = "programs/system", version = "=1.17.23" } +solana-test-validator = { path = "test-validator", version = "=1.17.23" } +solana-thin-client = { path = "thin-client", version = "=1.17.23" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.23", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.23" } +solana-turbine = { path = "turbine", version = "=1.17.23" } +solana-udp-client = { path = "udp-client", version = "=1.17.23" } +solana-version = { path = "version", version = "=1.17.23" } +solana-vote = { path = "vote", version = "=1.17.23" } +solana-vote-program = { path = "programs/vote", version = "=1.17.23" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.23" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.23" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.23" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 7748b95b7a092b..db7494244b294a 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.22" +version = "1.17.23" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.22" +version = "1.17.23" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.22" +version = "1.17.23" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.22" +version = "1.17.23" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.22" +version = "1.17.23" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.22" +version = "1.17.23" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.22" +version = "1.17.23" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.22" +version = "1.17.23" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.22" +version = "1.17.23" dependencies = [ "ahash 0.8.5", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.22" +version = "1.17.23" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.22" +version = "1.17.23" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.22" +version = "1.17.23" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.22" +version = "1.17.23" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.22" +version = "1.17.23" dependencies = [ "ahash 0.8.5", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.22" +version = "1.17.23" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.22" +version = "1.17.23" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.22" +version = "1.17.23" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.22" +version = "1.17.23" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.22" +version = "1.17.23" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.22" +version = "1.17.23" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.22" +version = "1.17.23" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.22" +version = "1.17.23" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.22" +version = "1.17.23" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.22" +version = "1.17.23" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.22" +version = "1.17.23" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.22" +version = "1.17.23" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.22" +version = "1.17.23" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.22" +version = "1.17.23" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.22" +version = "1.17.23" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.22" +version = "1.17.23" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.22" +version = "1.17.23" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.22" +version = "1.17.23" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.22" +version = "1.17.23" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.22" +version = "1.17.23" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.22" +version = "1.17.23" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.22" +version = "1.17.23" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.22" +version = "1.17.23" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.22" +version = "1.17.23" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.22" +version = "1.17.23" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.22" +version = "1.17.23" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.22" +version = "1.17.23" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.22" +version = "1.17.23" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.22" +version = "1.17.23" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index caabf3657452e0..0dd476feee125b 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.22" +version = "1.17.23" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.22" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.22" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.22" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.22" } -solana-ledger = { path = "../../ledger", version = "=1.17.22" } -solana-logger = { path = "../../logger", version = "=1.17.22" } -solana-measure = { path = "../../measure", version = "=1.17.22" } -solana-program = { path = "../../sdk/program", version = "=1.17.22" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.22" } -solana-program-test = { path = "../../program-test", version = "=1.17.22" } -solana-runtime = { path = "../../runtime", version = "=1.17.22" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.22" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.22" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.22", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.22" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.22" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.22" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.22", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.22" } -solana-sdk = { path = "../../sdk", version = "=1.17.22" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.22" } -solana-validator = { path = "../../validator", version = "=1.17.22" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.22" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.23" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.23" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.23" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.23" } +solana-ledger = { path = "../../ledger", version = "=1.17.23" } +solana-logger = { path = "../../logger", version = "=1.17.23" } +solana-measure = { path = "../../measure", version = "=1.17.23" } +solana-program = { path = "../../sdk/program", version = "=1.17.23" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.23" } +solana-program-test = { path = "../../program-test", version = "=1.17.23" } +solana-runtime = { path = "../../runtime", version = "=1.17.23" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.23" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.23" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.23", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.23" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.23" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.23" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.23", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.23" } +solana-sdk = { path = "../../sdk", version = "=1.17.23" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.23" } +solana-validator = { path = "../../validator", version = "=1.17.23" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.23" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 15aa75427c749d..b97f020135e302 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.22" +version = "1.17.23" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.22" } +solana-program = { path = "../../../../program", version = "=1.17.23" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 57085ed92f2d31..b227d544603c33 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.22" +version = "1.17.23" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.22" } +solana-program = { path = "../../../../program", version = "=1.17.23" } [lib] crate-type = ["cdylib"] From 17eb75ab49b05899ba41f54a4168684fdc691310 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 15 Feb 2024 12:44:00 +0900 Subject: [PATCH 173/213] v1.17: Report lost_insertions metrics correctly (backport of #35191) (#35198) Report lost_insertions metrics correctly (#35191) (cherry picked from commit 4b77ee5a1c8cad855f52babc30a12bac4c87f17b) Co-authored-by: Ryo Onodera --- program-runtime/src/loaded_programs.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index c08d2689acfaaa..0e49663843ca0d 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -178,7 +178,7 @@ impl Stats { let evictions: u64 = self.evictions.values().sum(); let reloads = self.reloads.load(Ordering::Relaxed); let insertions = self.insertions.load(Ordering::Relaxed); - let lost_insertions = self.insertions.load(Ordering::Relaxed); + let lost_insertions = self.lost_insertions.load(Ordering::Relaxed); let replacements = self.replacements.load(Ordering::Relaxed); let one_hit_wonders = self.one_hit_wonders.load(Ordering::Relaxed); let prunes_orphan = self.prunes_orphan.load(Ordering::Relaxed); From d56a08300a927cb0e065e9f0922cc8f8feb56340 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 20 Feb 2024 14:22:30 -0800 Subject: [PATCH 174/213] v1.17: replay: reload tower if set-identity during startup (backport of #35173) (#35256) replay: reload tower if set-identity during startup (#35173) * replay: reload tower if set-identity during startup * pr feedback: add unit tests * pr feedback: use tower.node_pubkey, more descriptive names (cherry picked from commit befe8b9d983f6c386241a68327b602bed3e158fc) Co-authored-by: Ashwin Sekar --- core/src/consensus.rs | 22 ++++++ core/src/replay_stage.rs | 126 ++++++++++++++++++++++++------ sdk/program/src/vote/state/mod.rs | 18 +++++ 3 files changed, 141 insertions(+), 25 deletions(-) diff --git a/core/src/consensus.rs b/core/src/consensus.rs index 675dfc691e675d..816e9d1b5e2af7 100644 --- a/core/src/consensus.rs +++ b/core/src/consensus.rs @@ -279,6 +279,28 @@ impl Tower { } } + #[cfg(test)] + pub fn new_random(node_pubkey: Pubkey) -> Self { + use rand::Rng; + + let mut rng = rand::thread_rng(); + let root_slot = rng.gen(); + let vote_state = VoteState::new_rand_for_tests(node_pubkey, root_slot); + let last_vote = VoteStateUpdate::from( + vote_state + .votes + .iter() + .map(|lv| (lv.slot(), lv.confirmation_count())) + .collect::>(), + ); + Self { + node_pubkey, + vote_state, + last_vote: VoteTransaction::CompactVoteStateUpdate(last_vote), + ..Tower::default() + } + } + pub fn new_from_bankforks( bank_forks: &BankForks, node_pubkey: &Pubkey, diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index b91b103fae3b12..317f54e3d71652 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -545,6 +545,21 @@ impl ReplayStage { let _exit = Finalizer::new(exit.clone()); let mut identity_keypair = cluster_info.keypair().clone(); let mut my_pubkey = identity_keypair.pubkey(); + if my_pubkey != tower.node_pubkey { + // set-identity was called during the startup procedure, ensure the tower is consistent + // before starting the loop. further calls to set-identity will reload the tower in the loop + let my_old_pubkey = tower.node_pubkey; + tower = Self::load_tower( + tower_storage.as_ref(), + &my_pubkey, + &vote_account, + &bank_forks, + ); + warn!( + "Identity changed during startup from {} to {}", + my_old_pubkey, my_pubkey + ); + } let (mut progress, mut heaviest_subtree_fork_choice) = Self::initialize_progress_and_fork_choice_with_locked_bank_forks( &bank_forks, @@ -947,28 +962,12 @@ impl ReplayStage { my_pubkey = identity_keypair.pubkey(); // Load the new identity's tower - tower = Tower::restore(tower_storage.as_ref(), &my_pubkey) - .and_then(|restored_tower| { - let root_bank = bank_forks.read().unwrap().root_bank(); - let slot_history = root_bank.get_slot_history(); - restored_tower.adjust_lockouts_after_replay( - root_bank.slot(), - &slot_history, - ) - }) - .unwrap_or_else(|err| { - if err.is_file_missing() { - Tower::new_from_bankforks( - &bank_forks.read().unwrap(), - &my_pubkey, - &vote_account, - ) - } else { - error!("Failed to load tower for {}: {}", my_pubkey, err); - std::process::exit(1); - } - }); - + tower = Self::load_tower( + tower_storage.as_ref(), + &my_pubkey, + &vote_account, + &bank_forks, + ); // Ensure the validator can land votes with the new identity before // becoming leader has_new_vote_been_rooted = !wait_for_vote_to_start_leader; @@ -1118,6 +1117,32 @@ impl ReplayStage { }) } + fn load_tower( + tower_storage: &dyn TowerStorage, + node_pubkey: &Pubkey, + vote_account: &Pubkey, + bank_forks: &Arc>, + ) -> Tower { + Tower::restore(tower_storage, node_pubkey) + .and_then(|restored_tower| { + let root_bank = bank_forks.read().unwrap().root_bank(); + let slot_history = root_bank.get_slot_history(); + restored_tower.adjust_lockouts_after_replay(root_bank.slot(), &slot_history) + }) + .unwrap_or_else(|err| { + if err.is_file_missing() { + Tower::new_from_bankforks( + &bank_forks.read().unwrap(), + node_pubkey, + vote_account, + ) + } else { + error!("Failed to load tower for {}: {}", node_pubkey, err); + std::process::exit(1); + } + }) + } + fn check_for_vote_only_mode( heaviest_bank_slot: Slot, forks_root: Slot, @@ -4086,9 +4111,9 @@ pub(crate) mod tests { crate::{ consensus::{ progress_map::{ValidatorStakeInfo, RETRANSMIT_BASE_DELAY_MS}, - tower_storage::NullTowerStorage, + tower_storage::{FileTowerStorage, NullTowerStorage}, tree_diff::TreeDiff, - Tower, + Tower, VOTE_THRESHOLD_DEPTH, }, replay_stage::ReplayStage, vote_simulator::{self, VoteSimulator}, @@ -4110,7 +4135,7 @@ pub(crate) mod tests { }, solana_runtime::{ accounts_background_service::AbsRequestSender, - commitment::BlockCommitment, + commitment::{BlockCommitment, VOTE_THRESHOLD_SIZE}, genesis_utils::{GenesisConfigInfo, ValidatorVoteKeypairs}, }, solana_sdk::{ @@ -4134,6 +4159,7 @@ pub(crate) mod tests { iter, sync::{atomic::AtomicU64, Arc, RwLock}, }, + tempfile::tempdir, trees::{tr, Tree}, }; @@ -8327,4 +8353,54 @@ pub(crate) mod tests { assert_eq!(reset_fork, Some(4)); assert_eq!(failures, vec![HeaviestForkFailures::LockedOut(4),]); } + + #[test] + fn test_tower_load_missing() { + let tower_file = tempdir().unwrap().into_path(); + let tower_storage = FileTowerStorage::new(tower_file); + let node_pubkey = Pubkey::new_unique(); + let vote_account = Pubkey::new_unique(); + let tree = tr(0) / (tr(1) / (tr(3) / (tr(4))) / (tr(2) / (tr(5) / (tr(6))))); + let generate_votes = |pubkeys: Vec| { + pubkeys + .into_iter() + .zip(iter::once(vec![0, 1, 2, 5, 6]).chain(iter::repeat(vec![0, 1, 3, 4]).take(2))) + .collect() + }; + let (vote_simulator, _blockstore) = + setup_forks_from_tree(tree, 3, Some(Box::new(generate_votes))); + let bank_forks = vote_simulator.bank_forks; + + let tower = + ReplayStage::load_tower(&tower_storage, &node_pubkey, &vote_account, &bank_forks); + let expected_tower = Tower::new_for_tests(VOTE_THRESHOLD_DEPTH, VOTE_THRESHOLD_SIZE); + assert_eq!(tower.vote_state, expected_tower.vote_state); + assert_eq!(tower.node_pubkey, node_pubkey); + } + + #[test] + fn test_tower_load() { + let tower_file = tempdir().unwrap().into_path(); + let tower_storage = FileTowerStorage::new(tower_file); + let node_keypair = Keypair::new(); + let node_pubkey = node_keypair.pubkey(); + let vote_account = Pubkey::new_unique(); + let tree = tr(0) / (tr(1) / (tr(3) / (tr(4))) / (tr(2) / (tr(5) / (tr(6))))); + let generate_votes = |pubkeys: Vec| { + pubkeys + .into_iter() + .zip(iter::once(vec![0, 1, 2, 5, 6]).chain(iter::repeat(vec![0, 1, 3, 4]).take(2))) + .collect() + }; + let (vote_simulator, _blockstore) = + setup_forks_from_tree(tree, 3, Some(Box::new(generate_votes))); + let bank_forks = vote_simulator.bank_forks; + let expected_tower = Tower::new_random(node_pubkey); + expected_tower.save(&tower_storage, &node_keypair).unwrap(); + + let tower = + ReplayStage::load_tower(&tower_storage, &node_pubkey, &vote_account, &bank_forks); + assert_eq!(tower.vote_state, expected_tower.vote_state); + assert_eq!(tower.node_pubkey, expected_tower.node_pubkey); + } } diff --git a/sdk/program/src/vote/state/mod.rs b/sdk/program/src/vote/state/mod.rs index 6d77d3ab5d9dda..31e2ea6f31e7ee 100644 --- a/sdk/program/src/vote/state/mod.rs +++ b/sdk/program/src/vote/state/mod.rs @@ -325,6 +325,24 @@ impl VoteState { } } + pub fn new_rand_for_tests(node_pubkey: Pubkey, root_slot: Slot) -> Self { + let votes = (1..32) + .map(|x| LandedVote { + latency: 0, + lockout: Lockout::new_with_confirmation_count( + u64::from(x).saturating_add(root_slot), + 32_u32.saturating_sub(x), + ), + }) + .collect(); + Self { + node_pubkey, + root_slot: Some(root_slot), + votes, + ..VoteState::default() + } + } + pub fn get_authorized_voter(&self, epoch: Epoch) -> Option { self.authorized_voters.get_authorized_voter(epoch) } From 07b69c91944e377efe064ea12b0a2135da4d9535 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 16:33:51 -0500 Subject: [PATCH 175/213] v1.17: validator: ignore too old tower error (backport of #35229) (#35278) validator: ignore too old tower error (#35229) * validator: ignore too old tower error * Update core/src/replay_stage.rs Co-authored-by: Ashwin Sekar * remove redundant references --------- Co-authored-by: Ashwin Sekar (cherry picked from commit 531793b4be6d6c55f7c6a13f6da1982a7387f185) Co-authored-by: DimAn --- core/src/consensus.rs | 3 +++ core/src/replay_stage.rs | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/core/src/consensus.rs b/core/src/consensus.rs index 816e9d1b5e2af7..59c0adf724346c 100644 --- a/core/src/consensus.rs +++ b/core/src/consensus.rs @@ -1449,6 +1449,9 @@ impl TowerError { false } } + pub fn is_too_old(&self) -> bool { + matches!(self, TowerError::TooOldTower(_, _)) + } } #[derive(Debug)] diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index 317f54e3d71652..aaf4a09d266034 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -1136,6 +1136,13 @@ impl ReplayStage { node_pubkey, vote_account, ) + } else if err.is_too_old() { + warn!("Failed to load tower, too old for {}: {}. Creating a new tower from bankforks.", node_pubkey, err); + Tower::new_from_bankforks( + &bank_forks.read().unwrap(), + node_pubkey, + vote_account, + ) } else { error!("Failed to load tower for {}: {}", node_pubkey, err); std::process::exit(1); From 5b2409779034cdf7328efaa669d21e7de9f04e97 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 18:51:44 -0800 Subject: [PATCH 176/213] v1.17: validator: include waited_for_supermajority in startup metric (backport of #35137) (#35276) * validator: include waited_for_supermajority in startup metric (#35137) (cherry picked from commit b0134ab04da4a8774e4f6d681d5ecbb5dba9a455) # Conflicts: # core/src/validator.rs * fix conflicts --------- Co-authored-by: Ashwin Sekar --- core/src/validator.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/validator.rs b/core/src/validator.rs index 550c1cd1c809e5..62ef6fe37620bc 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -1328,6 +1328,8 @@ impl Validator { ("id", id.to_string(), String), ("version", solana_version::version!(), String), ("cluster_type", cluster_type as u32, i64), + ("waited_for_supermajority", waited_for_supermajority, bool), + ("expected_shred_version", config.expected_shred_version, Option), ); *start_progress.write().unwrap() = ValidatorStartProgress::Running; From ee1365a96bfa0a4711c210ae6f1579abdf58d6c1 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sat, 24 Feb 2024 00:16:06 -0600 Subject: [PATCH 177/213] Update version to v1.17.24 (#35313) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 49c4372bb316c1..d2402149c93099 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.23" +version = "1.17.24" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.23" +version = "1.17.24" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.23" +version = "1.17.24" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.23" +version = "1.17.24" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.23" +version = "1.17.24" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.23" +version = "1.17.24" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.23" +version = "1.17.24" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.23" +version = "1.17.24" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.23" +version = "1.17.24" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.23" +version = "1.17.24" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.23" +version = "1.17.24" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.23" +version = "1.17.24" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.23" +version = "1.17.24" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.23" +version = "1.17.24" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.23" +version = "1.17.24" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.23" +version = "1.17.24" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.23" +version = "1.17.24" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.23" +version = "1.17.24" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.23" +version = "1.17.24" [[package]] name = "solana-merkle-root-bench" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.23" +version = "1.17.24" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.23" +version = "1.17.24" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.23" +version = "1.17.24" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.23" +version = "1.17.24" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.23" +version = "1.17.24" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.23" +version = "1.17.24" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.23" +version = "1.17.24" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.23" +version = "1.17.24" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.23" +version = "1.17.24" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.23" +version = "1.17.24" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.23" +version = "1.17.24" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.23" +version = "1.17.24" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.23" +version = "1.17.24" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.23" +version = "1.17.24" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.23" +version = "1.17.24" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index b40dbd3510bc20..de4dbe59e60152 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.23" +version = "1.17.24" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.23" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.23" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.23" } -solana-banks-client = { path = "banks-client", version = "=1.17.23" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.23" } -solana-banks-server = { path = "banks-server", version = "=1.17.23" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.23" } -solana-bloom = { path = "bloom", version = "=1.17.23" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.23" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.23" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.23", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.23" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.23" } -solana-cli = { path = "cli", version = "=1.17.23" } -solana-cli-config = { path = "cli-config", version = "=1.17.23" } -solana-cli-output = { path = "cli-output", version = "=1.17.23" } -solana-client = { path = "client", version = "=1.17.23" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.23" } -solana-config-program = { path = "programs/config", version = "=1.17.23" } -solana-core = { path = "core", version = "=1.17.23" } -solana-cost-model = { path = "cost-model", version = "=1.17.23" } -solana-download-utils = { path = "download-utils", version = "=1.17.23" } -solana-entry = { path = "entry", version = "=1.17.23" } -solana-faucet = { path = "faucet", version = "=1.17.23" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.23" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.23" } -solana-genesis = { path = "genesis", version = "=1.17.23" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.23" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.23" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.23" } -solana-gossip = { path = "gossip", version = "=1.17.23" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.23" } -solana-ledger = { path = "ledger", version = "=1.17.23" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.23" } -solana-logger = { path = "logger", version = "=1.17.23" } -solana-measure = { path = "measure", version = "=1.17.23" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.23" } -solana-metrics = { path = "metrics", version = "=1.17.23" } -solana-net-utils = { path = "net-utils", version = "=1.17.23" } -solana-notifier = { path = "notifier", version = "=1.17.23" } -solana-perf = { path = "perf", version = "=1.17.23" } -solana-poh = { path = "poh", version = "=1.17.23" } -solana-program = { path = "sdk/program", version = "=1.17.23" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.23" } -solana-program-test = { path = "program-test", version = "=1.17.23" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.23" } -solana-quic-client = { path = "quic-client", version = "=1.17.23" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.23" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.23", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.23" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.23", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.23" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.23" } -solana-runtime = { path = "runtime", version = "=1.17.23" } -solana-sdk = { path = "sdk", version = "=1.17.23" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.23" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.23" } -solana-stake-program = { path = "programs/stake", version = "=1.17.23" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.23" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.23" } -solana-streamer = { path = "streamer", version = "=1.17.23" } -solana-system-program = { path = "programs/system", version = "=1.17.23" } -solana-test-validator = { path = "test-validator", version = "=1.17.23" } -solana-thin-client = { path = "thin-client", version = "=1.17.23" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.23", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.23" } -solana-turbine = { path = "turbine", version = "=1.17.23" } -solana-udp-client = { path = "udp-client", version = "=1.17.23" } -solana-version = { path = "version", version = "=1.17.23" } -solana-vote = { path = "vote", version = "=1.17.23" } -solana-vote-program = { path = "programs/vote", version = "=1.17.23" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.23" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.23" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.23" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.24" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.24" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.24" } +solana-banks-client = { path = "banks-client", version = "=1.17.24" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.24" } +solana-banks-server = { path = "banks-server", version = "=1.17.24" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.24" } +solana-bloom = { path = "bloom", version = "=1.17.24" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.24" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.24" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.24", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.24" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.24" } +solana-cli = { path = "cli", version = "=1.17.24" } +solana-cli-config = { path = "cli-config", version = "=1.17.24" } +solana-cli-output = { path = "cli-output", version = "=1.17.24" } +solana-client = { path = "client", version = "=1.17.24" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.24" } +solana-config-program = { path = "programs/config", version = "=1.17.24" } +solana-core = { path = "core", version = "=1.17.24" } +solana-cost-model = { path = "cost-model", version = "=1.17.24" } +solana-download-utils = { path = "download-utils", version = "=1.17.24" } +solana-entry = { path = "entry", version = "=1.17.24" } +solana-faucet = { path = "faucet", version = "=1.17.24" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.24" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.24" } +solana-genesis = { path = "genesis", version = "=1.17.24" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.24" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.24" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.24" } +solana-gossip = { path = "gossip", version = "=1.17.24" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.24" } +solana-ledger = { path = "ledger", version = "=1.17.24" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.24" } +solana-logger = { path = "logger", version = "=1.17.24" } +solana-measure = { path = "measure", version = "=1.17.24" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.24" } +solana-metrics = { path = "metrics", version = "=1.17.24" } +solana-net-utils = { path = "net-utils", version = "=1.17.24" } +solana-notifier = { path = "notifier", version = "=1.17.24" } +solana-perf = { path = "perf", version = "=1.17.24" } +solana-poh = { path = "poh", version = "=1.17.24" } +solana-program = { path = "sdk/program", version = "=1.17.24" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.24" } +solana-program-test = { path = "program-test", version = "=1.17.24" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.24" } +solana-quic-client = { path = "quic-client", version = "=1.17.24" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.24" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.24", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.24" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.24", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.24" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.24" } +solana-runtime = { path = "runtime", version = "=1.17.24" } +solana-sdk = { path = "sdk", version = "=1.17.24" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.24" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.24" } +solana-stake-program = { path = "programs/stake", version = "=1.17.24" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.24" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.24" } +solana-streamer = { path = "streamer", version = "=1.17.24" } +solana-system-program = { path = "programs/system", version = "=1.17.24" } +solana-test-validator = { path = "test-validator", version = "=1.17.24" } +solana-thin-client = { path = "thin-client", version = "=1.17.24" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.24", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.24" } +solana-turbine = { path = "turbine", version = "=1.17.24" } +solana-udp-client = { path = "udp-client", version = "=1.17.24" } +solana-version = { path = "version", version = "=1.17.24" } +solana-vote = { path = "vote", version = "=1.17.24" } +solana-vote-program = { path = "programs/vote", version = "=1.17.24" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.24" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.24" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.24" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index db7494244b294a..49cb000bb25b94 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.23" +version = "1.17.24" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.23" +version = "1.17.24" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.23" +version = "1.17.24" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.23" +version = "1.17.24" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.23" +version = "1.17.24" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.23" +version = "1.17.24" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.23" +version = "1.17.24" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.23" +version = "1.17.24" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.23" +version = "1.17.24" dependencies = [ "ahash 0.8.5", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.23" +version = "1.17.24" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.23" +version = "1.17.24" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.23" +version = "1.17.24" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.23" +version = "1.17.24" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.23" +version = "1.17.24" dependencies = [ "ahash 0.8.5", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.23" +version = "1.17.24" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.23" +version = "1.17.24" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.23" +version = "1.17.24" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.23" +version = "1.17.24" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.23" +version = "1.17.24" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.23" +version = "1.17.24" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.23" +version = "1.17.24" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.23" +version = "1.17.24" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.23" +version = "1.17.24" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.23" +version = "1.17.24" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.23" +version = "1.17.24" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.23" +version = "1.17.24" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.23" +version = "1.17.24" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.23" +version = "1.17.24" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.23" +version = "1.17.24" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.23" +version = "1.17.24" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.23" +version = "1.17.24" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.23" +version = "1.17.24" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.23" +version = "1.17.24" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.23" +version = "1.17.24" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.23" +version = "1.17.24" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.23" +version = "1.17.24" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.23" +version = "1.17.24" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.23" +version = "1.17.24" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.23" +version = "1.17.24" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.23" +version = "1.17.24" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.23" +version = "1.17.24" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.23" +version = "1.17.24" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.23" +version = "1.17.24" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 0dd476feee125b..e774075cbe0403 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.23" +version = "1.17.24" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.23" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.23" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.23" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.23" } -solana-ledger = { path = "../../ledger", version = "=1.17.23" } -solana-logger = { path = "../../logger", version = "=1.17.23" } -solana-measure = { path = "../../measure", version = "=1.17.23" } -solana-program = { path = "../../sdk/program", version = "=1.17.23" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.23" } -solana-program-test = { path = "../../program-test", version = "=1.17.23" } -solana-runtime = { path = "../../runtime", version = "=1.17.23" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.23" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.23" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.23", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.23" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.23" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.23" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.23", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.23" } -solana-sdk = { path = "../../sdk", version = "=1.17.23" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.23" } -solana-validator = { path = "../../validator", version = "=1.17.23" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.23" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.24" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.24" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.24" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.24" } +solana-ledger = { path = "../../ledger", version = "=1.17.24" } +solana-logger = { path = "../../logger", version = "=1.17.24" } +solana-measure = { path = "../../measure", version = "=1.17.24" } +solana-program = { path = "../../sdk/program", version = "=1.17.24" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.24" } +solana-program-test = { path = "../../program-test", version = "=1.17.24" } +solana-runtime = { path = "../../runtime", version = "=1.17.24" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.24" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.24" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.24", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.24" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.24" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.24" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.24", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.24" } +solana-sdk = { path = "../../sdk", version = "=1.17.24" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.24" } +solana-validator = { path = "../../validator", version = "=1.17.24" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.24" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index b97f020135e302..5ab5a104042c7f 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.23" +version = "1.17.24" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.23" } +solana-program = { path = "../../../../program", version = "=1.17.24" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index b227d544603c33..7c0b03eeddefd5 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.23" +version = "1.17.24" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.23" } +solana-program = { path = "../../../../program", version = "=1.17.24" } [lib] crate-type = ["cdylib"] From 1390ec9ec03a2570bf3bc193364e9df07669992b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 1 Mar 2024 16:32:19 -0500 Subject: [PATCH 178/213] v1.17: Adds more info to panic message in AccountsHashVerifier (backport of #35353) (#35358) Adds more info to panic message in AccountsHashVerifier (#35353) (cherry picked from commit 6aaaf858c98a59a7c266ee4b302eb932a929c638) Co-authored-by: Brooks --- accounts-db/src/accounts_db.rs | 12 ++++++++++++ core/src/accounts_hash_verifier.rs | 25 ++++++++++++++++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/accounts-db/src/accounts_db.rs b/accounts-db/src/accounts_db.rs index e33176a6e74393..9dece549903751 100644 --- a/accounts-db/src/accounts_db.rs +++ b/accounts-db/src/accounts_db.rs @@ -7511,6 +7511,11 @@ impl AccountsDb { self.accounts_hashes.lock().unwrap().get(&slot).cloned() } + /// Get all accounts hashes + pub fn get_accounts_hashes(&self) -> HashMap { + self.accounts_hashes.lock().unwrap().clone() + } + /// Set the incremental accounts hash for `slot` /// /// returns the previous incremental accounts hash for `slot` @@ -7547,6 +7552,13 @@ impl AccountsDb { .cloned() } + /// Get all incremental accounts hashes + pub fn get_incremental_accounts_hashes( + &self, + ) -> HashMap { + self.incremental_accounts_hashes.lock().unwrap().clone() + } + /// Purge accounts hashes that are older than `last_full_snapshot_slot` /// /// Should only be called by AccountsHashVerifier, since it consumes the accounts hashes and diff --git a/core/src/accounts_hash_verifier.rs b/core/src/accounts_hash_verifier.rs index 4fbacabd7bf80e..1d7e5ae7fb5832 100644 --- a/core/src/accounts_hash_verifier.rs +++ b/core/src/accounts_hash_verifier.rs @@ -321,11 +321,26 @@ impl AccountsHashVerifier { else { panic!("Calculating incremental accounts hash requires a base slot"); }; - let (base_accounts_hash, base_capitalization) = accounts_package - .accounts - .accounts_db - .get_accounts_hash(base_slot) - .expect("incremental snapshot requires accounts hash and capitalization from the full snapshot it is based on"); + let accounts_db = &accounts_package.accounts.accounts_db; + let Some((base_accounts_hash, base_capitalization)) = + accounts_db.get_accounts_hash(base_slot) + else { + panic!( + "incremental snapshot requires accounts hash and capitalization \ + from the full snapshot it is based on \n\ + package: {accounts_package:?} \n\ + accounts hashes: {:?} \n\ + incremental accounts hashes: {:?} \n\ + full snapshot archives: {:?} \n\ + bank snapshots: {:?}", + accounts_db.get_accounts_hashes(), + accounts_db.get_incremental_accounts_hashes(), + snapshot_utils::get_full_snapshot_archives( + &snapshot_config.full_snapshot_archives_dir, + ), + snapshot_utils::get_bank_snapshots(&snapshot_config.bank_snapshots_dir), + ); + }; let (incremental_accounts_hash, incremental_capitalization) = Self::_calculate_incremental_accounts_hash(accounts_package, base_slot); let bank_incremental_snapshot_persistence = BankIncrementalSnapshotPersistence { From d0ed878d573c7f5391cd2cba20465407f63f11a8 Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sat, 2 Mar 2024 22:52:04 -0600 Subject: [PATCH 179/213] Update version to v1.17.25 (#35406) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d2402149c93099..ce6941ca0287d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2137,7 +2137,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "regex", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.24" +version = "1.17.25" dependencies = [ "regex", ] @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.24" +version = "1.17.25" dependencies = [ "protobuf-src", "tonic-build", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.24" +version = "1.17.25" [[package]] name = "rcgen" @@ -5099,7 +5099,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.24" +version = "1.17.25" dependencies = [ "Inflector", "assert_matches", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 2.33.3", "log", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 2.33.3", "log", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.24" +version = "1.17.25" dependencies = [ "arrayref", "assert_matches", @@ -5232,7 +5232,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "bytemuck", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -5262,7 +5262,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.24" +version = "1.17.25" dependencies = [ "serde", "solana-sdk", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "crossbeam-channel", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bv", "fnv", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bv", "bytemuck", @@ -5450,7 +5450,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "solana-logger", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_cmd", "bzip2", @@ -5479,11 +5479,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.24" +version = "1.17.25" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.24" +version = "1.17.25" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5494,7 +5494,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "chrono", @@ -5511,7 +5511,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "chrono", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.24" +version = "1.17.25" dependencies = [ "anyhow", "dirs-next", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.24" +version = "1.17.25" dependencies = [ "Inflector", "base64 0.21.4", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-trait", "bincode", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.24" +version = "1.17.25" dependencies = [ "futures-util", "rand 0.8.5", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5693,7 +5693,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-trait", "bincode", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.24" +version = "1.17.25" dependencies = [ "lazy_static", "log", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "clap 3.2.23", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "console", "indicatif", @@ -5880,7 +5880,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "ed25519-dalek", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -5913,7 +5913,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "byteorder", @@ -5935,7 +5935,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.24" +version = "1.17.25" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.24" +version = "1.17.25" dependencies = [ "proc-macro2", "quote", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.24" +version = "1.17.25" dependencies = [ "base64 0.21.4", "bincode", @@ -6000,7 +6000,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "solana-accounts-db", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "solana-sdk", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bs58", "crossbeam-channel", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.17.24" +version = "1.17.25" dependencies = [ "atty", "bincode", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bs58", "clap 3.2.23", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_cmd", "bs58", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "log", @@ -6278,7 +6278,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.24" +version = "1.17.25" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.24" +version = "1.17.25" dependencies = [ "env_logger", "lazy_static", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "solana-sdk", @@ -6346,11 +6346,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.24" +version = "1.17.25" [[package]] name = "solana-merkle-root-bench" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 2.33.3", "log", @@ -6363,7 +6363,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.24" +version = "1.17.25" dependencies = [ "fast-math", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.24" +version = "1.17.25" dependencies = [ "crossbeam-channel", "env_logger", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "clap 3.2.23", @@ -6419,7 +6419,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "reqwest", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.24" +version = "1.17.25" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6460,7 +6460,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 3.2.23", "log", @@ -6496,7 +6496,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "anyhow", "ark-bn254", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "async-trait", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "anyhow", "crossbeam-channel", @@ -6635,7 +6635,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-mutex", "async-trait", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.24" +version = "1.17.25" dependencies = [ "lazy_static", "num_cpus", @@ -6671,7 +6671,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "console", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.24" +version = "1.17.25" dependencies = [ "base64 0.21.4", "bincode", @@ -6749,7 +6749,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "async-trait", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.24" +version = "1.17.25" dependencies = [ "base64 0.21.4", "bs58", @@ -6798,7 +6798,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "anyhow", "clap 2.33.3", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "bs58", @@ -6842,7 +6842,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.24" +version = "1.17.25" dependencies = [ "arrayref", "assert_matches", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.24" +version = "1.17.25" dependencies = [ "anyhow", "assert_matches", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bs58", "proc-macro2", @@ -7000,7 +7000,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.24" +version = "1.17.25" dependencies = [ "crossbeam-channel", "log", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7031,7 +7031,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.24" +version = "1.17.25" dependencies = [ "backoff", "bincode", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "bs58", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 2.33.3", "log", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "async-channel", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -7154,7 +7154,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.24" +version = "1.17.25" dependencies = [ "base64 0.21.4", "bincode", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "log", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-trait", "bincode", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "clap 2.33.3", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.24" +version = "1.17.25" dependencies = [ "Inflector", "base64 0.21.4", @@ -7303,7 +7303,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-trait", "solana-connection-cache", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.24" +version = "1.17.25" dependencies = [ "serde_json", "solana-metrics", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.24" +version = "1.17.25" dependencies = [ "chrono", "clap 2.33.3", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "rustc_version 0.4.0", @@ -7439,7 +7439,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "crossbeam-channel", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 2.33.3", "humantime", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.24" +version = "1.17.25" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index de4dbe59e60152..27dbc025eadf33 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.24" +version = "1.17.25" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.24" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.24" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.24" } -solana-banks-client = { path = "banks-client", version = "=1.17.24" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.24" } -solana-banks-server = { path = "banks-server", version = "=1.17.24" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.24" } -solana-bloom = { path = "bloom", version = "=1.17.24" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.24" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.24" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.24", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.24" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.24" } -solana-cli = { path = "cli", version = "=1.17.24" } -solana-cli-config = { path = "cli-config", version = "=1.17.24" } -solana-cli-output = { path = "cli-output", version = "=1.17.24" } -solana-client = { path = "client", version = "=1.17.24" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.24" } -solana-config-program = { path = "programs/config", version = "=1.17.24" } -solana-core = { path = "core", version = "=1.17.24" } -solana-cost-model = { path = "cost-model", version = "=1.17.24" } -solana-download-utils = { path = "download-utils", version = "=1.17.24" } -solana-entry = { path = "entry", version = "=1.17.24" } -solana-faucet = { path = "faucet", version = "=1.17.24" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.24" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.24" } -solana-genesis = { path = "genesis", version = "=1.17.24" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.24" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.24" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.24" } -solana-gossip = { path = "gossip", version = "=1.17.24" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.24" } -solana-ledger = { path = "ledger", version = "=1.17.24" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.24" } -solana-logger = { path = "logger", version = "=1.17.24" } -solana-measure = { path = "measure", version = "=1.17.24" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.24" } -solana-metrics = { path = "metrics", version = "=1.17.24" } -solana-net-utils = { path = "net-utils", version = "=1.17.24" } -solana-notifier = { path = "notifier", version = "=1.17.24" } -solana-perf = { path = "perf", version = "=1.17.24" } -solana-poh = { path = "poh", version = "=1.17.24" } -solana-program = { path = "sdk/program", version = "=1.17.24" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.24" } -solana-program-test = { path = "program-test", version = "=1.17.24" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.24" } -solana-quic-client = { path = "quic-client", version = "=1.17.24" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.24" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.24", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.24" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.24", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.24" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.24" } -solana-runtime = { path = "runtime", version = "=1.17.24" } -solana-sdk = { path = "sdk", version = "=1.17.24" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.24" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.24" } -solana-stake-program = { path = "programs/stake", version = "=1.17.24" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.24" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.24" } -solana-streamer = { path = "streamer", version = "=1.17.24" } -solana-system-program = { path = "programs/system", version = "=1.17.24" } -solana-test-validator = { path = "test-validator", version = "=1.17.24" } -solana-thin-client = { path = "thin-client", version = "=1.17.24" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.24", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.24" } -solana-turbine = { path = "turbine", version = "=1.17.24" } -solana-udp-client = { path = "udp-client", version = "=1.17.24" } -solana-version = { path = "version", version = "=1.17.24" } -solana-vote = { path = "vote", version = "=1.17.24" } -solana-vote-program = { path = "programs/vote", version = "=1.17.24" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.24" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.24" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.24" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.25" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.25" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.25" } +solana-banks-client = { path = "banks-client", version = "=1.17.25" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.25" } +solana-banks-server = { path = "banks-server", version = "=1.17.25" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.25" } +solana-bloom = { path = "bloom", version = "=1.17.25" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.25" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.25" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.25", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.25" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.25" } +solana-cli = { path = "cli", version = "=1.17.25" } +solana-cli-config = { path = "cli-config", version = "=1.17.25" } +solana-cli-output = { path = "cli-output", version = "=1.17.25" } +solana-client = { path = "client", version = "=1.17.25" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.25" } +solana-config-program = { path = "programs/config", version = "=1.17.25" } +solana-core = { path = "core", version = "=1.17.25" } +solana-cost-model = { path = "cost-model", version = "=1.17.25" } +solana-download-utils = { path = "download-utils", version = "=1.17.25" } +solana-entry = { path = "entry", version = "=1.17.25" } +solana-faucet = { path = "faucet", version = "=1.17.25" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.25" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.25" } +solana-genesis = { path = "genesis", version = "=1.17.25" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.25" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.25" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.25" } +solana-gossip = { path = "gossip", version = "=1.17.25" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.25" } +solana-ledger = { path = "ledger", version = "=1.17.25" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.25" } +solana-logger = { path = "logger", version = "=1.17.25" } +solana-measure = { path = "measure", version = "=1.17.25" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.25" } +solana-metrics = { path = "metrics", version = "=1.17.25" } +solana-net-utils = { path = "net-utils", version = "=1.17.25" } +solana-notifier = { path = "notifier", version = "=1.17.25" } +solana-perf = { path = "perf", version = "=1.17.25" } +solana-poh = { path = "poh", version = "=1.17.25" } +solana-program = { path = "sdk/program", version = "=1.17.25" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.25" } +solana-program-test = { path = "program-test", version = "=1.17.25" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.25" } +solana-quic-client = { path = "quic-client", version = "=1.17.25" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.25" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.25", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.25" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.25", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.25" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.25" } +solana-runtime = { path = "runtime", version = "=1.17.25" } +solana-sdk = { path = "sdk", version = "=1.17.25" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.25" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.25" } +solana-stake-program = { path = "programs/stake", version = "=1.17.25" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.25" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.25" } +solana-streamer = { path = "streamer", version = "=1.17.25" } +solana-system-program = { path = "programs/system", version = "=1.17.25" } +solana-test-validator = { path = "test-validator", version = "=1.17.25" } +solana-thin-client = { path = "thin-client", version = "=1.17.25" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.25", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.25" } +solana-turbine = { path = "turbine", version = "=1.17.25" } +solana-udp-client = { path = "udp-client", version = "=1.17.25" } +solana-version = { path = "version", version = "=1.17.25" } +solana-vote = { path = "vote", version = "=1.17.25" } +solana-vote-program = { path = "programs/vote", version = "=1.17.25" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.25" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.25" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.25" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 49cb000bb25b94..21919415438b93 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.24" +version = "1.17.25" dependencies = [ "Inflector", "base64 0.21.4", @@ -4471,7 +4471,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.24" +version = "1.17.25" dependencies = [ "arrayref", "bincode", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "bytemuck", @@ -4547,7 +4547,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.24" +version = "1.17.25" dependencies = [ "serde", "solana-sdk", @@ -4571,7 +4571,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "crossbeam-channel", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bv", "fnv", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4623,7 +4623,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.24" +version = "1.17.25" dependencies = [ "array-bytes", "serde", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bv", "bytemuck", @@ -4649,7 +4649,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "chrono", "clap 2.33.3", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.24" +version = "1.17.25" dependencies = [ "dirs-next", "lazy_static", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.24" +version = "1.17.25" dependencies = [ "Inflector", "base64 0.21.4", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-trait", "bincode", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4742,7 +4742,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "chrono", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-trait", "bincode", @@ -4774,7 +4774,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.24" +version = "1.17.25" dependencies = [ "base64 0.21.4", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.24" +version = "1.17.25" dependencies = [ "lazy_static", "log", @@ -4868,7 +4868,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "console", "indicatif", @@ -4880,7 +4880,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "crossbeam-channel", @@ -4900,7 +4900,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.24" +version = "1.17.25" dependencies = [ "ahash 0.8.5", "blake3", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.24" +version = "1.17.25" dependencies = [ "proc-macro2", "quote", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "solana-accounts-db", @@ -4971,7 +4971,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "solana-sdk", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bs58", "crossbeam-channel", @@ -5006,7 +5006,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -5054,7 +5054,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "bincode", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "solana-measure", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.24" +version = "1.17.25" dependencies = [ "env_logger", "lazy_static", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "solana-sdk", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.24" +version = "1.17.25" dependencies = [ "fast-math", "solana-program", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.24" +version = "1.17.25" dependencies = [ "crossbeam-channel", "gethostname", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "clap 3.1.6", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.24" +version = "1.17.25" dependencies = [ "ahash 0.8.5", "bincode", @@ -5214,7 +5214,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.24" +version = "1.17.25" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5230,7 +5230,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "ark-bn254", "ark-ec", @@ -5282,7 +5282,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.24" +version = "1.17.25" dependencies = [ "base64 0.21.4", "bincode", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "crossbeam-channel", "futures-util", @@ -5359,7 +5359,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-mutex", "async-trait", @@ -5384,7 +5384,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.24" +version = "1.17.25" dependencies = [ "lazy_static", "num_cpus", @@ -5392,7 +5392,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.24" +version = "1.17.25" dependencies = [ "console", "dialoguer", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.24" +version = "1.17.25" dependencies = [ "base64 0.21.4", "bincode", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-trait", "base64 0.21.4", @@ -5488,7 +5488,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.24" +version = "1.17.25" dependencies = [ "base64 0.21.4", "bs58", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.24" +version = "1.17.25" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5519,7 +5519,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.24" +version = "1.17.25" dependencies = [ "arrayref", "base64 0.21.4", @@ -5594,7 +5594,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5623,7 +5623,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5631,21 +5631,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.24" +version = "1.17.25" dependencies = [ "array-bytes", "solana-program", @@ -5653,7 +5653,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.24" +version = "1.17.25" dependencies = [ "array-bytes", "solana-program", @@ -5661,21 +5661,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5683,14 +5683,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.24" +version = "1.17.25" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5698,21 +5698,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.24" +version = "1.17.25" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5722,42 +5722,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.24" +version = "1.17.25" dependencies = [ "rustversion", "solana-program", @@ -5767,49 +5767,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5817,14 +5817,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-program-runtime", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5842,21 +5842,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.24" +version = "1.17.25" dependencies = [ "array-bytes", "solana-program", @@ -5879,7 +5879,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.24" +version = "1.17.25" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5888,14 +5888,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5903,7 +5903,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-program-runtime", @@ -5913,21 +5913,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-program-runtime", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.24" +version = "1.17.25" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.24" +version = "1.17.25" dependencies = [ "blake3", "solana-program", @@ -5953,21 +5953,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-logger", "solana-program", @@ -5978,21 +5978,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", "solana-program-runtime", @@ -6002,21 +6002,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.24" +version = "1.17.25" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.24" +version = "1.17.25" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bs58", "proc-macro2", @@ -6085,7 +6085,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.24" +version = "1.17.25" dependencies = [ "crossbeam-channel", "log", @@ -6099,7 +6099,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "log", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.24" +version = "1.17.25" dependencies = [ "backoff", "bincode", @@ -6144,7 +6144,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "bs58", @@ -6159,7 +6159,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-channel", "bytes", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "log", @@ -6201,7 +6201,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.24" +version = "1.17.25" dependencies = [ "base64 0.21.4", "bincode", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "log", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-trait", "bincode", @@ -6266,7 +6266,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.24" +version = "1.17.25" dependencies = [ "Inflector", "base64 0.21.4", @@ -6289,7 +6289,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "bytes", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.24" +version = "1.17.25" dependencies = [ "async-trait", "solana-connection-cache", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.17.24" +version = "1.17.25" dependencies = [ "chrono", "clap 2.33.3", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.24" +version = "1.17.25" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.24" +version = "1.17.25" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.24" +version = "1.17.25" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.24" +version = "1.17.25" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index e774075cbe0403..a006e46c3b8210 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.24" +version = "1.17.25" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.24" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.24" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.24" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.24" } -solana-ledger = { path = "../../ledger", version = "=1.17.24" } -solana-logger = { path = "../../logger", version = "=1.17.24" } -solana-measure = { path = "../../measure", version = "=1.17.24" } -solana-program = { path = "../../sdk/program", version = "=1.17.24" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.24" } -solana-program-test = { path = "../../program-test", version = "=1.17.24" } -solana-runtime = { path = "../../runtime", version = "=1.17.24" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.24" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.24" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.24", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.24" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.24" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.24" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.24", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.24" } -solana-sdk = { path = "../../sdk", version = "=1.17.24" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.24" } -solana-validator = { path = "../../validator", version = "=1.17.24" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.24" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.25" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.25" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.25" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.25" } +solana-ledger = { path = "../../ledger", version = "=1.17.25" } +solana-logger = { path = "../../logger", version = "=1.17.25" } +solana-measure = { path = "../../measure", version = "=1.17.25" } +solana-program = { path = "../../sdk/program", version = "=1.17.25" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.25" } +solana-program-test = { path = "../../program-test", version = "=1.17.25" } +solana-runtime = { path = "../../runtime", version = "=1.17.25" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.25" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.25" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.25", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.25" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.25" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.25" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.25", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.25" } +solana-sdk = { path = "../../sdk", version = "=1.17.25" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.25" } +solana-validator = { path = "../../validator", version = "=1.17.25" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.25" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 5ab5a104042c7f..c6c4016f3550cc 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.24" +version = "1.17.25" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.24" } +solana-program = { path = "../../../../program", version = "=1.17.25" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 7c0b03eeddefd5..94533e35d07f90 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.24" +version = "1.17.25" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.24" } +solana-program = { path = "../../../../program", version = "=1.17.25" } [lib] crate-type = ["cdylib"] From 326bd2435c54660e5550672d848b4e3daa16d0c5 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 23:26:59 +0800 Subject: [PATCH 180/213] v1.17: [anza migration] ci (backport of #5) (#11) * [anza migration] ci (#5) * Update README.md * ci: update CodeCov report link * ci: update github pr link * ci: rename secondary pipeline * replace org name in .mergify * update channel info link * update dependabot pr link * use anza docker image * delete travis --------- Co-authored-by: Will Hickey (cherry picked from commit 16d08a02a30b66a90216dc2b342f24bc8d543386) # Conflicts: # ci/rust-version.sh * fix conflict --------- Co-authored-by: Yihau Chen Co-authored-by: yihau --- .mergify.yml | 4 +- .travis.yml | 94 -------------------------------- README.md | 34 +----------- ci/buildkite-pipeline-in-disk.sh | 4 +- ci/buildkite-pipeline.sh | 8 +-- ci/buildkite-solana-private.sh | 2 +- ci/channel-info.sh | 2 +- ci/dependabot-pr.sh | 2 +- ci/test-coverage.sh | 2 +- 9 files changed, 13 insertions(+), 139 deletions(-) delete mode 100644 .travis.yml diff --git a/.mergify.yml b/.mergify.yml index 1fca661dddda29..69f8e94b5fe1fc 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -33,7 +33,7 @@ pull_request_rules: actions: request_reviews: teams: - - "@solana-labs/community-pr-subscribers" + - "@anza-xyz/community-pr-subscribers" - name: label changes from monorepo-triage conditions: - author≠@core-contributors @@ -80,7 +80,7 @@ pull_request_rules: actions: backport: assignees: &BackportAssignee - - "{{ merged_by|replace('mergify[bot]', label|select('equalto', 'community')|first|default(author)|replace('community', '@solana-labs/community-pr-subscribers')) }}" + - "{{ merged_by|replace('mergify[bot]', label|select('equalto', 'community')|first|default(author)|replace('community', '@anza-xyz/community-pr-subscribers')) }}" title: "{{ destination_branch }}: {{ title }} (backport of #{{ number }})" ignore_conflicts: true labels: diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c2dd13e32551ba..00000000000000 --- a/.travis.yml +++ /dev/null @@ -1,94 +0,0 @@ -branches: - only: - - master - - /^v\d+\.\d+/ - -notifications: - email: false - slack: - on_success: change - if: NOT type = pull_request - secure: F4IjOE05MyaMOdPRL+r8qhs7jBvv4yDM3RmFKE1zNXnfUOqV4X38oQM1EI+YVsgpMQLj/pxnEB7wcTE4Bf86N6moLssEULCpvAuMVoXj4QbWdomLX+01WbFa6fLVeNQIg45NHrz2XzVBhoKOrMNnl+QI5mbR2AlS5oqsudHsXDnyLzZtd4Y5SDMdYG1zVWM01+oNNjgNfjcCGmOE/K0CnOMl6GPi3X9C34tJ19P2XT7MTDsz1/IfEF7fro2Q8DHEYL9dchJMoisXSkem5z7IDQkGzXsWdWT4NnndUvmd1MlTCE9qgoXDqRf95Qh8sB1Dz08HtvgfaosP2XjtNTfDI9BBYS15Ibw9y7PchAJE1luteNjF35EOy6OgmCLw/YpnweqfuNViBZz+yOPWXVC0kxnPIXKZ1wyH9ibeH6E4hr7a8o9SV/6SiWIlbYF+IR9jPXyTCLP/cc3sYljPWxDnhWFwFdRVIi3PbVAhVu7uWtVUO17Oc9gtGPgs/GrhOMkJfwQPXaudRJDpVZowxTX4x9kefNotlMAMRgq+Drbmgt4eEBiCNp0ITWgh17BiE1U09WS3myuduhoct85+FoVeaUkp1sxzHVtGsNQH0hcz7WcpZyOM+AwistJA/qzeEDQao5zi1eKWPbO2xAhi2rV1bDH6bPf/4lDBwLRqSiwvlWU= - -os: linux -dist: bionic -language: minimal - -jobs: - include: - - &release-artifacts - if: type IN (api, cron) OR tag IS present - name: "macOS release artifacts" - os: osx - osx_image: xcode12 - language: rust - rust: - - stable - install: - - source ci/rust-version.sh - - PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" - - readlink -f . - - brew install gnu-tar - - PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH" - - tar --version - script: - - source ci/env.sh - - rustup set profile default - - ci/publish-tarball.sh - deploy: - - provider: s3 - access_key_id: $AWS_ACCESS_KEY_ID - secret_access_key: $AWS_SECRET_ACCESS_KEY - bucket: release.solana.com - region: us-west-1 - skip_cleanup: true - acl: public_read - local_dir: travis-s3-upload - on: - all_branches: true - - provider: releases - token: $GITHUB_TOKEN - skip_cleanup: true - file_glob: true - file: travis-release-upload/* - on: - tags: true - - <<: *release-artifacts - name: "Windows release artifacts" - os: windows - install: - - choco install openssl - - export OPENSSL_DIR="C:\Program Files\OpenSSL-Win64" - - source ci/rust-version.sh - - PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" - - readlink -f . - # Linux release artifacts are still built by ci/buildkite-secondary.yml - #- <<: *release-artifacts - # name: "Linux release artifacts" - # os: linux - # before_install: - # - sudo apt-get install libssl-dev libudev-dev - - # docs pull request - - name: "docs" - if: type IN (push, pull_request) OR tag IS present - language: node_js - node_js: - - "lts/*" - - services: - - docker - - cache: - directories: - - ~/.npm - - before_install: - - source ci/env.sh - - .travis/channel_restriction.sh edge beta || travis_terminate 0 - - .travis/affects.sh docs/ .travis || travis_terminate 0 - - cd docs/ - - source .travis/before_install.sh - - script: - - source .travis/script.sh diff --git a/README.md b/README.md index 4fccacf2ba0672..e5e50d5c482055 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

    - Solana + Solana

    @@ -111,35 +111,3 @@ problem is solved by this code?" On the other hand, if a test does fail and you better way to solve the same problem, a Pull Request with your solution would most certainly be welcome! Likewise, if rewriting a test can better communicate what code it's protecting, please send us that patch! - -# Disclaimer - -All claims, content, designs, algorithms, estimates, roadmaps, -specifications, and performance measurements described in this project -are done with the Solana Labs, Inc. (“SL”) good faith efforts. It is up to -the reader to check and validate their accuracy and truthfulness. -Furthermore, nothing in this project constitutes a solicitation for -investment. - -Any content produced by SL or developer resources that SL provides are -for educational and inspirational purposes only. SL does not encourage, -induce or sanction the deployment, integration or use of any such -applications (including the code comprising the Solana blockchain -protocol) in violation of applicable laws or regulations and hereby -prohibits any such deployment, integration or use. This includes the use of -any such applications by the reader (a) in violation of export control -or sanctions laws of the United States or any other applicable -jurisdiction, (b) if the reader is located in or ordinarily resident in -a country or territory subject to comprehensive sanctions administered -by the U.S. Office of Foreign Assets Control (OFAC), or (c) if the -reader is or is working on behalf of a Specially Designated National -(SDN) or a person subject to similar blocking or denied party -prohibitions. - -The reader should be aware that U.S. export control and sanctions laws prohibit -U.S. persons (and other persons that are subject to such laws) from transacting -with persons in certain countries and territories or that are on the SDN list. -Accordingly, there is a risk to individuals that other persons using any of the -code contained in this repo, or a derivation thereof, may be sanctioned persons -and that transactions with such persons would be a violation of U.S. export -controls and sanctions law. diff --git a/ci/buildkite-pipeline-in-disk.sh b/ci/buildkite-pipeline-in-disk.sh index 113b009aa4452e..7ca00d7f72e3aa 100755 --- a/ci/buildkite-pipeline-in-disk.sh +++ b/ci/buildkite-pipeline-in-disk.sh @@ -289,7 +289,7 @@ if [[ -n $BUILDKITE_TAG ]]; then start_pipeline "Tag pipeline for $BUILDKITE_TAG" annotate --style info --context release-tag \ - "https://github.com/solana-labs/solana/releases/$BUILDKITE_TAG" + "https://github.com/anza-xyz/agave/releases/$BUILDKITE_TAG" # Jump directly to the secondary build to publish release artifacts quickly trigger_secondary_step @@ -307,7 +307,7 @@ if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then # Add helpful link back to the corresponding Github Pull Request annotate --style info --context pr-backlink \ - "Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH" + "Github Pull Request: https://github.com/anza-xyz/agave/$BUILDKITE_BRANCH" if [[ $GITHUB_USER = "dependabot[bot]" ]]; then command_step dependabot "ci/dependabot-pr.sh" 5 diff --git a/ci/buildkite-pipeline.sh b/ci/buildkite-pipeline.sh index 8535905bfee4d0..68c0c6252f73eb 100755 --- a/ci/buildkite-pipeline.sh +++ b/ci/buildkite-pipeline.sh @@ -121,8 +121,8 @@ EOF trigger_secondary_step() { cat >> "$output_file" <<"EOF" - - name: "Trigger Build on solana-secondary" - trigger: "solana-secondary" + - name: "Trigger Build on agave-secondary" + trigger: "agave-secondary" branches: "!pull/*" async: true soft_fail: true @@ -313,7 +313,7 @@ if [[ -n $BUILDKITE_TAG ]]; then start_pipeline "Tag pipeline for $BUILDKITE_TAG" annotate --style info --context release-tag \ - "https://github.com/solana-labs/solana/releases/$BUILDKITE_TAG" + "https://github.com/anza-xyz/agave/releases/$BUILDKITE_TAG" # Jump directly to the secondary build to publish release artifacts quickly trigger_secondary_step @@ -331,7 +331,7 @@ if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then # Add helpful link back to the corresponding Github Pull Request annotate --style info --context pr-backlink \ - "Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH" + "Github Pull Request: https://github.com/anza-xyz/agave/$BUILDKITE_BRANCH" if [[ $GITHUB_USER = "dependabot[bot]" ]]; then command_step dependabot "ci/dependabot-pr.sh" 5 diff --git a/ci/buildkite-solana-private.sh b/ci/buildkite-solana-private.sh index ede70e6229d5f8..a2366d5701c781 100755 --- a/ci/buildkite-solana-private.sh +++ b/ci/buildkite-solana-private.sh @@ -287,7 +287,7 @@ if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then # Add helpful link back to the corresponding Github Pull Request annotate --style info --context pr-backlink \ - "Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH" + "Github Pull Request: https://github.com/anza-xyz/agave/$BUILDKITE_BRANCH" if [[ $GITHUB_USER = "dependabot[bot]" ]]; then command_step dependabot "ci/dependabot-pr.sh" 5 diff --git a/ci/channel-info.sh b/ci/channel-info.sh index c82806454d012c..2bb808365653c6 100755 --- a/ci/channel-info.sh +++ b/ci/channel-info.sh @@ -11,7 +11,7 @@ here="$(dirname "$0")" # shellcheck source=ci/semver_bash/semver.sh source "$here"/semver_bash/semver.sh -remote=https://github.com/solana-labs/solana.git +remote=https://github.com/anza-xyz/agave.git # Fetch all vX.Y.Z tags # diff --git a/ci/dependabot-pr.sh b/ci/dependabot-pr.sh index 9ef6816cec5b96..8638a7d52578e7 100755 --- a/ci/dependabot-pr.sh +++ b/ci/dependabot-pr.sh @@ -21,7 +21,7 @@ fi echo --- "(FAILING) Backpropagating dependabot-triggered Cargo.lock updates" name="dependabot-buildkite" -api_base="https://api.github.com/repos/solana-labs/solana/pulls" +api_base="https://api.github.com/repos/anza-xyz/agave/pulls" pr_num=$(echo "$BUILDKITE_BRANCH" | grep -Eo '[0-9]+') branch=$(curl -s "$api_base/$pr_num" | python3 -c 'import json,sys;print(json.load(sys.stdin)["head"]["ref"])') diff --git a/ci/test-coverage.sh b/ci/test-coverage.sh index 44231cd338a13e..ffd362acd287b8 100755 --- a/ci/test-coverage.sh +++ b/ci/test-coverage.sh @@ -32,5 +32,5 @@ else codecov -t "${CODECOV_TOKEN}" annotate --style success --context codecov.io \ - "CodeCov report: https://codecov.io/github/solana-labs/solana/commit/${CI_COMMIT:0:9}" + "CodeCov report: https://codecov.io/github/anza-xyz/agave/commit/${CI_COMMIT:0:9}" fi From 3cc220cb627fe7cee8750391fcf7e1beaf5f0911 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 23:27:08 +0800 Subject: [PATCH 181/213] v1.17: [anza migration] backport of #6, #8, #9 (#13) * [anza migration] replace binaries backend (#6) * ci: add upload-gcs-artifact * ci: publish release binaries to GCS * ci: redirect github repo to anza-xyz * ci: publish windows binaries to GCS * replace release.solana.com with release.anza.xyz * use a explicit name for credential (cherry picked from commit b061cd33cb919b7c6bbd58780e0142d97df4f4b7) * [anza migration] ci: fix path (#8) * ci: fix windows build * ci: publish sdk docker image with the new name * update automerge status * [anza migration] ci: removed unused s3 upload in Windows build (#9) ci: removed unused s3 upload in Windows build --------- Co-authored-by: Yihau Chen --- .github/workflows/release-artifacts-auto.yml | 6 +-- .../workflows/release-artifacts-manually.yml | 4 +- .github/workflows/release-artifacts.yml | 40 ++++++++----------- .mergify.yml | 2 +- ci/publish-installer.sh | 12 +++--- ci/publish-tarball.sh | 6 +-- ci/upload-ci-artifact.sh | 10 +++++ ci/upload-github-release-asset.sh | 2 +- install/solana-install-init.sh | 4 +- install/src/command.rs | 8 ++-- sdk/docker-solana/build.sh | 4 +- 11 files changed, 49 insertions(+), 49 deletions(-) diff --git a/.github/workflows/release-artifacts-auto.yml b/.github/workflows/release-artifacts-auto.yml index a8309cdffc8a72..0cdd176e04396c 100644 --- a/.github/workflows/release-artifacts-auto.yml +++ b/.github/workflows/release-artifacts-auto.yml @@ -14,14 +14,12 @@ concurrency: jobs: release-artifacts: - if: github.repository == 'solana-labs/solana' + if: github.repository == 'anza-xyz/agave' uses: ./.github/workflows/release-artifacts.yml with: commit: ${{ github.sha }} secrets: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + GCS_RELEASE_BUCKET_WRITER_CREDIENTIAL: ${{ secrets.GCS_RELEASE_BUCKET_WRITER_CREDIENTIAL }} error_reporting: needs: diff --git a/.github/workflows/release-artifacts-manually.yml b/.github/workflows/release-artifacts-manually.yml index 35de72922c32c8..fe5c1b03b638b3 100644 --- a/.github/workflows/release-artifacts-manually.yml +++ b/.github/workflows/release-artifacts-manually.yml @@ -14,6 +14,4 @@ jobs: with: commit: ${{ github.event.inputs.commit }} secrets: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + GCS_RELEASE_BUCKET_WRITER_CREDIENTIAL: ${{ secrets.GCS_RELEASE_BUCKET_WRITER_CREDIENTIAL }} diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml index 98dc697920262c..d8e22c42ce5da8 100644 --- a/.github/workflows/release-artifacts.yml +++ b/.github/workflows/release-artifacts.yml @@ -7,11 +7,7 @@ on: required: false type: string secrets: - AWS_ACCESS_KEY_ID: - required: true - AWS_SECRET_ACCESS_KEY: - required: true - AWS_S3_BUCKET: + GCS_RELEASE_BUCKET_WRITER_CREDIENTIAL: required: true jobs: @@ -71,19 +67,19 @@ jobs: shell: bash run: | FOLDER_NAME=${{ steps.build.outputs.tag || steps.build.outputs.channel }} - mkdir -p "github-action-s3-upload/$FOLDER_NAME" - cp -v "solana-release-x86_64-pc-windows-msvc.tar.bz2" "github-action-s3-upload/$FOLDER_NAME/" - cp -v "solana-release-x86_64-pc-windows-msvc.yml" "github-action-s3-upload/$FOLDER_NAME/" - cp -v "solana-install-init-x86_64-pc-windows-msvc"* "github-action-s3-upload/$FOLDER_NAME" + mkdir -p "windows-release/$FOLDER_NAME" + cp -v "solana-release-x86_64-pc-windows-msvc.tar.bz2" "windows-release/$FOLDER_NAME/" + cp -v "solana-release-x86_64-pc-windows-msvc.yml" "windows-release/$FOLDER_NAME/" + cp -v "solana-install-init-x86_64-pc-windows-msvc"* "windows-release/$FOLDER_NAME" - name: Upload Artifacts if: ${{ steps.build.outputs.channel != '' || steps.build.outputs.tag != '' }} uses: actions/upload-artifact@v3 with: name: windows-artifact - path: github-action-s3-upload/ + path: windows-release/ - windows-s3-upload: + windows-gcs-upload: if: ${{ needs.windows-build.outputs.channel != '' || needs.windows-build.outputs.tag != '' }} needs: [windows-build] runs-on: ubuntu-20.04 @@ -92,18 +88,16 @@ jobs: uses: actions/download-artifact@v3 with: name: windows-artifact - path: ./github-action-s3-upload + path: ./windows-release - - name: Upload - uses: jakejarvis/s3-sync-action@master + - name: Setup crediential + uses: "google-github-actions/auth@v2" with: - args: --acl public-read --follow-symlinks - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - AWS_REGION: "us-west-1" - SOURCE_DIR: "github-action-s3-upload" + credentials_json: "${{ secrets.GCS_RELEASE_BUCKET_WRITER_CREDIENTIAL }}" + + - name: Upload files to GCS + run: | + gcloud storage cp --recursive windows-release/* gs://anza-release/ windows-gh-release: if: ${{ needs.windows-build.outputs.tag != '' }} @@ -114,7 +108,7 @@ jobs: uses: actions/download-artifact@v3 with: name: windows-artifact - path: ./github-action-s3-upload + path: .windows-release/ - name: Release uses: softprops/action-gh-release@v1 @@ -122,4 +116,4 @@ jobs: tag_name: ${{ needs.windows-build.outputs.tag }} draft: true files: | - github-action-s3-upload/${{ needs.windows-build.outputs.tag }}/* + windows-release/${{ needs.windows-build.outputs.tag }}/* diff --git a/.mergify.yml b/.mergify.yml index 69f8e94b5fe1fc..fe910363019744 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -50,7 +50,7 @@ pull_request_rules: - name: automatic merge (squash) on CI success conditions: - and: - - status-success=buildkite/solana + - status-success=buildkite/agave - status-success=ci-gate - label=automerge - label!=no-automerge diff --git a/ci/publish-installer.sh b/ci/publish-installer.sh index 4b5345ae0d26fe..e58fd939dd1a40 100755 --- a/ci/publish-installer.sh +++ b/ci/publish-installer.sh @@ -26,14 +26,14 @@ fi # upload install script source ci/upload-ci-artifact.sh -cat >release.solana.com-install <release.anza.xyz-install <>release.solana.com-install +cat install/solana-install-init.sh >>release.anza.xyz-install -echo --- AWS S3 Store: "install" -upload-s3-artifact "/solana/release.solana.com-install" "s3://release.solana.com/$CHANNEL_OR_TAG/install" +echo --- GCS: "install" +upload-gcs-artifact "/solana/release.anza.xyz-install" "gs://anza-release/$CHANNEL_OR_TAG/install" echo Published to: -ci/format-url.sh https://release.solana.com/"$CHANNEL_OR_TAG"/install +ci/format-url.sh https://release.anza.xyz/"$CHANNEL_OR_TAG"/install diff --git a/ci/publish-tarball.sh b/ci/publish-tarball.sh index ff72bb7da2d066..5c64f09564fe9f 100755 --- a/ci/publish-tarball.sh +++ b/ci/publish-tarball.sh @@ -118,11 +118,11 @@ for file in "${TARBALL_BASENAME}"-$TARGET.tar.bz2 "${TARBALL_BASENAME}"-$TARGET. fi if [[ -n $BUILDKITE ]]; then - echo --- AWS S3 Store: "$file" - upload-s3-artifact "/solana/$file" s3://release.solana.com/"$CHANNEL_OR_TAG"/"$file" + echo --- GCS Store: "$file" + upload-gcs-artifact "/solana/$file" gs://anza-release/"$CHANNEL_OR_TAG"/"$file" echo Published to: - $DRYRUN ci/format-url.sh https://release.solana.com/"$CHANNEL_OR_TAG"/"$file" + $DRYRUN ci/format-url.sh https://release.anza.xyz/"$CHANNEL_OR_TAG"/"$file" if [[ -n $TAG ]]; then ci/upload-github-release-asset.sh "$file" diff --git a/ci/upload-ci-artifact.sh b/ci/upload-ci-artifact.sh index 1236da9f27114a..e7cc34ab2b2d8c 100644 --- a/ci/upload-ci-artifact.sh +++ b/ci/upload-ci-artifact.sh @@ -40,3 +40,13 @@ upload-s3-artifact() { docker run "${args[@]}" ) } + +upload-gcs-artifact() { + echo "--- artifact: $1 to $2" + docker run --rm \ + -v "$GCS_RELEASE_BUCKET_WRITER_CREDIENTIAL:/application_default_credentials.json" \ + -v "$PWD:/solana" \ + -e CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE=/application_default_credentials.json \ + gcr.io/google.com/cloudsdktool/google-cloud-cli:latest \ + gcloud storage cp "$1" "$2" +} diff --git a/ci/upload-github-release-asset.sh b/ci/upload-github-release-asset.sh index ca2ae2a8f60443..229fb8993edafd 100755 --- a/ci/upload-github-release-asset.sh +++ b/ci/upload-github-release-asset.sh @@ -26,7 +26,7 @@ fi # Force CI_REPO_SLUG since sometimes # BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG is not set correctly, causing the # artifact upload to fail -CI_REPO_SLUG=solana-labs/solana +CI_REPO_SLUG=anza-xyz/agave #if [[ -z $CI_REPO_SLUG ]]; then # echo Error: CI_REPO_SLUG not defined # exit 1 diff --git a/install/solana-install-init.sh b/install/solana-install-init.sh index db36dc61e2ff30..4f28e300be52ab 100755 --- a/install/solana-install-init.sh +++ b/install/solana-install-init.sh @@ -16,9 +16,9 @@ { # this ensures the entire script is downloaded # if [ -z "$SOLANA_DOWNLOAD_ROOT" ]; then - SOLANA_DOWNLOAD_ROOT="https://github.com/solana-labs/solana/releases/download/" + SOLANA_DOWNLOAD_ROOT="https://github.com/anza-xyz/agave/releases/download/" fi -GH_LATEST_RELEASE="https://api.github.com/repos/solana-labs/solana/releases/latest" +GH_LATEST_RELEASE="https://api.github.com/repos/anza-xyz/agave/releases/latest" set -e diff --git a/install/src/command.rs b/install/src/command.rs index ac53f5fe2b5fd5..6f720c395bc331 100644 --- a/install/src/command.rs +++ b/install/src/command.rs @@ -573,7 +573,7 @@ pub fn init( fn github_release_download_url(release_semver: &str) -> String { format!( - "https://github.com/solana-labs/solana/releases/download/v{}/solana-release-{}.tar.bz2", + "https://github.com/anza-xyz/agave/releases/download/v{}/solana-release-{}.tar.bz2", release_semver, crate::build_env::TARGET ) @@ -581,7 +581,7 @@ fn github_release_download_url(release_semver: &str) -> String { fn release_channel_download_url(release_channel: &str) -> String { format!( - "https://release.solana.com/{}/solana-release-{}.tar.bz2", + "https://release.anza.xyz/{}/solana-release-{}.tar.bz2", release_channel, crate::build_env::TARGET ) @@ -589,7 +589,7 @@ fn release_channel_download_url(release_channel: &str) -> String { fn release_channel_version_url(release_channel: &str) -> String { format!( - "https://release.solana.com/{}/solana-release-{}.yml", + "https://release.anza.xyz/{}/solana-release-{}.yml", release_channel, crate::build_env::TARGET ) @@ -906,7 +906,7 @@ fn check_for_newer_github_release( while page == 1 || releases.len() == PER_PAGE { let url = reqwest::Url::parse_with_params( - "https://api.github.com/repos/solana-labs/solana/releases", + "https://api.github.com/repos/anza-xyz/agave/releases", &[ ("per_page", &format!("{PER_PAGE}")), ("page", &format!("{page}")), diff --git a/sdk/docker-solana/build.sh b/sdk/docker-solana/build.sh index 77160d73edbc38..dba9c1c6e5bf26 100755 --- a/sdk/docker-solana/build.sh +++ b/sdk/docker-solana/build.sh @@ -30,7 +30,7 @@ cp -f ../../fetch-spl.sh usr/bin/ ./fetch-spl.sh ) -docker build -t solanalabs/solana:"$CHANNEL_OR_TAG" . +docker build -t anzaxyz/agave:"$CHANNEL_OR_TAG" . maybeEcho= if [[ -z $CI ]]; then @@ -44,4 +44,4 @@ else fi ) fi -$maybeEcho docker push solanalabs/solana:"$CHANNEL_OR_TAG" +$maybeEcho docker push anzaxyz/agave:"$CHANNEL_OR_TAG" From 8155a8cc4d6059f7b7f477ca36e1a5418bf4d3d8 Mon Sep 17 00:00:00 2001 From: yihau Date: Sun, 3 Mar 2024 13:12:01 +0800 Subject: [PATCH 182/213] v1.17: [anza migration] rename crates --- .../scripts/downstream-project-spl-common.sh | 2 + .github/workflows/release-artifacts.yml | 2 +- Cargo.lock | 356 +++++++++--------- Cargo.toml | 2 +- ci/localnet-sanity.sh | 4 +- ci/publish-installer.sh | 2 +- ci/publish-tarball.sh | 4 +- ci/run-sanity.sh | 2 +- docs/src/cli/install-solana-cli-tools.md | 12 +- docs/src/cluster/bench-tps.md | 2 +- docs/src/clusters.md | 12 +- .../src/developing/backwards-compatibility.md | 2 +- .../developing/on-chain-programs/debugging.md | 34 +- .../developing/on-chain-programs/deploying.md | 2 +- docs/src/developing/plugins/geyser-plugins.md | 8 +- docs/src/getstarted/local.md | 8 +- docs/src/implemented-proposals/installer.md | 58 +-- .../rpc-transaction-history.md | 2 +- docs/src/integrations/exchange.md | 18 +- .../src/integrations/retrying-transactions.md | 2 +- docs/src/running-validator/restart-cluster.md | 14 +- .../running-validator/validator-failover.md | 12 +- docs/src/running-validator/validator-start.md | 30 +- docs/src/running-validator/vote-accounts.md | 8 +- .../validator/best-practices/monitoring.md | 28 +- .../validator/best-practices/operations.md | 28 +- .../get-started/setup-a-validator.md | 22 +- .../get-started/setup-an-rpc-node.md | 4 +- geyser-plugin-interface/Cargo.toml | 4 +- geyser-plugin-manager/Cargo.toml | 2 +- .../src/accounts_update_notifier.rs | 6 +- .../src/block_metadata_notifier.rs | 6 +- geyser-plugin-manager/src/entry_notifier.rs | 6 +- .../src/geyser_plugin_manager.rs | 4 +- .../src/slot_status_notifier.rs | 2 +- .../src/transaction_notifier.rs | 4 +- install/Cargo.toml | 4 +- ...-install-init.sh => agave-install-init.sh} | 16 +- install/install-help.sh | 6 +- ...-install-init.rs => agave-install-init.rs} | 2 +- install/src/command.rs | 4 +- install/src/lib.rs | 2 +- install/src/main.rs | 2 +- ledger-tool/Cargo.toml | 4 +- ledger-tool/src/ledger_utils.rs | 8 +- ledger/src/blockstore_db.rs | 2 +- local-cluster/tests/local_cluster.rs | 4 +- multinode-demo/bootstrap-validator.sh | 4 +- multinode-demo/common.sh | 6 +- multinode-demo/validator.sh | 6 +- net/net.sh | 8 +- net/remote/remote-deploy-update.sh | 2 +- net/remote/remote-node.sh | 8 +- net/remote/remote-sanity.sh | 4 +- notifier/src/lib.rs | 4 +- programs/sbf/Cargo.lock | 148 ++++---- programs/sbf/Cargo.toml | 2 +- programs/sbf/rust/simulation/Cargo.toml | 2 +- .../sbf/rust/simulation/tests/validator.rs | 2 +- .../src/nonblocking/pubsub_client.rs | 6 +- pubsub-client/src/pubsub_client.rs | 6 +- rbpf-cli/src/main.rs | 4 +- rpc/src/rpc.rs | 8 +- ...tall-deploy.sh => agave-install-deploy.sh} | 4 +- ... agave-install-update-manifest-keypair.sh} | 0 scripts/cargo-install-all.sh | 14 +- scripts/run.sh | 6 +- .../abi-testcases/mixed-validator-test.sh | 6 +- .../stability-testcases/gossip-dos-test.sh | 6 +- validator/Cargo.toml | 8 +- validator/src/bin/solana-test-validator.rs | 8 +- validator/src/bootstrap.rs | 2 +- validator/src/main.rs | 20 +- watchtower/Cargo.toml | 4 +- watchtower/README.md | 2 +- watchtower/src/main.rs | 10 +- 76 files changed, 542 insertions(+), 536 deletions(-) rename install/{solana-install-init.sh => agave-install-init.sh} (89%) rename install/src/bin/{solana-install-init.rs => agave-install-init.rs} (92%) rename scripts/{solana-install-deploy.sh => agave-install-deploy.sh} (90%) rename scripts/{solana-install-update-manifest-keypair.sh => agave-install-update-manifest-keypair.sh} (100%) diff --git a/.github/scripts/downstream-project-spl-common.sh b/.github/scripts/downstream-project-spl-common.sh index c6dcfaca007867..a2277fa3094628 100644 --- a/.github/scripts/downstream-project-spl-common.sh +++ b/.github/scripts/downstream-project-spl-common.sh @@ -22,3 +22,5 @@ if semverGT "$project_used_solana_version" "$SOLANA_VER"; then fi ./patch.crates-io.sh "$SOLANA_DIR" +# anza migration stopgap. can be removed when agave is fully recommended for public usage. +sed -i 's/solana-geyser-plugin-interface/agave-geyser-plugin-interface/g' ./Cargo.toml diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml index d8e22c42ce5da8..45be181c3ce9e1 100644 --- a/.github/workflows/release-artifacts.yml +++ b/.github/workflows/release-artifacts.yml @@ -70,7 +70,7 @@ jobs: mkdir -p "windows-release/$FOLDER_NAME" cp -v "solana-release-x86_64-pc-windows-msvc.tar.bz2" "windows-release/$FOLDER_NAME/" cp -v "solana-release-x86_64-pc-windows-msvc.yml" "windows-release/$FOLDER_NAME/" - cp -v "solana-install-init-x86_64-pc-windows-msvc"* "windows-release/$FOLDER_NAME" + cp -v "agave-install-init-x86_64-pc-windows-msvc"* "windows-release/$FOLDER_NAME" - name: Upload Artifacts if: ${{ steps.build.outputs.channel != '' || steps.build.outputs.tag != '' }} diff --git a/Cargo.lock b/Cargo.lock index ce6941ca0287d7..50bf277dd6a0ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -63,6 +63,183 @@ dependencies = [ "zeroize", ] +[[package]] +name = "agave-geyser-plugin-interface" +version = "1.17.25" +dependencies = [ + "log", + "solana-sdk", + "solana-transaction-status", + "thiserror", +] + +[[package]] +name = "agave-install" +version = "1.17.25" +dependencies = [ + "atty", + "bincode", + "bzip2", + "chrono", + "clap 2.33.3", + "console", + "crossbeam-channel", + "ctrlc", + "dirs-next", + "indicatif", + "lazy_static", + "nix 0.26.4", + "reqwest", + "scopeguard", + "semver 1.0.20", + "serde", + "serde_yaml 0.8.26", + "serde_yaml 0.9.25", + "solana-clap-utils", + "solana-config-program", + "solana-logger", + "solana-rpc-client", + "solana-sdk", + "solana-version", + "tar", + "tempfile", + "url 2.4.1", + "winapi 0.3.9", + "winreg", +] + +[[package]] +name = "agave-ledger-tool" +version = "1.17.25" +dependencies = [ + "assert_cmd", + "bs58", + "bytecount", + "chrono", + "clap 2.33.3", + "crossbeam-channel", + "csv", + "dashmap 4.0.2", + "futures 0.3.28", + "histogram", + "itertools", + "log", + "num_cpus", + "regex", + "serde", + "serde_json", + "signal-hook", + "solana-account-decoder", + "solana-accounts-db", + "solana-bpf-loader-program", + "solana-clap-utils", + "solana-cli-output", + "solana-core", + "solana-cost-model", + "solana-entry", + "solana-geyser-plugin-manager", + "solana-gossip", + "solana-ledger", + "solana-logger", + "solana-measure", + "solana-program-runtime", + "solana-rpc", + "solana-runtime", + "solana-sdk", + "solana-stake-program", + "solana-storage-bigtable", + "solana-streamer", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "solana_rbpf", + "tikv-jemallocator", + "tokio", +] + +[[package]] +name = "agave-validator" +version = "1.17.25" +dependencies = [ + "agave-geyser-plugin-interface", + "chrono", + "clap 2.33.3", + "console", + "core_affinity", + "crossbeam-channel", + "fd-lock", + "indicatif", + "itertools", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-ipc-server", + "jsonrpc-server-utils", + "lazy_static", + "libc", + "libloading", + "log", + "num_cpus", + "rand 0.8.5", + "rayon", + "serde", + "serde_json", + "serde_yaml 0.9.25", + "signal-hook", + "solana-account-decoder", + "solana-accounts-db", + "solana-clap-utils", + "solana-cli-config", + "solana-core", + "solana-download-utils", + "solana-entry", + "solana-faucet", + "solana-genesis-utils", + "solana-geyser-plugin-manager", + "solana-gossip", + "solana-ledger", + "solana-logger", + "solana-metrics", + "solana-net-utils", + "solana-perf", + "solana-poh", + "solana-rpc", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-runtime", + "solana-sdk", + "solana-send-transaction-service", + "solana-storage-bigtable", + "solana-streamer", + "solana-test-validator", + "solana-tpu-client", + "solana-version", + "solana-vote-program", + "spl-token-2022", + "symlink", + "thiserror", + "tikv-jemallocator", +] + +[[package]] +name = "agave-watchtower" +version = "1.17.25" +dependencies = [ + "clap 2.33.3", + "humantime", + "log", + "solana-clap-utils", + "solana-cli-config", + "solana-cli-output", + "solana-logger", + "solana-metrics", + "solana-notifier", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "solana-version", +] + [[package]] name = "ahash" version = "0.7.6" @@ -6009,20 +6186,11 @@ dependencies = [ "solana-sdk", ] -[[package]] -name = "solana-geyser-plugin-interface" -version = "1.17.25" -dependencies = [ - "log", - "solana-sdk", - "solana-transaction-status", - "thiserror", -] - [[package]] name = "solana-geyser-plugin-manager" version = "1.17.25" dependencies = [ + "agave-geyser-plugin-interface", "bs58", "crossbeam-channel", "json5", @@ -6033,7 +6201,6 @@ dependencies = [ "serde_json", "solana-accounts-db", "solana-entry", - "solana-geyser-plugin-interface", "solana-ledger", "solana-measure", "solana-metrics", @@ -6095,41 +6262,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "solana-install" -version = "1.17.25" -dependencies = [ - "atty", - "bincode", - "bzip2", - "chrono", - "clap 2.33.3", - "console", - "crossbeam-channel", - "ctrlc", - "dirs-next", - "indicatif", - "lazy_static", - "nix 0.26.4", - "reqwest", - "scopeguard", - "semver 1.0.20", - "serde", - "serde_yaml 0.8.26", - "serde_yaml 0.9.25", - "solana-clap-utils", - "solana-config-program", - "solana-logger", - "solana-rpc-client", - "solana-sdk", - "solana-version", - "tar", - "tempfile", - "url 2.4.1", - "winapi 0.3.9", - "winreg", -] - [[package]] name = "solana-keygen" version = "1.17.25" @@ -6215,55 +6347,6 @@ dependencies = [ "trees", ] -[[package]] -name = "solana-ledger-tool" -version = "1.17.25" -dependencies = [ - "assert_cmd", - "bs58", - "bytecount", - "chrono", - "clap 2.33.3", - "crossbeam-channel", - "csv", - "dashmap 4.0.2", - "futures 0.3.28", - "histogram", - "itertools", - "log", - "num_cpus", - "regex", - "serde", - "serde_json", - "signal-hook", - "solana-account-decoder", - "solana-accounts-db", - "solana-bpf-loader-program", - "solana-clap-utils", - "solana-cli-output", - "solana-core", - "solana-cost-model", - "solana-entry", - "solana-geyser-plugin-manager", - "solana-gossip", - "solana-ledger", - "solana-logger", - "solana-measure", - "solana-program-runtime", - "solana-rpc", - "solana-runtime", - "solana-sdk", - "solana-stake-program", - "solana-storage-bigtable", - "solana-streamer", - "solana-transaction-status", - "solana-version", - "solana-vote-program", - "solana_rbpf", - "tikv-jemallocator", - "tokio", -] - [[package]] name = "solana-loader-v4-program" version = "1.17.25" @@ -7359,70 +7442,6 @@ dependencies = [ "solana-metrics", ] -[[package]] -name = "solana-validator" -version = "1.17.25" -dependencies = [ - "chrono", - "clap 2.33.3", - "console", - "core_affinity", - "crossbeam-channel", - "fd-lock", - "indicatif", - "itertools", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-ipc-server", - "jsonrpc-server-utils", - "lazy_static", - "libc", - "libloading", - "log", - "num_cpus", - "rand 0.8.5", - "rayon", - "serde", - "serde_json", - "serde_yaml 0.9.25", - "signal-hook", - "solana-account-decoder", - "solana-accounts-db", - "solana-clap-utils", - "solana-cli-config", - "solana-core", - "solana-download-utils", - "solana-entry", - "solana-faucet", - "solana-genesis-utils", - "solana-geyser-plugin-interface", - "solana-geyser-plugin-manager", - "solana-gossip", - "solana-ledger", - "solana-logger", - "solana-metrics", - "solana-net-utils", - "solana-perf", - "solana-poh", - "solana-rpc", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-runtime", - "solana-sdk", - "solana-send-transaction-service", - "solana-storage-bigtable", - "solana-streamer", - "solana-test-validator", - "solana-tpu-client", - "solana-version", - "solana-vote-program", - "spl-token-2022", - "symlink", - "thiserror", - "tikv-jemallocator", -] - [[package]] name = "solana-version" version = "1.17.25" @@ -7479,25 +7498,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "solana-watchtower" -version = "1.17.25" -dependencies = [ - "clap 2.33.3", - "humantime", - "log", - "solana-clap-utils", - "solana-cli-config", - "solana-cli-output", - "solana-logger", - "solana-metrics", - "solana-notifier", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-sdk", - "solana-version", -] - [[package]] name = "solana-zk-keygen" version = "1.17.25" diff --git a/Cargo.toml b/Cargo.toml index 27dbc025eadf33..d4ba41ebe9711e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -327,7 +327,7 @@ solana-frozen-abi = { path = "frozen-abi", version = "=1.17.25" } solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.25" } solana-genesis = { path = "genesis", version = "=1.17.25" } solana-genesis-utils = { path = "genesis-utils", version = "=1.17.25" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.25" } +agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.25" } solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.25" } solana-gossip = { path = "gossip", version = "=1.17.25" } solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.25" } diff --git a/ci/localnet-sanity.sh b/ci/localnet-sanity.sh index e6734e180aa2da..b01eca31d50d81 100755 --- a/ci/localnet-sanity.sh +++ b/ci/localnet-sanity.sh @@ -202,8 +202,8 @@ killNodes() { # Try to use the RPC exit API to cleanly exit the first two nodes # (dynamic nodes, -x, are just killed) echo "--- RPC exit" - $solana_validator --ledger "$SOLANA_CONFIG_DIR"/bootstrap-validator exit --force || true - $solana_validator --ledger "$SOLANA_CONFIG_DIR"/validator exit --force || true + $agave_validator --ledger "$SOLANA_CONFIG_DIR"/bootstrap-validator exit --force || true + $agave_validator --ledger "$SOLANA_CONFIG_DIR"/validator exit --force || true # Give the nodes a splash of time to cleanly exit before killing them sleep 2 diff --git a/ci/publish-installer.sh b/ci/publish-installer.sh index e58fd939dd1a40..f7d98ffd5ddcf9 100755 --- a/ci/publish-installer.sh +++ b/ci/publish-installer.sh @@ -31,7 +31,7 @@ SOLANA_RELEASE=$CHANNEL_OR_TAG SOLANA_INSTALL_INIT_ARGS=$CHANNEL_OR_TAG SOLANA_DOWNLOAD_ROOT=https://release.anza.xyz EOF -cat install/solana-install-init.sh >>release.anza.xyz-install +cat install/agave-install-init.sh >>release.anza.xyz-install echo --- GCS: "install" upload-gcs-artifact "/solana/release.anza.xyz-install" "gs://anza-release/$CHANNEL_OR_TAG/install" diff --git a/ci/publish-tarball.sh b/ci/publish-tarball.sh index 5c64f09564fe9f..da5862fb3de1d2 100755 --- a/ci/publish-tarball.sh +++ b/ci/publish-tarball.sh @@ -93,7 +93,7 @@ echo --- Creating release tarball tar cvf "${TARBALL_BASENAME}"-$TARGET.tar "${RELEASE_BASENAME}" bzip2 "${TARBALL_BASENAME}"-$TARGET.tar - cp "${RELEASE_BASENAME}"/bin/solana-install-init solana-install-init-$TARGET + cp "${RELEASE_BASENAME}"/bin/agave-install-init agave-install-init-$TARGET cp "${RELEASE_BASENAME}"/version.yml "${TARBALL_BASENAME}"-$TARGET.yml ) @@ -110,7 +110,7 @@ fi source ci/upload-ci-artifact.sh -for file in "${TARBALL_BASENAME}"-$TARGET.tar.bz2 "${TARBALL_BASENAME}"-$TARGET.yml solana-install-init-"$TARGET"* $MAYBE_TARBALLS; do +for file in "${TARBALL_BASENAME}"-$TARGET.tar.bz2 "${TARBALL_BASENAME}"-$TARGET.yml agave-install-init-"$TARGET"* $MAYBE_TARBALLS; do if [[ -n $DO_NOT_PUBLISH_TAR ]]; then upload-ci-artifact "$file" echo "Skipped $file due to DO_NOT_PUBLISH_TAR" diff --git a/ci/run-sanity.sh b/ci/run-sanity.sh index 3e674d92f4eb25..d9527def4e23eb 100755 --- a/ci/run-sanity.sh +++ b/ci/run-sanity.sh @@ -31,7 +31,7 @@ while [[ $latest_slot -le $((snapshot_slot + 1)) ]]; do latest_slot=$($solana_cli --url http://localhost:8899 slot --commitment processed) done -$solana_validator --ledger config/ledger exit --force || true +$agave_validator --ledger config/ledger exit --force || true wait $pid diff --git a/docs/src/cli/install-solana-cli-tools.md b/docs/src/cli/install-solana-cli-tools.md index 26a4ede5af62b7..db0b30b607e0a7 100644 --- a/docs/src/cli/install-solana-cli-tools.md +++ b/docs/src/cli/install-solana-cli-tools.md @@ -54,7 +54,7 @@ Please update your PATH environment variable to include the solana programs: solana --version ``` -- After a successful install, `solana-install update` may be used to easily +- After a successful install, `agave-install update` may be used to easily update the Solana software to a newer version at any time. --- @@ -72,7 +72,7 @@ solana --version installer into a temporary directory: ```bash -cmd /c "curl https://release.solana.com/LATEST_SOLANA_RELEASE_VERSION/solana-install-init-x86_64-pc-windows-msvc.exe --output C:\solana-install-tmp\solana-install-init.exe --create-dirs" +cmd /c "curl https://release.solana.com/LATEST_SOLANA_RELEASE_VERSION/agave-install-init-x86_64-pc-windows-msvc.exe --output C:\agave-install-tmp\agave-install-init.exe --create-dirs" ``` - Copy and paste the following command, then press Enter to install the latest @@ -80,7 +80,7 @@ cmd /c "curl https://release.solana.com/LATEST_SOLANA_RELEASE_VERSION/solana-ins to allow the program to run. ```bash -C:\solana-install-tmp\solana-install-init.exe LATEST_SOLANA_RELEASE_VERSION +C:\agave-install-tmp\agave-install-init.exe LATEST_SOLANA_RELEASE_VERSION ``` - When the installer is finished, press Enter. @@ -95,12 +95,12 @@ C:\solana-install-tmp\solana-install-init.exe LATEST_SOLANA_RELEASE_VERSION solana --version ``` -- After a successful install, `solana-install update` may be used to easily +- After a successful install, `agave-install update` may be used to easily update the Solana software to a newer version at any time. ## Download Prebuilt Binaries -If you would rather not use `solana-install` to manage the install, you can +If you would rather not use `agave-install` to manage the install, you can manually download and install the binaries. ### Linux @@ -161,7 +161,7 @@ You can then run the following command to obtain the same result as with prebuilt binaries: ```bash -solana-install init +agave-install init ``` ## Use Homebrew diff --git a/docs/src/cluster/bench-tps.md b/docs/src/cluster/bench-tps.md index d913f9e5f16392..35978cdd0967dd 100644 --- a/docs/src/cluster/bench-tps.md +++ b/docs/src/cluster/bench-tps.md @@ -108,7 +108,7 @@ For example Generally we are using `debug` for infrequent debug messages, `trace` for potentially frequent messages and `info` for performance-related logging. -You can also attach to a running process with GDB. The leader's process is named _solana-validator_: +You can also attach to a running process with GDB. The leader's process is named _agave-validator_: ```bash sudo gdb diff --git a/docs/src/clusters.md b/docs/src/clusters.md index 5d59e7ea6cc40e..08102c68a8a7fe 100644 --- a/docs/src/clusters.md +++ b/docs/src/clusters.md @@ -39,10 +39,10 @@ export SOLANA_METRICS_CONFIG="host=https://metrics.solana.com:8086,db=devnet,u=s solana config set --url https://api.devnet.solana.com ``` -##### Example `solana-validator` command-line +##### Example `agave-validator` command-line ```bash -$ solana-validator \ +$ agave-validator \ --identity validator-keypair.json \ --vote-account vote-account-keypair.json \ --known-validator dv1ZAGvdsz5hHLwWXsVnM94hWf1pjbKVau1QVkaMJ92 \ @@ -91,10 +91,10 @@ export SOLANA_METRICS_CONFIG="host=https://metrics.solana.com:8086,db=tds,u=test solana config set --url https://api.testnet.solana.com ``` -##### Example `solana-validator` command-line +##### Example `agave-validator` command-line ```bash -$ solana-validator \ +$ agave-validator \ --identity validator-keypair.json \ --vote-account vote-account-keypair.json \ --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \ @@ -143,10 +143,10 @@ export SOLANA_METRICS_CONFIG="host=https://metrics.solana.com:8086,db=mainnet-be solana config set --url https://api.mainnet-beta.solana.com ``` -##### Example `solana-validator` command-line +##### Example `agave-validator` command-line ```bash -$ solana-validator \ +$ agave-validator \ --identity ~/validator-keypair.json \ --vote-account ~/vote-account-keypair.json \ --known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \ diff --git a/docs/src/developing/backwards-compatibility.md b/docs/src/developing/backwards-compatibility.md index 4a3c60b8e129bd..0fdc388ea2dbae 100644 --- a/docs/src/developing/backwards-compatibility.md +++ b/docs/src/developing/backwards-compatibility.md @@ -76,7 +76,7 @@ Major releases: - [`solana-program`](https://docs.rs/solana-program/) - Rust SDK for writing programs - [`solana-client`](https://docs.rs/solana-client/) - Rust client for connecting to RPC API - [`solana-cli-config`](https://docs.rs/solana-cli-config/) - Rust client for managing Solana CLI config files -- [`solana-geyser-plugin-interface`](https://docs.rs/solana-geyser-plugin-interface/) - Rust interface for developing Solana Geyser plugins. +- [`agave-geyser-plugin-interface`](https://docs.rs/agave-geyser-plugin-interface/) - Rust interface for developing Solana Geyser plugins. Patch releases: diff --git a/docs/src/developing/on-chain-programs/debugging.md b/docs/src/developing/on-chain-programs/debugging.md index fdbb1aebaa8002..700985f2ee9794 100644 --- a/docs/src/developing/on-chain-programs/debugging.md +++ b/docs/src/developing/on-chain-programs/debugging.md @@ -113,15 +113,15 @@ To turn on SBF interpreter trace messages in a local cluster configure the ## Source level debugging Source level debugging of on-chain programs written in Rust or C can -be done using the `program run` subcommand of `solana-ledger-tool`, +be done using the `program run` subcommand of `agave-ledger-tool`, and lldb, distributed with Solana Rust and Clang compiler binary package platform-tools. -The `solana-ledger-tool program run` subcommand loads a compiled +The `agave-ledger-tool program run` subcommand loads a compiled on-chain program, executes it in RBPF virtual machine and runs a gdb server that accepts incoming connections from LLDB or GDB. Once lldb -is connected to `solana-ledger-tool` gdbserver, it can control -execution of an on-chain program. Run `solana-ledger-tool program run +is connected to `agave-ledger-tool` gdbserver, it can control +execution of an on-chain program. Run `agave-ledger-tool program run --help` for an example of specifying input data for parameters of the program entrypoint function. @@ -131,7 +131,7 @@ loadable files, one a usual loadable module with the extension `.so`, and another the same loadable module but containing Dwarf debug information, a file with extension `.debug`. -To execute a program in debugger, run `solana-ledger-tool program run` +To execute a program in debugger, run `agave-ledger-tool program run` with `-e debugger` command line option. For example, a crate named 'helloworld' is compiled and an executable program is built in `target/deploy` directory. There should be three files in that @@ -139,27 +139,27 @@ directory - helloworld-keypair.json -- a keypair for deploying the program, - helloworld.debug -- a binary file containing debug information, - helloworld.so -- an executable file loadable into the virtual machine. -The command line for running `solana-ledger-tool` would be something like this +The command line for running `agave-ledger-tool` would be something like this ``` -solana-ledger-tool program run -l test-ledger -e debugger target/deploy/helloworld.so +agave-ledger-tool program run -l test-ledger -e debugger target/deploy/helloworld.so ``` -Note that `solana-ledger-tool` always loads a ledger database. Most +Note that `agave-ledger-tool` always loads a ledger database. Most on-chain programs interact with a ledger in some manner. Even if for debugging purpose a ledger is not needed, it has to be provided to -`solana-ledger-tool`. A minimal ledger database can be created by +`agave-ledger-tool`. A minimal ledger database can be created by running `solana-test-validator`, which creates a ledger in `test-ledger` subdirectory. -In debugger mode `solana-ledger-tool program run` loads an `.so` file and +In debugger mode `agave-ledger-tool program run` loads an `.so` file and starts listening for an incoming connection from a debugger ``` Waiting for a Debugger connection on "127.0.0.1:9001"... ``` -To connect to `solana-ledger-tool` and execute the program, run lldb. For +To connect to `agave-ledger-tool` and execute the program, run lldb. For debugging rust programs it may be beneficial to run solana-lldb wrapper to lldb, i.e. at a new shell prompt (other than the one used -to start `solana-ledger-tool`) run the command +to start `agave-ledger-tool`) run the command ``` solana-lldb @@ -181,7 +181,7 @@ If the debugger finds the file, it will print something like this Current executable set to '/path/helloworld.debug' (bpf). ``` -Now, connect to the gdb server that `solana-ledger-tool` implements, and +Now, connect to the gdb server that `agave-ledger-tool` implements, and debug the program as usual. Enter the following command at lldb prompt ``` (lldb) gdb-remote 127.0.0.1:9001 @@ -230,13 +230,13 @@ First file is `tasks.json` with the following content { "label": "solana-debugger", "type": "shell", - "command": "solana-ledger-tool program run -l test-ledger -e debugger ${workspaceFolder}/target/deploy/helloworld.so" + "command": "agave-ledger-tool program run -l test-ledger -e debugger ${workspaceFolder}/target/deploy/helloworld.so" } ] } ``` The first task is to build the on-chain program using cargo-build-sbf -utility. The second task is to run `solana-ledger-tool program run` in debugger mode. +utility. The second task is to run `agave-ledger-tool program run` in debugger mode. Another file is `launch.json` with the following content ``` @@ -254,12 +254,12 @@ Another file is `launch.json` with the following content } ``` This file specifies how to run debugger and to connect it to the gdb -server implemented by `solana-ledger-tool`. +server implemented by `agave-ledger-tool`. To start debugging a program, first build it by running the build task. The next step is to run `solana-debugger` task. The tasks specified in `tasks.json` file are started from `Terminal >> Run Task...` menu of -VSCode. When `solana-ledger-tool` is running and listening from incoming +VSCode. When `agave-ledger-tool` is running and listening from incoming connections, it's time to start the debugger. Launch it from VSCode `Run and Debug` menu. If everything is set up correctly, VSCode will start a debugging session and the program execution should stop on diff --git a/docs/src/developing/on-chain-programs/deploying.md b/docs/src/developing/on-chain-programs/deploying.md index 2f0d095444dcf3..111ee98f8b70fb 100644 --- a/docs/src/developing/on-chain-programs/deploying.md +++ b/docs/src/developing/on-chain-programs/deploying.md @@ -56,7 +56,7 @@ As a data point of the number of accounts and potential data stored on-chain, be 5. **BPF Program Loader v2**: 191 accounts 6. **BPF Program Loader v1**: 150 accounts -> _Note: this data was pulled with a modified `solana-ledger-tool` built from this branch: [https://github.com/jstarry/solana/tree/large-account-stats](https://github.com/jstarry/solana/tree/large-account-stats)_ +> _Note: this data was pulled with a modified `agave-ledger-tool` built from this branch: [https://github.com/jstarry/solana/tree/large-account-stats](https://github.com/jstarry/solana/tree/large-account-stats)_ ### Reclaiming buffer accounts diff --git a/docs/src/developing/plugins/geyser-plugins.md b/docs/src/developing/plugins/geyser-plugins.md index 3ea07473a61f88..41e1b655e94bdd 100644 --- a/docs/src/developing/plugins/geyser-plugins.md +++ b/docs/src/developing/plugins/geyser-plugins.md @@ -22,20 +22,20 @@ implementation for the PostgreSQL database. ### Important Crates: -- [`solana-geyser-plugin-interface`] — This crate defines the plugin +- [`agave-geyser-plugin-interface`] — This crate defines the plugin interfaces. - [`solana-accountsdb-plugin-postgres`] — The crate for the referential plugin implementation for the PostgreSQL database. -[`solana-geyser-plugin-interface`]: https://docs.rs/solana-geyser-plugin-interface +[`agave-geyser-plugin-interface`]: https://docs.rs/agave-geyser-plugin-interface [`solana-accountsdb-plugin-postgres`]: https://docs.rs/solana-accountsdb-plugin-postgres [`solana-sdk`]: https://docs.rs/solana-sdk [`solana-transaction-status`]: https://docs.rs/solana-transaction-status ## The Plugin Interface -The Plugin interface is declared in [`solana-geyser-plugin-interface`]. It +The Plugin interface is declared in [`agave-geyser-plugin-interface`]. It is defined by the trait `GeyserPlugin`. The plugin should implement the trait and expose a "C" function `_create_plugin` to return the pointer to this trait. For example, in the referential implementation, the following code @@ -164,7 +164,7 @@ please refer to [`solana-sdk`] and [`solana-transaction-status`] The `slot` points to the slot the transaction is executed at. For more details, please refer to the Rust documentation in -[`solana-geyser-plugin-interface`]. +[`agave-geyser-plugin-interface`]. ## Example PostgreSQL Plugin diff --git a/docs/src/getstarted/local.md b/docs/src/getstarted/local.md index 3a4358cac20843..580c335749b6ad 100644 --- a/docs/src/getstarted/local.md +++ b/docs/src/getstarted/local.md @@ -48,7 +48,7 @@ Confirm you have the desired version of `solana` installed by running: solana --version ``` -After a successful install, `solana-install update` may be used to easily update the Solana software to a newer version at any time. +After a successful install, `agave-install update` may be used to easily update the Solana software to a newer version at any time. @@ -70,7 +70,7 @@ After a successful install, `solana-install update` may be used to easily update installer into a temporary directory: ```bash -cmd /c "curl https://release.solana.com/stable/solana-install-init-x86_64-pc-windows-msvc.exe --output C:\solana-install-tmp\solana-install-init.exe --create-dirs" +cmd /c "curl https://release.solana.com/stable/agave-install-init-x86_64-pc-windows-msvc.exe --output C:\agave-install-tmp\agave-install-init.exe --create-dirs" ``` - Copy and paste the following command, then press Enter to install the latest @@ -78,7 +78,7 @@ cmd /c "curl https://release.solana.com/stable/solana-install-init-x86_64-pc-win to allow the program to run. ```bash -C:\solana-install-tmp\solana-install-init.exe stable +C:\agave-install-tmp\agave-install-init.exe stable ``` - When the installer is finished, press Enter. @@ -91,7 +91,7 @@ C:\solana-install-tmp\solana-install-init.exe stable solana --version ``` -After a successful install, `solana-install update` may be used to easily update the Solana software to a newer version at any time. +After a successful install, `agave-install update` may be used to easily update the Solana software to a newer version at any time. diff --git a/docs/src/implemented-proposals/installer.md b/docs/src/implemented-proposals/installer.md index a3ad797171c5b8..c052aa7b4e54e5 100644 --- a/docs/src/implemented-proposals/installer.md +++ b/docs/src/implemented-proposals/installer.md @@ -13,16 +13,16 @@ This document proposes an easy to use software install and updater that can be u The easiest install method for supported platforms: ```bash -$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.0/install/solana-install-init.sh | sh +$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.0/install/agave-install-init.sh | sh ``` -This script will check github for the latest tagged release and download and run the `solana-install-init` binary from there. +This script will check github for the latest tagged release and download and run the `agave-install-init` binary from there. If additional arguments need to be specified during the installation, the following shell syntax is used: ```bash -$ init_args=.... # arguments for `solana-install-init ...` -$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.0/install/solana-install-init.sh | sh -s - ${init_args} +$ init_args=.... # arguments for `agave-install-init ...` +$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.0/install/agave-install-init.sh | sh -s - ${init_args} ``` ### Fetch and run a pre-built installer from a Github release @@ -30,9 +30,9 @@ $ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.0/install/ With a well-known release URL, a pre-built binary can be obtained for supported platforms: ```bash -$ curl -o solana-install-init https://github.com/solana-labs/solana/releases/download/v1.0.0/solana-install-init-x86_64-apple-darwin -$ chmod +x ./solana-install-init -$ ./solana-install-init --help +$ curl -o agave-install-init https://github.com/solana-labs/solana/releases/download/v1.0.0/agave-install-init-x86_64-apple-darwin +$ chmod +x ./agave-install-init +$ ./agave-install-init --help ``` ### Build and run the installer from source @@ -51,16 +51,16 @@ Given a solana release tarball \(as created by `ci/publish-tarball.sh`\) that ha ```bash $ solana-keygen new -o update-manifest.json # <-- only generated once, the public key is shared with users -$ solana-install deploy http://example.com/path/to/solana-release.tar.bz2 update-manifest.json +$ agave-install deploy http://example.com/path/to/solana-release.tar.bz2 update-manifest.json ``` ### Run a validator node that auto updates itself ```bash -$ solana-install init --pubkey 92DMonmBYXwEMHJ99c9ceRSpAmk9v6i3RdvDdXaVcrfj # <-- pubkey is obtained from whoever is deploying the updates -$ export PATH=~/.local/share/solana-install/bin:$PATH +$ agave-install init --pubkey 92DMonmBYXwEMHJ99c9ceRSpAmk9v6i3RdvDdXaVcrfj # <-- pubkey is obtained from whoever is deploying the updates +$ export PATH=~/.local/share/agave-install/bin:$PATH $ solana-keygen ... # <-- runs the latest solana-keygen -$ solana-install run solana-validator ... # <-- runs a validator, restarting it as necessary when an update is applied +$ agave-install run agave-validator ... # <-- runs a validator, restarting it as necessary when an update is applied ``` ## On-chain Update Manifest @@ -87,9 +87,9 @@ pub struct SignedUpdateManifest { } ``` -Note that the `manifest` field itself contains a corresponding signature \(`manifest_signature`\) to guard against man-in-the-middle attacks between the `solana-install` tool and the solana cluster RPC API. +Note that the `manifest` field itself contains a corresponding signature \(`manifest_signature`\) to guard against man-in-the-middle attacks between the `agave-install` tool and the solana cluster RPC API. -To guard against rollback attacks, `solana-install` will refuse to install an update with an older `timestamp_secs` than what is currently installed. +To guard against rollback attacks, `agave-install` will refuse to install an update with an older `timestamp_secs` than what is currently installed. ## Release Archive Contents @@ -101,17 +101,17 @@ A release archive is expected to be a tar file compressed with bzip2 with the fo - `/bin/` -- directory containing available programs in the release. - `solana-install` will symlink this directory to + `agave-install` will symlink this directory to - `~/.local/share/solana-install/bin` for use by the `PATH` environment + `~/.local/share/agave-install/bin` for use by the `PATH` environment variable. - `...` -- any additional files and directories are permitted -## solana-install Tool +## agave-install Tool -The `solana-install` tool is used by the user to install and update their cluster software. +The `agave-install` tool is used by the user to install and update their cluster software. It manages the following files and directories in the user's home directory: @@ -122,11 +122,11 @@ It manages the following files and directories in the user's home directory: ### Command-line Interface ```text -solana-install 0.16.0 +agave-install 0.16.0 The solana cluster software installer USAGE: - solana-install [OPTIONS] + agave-install [OPTIONS] FLAGS: -h, --help Prints help information @@ -145,11 +145,11 @@ SUBCOMMANDS: ``` ```text -solana-install-init +agave-install-init initializes a new installation USAGE: - solana-install init [OPTIONS] + agave-install init [OPTIONS] FLAGS: -h, --help Prints help information @@ -161,11 +161,11 @@ OPTIONS: ``` ```text -solana-install info +agave-install info displays information about the current installation USAGE: - solana-install info [FLAGS] + agave-install info [FLAGS] FLAGS: -h, --help Prints help information @@ -173,11 +173,11 @@ FLAGS: ``` ```text -solana-install deploy +agave-install deploy deploys a new update USAGE: - solana-install deploy + agave-install deploy FLAGS: -h, --help Prints help information @@ -188,22 +188,22 @@ ARGS: ``` ```text -solana-install update +agave-install update checks for an update, and if available downloads and applies it USAGE: - solana-install update + agave-install update FLAGS: -h, --help Prints help information ``` ```text -solana-install run +agave-install run Runs a program while periodically checking and applying software updates USAGE: - solana-install run [program_arguments]... + agave-install run [program_arguments]... FLAGS: -h, --help Prints help information diff --git a/docs/src/implemented-proposals/rpc-transaction-history.md b/docs/src/implemented-proposals/rpc-transaction-history.md index c8eb878eae45ce..d728254412bd79 100644 --- a/docs/src/implemented-proposals/rpc-transaction-history.md +++ b/docs/src/implemented-proposals/rpc-transaction-history.md @@ -68,7 +68,7 @@ results of BigTable queries more complicated but is not a significant issue. ## Data Population The ongoing population of instance data will occur on an epoch cadence through the -use of a new `solana-ledger-tool` command that will convert rocksdb data for a +use of a new `agave-ledger-tool` command that will convert rocksdb data for a given slot range into the instance schema. The same process will be run once, manually, to backfill the existing ledger diff --git a/docs/src/integrations/exchange.md b/docs/src/integrations/exchange.md index 2e8d70f9cc614f..9de6d517fd673c 100644 --- a/docs/src/integrations/exchange.md +++ b/docs/src/integrations/exchange.md @@ -28,7 +28,7 @@ To run an api node: 2. Start the validator with at least the following parameters: ```bash -solana-validator \ +agave-validator \ --ledger \ --identity \ --entrypoint \ @@ -44,14 +44,14 @@ solana-validator \ Customize `--ledger` to your desired ledger storage location, and `--rpc-port` to the port you want to expose. The `--entrypoint` and `--expected-genesis-hash` parameters are all specific to the cluster you are joining. -[Current parameters for Mainnet Beta](../clusters.md#example-solana-validator-command-line-2) +[Current parameters for Mainnet Beta](../clusters.md#example-agave-validator-command-line-2) The `--limit-ledger-size` parameter allows you to specify how many ledger [shreds](../terminology.md#shred) your node retains on disk. If you do not include this parameter, the validator will keep the entire ledger until it runs out of disk space. The default value attempts to keep the ledger disk usage under 500GB. More or less disk usage may be requested by adding an argument to -`--limit-ledger-size` if desired. Check `solana-validator --help` for the +`--limit-ledger-size` if desired. Check `agave-validator --help` for the default limit value used by `--limit-ledger-size`. More information about selecting a custom limit value is [available here](https://github.com/solana-labs/solana/blob/583cec922b6107e0f85c7e14cb5e642bc7dfb340/core/src/ledger_cleanup_service.rs#L15-L26). @@ -70,16 +70,16 @@ ensure you miss as little data as possible. Running the solana software as a systemd service is one great option. For monitoring, we provide -[`solana-watchtower`](https://github.com/solana-labs/solana/blob/master/watchtower/README.md), -which can monitor your validator and detect with the `solana-validator` process +[`agave-watchtower`](https://github.com/solana-labs/solana/blob/master/watchtower/README.md), +which can monitor your validator and detect with the `agave-validator` process is unhealthy. It can directly be configured to alert you via Slack, Telegram, -Discord, or Twillio. For details, run `solana-watchtower --help`. +Discord, or Twillio. For details, run `agave-watchtower --help`. ```bash -solana-watchtower --validator-identity +agave-watchtower --validator-identity ``` -> You can find more information about the [best practices for Solana Watchtower](../validator/best-practices/monitoring.md#solana-watchtower) here in the docs. +> You can find more information about the [best practices for Solana Watchtower](../validator/best-practices/monitoring.md#agave-watchtower) here in the docs. #### New Software Release Announcements @@ -103,7 +103,7 @@ known validators. This snapshot reflects the current state of the chain, but does not contain the complete historical ledger. If one of your node exits and boots from a new snapshot, there may be a gap in the ledger on that node. In order to prevent this issue, add the `--no-snapshot-fetch` parameter to your -`solana-validator` command to receive historical ledger data instead of a +`agave-validator` command to receive historical ledger data instead of a snapshot. Do not pass the `--no-snapshot-fetch` parameter on your initial boot as it's not diff --git a/docs/src/integrations/retrying-transactions.md b/docs/src/integrations/retrying-transactions.md index c2d7ff24be2292..29cdeafa0c0d8b 100644 --- a/docs/src/integrations/retrying-transactions.md +++ b/docs/src/integrations/retrying-transactions.md @@ -106,7 +106,7 @@ according to three ports: unable to process all transactions For more information on the TPU, please refer to -[this excellent writeup by Jito Labs](https://jito-labs.medium.com/solana-validator-101-transaction-processing-90bcdc271143). +[this excellent writeup by Jito Labs](https://jito-labs.medium.com/agave-validator-101-transaction-processing-90bcdc271143). ## How Transactions Get Dropped diff --git a/docs/src/running-validator/restart-cluster.md b/docs/src/running-validator/restart-cluster.md index 4039f69a6b468f..4823ae2fd5c900 100644 --- a/docs/src/running-validator/restart-cluster.md +++ b/docs/src/running-validator/restart-cluster.md @@ -5,7 +5,7 @@ In Solana 1.14 or greater, run the following command to output the latest optimistically confirmed slot your validator observed: ```bash -solana-ledger-tool -l ledger latest-optimistic-slots +agave-ledger-tool -l ledger latest-optimistic-slots ``` In Solana 1.13 or less, the latest optimistically confirmed can be found by looking for the more recent occurrence of @@ -28,11 +28,11 @@ instead. ### Step 4. Create a new snapshot for slot `SLOT_X` with a hard fork at slot `SLOT_X` ```bash -$ solana-ledger-tool -l --snapshot-archive-path --incremental-snapshot-archive-path create-snapshot SLOT_X --hard-fork SLOT_X +$ agave-ledger-tool -l --snapshot-archive-path --incremental-snapshot-archive-path create-snapshot SLOT_X --hard-fork SLOT_X ``` The snapshots directory should now contain the new snapshot. -`solana-ledger-tool create-snapshot` will also output the new shred version, and bank hash value, +`agave-ledger-tool create-snapshot` will also output the new shred version, and bank hash value, call this NEW_SHRED_VERSION and NEW_BANK_HASH respectively. Adjust your validator's arguments: @@ -62,7 +62,7 @@ Post something like the following to #announcements (adjusting the text as appro > 2. a. Preferred method, start from your local ledger with: > > ```bash -> solana-validator +> agave-validator > --wait-for-supermajority SLOT_X # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART > --expected-bank-hash NEW_BANK_HASH # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART > --hard-fork SLOT_X # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART @@ -78,7 +78,7 @@ Post something like the following to #announcements (adjusting the text as appro > b. If your validator doesn't have ledger up to slot SLOT_X or if you have deleted your ledger, have it instead download a snapshot with: > > ```bash -> solana-validator +> agave-validator > --wait-for-supermajority SLOT_X # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART > --expected-bank-hash NEW_BANK_HASH # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART > --entrypoint entrypoint.testnet.solana.com:8001 @@ -89,7 +89,7 @@ Post something like the following to #announcements (adjusting the text as appro > ... # <-- your other --identity/--vote-account/etc arguments > ``` > -> You can check for which slots your ledger has with: `solana-ledger-tool -l path/to/ledger bounds` +> You can check for which slots your ledger has with: `agave-ledger-tool -l path/to/ledger bounds` > > 3. Wait until 80% of the stake comes online > @@ -116,7 +116,7 @@ and create a new snapshot with additional `--destake-vote-account ` arguments for each of the non-responsive validator's vote account address ```bash -$ solana-ledger-tool -l ledger create-snapshot SLOT_X ledger --hard-fork SLOT_X \ +$ agave-ledger-tool -l ledger create-snapshot SLOT_X ledger --hard-fork SLOT_X \ --destake-vote-account \ --destake-vote-account \ . diff --git a/docs/src/running-validator/validator-failover.md b/docs/src/running-validator/validator-failover.md index 34968b73640933..1329dd58b2281c 100644 --- a/docs/src/running-validator/validator-failover.md +++ b/docs/src/running-validator/validator-failover.md @@ -82,11 +82,11 @@ For more information on etcd TLS setup, please refer to https://etcd.io/docs/v3.5/op-guide/security/#example-2-client-to-server-authentication-with-https-client-certificates ### Primary Validator -The following additional `solana-validator` parameters are required to enable +The following additional `agave-validator` parameters are required to enable tower storage into etcd: ``` -solana-validator ... \ +agave-validator ... \ --tower-storage etcd \ --etcd-cacert-file certs/etcd-ca.pem \ --etcd-cert-file certs/validator.pem \ @@ -100,7 +100,7 @@ that your etcd endpoint remain accessible at all times. ### Secondary Validator Configure the secondary validator like the primary with the exception of the -following `solana-validator` command-line argument changes: +following `agave-validator` command-line argument changes: * Generate and use a secondary validator identity: `--identity secondary-validator-keypair.json` * Add `--no-check-vote-account` * Add `--authorized-voter validator-keypair.json` (where @@ -111,8 +111,8 @@ When both validators are running normally and caught up to the cluster, a failover from primary to secondary can be triggered by running the following command on the secondary validator: ```bash -$ solana-validator wait-for-restart-window --identity validator-keypair.json \ - && solana-validator set-identity validator-keypair.json +$ agave-validator wait-for-restart-window --identity validator-keypair.json \ + && agave-validator set-identity validator-keypair.json ``` The secondary validator will acquire a lock on the tower in etcd to ensure @@ -128,7 +128,7 @@ exit. However if/when the secondary validator restarts, it will do so using the secondary validator identity and thus the restart cycle is broken. ## Triggering a failover via monitoring -Monitoring of your choosing can invoke the `solana-validator set-identity +Monitoring of your choosing can invoke the `agave-validator set-identity validator-keypair.json` command mentioned in the previous section. It is not necessary to guarantee the primary validator has halted before failing diff --git a/docs/src/running-validator/validator-start.md b/docs/src/running-validator/validator-start.md index ccd012aa79997c..5a3f5ca3402284 100644 --- a/docs/src/running-validator/validator-start.md +++ b/docs/src/running-validator/validator-start.md @@ -29,7 +29,7 @@ detail on cluster activity. ## Enabling CUDA If your machine has a GPU with CUDA installed \(Linux-only currently\), include -the `--cuda` argument to `solana-validator`. +the `--cuda` argument to `agave-validator`. When your validator is started look for the following log message to indicate that CUDA is enabled: `"[ solana::validator] CUDA is enabled"` @@ -44,7 +44,7 @@ the following commands. #### **Optimize sysctl knobs** ```bash -sudo bash -c "cat >/etc/sysctl.d/21-solana-validator.conf </etc/sysctl.d/21-agave-validator.conf <` -argument to `solana-validator`. You can specify multiple ones by repeating the argument `--known-validator --known-validator `. +argument to `agave-validator`. You can specify multiple ones by repeating the argument `--known-validator --known-validator `. This has two effects, one is when the validator is booting with `--only-known-rpc`, it will only ask that set of known nodes for downloading genesis and snapshot data. Another is that in combination with the `--halt-on-known-validators-accounts-hash-mismatch` option, it will monitor the merkle root hash of the entire accounts state of other known nodes on gossip and if the hashes produce any mismatch, @@ -280,13 +280,13 @@ account state divergence. Connect to the cluster by running: ```bash -solana-validator \ +agave-validator \ --identity ~/validator-keypair.json \ --vote-account ~/vote-account-keypair.json \ --rpc-port 8899 \ --entrypoint entrypoint.devnet.solana.com:8001 \ --limit-ledger-size \ - --log ~/solana-validator.log + --log ~/agave-validator.log ``` To force validator logging to the console add a `--log -` argument, otherwise @@ -299,7 +299,7 @@ The ledger will be placed in the `ledger/` directory by default, use the > [paper wallet seed phrase](../wallet-guide/paper-wallet.md) > for your `--identity` and/or > `--authorized-voter` keypairs. To use these, pass the respective argument as -> `solana-validator --identity ASK ... --authorized-voter ASK ...` +> `agave-validator --identity ASK ... --authorized-voter ASK ...` > and you will be prompted to enter your seed phrases and optional passphrase. Confirm your validator is connected to the network by opening a new terminal and @@ -315,7 +315,7 @@ If your validator is connected, its public key and IP address will appear in the By default the validator will dynamically select available network ports in the 8000-10000 range, and may be overridden with `--dynamic-port-range`. For -example, `solana-validator --dynamic-port-range 11000-11020 ...` will restrict +example, `agave-validator --dynamic-port-range 11000-11020 ...` will restrict the validator to ports 11000-11020. ### Limiting ledger size to conserve disk space @@ -369,8 +369,8 @@ WantedBy=multi-user.target ``` Now create `/home/sol/bin/validator.sh` to include the desired -`solana-validator` command-line. Ensure that the 'exec' command is used to -start the validator process (i.e. "exec solana-validator ..."). This is +`agave-validator` command-line. Ensure that the 'exec' command is used to +start the validator process (i.e. "exec agave-validator ..."). This is important because without it, logrotate will end up killing the validator every time the logs are rotated. @@ -397,14 +397,14 @@ to be reverted and the issue reproduced before help can be provided. #### Log rotation -The validator log file, as specified by `--log ~/solana-validator.log`, can get +The validator log file, as specified by `--log ~/agave-validator.log`, can get very large over time and it's recommended that log rotation be configured. The validator will re-open its log file when it receives the `USR1` signal, which is the basic primitive that enables log rotation. If the validator is being started by a wrapper shell script, it is important to -launch the process with `exec` (`exec solana-validator ...`) when using logrotate. +launch the process with `exec` (`exec agave-validator ...`) when using logrotate. This will prevent the `USR1` signal from being sent to the script's process instead of the validator's, which will kill them both. @@ -412,13 +412,13 @@ instead of the validator's, which will kill them both. An example setup for the `logrotate`, which assumes that the validator is running as a systemd service called `sol.service` and writes a log file at -/home/sol/solana-validator.log: +/home/sol/agave-validator.log: ```bash # Setup log rotation cat > logrotate.sol < @@ -72,14 +72,14 @@ Next, in your browser, go to `https://api.telegram.org/bot/getUp The response should be in JSON. Search for the string `"chat":` in the JSON. The `id` value of that chat is your `TELEGRAM_CHAT_ID`. It will be a negative number like: `-781559558`. Remember to include the negative sign! If you cannot find `"chat":` in the JSON, then you may have to remove the bot from your chat group and add it again. -With your Telegram chat id in hand, export the environment variable where you plan to run `solana-watchtower`: +With your Telegram chat id in hand, export the environment variable where you plan to run `agave-watchtower`: ``` export TELEGRAM_CHAT_ID= ``` -#### Restart solana-watchtower +#### Restart agave-watchtower -Once your environment variables are set, restart `solana-watchtower`. You should see output about your validator. +Once your environment variables are set, restart `agave-watchtower`. You should see output about your validator. To test that your Telegram configuration is working properly, you could stop your validator briefly until it is labeled as delinquent. Up to a minute after the validator is delinquent, you should receive a message in the Telegram group from your bot. Start the validator again and verify that you get another message in your Telegram group from the bot. The message should say `all clear`. \ No newline at end of file diff --git a/docs/src/validator/best-practices/operations.md b/docs/src/validator/best-practices/operations.md index 0588fc9ee9053c..7560f77994d79e 100644 --- a/docs/src/validator/best-practices/operations.md +++ b/docs/src/validator/best-practices/operations.md @@ -13,10 +13,10 @@ The Solana validator community holds regular educational workshops. You can watc ## Help with the validator command line -From within the Solana CLI, you can execute the `solana-validator` command with the `--help` flag to get a better understanding of the flags and sub commands available. +From within the Solana CLI, you can execute the `agave-validator` command with the `--help` flag to get a better understanding of the flags and sub commands available. ``` -solana-validator --help +agave-validator --help ``` ## Restarting your validator @@ -31,10 +31,10 @@ solana leader-schedule Based on the current slot and the leader schedule, you can calculate open time windows where your validator is not expected to produce blocks. -Assuming you are ready to restart, you may use the `solana-validator exit` command. The command exits your validator process when an appropriate idle time window is reached. Assuming that you have systemd implemented for your validator process, the validator should restart automatically after the exit. See the below help command for details: +Assuming you are ready to restart, you may use the `agave-validator exit` command. The command exits your validator process when an appropriate idle time window is reached. Assuming that you have systemd implemented for your validator process, the validator should restart automatically after the exit. See the below help command for details: ``` -solana-validator exit --help +agave-validator exit --help ``` ## Upgrading @@ -45,27 +45,27 @@ There are many ways to upgrade the [Solana software](../../cli/install-solana-cl ### Building From Source -It is a best practice to always build your Solana binaries from source. If you build from source, you are certain that the code you are building has not been tampered with before the binary was created. You may also be able to optimize your `solana-validator` binary to your specific hardware. +It is a best practice to always build your Solana binaries from source. If you build from source, you are certain that the code you are building has not been tampered with before the binary was created. You may also be able to optimize your `agave-validator` binary to your specific hardware. If you build from source on the validator machine (or a machine with the same CPU), you can target your specific architecture using the `-march` flag. Refer to the Solana docs for [instructions on building from source](../../cli/install-solana-cli-tools.md#build-from-source). -### solana-install +### agave-install -If you are not comfortable building from source, or you need to quickly install a new version to test something out, you could instead try using the `solana-install` command. +If you are not comfortable building from source, or you need to quickly install a new version to test something out, you could instead try using the `agave-install` command. Assuming you want to install Solana version `1.14.17`, you would execute the following: ``` -solana-install init 1.14.17 +agave-install init 1.14.17 ``` -This command downloads the executable for `1.14.17` and installs it into a `.local` directory. You can also look at `solana-install --help` for more options. +This command downloads the executable for `1.14.17` and installs it into a `.local` directory. You can also look at `agave-install --help` for more options. > **Note** this command only works if you already have the solana cli installed. If you do not have the cli installed, refer to [install solana cli tools](../../cli/install-solana-cli-tools.md) ### Restart -For all install methods, the validator process will need to be restarted before the newly installed version is in use. Use `solana-validator exit` to restart your validator process. +For all install methods, the validator process will need to be restarted before the newly installed version is in use. Use `agave-validator exit` to restart your validator process. ### Verifying version @@ -79,13 +79,13 @@ grep -B1 'Starting validator with' Validators operators who have not experienced significant downtime (multiple hours of downtime), should avoid downloading snapshots. It is important for the health of the cluster as well as your validator history to maintain the local ledger. Therefore, you should not download a new snapshot any time your validator is offline or experiences an issue. Downloading a snapshot should only be reserved for occasions when you do not have local state. Prolonged downtime or the first install of a new validator are examples of times when you may not have state locally. In other cases such as restarts for upgrades, a snapshot download should be avoided. -To avoid downloading a snapshot on restart, add the following flag to the `solana-validator` command: +To avoid downloading a snapshot on restart, add the following flag to the `agave-validator` command: ``` --no-snapshot-fetch ``` -If you use this flag with the `solana-validator` command, make sure that you run `solana catchup ` after your validator starts to make sure that the validator is catching up in a reasonable time. After some time (potentially a few hours), if it appears that your validator continues to fall behind, then you may have to download a new snapshot. +If you use this flag with the `agave-validator` command, make sure that you run `solana catchup ` after your validator starts to make sure that the validator is catching up in a reasonable time. After some time (potentially a few hours), if it appears that your validator continues to fall behind, then you may have to download a new snapshot. ### Downloading Snapshots @@ -122,13 +122,13 @@ Once you have a local snapshot, you can restart your validator with the `--no-sn ## Regularly Check Account Balances -It is important that you do not accidentally run out of funds in your identity account, as your node will stop voting. It is also important to note that this account keypair is the most vulnerable of the three keypairs in a vote account because the keypair for the identity account is stored on your validator when running the `solana-validator` software. How much SOL you should store there is up to you. As a best practice, make sure to check the account regularly and refill or deduct from it as needed. To check the account balance do: +It is important that you do not accidentally run out of funds in your identity account, as your node will stop voting. It is also important to note that this account keypair is the most vulnerable of the three keypairs in a vote account because the keypair for the identity account is stored on your validator when running the `agave-validator` software. How much SOL you should store there is up to you. As a best practice, make sure to check the account regularly and refill or deduct from it as needed. To check the account balance do: ``` solana balance validator-keypair.json ``` -> **Note** `solana-watchtower` can monitor for a minimum validator identity balance. See [monitoring best practices](./monitoring.md) for details. +> **Note** `agave-watchtower` can monitor for a minimum validator identity balance. See [monitoring best practices](./monitoring.md) for details. ## Withdrawing From The Vote Account diff --git a/docs/src/validator/get-started/setup-a-validator.md b/docs/src/validator/get-started/setup-a-validator.md index 6598400bda5a37..a745798cd2351b 100644 --- a/docs/src/validator/get-started/setup-a-validator.md +++ b/docs/src/validator/get-started/setup-a-validator.md @@ -245,7 +245,7 @@ Your system will need to be tuned in order to run properly. Your validator may n #### **Optimize sysctl knobs** ```bash -sudo bash -c "cat >/etc/sysctl.d/21-solana-validator.conf </etc/sysctl.d/21-agave-validator.conf < For more explanation on the flags used in the command, refer to the `solana-validator --help` command +> For more explanation on the flags used in the command, refer to the `agave-validator --help` command ``` #!/bin/bash -exec solana-validator \ +exec agave-validator \ --identity /home/sol/validator-keypair.json \ --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \ --known-validator dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs \ diff --git a/geyser-plugin-interface/Cargo.toml b/geyser-plugin-interface/Cargo.toml index af99758b47d630..56f42fd4612cec 100644 --- a/geyser-plugin-interface/Cargo.toml +++ b/geyser-plugin-interface/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "solana-geyser-plugin-interface" +name = "agave-geyser-plugin-interface" description = "The Solana Geyser plugin interface." -documentation = "https://docs.rs/solana-geyser-plugin-interface" +documentation = "https://docs.rs/agave-geyser-plugin-interface" version = { workspace = true } authors = { workspace = true } repository = { workspace = true } diff --git a/geyser-plugin-manager/Cargo.toml b/geyser-plugin-manager/Cargo.toml index 9b4468eddaea9b..2c8efb062285d5 100644 --- a/geyser-plugin-manager/Cargo.toml +++ b/geyser-plugin-manager/Cargo.toml @@ -10,6 +10,7 @@ license = { workspace = true } edition = { workspace = true } [dependencies] +agave-geyser-plugin-interface = { workspace = true } bs58 = { workspace = true } crossbeam-channel = { workspace = true } @@ -21,7 +22,6 @@ log = { workspace = true } serde_json = { workspace = true } solana-accounts-db = { workspace = true } solana-entry = { workspace = true } -solana-geyser-plugin-interface = { workspace = true } solana-ledger = { workspace = true } solana-measure = { workspace = true } solana-metrics = { workspace = true } diff --git a/geyser-plugin-manager/src/accounts_update_notifier.rs b/geyser-plugin-manager/src/accounts_update_notifier.rs index 7c7e3370fc00eb..90ab0b7998a35c 100644 --- a/geyser-plugin-manager/src/accounts_update_notifier.rs +++ b/geyser-plugin-manager/src/accounts_update_notifier.rs @@ -1,14 +1,14 @@ /// Module responsible for notifying plugins of account updates use { crate::geyser_plugin_manager::GeyserPluginManager, + agave_geyser_plugin_interface::geyser_plugin_interface::{ + ReplicaAccountInfoV3, ReplicaAccountInfoVersions, + }, log::*, solana_accounts_db::{ account_storage::meta::StoredAccountMeta, accounts_update_notifier_interface::AccountsUpdateNotifierInterface, }, - solana_geyser_plugin_interface::geyser_plugin_interface::{ - ReplicaAccountInfoV3, ReplicaAccountInfoVersions, - }, solana_measure::measure::Measure, solana_metrics::*, solana_sdk::{ diff --git a/geyser-plugin-manager/src/block_metadata_notifier.rs b/geyser-plugin-manager/src/block_metadata_notifier.rs index ab56cf3be81701..b23cc002220171 100644 --- a/geyser-plugin-manager/src/block_metadata_notifier.rs +++ b/geyser-plugin-manager/src/block_metadata_notifier.rs @@ -3,11 +3,11 @@ use { block_metadata_notifier_interface::BlockMetadataNotifier, geyser_plugin_manager::GeyserPluginManager, }, - log::*, - solana_accounts_db::stake_rewards::RewardInfo, - solana_geyser_plugin_interface::geyser_plugin_interface::{ + agave_geyser_plugin_interface::geyser_plugin_interface::{ ReplicaBlockInfoV3, ReplicaBlockInfoVersions, }, + log::*, + solana_accounts_db::stake_rewards::RewardInfo, solana_measure::measure::Measure, solana_metrics::*, solana_sdk::{clock::UnixTimestamp, pubkey::Pubkey}, diff --git a/geyser-plugin-manager/src/entry_notifier.rs b/geyser-plugin-manager/src/entry_notifier.rs index ce6c3239c0946c..69a61ff70ae934 100644 --- a/geyser-plugin-manager/src/entry_notifier.rs +++ b/geyser-plugin-manager/src/entry_notifier.rs @@ -1,11 +1,11 @@ /// Module responsible for notifying plugins about entries use { crate::geyser_plugin_manager::GeyserPluginManager, - log::*, - solana_entry::entry::EntrySummary, - solana_geyser_plugin_interface::geyser_plugin_interface::{ + agave_geyser_plugin_interface::geyser_plugin_interface::{ ReplicaEntryInfo, ReplicaEntryInfoVersions, }, + log::*, + solana_entry::entry::EntrySummary, solana_ledger::entry_notifier_interface::EntryNotifier, solana_measure::measure::Measure, solana_metrics::*, diff --git a/geyser-plugin-manager/src/geyser_plugin_manager.rs b/geyser-plugin-manager/src/geyser_plugin_manager.rs index c5da56859e2b36..48ee75e80b9bb2 100644 --- a/geyser-plugin-manager/src/geyser_plugin_manager.rs +++ b/geyser-plugin-manager/src/geyser_plugin_manager.rs @@ -1,9 +1,9 @@ use { + agave_geyser_plugin_interface::geyser_plugin_interface::GeyserPlugin, jsonrpc_core::{ErrorCode, Result as JsonRpcResult}, jsonrpc_server_utils::tokio::sync::oneshot::Sender as OneShotSender, libloading::Library, log::*, - solana_geyser_plugin_interface::geyser_plugin_interface::GeyserPlugin, std::{ ops::{Deref, DerefMut}, path::Path, @@ -419,8 +419,8 @@ mod tests { crate::geyser_plugin_manager::{ GeyserPluginManager, LoadedGeyserPlugin, TESTPLUGIN2_CONFIG, TESTPLUGIN_CONFIG, }, + agave_geyser_plugin_interface::geyser_plugin_interface::GeyserPlugin, libloading::Library, - solana_geyser_plugin_interface::geyser_plugin_interface::GeyserPlugin, std::sync::{Arc, RwLock}, }; diff --git a/geyser-plugin-manager/src/slot_status_notifier.rs b/geyser-plugin-manager/src/slot_status_notifier.rs index 587abe2f79d4de..1557bb2d4d8c36 100644 --- a/geyser-plugin-manager/src/slot_status_notifier.rs +++ b/geyser-plugin-manager/src/slot_status_notifier.rs @@ -1,7 +1,7 @@ use { crate::geyser_plugin_manager::GeyserPluginManager, + agave_geyser_plugin_interface::geyser_plugin_interface::SlotStatus, log::*, - solana_geyser_plugin_interface::geyser_plugin_interface::SlotStatus, solana_measure::measure::Measure, solana_metrics::*, solana_sdk::clock::Slot, diff --git a/geyser-plugin-manager/src/transaction_notifier.rs b/geyser-plugin-manager/src/transaction_notifier.rs index ab821e811047d2..b757c1202b377d 100644 --- a/geyser-plugin-manager/src/transaction_notifier.rs +++ b/geyser-plugin-manager/src/transaction_notifier.rs @@ -1,10 +1,10 @@ /// Module responsible for notifying plugins of transactions use { crate::geyser_plugin_manager::GeyserPluginManager, - log::*, - solana_geyser_plugin_interface::geyser_plugin_interface::{ + agave_geyser_plugin_interface::geyser_plugin_interface::{ ReplicaTransactionInfoV2, ReplicaTransactionInfoVersions, }, + log::*, solana_measure::measure::Measure, solana_metrics::*, solana_rpc::transaction_notifier_interface::TransactionNotifier, diff --git a/install/Cargo.toml b/install/Cargo.toml index 588d4315df5f35..c40a0ee6e9eee3 100644 --- a/install/Cargo.toml +++ b/install/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "solana-install" +name = "agave-install" description = "The solana cluster software installer" -documentation = "https://docs.rs/solana-install" +documentation = "https://docs.rs/agave-install" version = { workspace = true } authors = { workspace = true } repository = { workspace = true } diff --git a/install/solana-install-init.sh b/install/agave-install-init.sh similarity index 89% rename from install/solana-install-init.sh rename to install/agave-install-init.sh index 4f28e300be52ab..cf2d1babf3c306 100755 --- a/install/solana-install-init.sh +++ b/install/agave-install-init.sh @@ -10,7 +10,7 @@ # except according to those terms. # This is just a little script that can be downloaded from the internet to -# install solana-install. It just does platform detection, downloads the installer +# install agave-install. It just does platform detection, downloads the installer # and runs it. { # this ensures the entire script is downloaded # @@ -24,11 +24,11 @@ set -e usage() { cat 1>&2 < --pubkey + agave-install-init [FLAGS] [OPTIONS] --data_dir --pubkey FLAGS: -h, --help Prints help information @@ -81,7 +81,7 @@ main() { esac TARGET="${_cputype}-${_ostype}" - temp_dir="$(mktemp -d 2>/dev/null || ensure mktemp -d -t solana-install-init)" + temp_dir="$(mktemp -d 2>/dev/null || ensure mktemp -d -t agave-install-init)" ensure mkdir -p "$temp_dir" # Check for SOLANA_RELEASE environment variable override. Otherwise fetch @@ -101,8 +101,8 @@ main() { fi fi - download_url="$SOLANA_DOWNLOAD_ROOT/$release/solana-install-init-$TARGET" - solana_install_init="$temp_dir/solana-install-init" + download_url="$SOLANA_DOWNLOAD_ROOT/$release/agave-install-init-$TARGET" + solana_install_init="$temp_dir/agave-install-init" printf 'downloading %s installer\n' "$release" 1>&2 @@ -111,7 +111,7 @@ main() { ensure chmod u+x "$solana_install_init" if [ ! -x "$solana_install_init" ]; then printf '%s\n' "Cannot execute $solana_install_init (likely because of mounting /tmp as noexec)." 1>&2 - printf '%s\n' "Please copy the file to a location where you can execute binaries and run ./solana-install-init." 1>&2 + printf '%s\n' "Please copy the file to a location where you can execute binaries and run ./agave-install-init." 1>&2 exit 1 fi @@ -130,7 +130,7 @@ main() { } err() { - printf 'solana-install-init: %s\n' "$1" >&2 + printf 'agave-install-init: %s\n' "$1" >&2 exit 1 } diff --git a/install/install-help.sh b/install/install-help.sh index 9fb08afa6d14c9..7604777e378677 100755 --- a/install/install-help.sh +++ b/install/install-help.sh @@ -4,11 +4,11 @@ set -e cd "$(dirname "$0")"/.. cargo="$(readlink -f "./cargo")" -"$cargo" build --package solana-install +"$cargo" build --package agave-install export PATH=$PWD/target/debug:$PATH echo "\`\`\`manpage" -solana-install --help +agave-install --help echo "\`\`\`" echo "" @@ -16,7 +16,7 @@ commands=(init info deploy update run) for x in "${commands[@]}"; do echo "\`\`\`manpage" - solana-install "${x}" --help + agave-install "${x}" --help echo "\`\`\`" echo "" done diff --git a/install/src/bin/solana-install-init.rs b/install/src/bin/agave-install-init.rs similarity index 92% rename from install/src/bin/solana-install-init.rs rename to install/src/bin/agave-install-init.rs index ec888d8f452090..84c154ac12b35e 100644 --- a/install/src/bin/solana-install-init.rs +++ b/install/src/bin/agave-install-init.rs @@ -16,7 +16,7 @@ fn press_enter() { } fn main() { - solana_install::main_init().unwrap_or_else(|err| { + agave_install::main_init().unwrap_or_else(|err| { println!("Error: {err}"); press_enter(); exit(1); diff --git a/install/src/command.rs b/install/src/command.rs index 6f720c395bc331..996799835fa6ba 100644 --- a/install/src/command.rs +++ b/install/src/command.rs @@ -541,7 +541,7 @@ pub fn init( explicit_release: Option, ) -> Result<(), String> { let config = { - // Write new config file only if different, so that running |solana-install init| + // Write new config file only if different, so that running |agave-install init| // repeatedly doesn't unnecessarily re-download let mut current_config = Config::load(config_file).unwrap_or_default(); current_config.current_update_manifest = None; @@ -871,7 +871,7 @@ fn check_for_newer_github_release( prerelease_allowed: bool, ) -> Result, String> { let client = reqwest::blocking::Client::builder() - .user_agent("solana-install") + .user_agent("agave-install") .build() .map_err(|err| err.to_string())?; diff --git a/install/src/lib.rs b/install/src/lib.rs index 159317edd2e5a8..a28b963d65f825 100644 --- a/install/src/lib.rs +++ b/install/src/lib.rs @@ -281,7 +281,7 @@ pub fn main() -> Result<(), String> { pub fn main_init() -> Result<(), String> { solana_logger::setup(); - let matches = App::new("solana-install-init") + let matches = App::new("agave-install-init") .about("Initializes a new installation") .version(solana_version::version!()) .arg({ diff --git a/install/src/main.rs b/install/src/main.rs index c7b15aa6a67206..245f09825ddc6a 100644 --- a/install/src/main.rs +++ b/install/src/main.rs @@ -1,3 +1,3 @@ fn main() -> Result<(), String> { - solana_install::main() + agave_install::main() } diff --git a/ledger-tool/Cargo.toml b/ledger-tool/Cargo.toml index fb387773c14cfa..66b4b551064a8c 100644 --- a/ledger-tool/Cargo.toml +++ b/ledger-tool/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "solana-ledger-tool" +name = "agave-ledger-tool" description = "Blockchain, Rebuilt for Scale" -documentation = "https://docs.rs/solana-ledger-tool" +documentation = "https://docs.rs/agave-ledger-tool" version = { workspace = true } authors = { workspace = true } repository = { workspace = true } diff --git a/ledger-tool/src/ledger_utils.rs b/ledger-tool/src/ledger_utils.rs index 6514312bc5d43d..e96034077f077d 100644 --- a/ledger-tool/src/ledger_utils.rs +++ b/ledger-tool/src/ledger_utils.rs @@ -137,14 +137,14 @@ pub fn load_and_process_ledger( } let account_paths = if let Some(account_paths) = arg_matches.value_of("account_paths") { - // If this blockstore access is Primary, no other process (solana-validator) can hold + // If this blockstore access is Primary, no other process (agave-validator) can hold // Primary access. So, allow a custom accounts path without worry of wiping the accounts - // of solana-validator. + // of agave-validator. if !blockstore.is_primary_access() { // Attempt to open the Blockstore in Primary access; if successful, no other process // was holding Primary so allow things to proceed with custom accounts path. Release - // the Primary access instead of holding it to give priority to solana-validator over - // solana-ledger-tool should solana-validator start before we've finished. + // the Primary access instead of holding it to give priority to agave-validator over + // agave-ledger-tool should agave-validator start before we've finished. info!( "Checking if another process currently holding Primary access to {:?}", blockstore.ledger_path() diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index 30cb4b2e9779a4..566e4cf18c95dc 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -410,7 +410,7 @@ impl Rocks { "Opening Rocks with secondary (read only) access at: {:?}", secondary_path ); - info!("This secondary access could temporarily degrade other accesses, such as by solana-validator"); + info!("This secondary access could temporarily degrade other accesses, such as by agave-validator"); Rocks { db: DB::open_cf_descriptors_as_secondary( diff --git a/local-cluster/tests/local_cluster.rs b/local-cluster/tests/local_cluster.rs index fc08389947d581..c654efdd35de85 100644 --- a/local-cluster/tests/local_cluster.rs +++ b/local-cluster/tests/local_cluster.rs @@ -2315,13 +2315,13 @@ fn test_hard_fork_with_gap_in_roots() { ); // create hard-forked snapshot only for validator a, emulating the manual cluster restart - // procedure with `solana-ledger-tool create-snapshot` + // procedure with `agave-ledger-tool create-snapshot` let genesis_slot = 0; { let blockstore_a = Blockstore::open(&val_a_ledger_path).unwrap(); create_snapshot_to_hard_fork(&blockstore_a, hard_fork_slot, vec![hard_fork_slot]); - // Intentionally make solana-validator unbootable by replaying blocks from the genesis to + // Intentionally make agave-validator unbootable by replaying blocks from the genesis to // ensure the hard-forked snapshot is used always. Otherwise, we couldn't create a gap // in the ledger roots column family reliably. // There was a bug which caused the hard-forked snapshot at an unrooted slot to forget diff --git a/multinode-demo/bootstrap-validator.sh b/multinode-demo/bootstrap-validator.sh index f69c05d1ed3d7f..98d40e9adf3b19 100755 --- a/multinode-demo/bootstrap-validator.sh +++ b/multinode-demo/bootstrap-validator.sh @@ -14,9 +14,9 @@ if [[ "$SOLANA_GPU_MISSING" -eq 1 ]]; then fi if [[ -n $SOLANA_CUDA ]]; then - program=$solana_validator_cuda + program=$agave_validator_cuda else - program=$solana_validator + program=$agave_validator fi no_restart=0 diff --git a/multinode-demo/common.sh b/multinode-demo/common.sh index 9ae9331cb7a11d..1643208947b643 100644 --- a/multinode-demo/common.sh +++ b/multinode-demo/common.sh @@ -40,6 +40,8 @@ else if [[ -z $program ]]; then crate="cli" program="solana" + elif [[ $program == "validator" || $program == "ledger-tool" || $program == "watchtower" || $program == "install" ]]; then + program="agave-$program" else program="solana-$program" fi @@ -63,8 +65,8 @@ fi solana_bench_tps=$(solana_program bench-tps) solana_faucet=$(solana_program faucet) -solana_validator=$(solana_program validator) -solana_validator_cuda="$solana_validator --cuda" +agave_validator=$(solana_program validator) +agave_validator_cuda="$agave_validator --cuda" solana_genesis=$(solana_program genesis) solana_gossip=$(solana_program gossip) solana_keygen=$(solana_program keygen) diff --git a/multinode-demo/validator.sh b/multinode-demo/validator.sh index 9090055b908b10..a122b8523b5ea6 100755 --- a/multinode-demo/validator.sh +++ b/multinode-demo/validator.sh @@ -64,7 +64,7 @@ while [[ -n $1 ]]; do elif [[ $1 = --no-airdrop ]]; then airdrops_enabled=0 shift - # solana-validator options + # agave-validator options elif [[ $1 = --expected-genesis-hash ]]; then args+=("$1" "$2") shift 2 @@ -267,9 +267,9 @@ if [[ $maybeRequireTower = true ]]; then fi if [[ -n $SOLANA_CUDA ]]; then - program=$solana_validator_cuda + program=$agave_validator_cuda else - program=$solana_validator + program=$agave_validator fi set -e diff --git a/net/net.sh b/net/net.sh index 1106fe8e90a9bc..00261a135826d0 100755 --- a/net/net.sh +++ b/net/net.sh @@ -120,7 +120,7 @@ Operate a configured testnet sanity/start-specific options: -F - Discard validator nodes that didn't bootup successfully - -o noInstallCheck - Skip solana-install sanity + -o noInstallCheck - Skip agave-install sanity -o rejectExtraNodes - Require the exact number of nodes stop-specific options: @@ -136,7 +136,7 @@ Operate a configured testnet --netem-cmd - Optional command argument to netem. Default is "add". Use "cleanup" to remove rules. update-specific options: - --platform linux|osx|windows - Deploy the tarball using 'solana-install deploy ...' for the + --platform linux|osx|windows - Deploy the tarball using 'agave-install deploy ...' for the given platform (multiple platforms may be specified) (-t option must be supplied as well) @@ -511,11 +511,11 @@ deployUpdate() { declare bootstrapLeader=${validatorIpList[0]} for updatePlatform in $updatePlatforms; do - echo "--- Deploying solana-install update: $updatePlatform" + echo "--- Deploying agave-install update: $updatePlatform" ( set -x - scripts/solana-install-update-manifest-keypair.sh "$updatePlatform" + scripts/agave-install-update-manifest-keypair.sh "$updatePlatform" timeout 30s scp "${sshOptions[@]}" \ update_manifest_keypair.json "$bootstrapLeader:solana/update_manifest_keypair.json" diff --git a/net/remote/remote-deploy-update.sh b/net/remote/remote-deploy-update.sh index dd772927c0e119..3a71cf5725123e 100755 --- a/net/remote/remote-deploy-update.sh +++ b/net/remote/remote-deploy-update.sh @@ -35,6 +35,6 @@ loadConfigFile PATH="$HOME"/.cargo/bin:"$PATH" set -x -scripts/solana-install-deploy.sh \ +scripts/agave-install-deploy.sh \ --keypair config/faucet.json \ localhost "$releaseChannel" "$updatePlatform" diff --git a/net/remote/remote-node.sh b/net/remote/remote-node.sh index aeb920bd50bab0..b7d224088da9f9 100755 --- a/net/remote/remote-node.sh +++ b/net/remote/remote-node.sh @@ -121,7 +121,7 @@ cat >> ~/solana/on-reboot < system-stats.pid if ${GPU_CUDA_OK} && [[ -e /dev/nvidia0 ]]; then - echo Selecting solana-validator-cuda + echo Selecting agave-validator-cuda export SOLANA_CUDA=1 elif ${GPU_FAIL_IF_NONE} ; then echo "Expected GPU, found none!" @@ -257,13 +257,13 @@ EOF if [[ -n "$maybeWarpSlot" ]]; then # shellcheck disable=SC2086 # Do not want to quote $maybeWarSlot - solana-ledger-tool -l config/bootstrap-validator create-snapshot 0 config/bootstrap-validator $maybeWarpSlot + agave-ledger-tool -l config/bootstrap-validator create-snapshot 0 config/bootstrap-validator $maybeWarpSlot fi - solana-ledger-tool -l config/bootstrap-validator shred-version --max-genesis-archive-unpacked-size 1073741824 | tee config/shred-version + agave-ledger-tool -l config/bootstrap-validator shred-version --max-genesis-archive-unpacked-size 1073741824 | tee config/shred-version if [[ -n "$maybeWaitForSupermajority" ]]; then - bankHash=$(solana-ledger-tool -l config/bootstrap-validator bank-hash --halt-at-slot 0) + bankHash=$(agave-ledger-tool -l config/bootstrap-validator bank-hash --halt-at-slot 0) extraNodeArgs="$extraNodeArgs --expected-bank-hash $bankHash" echo "$bankHash" > config/bank-hash fi diff --git a/net/remote/remote-sanity.sh b/net/remote/remote-sanity.sh index 8c36e99ffdf936..91dae4b57336fa 100755 --- a/net/remote/remote-sanity.sh +++ b/net/remote/remote-sanity.sh @@ -65,7 +65,7 @@ local|tar|skip) export USE_INSTALL=1 solana_cli=solana solana_gossip=solana-gossip - solana_install=solana-install + solana_install=agave-install ;; *) echo "Unknown deployment method: $deployMethod" @@ -122,7 +122,7 @@ else fi if $installCheck && [[ -r update_manifest_keypair.json ]]; then - echo "--- $sanityTargetIp: solana-install test" + echo "--- $sanityTargetIp: agave-install test" ( set -x diff --git a/notifier/src/lib.rs b/notifier/src/lib.rs index a369225772492c..75406d2fbdae33 100644 --- a/notifier/src/lib.rs +++ b/notifier/src/lib.rs @@ -19,7 +19,7 @@ /// /// To receive a Twilio SMS notification on failure, having a Twilio account, /// and a sending number owned by that account, -/// define environment variable before running `solana-watchtower`: +/// define environment variable before running `agave-watchtower`: /// ```bash /// export TWILIO_CONFIG='ACCOUNT=,TOKEN=,TO=,FROM=' /// ``` @@ -208,7 +208,7 @@ impl Notifier { NotificationType::Resolve { ref incident } => incident.clone().to_string(), }; - let data = json!({"payload":{"summary":msg,"source":"solana-watchtower","severity":"critical"},"routing_key":routing_key,"event_action":event_action,"dedup_key":dedup_key}); + let data = json!({"payload":{"summary":msg,"source":"agave-watchtower","severity":"critical"},"routing_key":routing_key,"event_action":event_action,"dedup_key":dedup_key}); let url = "https://events.pagerduty.com/v2/enqueue"; if let Err(err) = self.client.post(url).json(&data).send() { diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 21919415438b93..4bb66ae0cd62a1 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -63,6 +63,78 @@ dependencies = [ "zeroize", ] +[[package]] +name = "agave-geyser-plugin-interface" +version = "1.17.25" +dependencies = [ + "log", + "solana-sdk", + "solana-transaction-status", + "thiserror", +] + +[[package]] +name = "agave-validator" +version = "1.17.25" +dependencies = [ + "agave-geyser-plugin-interface", + "chrono", + "clap 2.33.3", + "console", + "core_affinity", + "crossbeam-channel", + "fd-lock", + "indicatif", + "itertools", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-ipc-server", + "jsonrpc-server-utils", + "lazy_static", + "libc", + "libloading", + "log", + "num_cpus", + "rand 0.8.5", + "rayon", + "serde", + "serde_json", + "serde_yaml", + "signal-hook", + "solana-accounts-db", + "solana-clap-utils", + "solana-cli-config", + "solana-core", + "solana-download-utils", + "solana-entry", + "solana-faucet", + "solana-genesis-utils", + "solana-geyser-plugin-manager", + "solana-gossip", + "solana-ledger", + "solana-logger", + "solana-metrics", + "solana-net-utils", + "solana-perf", + "solana-poh", + "solana-rpc", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-runtime", + "solana-sdk", + "solana-send-transaction-service", + "solana-storage-bigtable", + "solana-streamer", + "solana-test-validator", + "solana-tpu-client", + "solana-version", + "solana-vote-program", + "symlink", + "thiserror", + "tikv-jemallocator", +] + [[package]] name = "ahash" version = "0.7.6" @@ -4969,20 +5041,11 @@ dependencies = [ "solana-sdk", ] -[[package]] -name = "solana-geyser-plugin-interface" -version = "1.17.25" -dependencies = [ - "log", - "solana-sdk", - "solana-transaction-status", - "thiserror", -] - [[package]] name = "solana-geyser-plugin-manager" version = "1.17.25" dependencies = [ + "agave-geyser-plugin-interface", "bs58", "crossbeam-channel", "json5", @@ -4993,7 +5056,6 @@ dependencies = [ "serde_json", "solana-accounts-db", "solana-entry", - "solana-geyser-plugin-interface", "solana-ledger", "solana-measure", "solana-metrics", @@ -5969,11 +6031,11 @@ dependencies = [ name = "solana-sbf-rust-simulation" version = "1.17.25" dependencies = [ + "agave-validator", "solana-logger", "solana-program", "solana-program-test", "solana-sdk", - "solana-validator", ] [[package]] @@ -6335,68 +6397,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "solana-validator" -version = "1.17.25" -dependencies = [ - "chrono", - "clap 2.33.3", - "console", - "core_affinity", - "crossbeam-channel", - "fd-lock", - "indicatif", - "itertools", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-ipc-server", - "jsonrpc-server-utils", - "lazy_static", - "libc", - "libloading", - "log", - "num_cpus", - "rand 0.8.5", - "rayon", - "serde", - "serde_json", - "serde_yaml", - "signal-hook", - "solana-accounts-db", - "solana-clap-utils", - "solana-cli-config", - "solana-core", - "solana-download-utils", - "solana-entry", - "solana-faucet", - "solana-genesis-utils", - "solana-geyser-plugin-interface", - "solana-geyser-plugin-manager", - "solana-gossip", - "solana-ledger", - "solana-logger", - "solana-metrics", - "solana-net-utils", - "solana-perf", - "solana-poh", - "solana-rpc", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-runtime", - "solana-sdk", - "solana-send-transaction-service", - "solana-storage-bigtable", - "solana-streamer", - "solana-test-validator", - "solana-tpu-client", - "solana-version", - "solana-vote-program", - "symlink", - "thiserror", - "tikv-jemallocator", -] - [[package]] name = "solana-version" version = "1.17.25" diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index a006e46c3b8210..4911a182810bf4 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -47,7 +47,7 @@ solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.25", default solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.25" } solana-sdk = { path = "../../sdk", version = "=1.17.25" } solana-transaction-status = { path = "../../transaction-status", version = "=1.17.25" } -solana-validator = { path = "../../validator", version = "=1.17.25" } +agave-validator = { path = "../../validator", version = "=1.17.25" } solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.25" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/programs/sbf/rust/simulation/Cargo.toml b/programs/sbf/rust/simulation/Cargo.toml index 7091ef9d5ade0c..e9728e5916b801 100644 --- a/programs/sbf/rust/simulation/Cargo.toml +++ b/programs/sbf/rust/simulation/Cargo.toml @@ -16,10 +16,10 @@ test-bpf = [] solana-program = { workspace = true } [dev-dependencies] +agave-validator = { workspace = true } solana-logger = { workspace = true } solana-program-test = { workspace = true } solana-sdk = { workspace = true } -solana-validator = { workspace = true } [lib] crate-type = ["cdylib", "lib"] diff --git a/programs/sbf/rust/simulation/tests/validator.rs b/programs/sbf/rust/simulation/tests/validator.rs index 3044ad9a642629..17de51e665e3ec 100644 --- a/programs/sbf/rust/simulation/tests/validator.rs +++ b/programs/sbf/rust/simulation/tests/validator.rs @@ -1,13 +1,13 @@ #![cfg(feature = "test-bpf")] use { + agave_validator::test_validator::*, solana_program::{ instruction::{AccountMeta, Instruction}, pubkey::Pubkey, sysvar, }, solana_sdk::{signature::Signer, transaction::Transaction}, - solana_validator::test_validator::*, }; #[test] diff --git a/pubsub-client/src/nonblocking/pubsub_client.rs b/pubsub-client/src/nonblocking/pubsub_client.rs index fe0540ebed4227..c14b6ee1b08781 100644 --- a/pubsub-client/src/nonblocking/pubsub_client.rs +++ b/pubsub-client/src/nonblocking/pubsub_client.rs @@ -33,7 +33,7 @@ //! By default the [`block_subscribe`] and [`vote_subscribe`] events are //! disabled on RPC nodes. They can be enabled by passing //! `--rpc-pubsub-enable-block-subscription` and -//! `--rpc-pubsub-enable-vote-subscription` to `solana-validator`. When these +//! `--rpc-pubsub-enable-vote-subscription` to `agave-validator`. When these //! methods are disabled, the RPC server will return a "Method not found" error //! message. //! @@ -381,7 +381,7 @@ impl PubsubClient { /// Receives messages of type [`RpcBlockUpdate`] when a block is confirmed or finalized. /// /// This method is disabled by default. It can be enabled by passing - /// `--rpc-pubsub-enable-block-subscription` to `solana-validator`. + /// `--rpc-pubsub-enable-block-subscription` to `agave-validator`. /// /// # RPC Reference /// @@ -452,7 +452,7 @@ impl PubsubClient { /// votes are observed prior to confirmation and may never be confirmed. /// /// This method is disabled by default. It can be enabled by passing - /// `--rpc-pubsub-enable-vote-subscription` to `solana-validator`. + /// `--rpc-pubsub-enable-vote-subscription` to `agave-validator`. /// /// # RPC Reference /// diff --git a/pubsub-client/src/pubsub_client.rs b/pubsub-client/src/pubsub_client.rs index 612df285d8e5e3..49139983521627 100644 --- a/pubsub-client/src/pubsub_client.rs +++ b/pubsub-client/src/pubsub_client.rs @@ -32,7 +32,7 @@ //! By default the [`block_subscribe`] and [`vote_subscribe`] events are //! disabled on RPC nodes. They can be enabled by passing //! `--rpc-pubsub-enable-block-subscription` and -//! `--rpc-pubsub-enable-vote-subscription` to `solana-validator`. When these +//! `--rpc-pubsub-enable-vote-subscription` to `agave-validator`. When these //! methods are disabled, the RPC server will return a "Method not found" error //! message. //! @@ -416,7 +416,7 @@ impl PubsubClient { /// Receives messages of type [`RpcBlockUpdate`] when a block is confirmed or finalized. /// /// This method is disabled by default. It can be enabled by passing - /// `--rpc-pubsub-enable-block-subscription` to `solana-validator`. + /// `--rpc-pubsub-enable-block-subscription` to `agave-validator`. /// /// # RPC Reference /// @@ -578,7 +578,7 @@ impl PubsubClient { /// votes are observed prior to confirmation and may never be confirmed. /// /// This method is disabled by default. It can be enabled by passing - /// `--rpc-pubsub-enable-vote-subscription` to `solana-validator`. + /// `--rpc-pubsub-enable-vote-subscription` to `agave-validator`. /// /// # RPC Reference /// diff --git a/rbpf-cli/src/main.rs b/rbpf-cli/src/main.rs index e7db982026f82a..9e243f0836aa0f 100644 --- a/rbpf-cli/src/main.rs +++ b/rbpf-cli/src/main.rs @@ -1,6 +1,6 @@ fn main() { println!( - r##"rbpf-cli is replaced by solana-ledger-tool program run subcommand. -Please, use 'solana-ledger-tool program run --help' for more information."## + r##"rbpf-cli is replaced by agave-ledger-tool program run subcommand. +Please, use 'agave-ledger-tool program run --help' for more information."## ); } diff --git a/rpc/src/rpc.rs b/rpc/src/rpc.rs index d7d0d8b6cc172d..a10f3cd14a7e1d 100644 --- a/rpc/src/rpc.rs +++ b/rpc/src/rpc.rs @@ -2550,7 +2550,7 @@ pub mod rpc_minimal { #[rpc(meta, name = "getVersion")] fn get_version(&self, meta: Self::Metadata) -> Result; - // TODO: Refactor `solana-validator wait-for-restart-window` to not require this method, so + // TODO: Refactor `agave-validator wait-for-restart-window` to not require this method, so // it can be removed from rpc_minimal #[rpc(meta, name = "getVoteAccounts")] fn get_vote_accounts( @@ -2559,7 +2559,7 @@ pub mod rpc_minimal { config: Option, ) -> Result; - // TODO: Refactor `solana-validator wait-for-restart-window` to not require this method, so + // TODO: Refactor `agave-validator wait-for-restart-window` to not require this method, so // it can be removed from rpc_minimal #[rpc(meta, name = "getLeaderSchedule")] fn get_leader_schedule( @@ -2685,7 +2685,7 @@ pub mod rpc_minimal { }) } - // TODO: Refactor `solana-validator wait-for-restart-window` to not require this method, so + // TODO: Refactor `agave-validator wait-for-restart-window` to not require this method, so // it can be removed from rpc_minimal fn get_vote_accounts( &self, @@ -2696,7 +2696,7 @@ pub mod rpc_minimal { meta.get_vote_accounts(config) } - // TODO: Refactor `solana-validator wait-for-restart-window` to not require this method, so + // TODO: Refactor `agave-validator wait-for-restart-window` to not require this method, so // it can be removed from rpc_minimal fn get_leader_schedule( &self, diff --git a/scripts/solana-install-deploy.sh b/scripts/agave-install-deploy.sh similarity index 90% rename from scripts/solana-install-deploy.sh rename to scripts/agave-install-deploy.sh index ea77ca34bc9ea3..a8f8eeb65b3857 100755 --- a/scripts/solana-install-deploy.sh +++ b/scripts/agave-install-deploy.sh @@ -26,7 +26,7 @@ if [[ -z $URL || -z $TAG ]]; then fi if [[ ! -f update_manifest_keypair.json ]]; then - "$SOLANA_ROOT"/scripts/solana-install-update-manifest-keypair.sh "$OS" + "$SOLANA_ROOT"/scripts/agave-install-update-manifest-keypair.sh "$OS" fi case "$OS" in @@ -76,4 +76,4 @@ if [[ $balance = "0 lamports" ]]; then fi # shellcheck disable=SC2086 # Don't want to double quote $maybeKeypair -solana-install deploy $maybeKeypair --url "$URL" "$DOWNLOAD_URL" update_manifest_keypair.json +agave-install deploy $maybeKeypair --url "$URL" "$DOWNLOAD_URL" update_manifest_keypair.json diff --git a/scripts/solana-install-update-manifest-keypair.sh b/scripts/agave-install-update-manifest-keypair.sh similarity index 100% rename from scripts/solana-install-update-manifest-keypair.sh rename to scripts/agave-install-update-manifest-keypair.sh diff --git a/scripts/cargo-install-all.sh b/scripts/cargo-install-all.sh index 549aa15550b0eb..029b1fbf27943d 100755 --- a/scripts/cargo-install-all.sh +++ b/scripts/cargo-install-all.sh @@ -91,8 +91,8 @@ if [[ $CI_OS_NAME = windows ]]; then cargo-test-bpf cargo-test-sbf solana - solana-install - solana-install-init + agave-install + agave-install-init solana-keygen solana-stake-accounts solana-test-validator @@ -106,12 +106,12 @@ else solana-bench-tps solana-faucet solana-gossip - solana-install + agave-install solana-keygen - solana-ledger-tool + agave-ledger-tool solana-log-analyzer solana-net-shaper - solana-validator + agave-validator rbpf-cli ) @@ -123,11 +123,11 @@ else cargo-test-bpf cargo-test-sbf solana-dos - solana-install-init + agave-install-init solana-stake-accounts solana-test-validator solana-tokens - solana-watchtower + agave-watchtower ) fi diff --git a/scripts/run.sh b/scripts/run.sh index 699bfce3e253e3..2d8e1ec88ac450 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -23,9 +23,11 @@ fi PATH=$PWD/target/$profile:$PATH ok=true -for program in solana-{faucet,genesis,keygen,validator}; do +for program in solana-{faucet,genesis,keygen}; do $program -V || ok=false done +agave-validator -V || ok=false + $ok || { echo echo "Unable to locate required programs. Try building them first with:" @@ -115,7 +117,7 @@ args=( --no-os-network-limits-test ) # shellcheck disable=SC2086 -solana-validator "${args[@]}" $SOLANA_RUN_SH_VALIDATOR_ARGS & +agave-validator "${args[@]}" $SOLANA_RUN_SH_VALIDATOR_ARGS & validator=$! wait "$validator" diff --git a/system-test/abi-testcases/mixed-validator-test.sh b/system-test/abi-testcases/mixed-validator-test.sh index 8ab673b26a3d21..c0400560dc519e 100755 --- a/system-test/abi-testcases/mixed-validator-test.sh +++ b/system-test/abi-testcases/mixed-validator-test.sh @@ -30,14 +30,14 @@ solanaInstallGlobalOpts=( bootstrapInstall() { declare v=$1 if [[ ! -h $solanaInstallDataDir/active_release ]]; then - sh "$SOLANA_ROOT"/install/solana-install-init.sh "$v" "${solanaInstallGlobalOpts[@]}" + sh "$SOLANA_ROOT"/install/agave-install-init.sh "$v" "${solanaInstallGlobalOpts[@]}" fi export PATH="$solanaInstallDataDir/active_release/bin/:$PATH" } bootstrapInstall "$baselineVersion" for v in "${otherVersions[@]}"; do - solana-install-init "${solanaInstallGlobalOpts[@]}" "$v" + agave-install-init "${solanaInstallGlobalOpts[@]}" "$v" solana -V done @@ -113,7 +113,7 @@ for v in "${otherVersions[@]}"; do ( set -x tmux new-window -t abi -n "$v" " \ - $SOLANA_BIN/solana-validator \ + $SOLANA_BIN/agave-validator \ --ledger $ledger \ --no-snapshot-fetch \ --entrypoint 127.0.0.1:8001 \ diff --git a/system-test/stability-testcases/gossip-dos-test.sh b/system-test/stability-testcases/gossip-dos-test.sh index f8afade75dc847..68c3c540d5948c 100755 --- a/system-test/stability-testcases/gossip-dos-test.sh +++ b/system-test/stability-testcases/gossip-dos-test.sh @@ -19,14 +19,14 @@ solanaInstallGlobalOpts=( bootstrapInstall() { declare v=$1 if [[ ! -h $solanaInstallDataDir/active_release ]]; then - sh "$SOLANA_ROOT"/install/solana-install-init.sh "$v" "${solanaInstallGlobalOpts[@]}" + sh "$SOLANA_ROOT"/install/agave-install-init.sh "$v" "${solanaInstallGlobalOpts[@]}" fi export PATH="$solanaInstallDataDir/active_release/bin/:$PATH" } bootstrapInstall "edge" -solana-install-init --version -solana-install-init edge +agave-install-init --version +agave-install-init edge solana-gossip --version solana-dos --version diff --git a/validator/Cargo.toml b/validator/Cargo.toml index 845bdda7eeab6b..7882762c6a0721 100644 --- a/validator/Cargo.toml +++ b/validator/Cargo.toml @@ -1,8 +1,8 @@ [package] -name = "solana-validator" +name = "agave-validator" description = "Blockchain, Rebuilt for Scale" -documentation = "https://docs.rs/solana-validator" -default-run = "solana-validator" +documentation = "https://docs.rs/agave-validator" +default-run = "agave-validator" version = { workspace = true } authors = { workspace = true } repository = { workspace = true } @@ -11,6 +11,7 @@ license = { workspace = true } edition = { workspace = true } [dependencies] +agave-geyser-plugin-interface = { workspace = true } chrono = { workspace = true, features = ["default", "serde"] } clap = { workspace = true } console = { workspace = true } @@ -41,7 +42,6 @@ solana-download-utils = { workspace = true } solana-entry = { workspace = true } solana-faucet = { workspace = true } solana-genesis-utils = { workspace = true } -solana-geyser-plugin-interface = { workspace = true } solana-geyser-plugin-manager = { workspace = true } solana-gossip = { workspace = true } solana-ledger = { workspace = true } diff --git a/validator/src/bin/solana-test-validator.rs b/validator/src/bin/solana-test-validator.rs index aee5fc039df410..139ad6804f0bc0 100644 --- a/validator/src/bin/solana-test-validator.rs +++ b/validator/src/bin/solana-test-validator.rs @@ -1,4 +1,8 @@ use { + agave_validator::{ + admin_rpc_service, cli, dashboard::Dashboard, ledger_lockfile, lock_ledger, + println_name_value, redirect_stderr_to_file, + }, clap::{crate_name, value_t, value_t_or_exit, values_t_or_exit}, crossbeam_channel::unbounded, itertools::Itertools, @@ -28,10 +32,6 @@ use { }, solana_streamer::socket::SocketAddrSpace, solana_test_validator::*, - solana_validator::{ - admin_rpc_service, cli, dashboard::Dashboard, ledger_lockfile, lock_ledger, - println_name_value, redirect_stderr_to_file, - }, std::{ collections::HashSet, fs, io, diff --git a/validator/src/bootstrap.rs b/validator/src/bootstrap.rs index 88a45fdad50635..0fe1ae7e6d5eda 100644 --- a/validator/src/bootstrap.rs +++ b/validator/src/bootstrap.rs @@ -444,7 +444,7 @@ pub fn attempt_download_genesis_and_snapshot( ) .unwrap_or_else(|err| { // Consider failures here to be more likely due to user error (eg, - // incorrect `solana-validator` command-line arguments) rather than the + // incorrect `agave-validator` command-line arguments) rather than the // RPC node failing. // // Power users can always use the `--no-check-vote-account` option to diff --git a/validator/src/main.rs b/validator/src/main.rs index f5b0ce1a0609e7..680397a9d3c73c 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -2,6 +2,15 @@ #[cfg(not(target_env = "msvc"))] use jemallocator::Jemalloc; use { + agave_validator::{ + admin_rpc_service, + admin_rpc_service::{load_staked_nodes_overrides, StakedNodesOverrides}, + bootstrap, + cli::{app, warn_for_deprecated_arguments, DefaultArgs}, + dashboard::Dashboard, + ledger_lockfile, lock_ledger, new_spinner_progress_bar, println_name_value, + redirect_stderr_to_file, + }, clap::{crate_name, value_t, value_t_or_exit, values_t, values_t_or_exit, ArgMatches}, console::style, crossbeam_channel::unbounded, @@ -65,15 +74,6 @@ use { solana_send_transaction_service::send_transaction_service, solana_streamer::socket::SocketAddrSpace, solana_tpu_client::tpu_client::DEFAULT_TPU_ENABLE_UDP, - solana_validator::{ - admin_rpc_service, - admin_rpc_service::{load_staked_nodes_overrides, StakedNodesOverrides}, - bootstrap, - cli::{app, warn_for_deprecated_arguments, DefaultArgs}, - dashboard::Dashboard, - ledger_lockfile, lock_ledger, new_spinner_progress_bar, println_name_value, - redirect_stderr_to_file, - }, std::{ collections::{HashSet, VecDeque}, env, @@ -899,7 +899,7 @@ pub fn main() { let logfile = matches .value_of("logfile") .map(|s| s.into()) - .unwrap_or_else(|| format!("solana-validator-{}.log", identity_keypair.pubkey())); + .unwrap_or_else(|| format!("agave-validator-{}.log", identity_keypair.pubkey())); if logfile == "-" { None diff --git a/watchtower/Cargo.toml b/watchtower/Cargo.toml index d8bad3cf4d18f0..4088ee7d9b51ab 100644 --- a/watchtower/Cargo.toml +++ b/watchtower/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "solana-watchtower" +name = "agave-watchtower" description = "Blockchain, Rebuilt for Scale" -documentation = "https://docs.rs/solana-watchtower" +documentation = "https://docs.rs/agave-watchtower" version = { workspace = true } authors = { workspace = true } repository = { workspace = true } diff --git a/watchtower/README.md b/watchtower/README.md index 33bad3e458c449..5c548d405a248c 100644 --- a/watchtower/README.md +++ b/watchtower/README.md @@ -1,4 +1,4 @@ -The `solana-watchtower` program is used to monitor the health of a cluster. It +The `agave-watchtower` program is used to monitor the health of a cluster. It periodically polls the cluster over an RPC API to confirm that the transaction count is advancing, new blockhashes are available, and no validators are delinquent. Results are reported as InfluxDB metrics, with an optional push diff --git a/watchtower/src/main.rs b/watchtower/src/main.rs index f42acdaadaabc6..341b7903c0a33e 100644 --- a/watchtower/src/main.rs +++ b/watchtower/src/main.rs @@ -47,7 +47,7 @@ fn get_config() -> Config { .version(solana_version::version!()) .after_help("ADDITIONAL HELP: To receive a Slack, Discord, PagerDuty and/or Telegram notification on sanity failure, - define environment variables before running `solana-watchtower`: + define environment variables before running `agave-watchtower`: export SLACK_WEBHOOK=... export DISCORD_WEBHOOK=... @@ -63,7 +63,7 @@ fn get_config() -> Config { To receive a Twilio SMS notification on failure, having a Twilio account, and a sending number owned by that account, - define environment variable before running `solana-watchtower`: + define environment variable before running `agave-watchtower`: export TWILIO_CONFIG='ACCOUNT=,TOKEN=,TO=,FROM='") .arg({ @@ -166,7 +166,7 @@ fn get_config() -> Config { .value_name("SUFFIX") .takes_value(true) .default_value("") - .help("Add this string into all notification messages after \"solana-watchtower\"") + .help("Add this string into all notification messages after \"agave-watchtower\"") ) .get_matches(); @@ -381,7 +381,7 @@ fn main() -> Result<(), Box> { if let Some((failure_test_name, failure_error_message)) = &failure { let notification_msg = format!( - "solana-watchtower{}: Error: {}: {}", + "agave-watchtower{}: Error: {}: {}", config.name_suffix, failure_test_name, failure_error_message ); num_consecutive_failures += 1; @@ -415,7 +415,7 @@ fn main() -> Result<(), Box> { ); info!("{}", all_clear_msg); notifier.send( - &format!("solana-watchtower{}: {}", config.name_suffix, all_clear_msg), + &format!("agave-watchtower{}: {}", config.name_suffix, all_clear_msg), &NotificationType::Resolve { incident }, ); } From 527b75b841e3be41c315af2174ab373bb85ab324 Mon Sep 17 00:00:00 2001 From: Yihau Chen Date: Tue, 5 Mar 2024 15:20:01 +0800 Subject: [PATCH 183/213] v1.17: ignore mio audit report (#76) ci: ignore mio audit --- ci/do-audit.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci/do-audit.sh b/ci/do-audit.sh index 039df6b63cb635..0118c84c5f0fec 100755 --- a/ci/do-audit.sh +++ b/ci/do-audit.sh @@ -30,6 +30,9 @@ cargo_audit_ignores=( --ignore RUSTSEC-2023-0001 --ignore RUSTSEC-2022-0093 + + # mio + --ignore RUSTSEC-2024-0019 ) scripts/cargo-for-all-lock-files.sh audit "${cargo_audit_ignores[@]}" | $dep_tree_filter # we want the `cargo audit` exit code, not `$dep_tree_filter`'s From bc3ab0f839fe3dba322f8339cdba67735dfd37a3 Mon Sep 17 00:00:00 2001 From: Jon C Date: Wed, 6 Mar 2024 14:57:57 +0100 Subject: [PATCH 184/213] (v1.17) CI: Checkout v1.17 branch from SPL for downstream job (#108) CI: Checkout v1.17 branch from SPL for downstream job --- .github/scripts/downstream-project-spl-common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/downstream-project-spl-common.sh b/.github/scripts/downstream-project-spl-common.sh index a2277fa3094628..47237e71c9c5a8 100644 --- a/.github/scripts/downstream-project-spl-common.sh +++ b/.github/scripts/downstream-project-spl-common.sh @@ -8,7 +8,7 @@ source "$here"/../../ci/downstream-projects/common.sh set -x rm -rf spl -git clone https://github.com/solana-labs/solana-program-library.git spl +git clone https://github.com/solana-labs/solana-program-library.git spl -b v1.17 # copy toolchain file to use solana's rust version cp "$SOLANA_DIR"/rust-toolchain.toml spl/ From 0ef1f6513ac0c5adffb049c767d7cdff2d2256db Mon Sep 17 00:00:00 2001 From: Tyera Date: Wed, 6 Mar 2024 23:15:45 -0700 Subject: [PATCH 185/213] v1.17: Display error message while loading geyser plugins (#33990) (#97) Display error message while laoding geyser plugins (#33990) Co-authored-by: galactus <96341601+godmodegalactus@users.noreply.github.com> --- geyser-plugin-manager/src/geyser_plugin_manager.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/geyser-plugin-manager/src/geyser_plugin_manager.rs b/geyser-plugin-manager/src/geyser_plugin_manager.rs index 48ee75e80b9bb2..81579f8fd9d4de 100644 --- a/geyser-plugin-manager/src/geyser_plugin_manager.rs +++ b/geyser-plugin-manager/src/geyser_plugin_manager.rs @@ -296,13 +296,13 @@ pub enum GeyserPluginManagerError { #[error("Invalid plugin path")] InvalidPluginPath, - #[error("Cannot load plugin shared library")] + #[error("Cannot load plugin shared library (error: {0})")] PluginLoadError(String), #[error("The geyser plugin {0} is already loaded shared library")] PluginAlreadyLoaded(String), - #[error("The GeyserPlugin on_load method failed")] + #[error("The GeyserPlugin on_load method failed (error: {0})")] PluginStartError(String), } From 9b22f28104ec5fd606e4bb39442a7600b38bb671 Mon Sep 17 00:00:00 2001 From: Pankaj Garg Date: Fri, 8 Mar 2024 16:23:03 -0800 Subject: [PATCH 186/213] v1.17: Remove unnecessary unwrap from `simulate_transaction_unchecked()` (backport of #35375) (#65) Remove unnecessary unwrap from `simulate_transaction_unchecked()` (#35375) Remove unnecessary unwrap from simulate_transaction_unchecked() (cherry picked from commit cb260f10d1b05743391b9b442bf175c19d894931) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- runtime/src/bank.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 4f2260f72ea17c..9a3c25b4b8ee85 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -4384,9 +4384,7 @@ impl Bank { let post_simulation_accounts = loaded_transactions .into_iter() .next() - .unwrap() - .0 - .ok() + .and_then(|(loaded_transactions_res, _)| loaded_transactions_res.ok()) .map(|loaded_transaction| { loaded_transaction .accounts @@ -4406,7 +4404,12 @@ impl Bank { debug!("simulate_transaction: {:?}", timings); - let execution_result = execution_results.pop().unwrap(); + let execution_result = + execution_results + .pop() + .unwrap_or(TransactionExecutionResult::NotExecuted( + TransactionError::InvalidProgramForExecution, + )); let flattened_result = execution_result.flattened_result(); let (logs, return_data) = match execution_result { TransactionExecutionResult::Executed { details, .. } => { From b72e64563f246c467e4e64bf036243c07df7795c Mon Sep 17 00:00:00 2001 From: Yihau Chen Date: Mon, 11 Mar 2024 23:01:07 +0800 Subject: [PATCH 187/213] Bump version to v1.17.26 (#168) --- Cargo.lock | 218 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 244 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 334 insertions(+), 334 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 50bf277dd6a0ea..90252a69811169 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-install" -version = "1.17.25" +version = "1.17.26" dependencies = [ "atty", "bincode", @@ -110,7 +110,7 @@ dependencies = [ [[package]] name = "agave-ledger-tool" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_cmd", "bs58", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.25" +version = "1.17.26" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "agave-watchtower" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 2.33.3", "humantime", @@ -887,7 +887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" dependencies = [ "borsh-derive 0.10.3", - "hashbrown 0.13.2", + "hashbrown 0.12.3", ] [[package]] @@ -2314,7 +2314,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "regex", @@ -2322,7 +2322,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.25" +version = "1.17.26" dependencies = [ "regex", ] @@ -4243,7 +4243,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.25" +version = "1.17.26" dependencies = [ "protobuf-src", "tonic-build", @@ -4486,7 +4486,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.25" +version = "1.17.26" [[package]] name = "rcgen" @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.25" +version = "1.17.26" dependencies = [ "Inflector", "assert_matches", @@ -5301,7 +5301,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 2.33.3", "log", @@ -5315,7 +5315,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 2.33.3", "log", @@ -5345,7 +5345,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.25" +version = "1.17.26" dependencies = [ "arrayref", "assert_matches", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "bytemuck", @@ -5428,7 +5428,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -5439,7 +5439,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5463,7 +5463,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5480,7 +5480,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.25" +version = "1.17.26" dependencies = [ "serde", "solana-sdk", @@ -5489,7 +5489,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "crossbeam-channel", @@ -5507,7 +5507,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5518,7 +5518,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5559,7 +5559,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bv", "fnv", @@ -5576,7 +5576,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -5608,7 +5608,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bv", "bytemuck", @@ -5627,7 +5627,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "solana-logger", @@ -5635,7 +5635,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_cmd", "bzip2", @@ -5656,11 +5656,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.25" +version = "1.17.26" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.25" +version = "1.17.26" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5671,7 +5671,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "chrono", @@ -5688,7 +5688,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -5759,7 +5759,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.25" +version = "1.17.26" dependencies = [ "anyhow", "dirs-next", @@ -5774,7 +5774,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.25" +version = "1.17.26" dependencies = [ "Inflector", "base64 0.21.4", @@ -5800,7 +5800,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-trait", "bincode", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.25" +version = "1.17.26" dependencies = [ "futures-util", "rand 0.8.5", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5870,7 +5870,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "chrono", @@ -5883,7 +5883,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-trait", "bincode", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5990,7 +5990,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.25" +version = "1.17.26" dependencies = [ "lazy_static", "log", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "clap 3.2.23", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "console", "indicatif", @@ -6057,7 +6057,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "ed25519-dalek", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "byteorder", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.25" +version = "1.17.26" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.25" +version = "1.17.26" dependencies = [ "proc-macro2", "quote", @@ -6152,7 +6152,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.25" +version = "1.17.26" dependencies = [ "base64 0.21.4", "bincode", @@ -6177,7 +6177,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "solana-accounts-db", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.25" +version = "1.17.26" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -6213,7 +6213,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -6264,7 +6264,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bs58", "clap 3.2.23", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "log", @@ -6361,7 +6361,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6400,7 +6400,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.25" +version = "1.17.26" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.25" +version = "1.17.26" dependencies = [ "env_logger", "lazy_static", @@ -6421,7 +6421,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "solana-sdk", @@ -6429,11 +6429,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.25" +version = "1.17.26" [[package]] name = "solana-merkle-root-bench" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 2.33.3", "log", @@ -6446,7 +6446,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.25" +version = "1.17.26" dependencies = [ "fast-math", "hex", @@ -6455,7 +6455,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.25" +version = "1.17.26" dependencies = [ "crossbeam-channel", "env_logger", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6482,7 +6482,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "clap 3.2.23", @@ -6502,7 +6502,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "reqwest", @@ -6512,7 +6512,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.25" +version = "1.17.26" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6543,7 +6543,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -6564,7 +6564,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 3.2.23", "log", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "anyhow", "ark-bn254", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6665,7 +6665,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "async-trait", @@ -6694,7 +6694,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "anyhow", "crossbeam-channel", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-mutex", "async-trait", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.25" +version = "1.17.26" dependencies = [ "lazy_static", "num_cpus", @@ -6754,7 +6754,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "console", @@ -6773,7 +6773,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.25" +version = "1.17.26" dependencies = [ "base64 0.21.4", "bincode", @@ -6832,7 +6832,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "async-trait", @@ -6861,7 +6861,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.25" +version = "1.17.26" dependencies = [ "base64 0.21.4", "bs58", @@ -6881,7 +6881,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "anyhow", "clap 2.33.3", @@ -6898,7 +6898,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "bs58", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.25" +version = "1.17.26" dependencies = [ "arrayref", "assert_matches", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.25" +version = "1.17.26" dependencies = [ "anyhow", "assert_matches", @@ -7066,7 +7066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bs58", "proc-macro2", @@ -7083,7 +7083,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.25" +version = "1.17.26" dependencies = [ "crossbeam-channel", "log", @@ -7098,7 +7098,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7114,7 +7114,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -7131,7 +7131,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.25" +version = "1.17.26" dependencies = [ "backoff", "bincode", @@ -7163,7 +7163,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "bs58", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 2.33.3", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "async-channel", @@ -7223,7 +7223,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.25" +version = "1.17.26" dependencies = [ "base64 0.21.4", "bincode", @@ -7267,7 +7267,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "log", @@ -7281,7 +7281,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -7314,7 +7314,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-trait", "bincode", @@ -7336,7 +7336,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "clap 2.33.3", @@ -7363,7 +7363,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.25" +version = "1.17.26" dependencies = [ "Inflector", "base64 0.21.4", @@ -7386,7 +7386,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -7423,7 +7423,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-trait", "solana-connection-cache", @@ -7436,7 +7436,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.25" +version = "1.17.26" dependencies = [ "serde_json", "solana-metrics", @@ -7444,7 +7444,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "rustc_version 0.4.0", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "crossbeam-channel", @@ -7477,7 +7477,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.25" +version = "1.17.26" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index d4ba41ebe9711e..9bcf1e14e689ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.25" +version = "1.17.26" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.25" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.25" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.25" } -solana-banks-client = { path = "banks-client", version = "=1.17.25" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.25" } -solana-banks-server = { path = "banks-server", version = "=1.17.25" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.25" } -solana-bloom = { path = "bloom", version = "=1.17.25" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.25" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.25" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.25", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.25" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.25" } -solana-cli = { path = "cli", version = "=1.17.25" } -solana-cli-config = { path = "cli-config", version = "=1.17.25" } -solana-cli-output = { path = "cli-output", version = "=1.17.25" } -solana-client = { path = "client", version = "=1.17.25" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.25" } -solana-config-program = { path = "programs/config", version = "=1.17.25" } -solana-core = { path = "core", version = "=1.17.25" } -solana-cost-model = { path = "cost-model", version = "=1.17.25" } -solana-download-utils = { path = "download-utils", version = "=1.17.25" } -solana-entry = { path = "entry", version = "=1.17.25" } -solana-faucet = { path = "faucet", version = "=1.17.25" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.25" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.25" } -solana-genesis = { path = "genesis", version = "=1.17.25" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.25" } -agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.25" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.25" } -solana-gossip = { path = "gossip", version = "=1.17.25" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.25" } -solana-ledger = { path = "ledger", version = "=1.17.25" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.25" } -solana-logger = { path = "logger", version = "=1.17.25" } -solana-measure = { path = "measure", version = "=1.17.25" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.25" } -solana-metrics = { path = "metrics", version = "=1.17.25" } -solana-net-utils = { path = "net-utils", version = "=1.17.25" } -solana-notifier = { path = "notifier", version = "=1.17.25" } -solana-perf = { path = "perf", version = "=1.17.25" } -solana-poh = { path = "poh", version = "=1.17.25" } -solana-program = { path = "sdk/program", version = "=1.17.25" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.25" } -solana-program-test = { path = "program-test", version = "=1.17.25" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.25" } -solana-quic-client = { path = "quic-client", version = "=1.17.25" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.25" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.25", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.25" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.25", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.25" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.25" } -solana-runtime = { path = "runtime", version = "=1.17.25" } -solana-sdk = { path = "sdk", version = "=1.17.25" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.25" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.25" } -solana-stake-program = { path = "programs/stake", version = "=1.17.25" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.25" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.25" } -solana-streamer = { path = "streamer", version = "=1.17.25" } -solana-system-program = { path = "programs/system", version = "=1.17.25" } -solana-test-validator = { path = "test-validator", version = "=1.17.25" } -solana-thin-client = { path = "thin-client", version = "=1.17.25" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.25", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.25" } -solana-turbine = { path = "turbine", version = "=1.17.25" } -solana-udp-client = { path = "udp-client", version = "=1.17.25" } -solana-version = { path = "version", version = "=1.17.25" } -solana-vote = { path = "vote", version = "=1.17.25" } -solana-vote-program = { path = "programs/vote", version = "=1.17.25" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.25" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.25" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.25" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.26" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.26" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.26" } +solana-banks-client = { path = "banks-client", version = "=1.17.26" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.26" } +solana-banks-server = { path = "banks-server", version = "=1.17.26" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.26" } +solana-bloom = { path = "bloom", version = "=1.17.26" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.26" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.26" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.26", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.26" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.26" } +solana-cli = { path = "cli", version = "=1.17.26" } +solana-cli-config = { path = "cli-config", version = "=1.17.26" } +solana-cli-output = { path = "cli-output", version = "=1.17.26" } +solana-client = { path = "client", version = "=1.17.26" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.26" } +solana-config-program = { path = "programs/config", version = "=1.17.26" } +solana-core = { path = "core", version = "=1.17.26" } +solana-cost-model = { path = "cost-model", version = "=1.17.26" } +solana-download-utils = { path = "download-utils", version = "=1.17.26" } +solana-entry = { path = "entry", version = "=1.17.26" } +solana-faucet = { path = "faucet", version = "=1.17.26" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.26" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.26" } +solana-genesis = { path = "genesis", version = "=1.17.26" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.26" } +agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.26" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.26" } +solana-gossip = { path = "gossip", version = "=1.17.26" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.26" } +solana-ledger = { path = "ledger", version = "=1.17.26" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.26" } +solana-logger = { path = "logger", version = "=1.17.26" } +solana-measure = { path = "measure", version = "=1.17.26" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.26" } +solana-metrics = { path = "metrics", version = "=1.17.26" } +solana-net-utils = { path = "net-utils", version = "=1.17.26" } +solana-notifier = { path = "notifier", version = "=1.17.26" } +solana-perf = { path = "perf", version = "=1.17.26" } +solana-poh = { path = "poh", version = "=1.17.26" } +solana-program = { path = "sdk/program", version = "=1.17.26" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.26" } +solana-program-test = { path = "program-test", version = "=1.17.26" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.26" } +solana-quic-client = { path = "quic-client", version = "=1.17.26" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.26" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.26", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.26" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.26", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.26" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.26" } +solana-runtime = { path = "runtime", version = "=1.17.26" } +solana-sdk = { path = "sdk", version = "=1.17.26" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.26" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.26" } +solana-stake-program = { path = "programs/stake", version = "=1.17.26" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.26" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.26" } +solana-streamer = { path = "streamer", version = "=1.17.26" } +solana-system-program = { path = "programs/system", version = "=1.17.26" } +solana-test-validator = { path = "test-validator", version = "=1.17.26" } +solana-thin-client = { path = "thin-client", version = "=1.17.26" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.26", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.26" } +solana-turbine = { path = "turbine", version = "=1.17.26" } +solana-udp-client = { path = "udp-client", version = "=1.17.26" } +solana-version = { path = "version", version = "=1.17.26" } +solana-vote = { path = "vote", version = "=1.17.26" } +solana-vote-program = { path = "programs/vote", version = "=1.17.26" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.26" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.26" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.26" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 4bb66ae0cd62a1..67d3e6a25f7a4b 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.25" +version = "1.17.26" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -741,7 +741,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" dependencies = [ "borsh-derive 0.10.3", - "hashbrown 0.13.2", + "hashbrown 0.12.3", ] [[package]] @@ -4520,7 +4520,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.25" +version = "1.17.26" dependencies = [ "Inflector", "base64 0.21.4", @@ -4543,7 +4543,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.25" +version = "1.17.26" dependencies = [ "arrayref", "bincode", @@ -4600,7 +4600,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "bytemuck", @@ -4619,7 +4619,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4634,7 +4634,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.25" +version = "1.17.26" dependencies = [ "serde", "solana-sdk", @@ -4643,7 +4643,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "crossbeam-channel", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bv", "fnv", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4695,7 +4695,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.25" +version = "1.17.26" dependencies = [ "array-bytes", "serde", @@ -4705,7 +4705,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bv", "bytemuck", @@ -4721,7 +4721,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "chrono", "clap 2.33.3", @@ -4736,7 +4736,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.25" +version = "1.17.26" dependencies = [ "dirs-next", "lazy_static", @@ -4750,7 +4750,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.25" +version = "1.17.26" dependencies = [ "Inflector", "base64 0.21.4", @@ -4775,7 +4775,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-trait", "bincode", @@ -4806,7 +4806,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4814,7 +4814,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "chrono", @@ -4826,7 +4826,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-trait", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.25" +version = "1.17.26" dependencies = [ "base64 0.21.4", "bincode", @@ -4918,7 +4918,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.25" +version = "1.17.26" dependencies = [ "lazy_static", "log", @@ -4940,7 +4940,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "console", "indicatif", @@ -4952,7 +4952,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "crossbeam-channel", @@ -4972,7 +4972,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4994,7 +4994,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.25" +version = "1.17.26" dependencies = [ "ahash 0.8.5", "blake3", @@ -5022,7 +5022,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.25" +version = "1.17.26" dependencies = [ "proc-macro2", "quote", @@ -5032,7 +5032,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "solana-accounts-db", @@ -5043,7 +5043,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.25" +version = "1.17.26" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -5068,7 +5068,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "bincode", @@ -5180,7 +5180,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "solana-measure", @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.25" +version = "1.17.26" dependencies = [ "env_logger", "lazy_static", @@ -5200,7 +5200,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "solana-sdk", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.25" +version = "1.17.26" dependencies = [ "fast-math", "solana-program", @@ -5216,7 +5216,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.25" +version = "1.17.26" dependencies = [ "crossbeam-channel", "gethostname", @@ -5229,7 +5229,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "clap 3.1.6", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.25" +version = "1.17.26" dependencies = [ "ahash 0.8.5", "bincode", @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.25" +version = "1.17.26" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5292,7 +5292,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "ark-bn254", "ark-ec", @@ -5344,7 +5344,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.25" +version = "1.17.26" dependencies = [ "base64 0.21.4", "bincode", @@ -5370,7 +5370,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "async-trait", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "crossbeam-channel", "futures-util", @@ -5421,7 +5421,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-mutex", "async-trait", @@ -5446,7 +5446,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.25" +version = "1.17.26" dependencies = [ "lazy_static", "num_cpus", @@ -5454,7 +5454,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.25" +version = "1.17.26" dependencies = [ "console", "dialoguer", @@ -5471,7 +5471,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.25" +version = "1.17.26" dependencies = [ "base64 0.21.4", "bincode", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-trait", "base64 0.21.4", @@ -5550,7 +5550,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.25" +version = "1.17.26" dependencies = [ "base64 0.21.4", "bs58", @@ -5570,7 +5570,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.25" +version = "1.17.26" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.25" +version = "1.17.26" dependencies = [ "arrayref", "base64 0.21.4", @@ -5656,7 +5656,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5693,21 +5693,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.25" +version = "1.17.26" dependencies = [ "array-bytes", "solana-program", @@ -5715,7 +5715,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.25" +version = "1.17.26" dependencies = [ "array-bytes", "solana-program", @@ -5723,21 +5723,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5745,14 +5745,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.25" +version = "1.17.26" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5760,21 +5760,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.25" +version = "1.17.26" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5784,42 +5784,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.25" +version = "1.17.26" dependencies = [ "rustversion", "solana-program", @@ -5829,49 +5829,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5879,14 +5879,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-program-runtime", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5904,21 +5904,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5926,14 +5926,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.25" +version = "1.17.26" dependencies = [ "array-bytes", "solana-program", @@ -5941,7 +5941,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.25" +version = "1.17.26" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5950,14 +5950,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-program-runtime", @@ -5975,21 +5975,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-program-runtime", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.25" +version = "1.17.26" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -6007,7 +6007,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.25" +version = "1.17.26" dependencies = [ "blake3", "solana-program", @@ -6015,21 +6015,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.25" +version = "1.17.26" dependencies = [ "agave-validator", "solana-logger", @@ -6040,21 +6040,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", "solana-program-runtime", @@ -6064,21 +6064,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.25" +version = "1.17.26" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.25" +version = "1.17.26" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6130,7 +6130,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bs58", "proc-macro2", @@ -6147,7 +6147,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.25" +version = "1.17.26" dependencies = [ "crossbeam-channel", "log", @@ -6161,7 +6161,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "log", @@ -6174,7 +6174,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.25" +version = "1.17.26" dependencies = [ "backoff", "bincode", @@ -6206,7 +6206,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "bs58", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-channel", "bytes", @@ -6251,7 +6251,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "log", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.25" +version = "1.17.26" dependencies = [ "base64 0.21.4", "bincode", @@ -6293,7 +6293,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "log", @@ -6306,7 +6306,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-trait", "bincode", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.25" +version = "1.17.26" dependencies = [ "Inflector", "base64 0.21.4", @@ -6351,7 +6351,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "bytes", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.25" +version = "1.17.26" dependencies = [ "async-trait", "solana-connection-cache", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.25" +version = "1.17.26" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.25" +version = "1.17.26" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.25" +version = "1.17.26" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.25" +version = "1.17.26" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 4911a182810bf4..688f910dc83b33 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.25" +version = "1.17.26" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.25" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.25" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.25" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.25" } -solana-ledger = { path = "../../ledger", version = "=1.17.25" } -solana-logger = { path = "../../logger", version = "=1.17.25" } -solana-measure = { path = "../../measure", version = "=1.17.25" } -solana-program = { path = "../../sdk/program", version = "=1.17.25" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.25" } -solana-program-test = { path = "../../program-test", version = "=1.17.25" } -solana-runtime = { path = "../../runtime", version = "=1.17.25" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.25" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.25" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.25", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.25" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.25" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.25" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.25", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.25" } -solana-sdk = { path = "../../sdk", version = "=1.17.25" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.25" } -agave-validator = { path = "../../validator", version = "=1.17.25" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.25" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.26" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.26" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.26" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.26" } +solana-ledger = { path = "../../ledger", version = "=1.17.26" } +solana-logger = { path = "../../logger", version = "=1.17.26" } +solana-measure = { path = "../../measure", version = "=1.17.26" } +solana-program = { path = "../../sdk/program", version = "=1.17.26" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.26" } +solana-program-test = { path = "../../program-test", version = "=1.17.26" } +solana-runtime = { path = "../../runtime", version = "=1.17.26" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.26" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.26" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.26", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.26" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.26" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.26" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.26", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.26" } +solana-sdk = { path = "../../sdk", version = "=1.17.26" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.26" } +agave-validator = { path = "../../validator", version = "=1.17.26" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.26" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index c6c4016f3550cc..039bf3bea0b598 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.25" +version = "1.17.26" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.25" } +solana-program = { path = "../../../../program", version = "=1.17.26" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 94533e35d07f90..fa44be78cb4a6e 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.25" +version = "1.17.26" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.25" } +solana-program = { path = "../../../../program", version = "=1.17.26" } [lib] crate-type = ["cdylib"] From 24c870b139809564d9f506ba580eb96f65cf83aa Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 11:42:04 +0800 Subject: [PATCH 188/213] v1.17: [anza migration] ci: fix Windows gh release pipeline (backport of #165) (#166) ci: fix Windows gh release pipeline (#165) (cherry picked from commit 3863bb1bdf0f7c9a0b35c2c19dc50943ca39657e) Co-authored-by: Yihau Chen --- .github/workflows/release-artifacts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml index 45be181c3ce9e1..08d7e56fdabed9 100644 --- a/.github/workflows/release-artifacts.yml +++ b/.github/workflows/release-artifacts.yml @@ -108,7 +108,7 @@ jobs: uses: actions/download-artifact@v3 with: name: windows-artifact - path: .windows-release/ + path: ./windows-release/ - name: Release uses: softprops/action-gh-release@v1 From 2332aee4a27713be651a8d14b475d4d48c65a4c6 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:47:16 -0500 Subject: [PATCH 189/213] v1.17: add precompile signature metrics to cost tracker (backport of #133) (#142) * add precompile signature metrics to cost tracker (#133) (cherry picked from commit 9770cd9083126b4dfe40fb207b0a3b8b21f33d21) # Conflicts: # cost-model/src/cost_model.rs # cost-model/src/cost_tracker.rs * merge fix * fmt --------- Co-authored-by: Tao Zhu <82401714+tao-stones@users.noreply.github.com> Co-authored-by: Tao Zhu --- cost-model/src/block_cost_limits.rs | 8 +- cost-model/src/cost_model.rs | 24 +++++- cost-model/src/cost_tracker.rs | 42 ++++++++++ cost-model/src/transaction_cost.rs | 31 ++++++++ sdk/program/src/message/sanitized.rs | 112 ++++++++++++++++++++++++--- 5 files changed, 202 insertions(+), 15 deletions(-) diff --git a/cost-model/src/block_cost_limits.rs b/cost-model/src/block_cost_limits.rs index 328d89cd04198b..b04f289e0553af 100644 --- a/cost-model/src/block_cost_limits.rs +++ b/cost-model/src/block_cost_limits.rs @@ -24,6 +24,10 @@ pub const MAX_CONCURRENCY: u64 = 4; pub const COMPUTE_UNIT_TO_US_RATIO: u64 = 30; /// Number of compute units for one signature verification. pub const SIGNATURE_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 24; +/// Number of compute units for one secp256k1 signature verification. +pub const SECP256K1_VERIFY_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 223; +/// Number of compute units for one ed25519 signature verification. +pub const ED25519_VERIFY_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 76; /// Number of compute units for one write lock pub const WRITE_LOCK_UNITS: u64 = COMPUTE_UNIT_TO_US_RATIO * 10; /// Number of data bytes per compute units @@ -43,8 +47,8 @@ lazy_static! { (bpf_loader::id(), solana_bpf_loader_program::DEFAULT_LOADER_COMPUTE_UNITS), (loader_v4::id(), solana_loader_v4_program::DEFAULT_COMPUTE_UNITS), // Note: These are precompile, run directly in bank during sanitizing; - (secp256k1_program::id(), COMPUTE_UNIT_TO_US_RATIO * 24), - (ed25519_program::id(), COMPUTE_UNIT_TO_US_RATIO * 24), + (secp256k1_program::id(), 0), + (ed25519_program::id(), 0), ] .iter() .cloned() diff --git a/cost-model/src/cost_model.rs b/cost-model/src/cost_model.rs index 0e8d6954202351..d44d6550dc67de 100644 --- a/cost-model/src/cost_model.rs +++ b/cost-model/src/cost_model.rs @@ -43,7 +43,7 @@ impl CostModel { } else { let mut tx_cost = UsageCostDetails::new_with_default_capacity(); - tx_cost.signature_cost = Self::get_signature_cost(transaction); + Self::get_signature_cost(&mut tx_cost, transaction); Self::get_write_lock_cost(&mut tx_cost, transaction); Self::get_transaction_cost(&mut tx_cost, transaction, feature_set); tx_cost.account_data_size = Self::calculate_account_data_size(transaction); @@ -69,8 +69,26 @@ impl CostModel { ) } - fn get_signature_cost(transaction: &SanitizedTransaction) -> u64 { - transaction.signatures().len() as u64 * SIGNATURE_COST + fn get_signature_cost(tx_cost: &mut UsageCostDetails, transaction: &SanitizedTransaction) { + let signatures_count_detail = transaction.message().get_signature_details(); + tx_cost.num_transaction_signatures = signatures_count_detail.num_transaction_signatures(); + tx_cost.num_secp256k1_instruction_signatures = + signatures_count_detail.num_secp256k1_instruction_signatures(); + tx_cost.num_ed25519_instruction_signatures = + signatures_count_detail.num_ed25519_instruction_signatures(); + tx_cost.signature_cost = signatures_count_detail + .num_transaction_signatures() + .saturating_mul(SIGNATURE_COST) + .saturating_add( + signatures_count_detail + .num_secp256k1_instruction_signatures() + .saturating_mul(SECP256K1_VERIFY_COST), + ) + .saturating_add( + signatures_count_detail + .num_ed25519_instruction_signatures() + .saturating_mul(ED25519_VERIFY_COST), + ); } fn get_writable_accounts(transaction: &SanitizedTransaction) -> Vec { diff --git a/cost-model/src/cost_tracker.rs b/cost-model/src/cost_tracker.rs index 0841849bf1d90c..33b0172eacd466 100644 --- a/cost-model/src/cost_tracker.rs +++ b/cost-model/src/cost_tracker.rs @@ -62,6 +62,9 @@ pub struct CostTracker { /// The amount of total account data size remaining. If `Some`, then do not add transactions /// that would cause `account_data_size` to exceed this limit. account_data_size_limit: Option, + transaction_signature_count: u64, + secp256k1_instruction_signature_count: u64, + ed25519_instruction_signature_count: u64, } impl Default for CostTracker { @@ -82,6 +85,9 @@ impl Default for CostTracker { transaction_count: 0, account_data_size: 0, account_data_size_limit: None, + transaction_signature_count: 0, + secp256k1_instruction_signature_count: 0, + ed25519_instruction_signature_count: 0, } } } @@ -167,6 +173,21 @@ impl CostTracker { ("costliest_account", costliest_account.to_string(), String), ("costliest_account_cost", costliest_account_cost as i64, i64), ("account_data_size", self.account_data_size, i64), + ( + "transaction_signature_count", + self.transaction_signature_count, + i64 + ), + ( + "secp256k1_instruction_signature_count", + self.secp256k1_instruction_signature_count, + i64 + ), + ( + "ed25519_instruction_signature_count", + self.ed25519_instruction_signature_count, + i64 + ), ); } @@ -234,6 +255,18 @@ impl CostTracker { self.add_transaction_execution_cost(tx_cost, tx_cost.sum()); saturating_add_assign!(self.account_data_size, tx_cost.account_data_size()); saturating_add_assign!(self.transaction_count, 1); + saturating_add_assign!( + self.transaction_signature_count, + tx_cost.num_transaction_signatures() + ); + saturating_add_assign!( + self.secp256k1_instruction_signature_count, + tx_cost.num_secp256k1_instruction_signatures() + ); + saturating_add_assign!( + self.ed25519_instruction_signature_count, + tx_cost.num_ed25519_instruction_signatures() + ); } fn remove_transaction_cost(&mut self, tx_cost: &TransactionCost) { @@ -243,6 +276,15 @@ impl CostTracker { .account_data_size .saturating_sub(tx_cost.account_data_size()); self.transaction_count = self.transaction_count.saturating_sub(1); + self.transaction_signature_count = self + .transaction_signature_count + .saturating_sub(tx_cost.num_transaction_signatures()); + self.secp256k1_instruction_signature_count = self + .secp256k1_instruction_signature_count + .saturating_sub(tx_cost.num_secp256k1_instruction_signatures()); + self.ed25519_instruction_signature_count = self + .ed25519_instruction_signature_count + .saturating_sub(tx_cost.num_ed25519_instruction_signatures()); } /// Apply additional actual execution units to cost_tracker diff --git a/cost-model/src/transaction_cost.rs b/cost-model/src/transaction_cost.rs index e765eee3bc7038..170be03e037d50 100644 --- a/cost-model/src/transaction_cost.rs +++ b/cost-model/src/transaction_cost.rs @@ -87,6 +87,27 @@ impl TransactionCost { Self::Transaction(usage_cost) => &usage_cost.writable_accounts, } } + + pub fn num_transaction_signatures(&self) -> u64 { + match self { + Self::SimpleVote { .. } => 1, + Self::Transaction(usage_cost) => usage_cost.num_transaction_signatures, + } + } + + pub fn num_secp256k1_instruction_signatures(&self) -> u64 { + match self { + Self::SimpleVote { .. } => 0, + Self::Transaction(usage_cost) => usage_cost.num_secp256k1_instruction_signatures, + } + } + + pub fn num_ed25519_instruction_signatures(&self) -> u64 { + match self { + Self::SimpleVote { .. } => 0, + Self::Transaction(usage_cost) => usage_cost.num_ed25519_instruction_signatures, + } + } } const MAX_WRITABLE_ACCOUNTS: usize = 256; @@ -102,6 +123,9 @@ pub struct UsageCostDetails { pub bpf_execution_cost: u64, pub loaded_accounts_data_size_cost: u64, pub account_data_size: u64, + pub num_transaction_signatures: u64, + pub num_secp256k1_instruction_signatures: u64, + pub num_ed25519_instruction_signatures: u64, } impl Default for UsageCostDetails { @@ -115,6 +139,9 @@ impl Default for UsageCostDetails { bpf_execution_cost: 0u64, loaded_accounts_data_size_cost: 0u64, account_data_size: 0u64, + num_transaction_signatures: 0u64, + num_secp256k1_instruction_signatures: 0u64, + num_ed25519_instruction_signatures: 0u64, } } } @@ -133,6 +160,10 @@ impl PartialEq for UsageCostDetails { && self.bpf_execution_cost == other.bpf_execution_cost && self.loaded_accounts_data_size_cost == other.loaded_accounts_data_size_cost && self.account_data_size == other.account_data_size + && self.num_transaction_signatures == other.num_transaction_signatures + && self.num_secp256k1_instruction_signatures + == other.num_secp256k1_instruction_signatures + && self.num_ed25519_instruction_signatures == other.num_ed25519_instruction_signatures && to_hash_set(&self.writable_accounts) == to_hash_set(&other.writable_accounts) } } diff --git a/sdk/program/src/message/sanitized.rs b/sdk/program/src/message/sanitized.rs index 640159a7ad2dea..066f4505e40589 100644 --- a/sdk/program/src/message/sanitized.rs +++ b/sdk/program/src/message/sanitized.rs @@ -347,23 +347,75 @@ impl SanitizedMessage { } pub fn num_signatures(&self) -> u64 { - let mut num_signatures = u64::from(self.header().num_required_signatures); - // This next part is really calculating the number of pre-processor - // operations being done and treating them like a signature + self.get_signature_details().total_signatures() + } + + pub fn num_write_locks(&self) -> u64 { + self.account_keys() + .len() + .saturating_sub(self.num_readonly_accounts()) as u64 + } + + /// return detailed signature counts + pub fn get_signature_details(&self) -> TransactionSignatureDetails { + let mut transaction_signature_details = TransactionSignatureDetails { + num_transaction_signatures: u64::from(self.header().num_required_signatures), + ..TransactionSignatureDetails::default() + }; + + // counting the number of pre-processor operations separately for (program_id, instruction) in self.program_instructions_iter() { - if secp256k1_program::check_id(program_id) || ed25519_program::check_id(program_id) { + if secp256k1_program::check_id(program_id) { if let Some(num_verifies) = instruction.data.first() { - num_signatures = num_signatures.saturating_add(u64::from(*num_verifies)); + transaction_signature_details.num_secp256k1_instruction_signatures = + transaction_signature_details + .num_secp256k1_instruction_signatures + .saturating_add(u64::from(*num_verifies)); + } + } else if ed25519_program::check_id(program_id) { + if let Some(num_verifies) = instruction.data.first() { + transaction_signature_details.num_ed25519_instruction_signatures = + transaction_signature_details + .num_ed25519_instruction_signatures + .saturating_add(u64::from(*num_verifies)); } } } - num_signatures + + transaction_signature_details } +} - pub fn num_write_locks(&self) -> u64 { - self.account_keys() - .len() - .saturating_sub(self.num_readonly_accounts()) as u64 +#[derive(Default)] +/// Transaction signature details including the number of transaction signatures +/// and precompile signatures. +pub struct TransactionSignatureDetails { + num_transaction_signatures: u64, + num_secp256k1_instruction_signatures: u64, + num_ed25519_instruction_signatures: u64, +} + +impl TransactionSignatureDetails { + /// return total number of signature, treating pre-processor operations as signature + pub(crate) fn total_signatures(&self) -> u64 { + self.num_transaction_signatures + .saturating_add(self.num_secp256k1_instruction_signatures) + .saturating_add(self.num_ed25519_instruction_signatures) + } + + /// return the number of transaction signatures + pub fn num_transaction_signatures(&self) -> u64 { + self.num_transaction_signatures + } + + /// return the number of secp256k1 instruction signatures + pub fn num_secp256k1_instruction_signatures(&self) -> u64 { + self.num_secp256k1_instruction_signatures + } + + /// return the number of ed25519 instruction signatures + pub fn num_ed25519_instruction_signatures(&self) -> u64 { + self.num_ed25519_instruction_signatures } } @@ -559,4 +611,44 @@ mod tests { } } } + + #[test] + fn test_get_signature_details() { + let key0 = Pubkey::new_unique(); + let key1 = Pubkey::new_unique(); + let loader_key = Pubkey::new_unique(); + + let loader_instr = CompiledInstruction::new(2, &(), vec![0, 1]); + let mock_secp256k1_instr = CompiledInstruction::new(3, &[1u8; 10], vec![]); + let mock_ed25519_instr = CompiledInstruction::new(4, &[5u8; 10], vec![]); + + let message = SanitizedMessage::try_from(legacy::Message::new_with_compiled_instructions( + 2, + 1, + 2, + vec![ + key0, + key1, + loader_key, + secp256k1_program::id(), + ed25519_program::id(), + ], + Hash::default(), + vec![ + loader_instr, + mock_secp256k1_instr.clone(), + mock_ed25519_instr, + mock_secp256k1_instr, + ], + )) + .unwrap(); + + let signature_details = message.get_signature_details(); + // expect 2 required transaction signatures + assert_eq!(2, signature_details.num_transaction_signatures); + // expect 2 secp256k1 instruction signatures - 1 for each mock_secp2561k1_instr + assert_eq!(2, signature_details.num_secp256k1_instruction_signatures); + // expect 5 ed25519 instruction signatures from mock_ed25519_instr + assert_eq!(5, signature_details.num_ed25519_instruction_signatures); + } } From 74e40fb45d21adafc5aa354c940a829a8f7a2e5a Mon Sep 17 00:00:00 2001 From: steviez Date: Wed, 13 Mar 2024 17:15:28 -0500 Subject: [PATCH 190/213] V1.17.27 version bump (#231) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 90252a69811169..d01f4af5267746 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-install" -version = "1.17.26" +version = "1.17.27" dependencies = [ "atty", "bincode", @@ -110,7 +110,7 @@ dependencies = [ [[package]] name = "agave-ledger-tool" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_cmd", "bs58", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.26" +version = "1.17.27" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "agave-watchtower" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 2.33.3", "humantime", @@ -2314,7 +2314,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "regex", @@ -2322,7 +2322,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.26" +version = "1.17.27" dependencies = [ "regex", ] @@ -4243,7 +4243,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.26" +version = "1.17.27" dependencies = [ "protobuf-src", "tonic-build", @@ -4486,7 +4486,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.26" +version = "1.17.27" [[package]] name = "rcgen" @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.26" +version = "1.17.27" dependencies = [ "Inflector", "assert_matches", @@ -5301,7 +5301,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 2.33.3", "log", @@ -5315,7 +5315,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 2.33.3", "log", @@ -5345,7 +5345,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.26" +version = "1.17.27" dependencies = [ "arrayref", "assert_matches", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "bytemuck", @@ -5428,7 +5428,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -5439,7 +5439,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5463,7 +5463,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5480,7 +5480,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.26" +version = "1.17.27" dependencies = [ "serde", "solana-sdk", @@ -5489,7 +5489,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "crossbeam-channel", @@ -5507,7 +5507,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5518,7 +5518,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5559,7 +5559,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bv", "fnv", @@ -5576,7 +5576,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -5608,7 +5608,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bv", "bytemuck", @@ -5627,7 +5627,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "solana-logger", @@ -5635,7 +5635,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_cmd", "bzip2", @@ -5656,11 +5656,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.26" +version = "1.17.27" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.26" +version = "1.17.27" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5671,7 +5671,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "chrono", @@ -5688,7 +5688,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -5759,7 +5759,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.26" +version = "1.17.27" dependencies = [ "anyhow", "dirs-next", @@ -5774,7 +5774,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.26" +version = "1.17.27" dependencies = [ "Inflector", "base64 0.21.4", @@ -5800,7 +5800,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-trait", "bincode", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.26" +version = "1.17.27" dependencies = [ "futures-util", "rand 0.8.5", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5870,7 +5870,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "chrono", @@ -5883,7 +5883,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-trait", "bincode", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5990,7 +5990,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.26" +version = "1.17.27" dependencies = [ "lazy_static", "log", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "clap 3.2.23", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "console", "indicatif", @@ -6057,7 +6057,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "ed25519-dalek", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "byteorder", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.26" +version = "1.17.27" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.26" +version = "1.17.27" dependencies = [ "proc-macro2", "quote", @@ -6152,7 +6152,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.26" +version = "1.17.27" dependencies = [ "base64 0.21.4", "bincode", @@ -6177,7 +6177,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "solana-accounts-db", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.26" +version = "1.17.27" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -6213,7 +6213,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -6264,7 +6264,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bs58", "clap 3.2.23", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "log", @@ -6361,7 +6361,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6400,7 +6400,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.26" +version = "1.17.27" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.26" +version = "1.17.27" dependencies = [ "env_logger", "lazy_static", @@ -6421,7 +6421,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "solana-sdk", @@ -6429,11 +6429,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.26" +version = "1.17.27" [[package]] name = "solana-merkle-root-bench" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 2.33.3", "log", @@ -6446,7 +6446,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.26" +version = "1.17.27" dependencies = [ "fast-math", "hex", @@ -6455,7 +6455,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.26" +version = "1.17.27" dependencies = [ "crossbeam-channel", "env_logger", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6482,7 +6482,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "clap 3.2.23", @@ -6502,7 +6502,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "reqwest", @@ -6512,7 +6512,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.26" +version = "1.17.27" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6543,7 +6543,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -6564,7 +6564,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 3.2.23", "log", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "anyhow", "ark-bn254", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6665,7 +6665,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "async-trait", @@ -6694,7 +6694,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "anyhow", "crossbeam-channel", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-mutex", "async-trait", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.26" +version = "1.17.27" dependencies = [ "lazy_static", "num_cpus", @@ -6754,7 +6754,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "console", @@ -6773,7 +6773,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.26" +version = "1.17.27" dependencies = [ "base64 0.21.4", "bincode", @@ -6832,7 +6832,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "async-trait", @@ -6861,7 +6861,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.26" +version = "1.17.27" dependencies = [ "base64 0.21.4", "bs58", @@ -6881,7 +6881,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "anyhow", "clap 2.33.3", @@ -6898,7 +6898,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "bs58", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.26" +version = "1.17.27" dependencies = [ "arrayref", "assert_matches", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.26" +version = "1.17.27" dependencies = [ "anyhow", "assert_matches", @@ -7066,7 +7066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bs58", "proc-macro2", @@ -7083,7 +7083,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.26" +version = "1.17.27" dependencies = [ "crossbeam-channel", "log", @@ -7098,7 +7098,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7114,7 +7114,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -7131,7 +7131,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.26" +version = "1.17.27" dependencies = [ "backoff", "bincode", @@ -7163,7 +7163,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "bs58", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 2.33.3", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "async-channel", @@ -7223,7 +7223,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.26" +version = "1.17.27" dependencies = [ "base64 0.21.4", "bincode", @@ -7267,7 +7267,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "log", @@ -7281,7 +7281,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -7314,7 +7314,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-trait", "bincode", @@ -7336,7 +7336,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "clap 2.33.3", @@ -7363,7 +7363,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.26" +version = "1.17.27" dependencies = [ "Inflector", "base64 0.21.4", @@ -7386,7 +7386,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -7423,7 +7423,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-trait", "solana-connection-cache", @@ -7436,7 +7436,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.26" +version = "1.17.27" dependencies = [ "serde_json", "solana-metrics", @@ -7444,7 +7444,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "rustc_version 0.4.0", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "crossbeam-channel", @@ -7477,7 +7477,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.26" +version = "1.17.27" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 9bcf1e14e689ce..227d5f73c5f7b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.26" +version = "1.17.27" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.26" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.26" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.26" } -solana-banks-client = { path = "banks-client", version = "=1.17.26" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.26" } -solana-banks-server = { path = "banks-server", version = "=1.17.26" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.26" } -solana-bloom = { path = "bloom", version = "=1.17.26" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.26" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.26" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.26", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.26" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.26" } -solana-cli = { path = "cli", version = "=1.17.26" } -solana-cli-config = { path = "cli-config", version = "=1.17.26" } -solana-cli-output = { path = "cli-output", version = "=1.17.26" } -solana-client = { path = "client", version = "=1.17.26" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.26" } -solana-config-program = { path = "programs/config", version = "=1.17.26" } -solana-core = { path = "core", version = "=1.17.26" } -solana-cost-model = { path = "cost-model", version = "=1.17.26" } -solana-download-utils = { path = "download-utils", version = "=1.17.26" } -solana-entry = { path = "entry", version = "=1.17.26" } -solana-faucet = { path = "faucet", version = "=1.17.26" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.26" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.26" } -solana-genesis = { path = "genesis", version = "=1.17.26" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.26" } -agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.26" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.26" } -solana-gossip = { path = "gossip", version = "=1.17.26" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.26" } -solana-ledger = { path = "ledger", version = "=1.17.26" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.26" } -solana-logger = { path = "logger", version = "=1.17.26" } -solana-measure = { path = "measure", version = "=1.17.26" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.26" } -solana-metrics = { path = "metrics", version = "=1.17.26" } -solana-net-utils = { path = "net-utils", version = "=1.17.26" } -solana-notifier = { path = "notifier", version = "=1.17.26" } -solana-perf = { path = "perf", version = "=1.17.26" } -solana-poh = { path = "poh", version = "=1.17.26" } -solana-program = { path = "sdk/program", version = "=1.17.26" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.26" } -solana-program-test = { path = "program-test", version = "=1.17.26" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.26" } -solana-quic-client = { path = "quic-client", version = "=1.17.26" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.26" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.26", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.26" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.26", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.26" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.26" } -solana-runtime = { path = "runtime", version = "=1.17.26" } -solana-sdk = { path = "sdk", version = "=1.17.26" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.26" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.26" } -solana-stake-program = { path = "programs/stake", version = "=1.17.26" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.26" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.26" } -solana-streamer = { path = "streamer", version = "=1.17.26" } -solana-system-program = { path = "programs/system", version = "=1.17.26" } -solana-test-validator = { path = "test-validator", version = "=1.17.26" } -solana-thin-client = { path = "thin-client", version = "=1.17.26" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.26", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.26" } -solana-turbine = { path = "turbine", version = "=1.17.26" } -solana-udp-client = { path = "udp-client", version = "=1.17.26" } -solana-version = { path = "version", version = "=1.17.26" } -solana-vote = { path = "vote", version = "=1.17.26" } -solana-vote-program = { path = "programs/vote", version = "=1.17.26" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.26" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.26" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.26" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.27" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.27" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.27" } +solana-banks-client = { path = "banks-client", version = "=1.17.27" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.27" } +solana-banks-server = { path = "banks-server", version = "=1.17.27" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.27" } +solana-bloom = { path = "bloom", version = "=1.17.27" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.27" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.27" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.27", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.27" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.27" } +solana-cli = { path = "cli", version = "=1.17.27" } +solana-cli-config = { path = "cli-config", version = "=1.17.27" } +solana-cli-output = { path = "cli-output", version = "=1.17.27" } +solana-client = { path = "client", version = "=1.17.27" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.27" } +solana-config-program = { path = "programs/config", version = "=1.17.27" } +solana-core = { path = "core", version = "=1.17.27" } +solana-cost-model = { path = "cost-model", version = "=1.17.27" } +solana-download-utils = { path = "download-utils", version = "=1.17.27" } +solana-entry = { path = "entry", version = "=1.17.27" } +solana-faucet = { path = "faucet", version = "=1.17.27" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.27" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.27" } +solana-genesis = { path = "genesis", version = "=1.17.27" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.27" } +agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.27" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.27" } +solana-gossip = { path = "gossip", version = "=1.17.27" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.27" } +solana-ledger = { path = "ledger", version = "=1.17.27" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.27" } +solana-logger = { path = "logger", version = "=1.17.27" } +solana-measure = { path = "measure", version = "=1.17.27" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.27" } +solana-metrics = { path = "metrics", version = "=1.17.27" } +solana-net-utils = { path = "net-utils", version = "=1.17.27" } +solana-notifier = { path = "notifier", version = "=1.17.27" } +solana-perf = { path = "perf", version = "=1.17.27" } +solana-poh = { path = "poh", version = "=1.17.27" } +solana-program = { path = "sdk/program", version = "=1.17.27" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.27" } +solana-program-test = { path = "program-test", version = "=1.17.27" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.27" } +solana-quic-client = { path = "quic-client", version = "=1.17.27" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.27" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.27", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.27" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.27", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.27" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.27" } +solana-runtime = { path = "runtime", version = "=1.17.27" } +solana-sdk = { path = "sdk", version = "=1.17.27" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.27" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.27" } +solana-stake-program = { path = "programs/stake", version = "=1.17.27" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.27" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.27" } +solana-streamer = { path = "streamer", version = "=1.17.27" } +solana-system-program = { path = "programs/system", version = "=1.17.27" } +solana-test-validator = { path = "test-validator", version = "=1.17.27" } +solana-thin-client = { path = "thin-client", version = "=1.17.27" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.27", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.27" } +solana-turbine = { path = "turbine", version = "=1.17.27" } +solana-udp-client = { path = "udp-client", version = "=1.17.27" } +solana-version = { path = "version", version = "=1.17.27" } +solana-vote = { path = "vote", version = "=1.17.27" } +solana-vote-program = { path = "programs/vote", version = "=1.17.27" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.27" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.27" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.27" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 67d3e6a25f7a4b..59a9f888eba3bc 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.26" +version = "1.17.27" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -4520,7 +4520,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.26" +version = "1.17.27" dependencies = [ "Inflector", "base64 0.21.4", @@ -4543,7 +4543,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.26" +version = "1.17.27" dependencies = [ "arrayref", "bincode", @@ -4600,7 +4600,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "bytemuck", @@ -4619,7 +4619,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4634,7 +4634,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.26" +version = "1.17.27" dependencies = [ "serde", "solana-sdk", @@ -4643,7 +4643,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "crossbeam-channel", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bv", "fnv", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4695,7 +4695,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.26" +version = "1.17.27" dependencies = [ "array-bytes", "serde", @@ -4705,7 +4705,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bv", "bytemuck", @@ -4721,7 +4721,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "chrono", "clap 2.33.3", @@ -4736,7 +4736,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.26" +version = "1.17.27" dependencies = [ "dirs-next", "lazy_static", @@ -4750,7 +4750,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.26" +version = "1.17.27" dependencies = [ "Inflector", "base64 0.21.4", @@ -4775,7 +4775,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-trait", "bincode", @@ -4806,7 +4806,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4814,7 +4814,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "chrono", @@ -4826,7 +4826,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-trait", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.26" +version = "1.17.27" dependencies = [ "base64 0.21.4", "bincode", @@ -4918,7 +4918,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.26" +version = "1.17.27" dependencies = [ "lazy_static", "log", @@ -4940,7 +4940,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "console", "indicatif", @@ -4952,7 +4952,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "crossbeam-channel", @@ -4972,7 +4972,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4994,7 +4994,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.26" +version = "1.17.27" dependencies = [ "ahash 0.8.5", "blake3", @@ -5022,7 +5022,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.26" +version = "1.17.27" dependencies = [ "proc-macro2", "quote", @@ -5032,7 +5032,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "solana-accounts-db", @@ -5043,7 +5043,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.26" +version = "1.17.27" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -5068,7 +5068,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "bincode", @@ -5180,7 +5180,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "solana-measure", @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.26" +version = "1.17.27" dependencies = [ "env_logger", "lazy_static", @@ -5200,7 +5200,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "solana-sdk", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.26" +version = "1.17.27" dependencies = [ "fast-math", "solana-program", @@ -5216,7 +5216,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.26" +version = "1.17.27" dependencies = [ "crossbeam-channel", "gethostname", @@ -5229,7 +5229,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "clap 3.1.6", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.26" +version = "1.17.27" dependencies = [ "ahash 0.8.5", "bincode", @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.26" +version = "1.17.27" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5292,7 +5292,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "ark-bn254", "ark-ec", @@ -5344,7 +5344,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.26" +version = "1.17.27" dependencies = [ "base64 0.21.4", "bincode", @@ -5370,7 +5370,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "async-trait", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "crossbeam-channel", "futures-util", @@ -5421,7 +5421,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-mutex", "async-trait", @@ -5446,7 +5446,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.26" +version = "1.17.27" dependencies = [ "lazy_static", "num_cpus", @@ -5454,7 +5454,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.26" +version = "1.17.27" dependencies = [ "console", "dialoguer", @@ -5471,7 +5471,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.26" +version = "1.17.27" dependencies = [ "base64 0.21.4", "bincode", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-trait", "base64 0.21.4", @@ -5550,7 +5550,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.26" +version = "1.17.27" dependencies = [ "base64 0.21.4", "bs58", @@ -5570,7 +5570,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.26" +version = "1.17.27" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.26" +version = "1.17.27" dependencies = [ "arrayref", "base64 0.21.4", @@ -5656,7 +5656,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5693,21 +5693,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.26" +version = "1.17.27" dependencies = [ "array-bytes", "solana-program", @@ -5715,7 +5715,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.26" +version = "1.17.27" dependencies = [ "array-bytes", "solana-program", @@ -5723,21 +5723,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5745,14 +5745,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.26" +version = "1.17.27" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5760,21 +5760,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.26" +version = "1.17.27" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5784,42 +5784,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.26" +version = "1.17.27" dependencies = [ "rustversion", "solana-program", @@ -5829,49 +5829,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5879,14 +5879,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-program-runtime", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5904,21 +5904,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5926,14 +5926,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.26" +version = "1.17.27" dependencies = [ "array-bytes", "solana-program", @@ -5941,7 +5941,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.26" +version = "1.17.27" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5950,14 +5950,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-program-runtime", @@ -5975,21 +5975,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-program-runtime", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.26" +version = "1.17.27" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -6007,7 +6007,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.26" +version = "1.17.27" dependencies = [ "blake3", "solana-program", @@ -6015,21 +6015,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.26" +version = "1.17.27" dependencies = [ "agave-validator", "solana-logger", @@ -6040,21 +6040,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", "solana-program-runtime", @@ -6064,21 +6064,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.26" +version = "1.17.27" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.26" +version = "1.17.27" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6130,7 +6130,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bs58", "proc-macro2", @@ -6147,7 +6147,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.26" +version = "1.17.27" dependencies = [ "crossbeam-channel", "log", @@ -6161,7 +6161,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "log", @@ -6174,7 +6174,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.26" +version = "1.17.27" dependencies = [ "backoff", "bincode", @@ -6206,7 +6206,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "bs58", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-channel", "bytes", @@ -6251,7 +6251,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "log", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.26" +version = "1.17.27" dependencies = [ "base64 0.21.4", "bincode", @@ -6293,7 +6293,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "log", @@ -6306,7 +6306,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-trait", "bincode", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.26" +version = "1.17.27" dependencies = [ "Inflector", "base64 0.21.4", @@ -6351,7 +6351,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "bytes", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.26" +version = "1.17.27" dependencies = [ "async-trait", "solana-connection-cache", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.26" +version = "1.17.27" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.26" +version = "1.17.27" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.26" +version = "1.17.27" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.26" +version = "1.17.27" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 688f910dc83b33..b0e4458a9257da 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.26" +version = "1.17.27" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.26" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.26" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.26" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.26" } -solana-ledger = { path = "../../ledger", version = "=1.17.26" } -solana-logger = { path = "../../logger", version = "=1.17.26" } -solana-measure = { path = "../../measure", version = "=1.17.26" } -solana-program = { path = "../../sdk/program", version = "=1.17.26" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.26" } -solana-program-test = { path = "../../program-test", version = "=1.17.26" } -solana-runtime = { path = "../../runtime", version = "=1.17.26" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.26" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.26" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.26", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.26" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.26" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.26" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.26", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.26" } -solana-sdk = { path = "../../sdk", version = "=1.17.26" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.26" } -agave-validator = { path = "../../validator", version = "=1.17.26" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.26" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.27" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.27" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.27" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.27" } +solana-ledger = { path = "../../ledger", version = "=1.17.27" } +solana-logger = { path = "../../logger", version = "=1.17.27" } +solana-measure = { path = "../../measure", version = "=1.17.27" } +solana-program = { path = "../../sdk/program", version = "=1.17.27" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.27" } +solana-program-test = { path = "../../program-test", version = "=1.17.27" } +solana-runtime = { path = "../../runtime", version = "=1.17.27" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.27" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.27" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.27", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.27" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.27" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.27" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.27", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.27" } +solana-sdk = { path = "../../sdk", version = "=1.17.27" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.27" } +agave-validator = { path = "../../validator", version = "=1.17.27" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.27" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 039bf3bea0b598..42a6e65085a8c8 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.26" +version = "1.17.27" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.26" } +solana-program = { path = "../../../../program", version = "=1.17.27" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index fa44be78cb4a6e..6cf1edbeeac19b 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.26" +version = "1.17.27" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.26" } +solana-program = { path = "../../../../program", version = "=1.17.27" } [lib] crate-type = ["cdylib"] From 3809dc069aa05c5da158f784a7f8a4593cf47843 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 05:16:26 -0500 Subject: [PATCH 191/213] v1.17: [anza migration] Sets client id to Agave (backport of #163) (#205) [anza migration] Sets client id to Agave (#163) (cherry picked from commit 0f1ca20d38a111bb47621aa3108a2f9fc107f998) Co-authored-by: Brooks --- version/src/lib.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/version/src/lib.rs b/version/src/lib.rs index edeca08c960243..7a59406cf0647d 100644 --- a/version/src/lib.rs +++ b/version/src/lib.rs @@ -17,6 +17,7 @@ enum ClientId { SolanaLabs, JitoLabs, Firedancer, + Agave, // If new variants are added, update From and TryFrom. Unknown(u16), } @@ -63,7 +64,7 @@ impl Default for Version { commit: compute_commit(option_env!("CI_COMMIT")).unwrap_or_default(), feature_set, // Other client implementations need to modify this line. - client: u16::try_from(ClientId::SolanaLabs).unwrap(), + client: u16::try_from(ClientId::Agave).unwrap(), } } } @@ -97,6 +98,7 @@ impl From for ClientId { 0u16 => Self::SolanaLabs, 1u16 => Self::JitoLabs, 2u16 => Self::Firedancer, + 3u16 => Self::Agave, _ => Self::Unknown(client), } } @@ -110,7 +112,8 @@ impl TryFrom for u16 { ClientId::SolanaLabs => Ok(0u16), ClientId::JitoLabs => Ok(1u16), ClientId::Firedancer => Ok(2u16), - ClientId::Unknown(client @ 0u16..=2u16) => Err(format!("Invalid client: {client}")), + ClientId::Agave => Ok(3u16), + ClientId::Unknown(client @ 0u16..=3u16) => Err(format!("Invalid client: {client}")), ClientId::Unknown(client) => Ok(client), } } @@ -147,19 +150,21 @@ mod test { assert_eq!(ClientId::from(0u16), ClientId::SolanaLabs); assert_eq!(ClientId::from(1u16), ClientId::JitoLabs); assert_eq!(ClientId::from(2u16), ClientId::Firedancer); - for client in 3u16..=u16::MAX { + assert_eq!(ClientId::from(3u16), ClientId::Agave); + for client in 4u16..=u16::MAX { assert_eq!(ClientId::from(client), ClientId::Unknown(client)); } assert_eq!(u16::try_from(ClientId::SolanaLabs), Ok(0u16)); assert_eq!(u16::try_from(ClientId::JitoLabs), Ok(1u16)); assert_eq!(u16::try_from(ClientId::Firedancer), Ok(2u16)); - for client in 0..=2u16 { + assert_eq!(u16::try_from(ClientId::Agave), Ok(3u16)); + for client in 0..=3u16 { assert_eq!( u16::try_from(ClientId::Unknown(client)), Err(format!("Invalid client: {client}")) ); } - for client in 3u16..=u16::MAX { + for client in 4u16..=u16::MAX { assert_eq!(u16::try_from(ClientId::Unknown(client)), Ok(client)); } } From 39336359de9c0faed0b724275a42e8f82f22eb43 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 22:16:11 -0500 Subject: [PATCH 192/213] v1.17: vote: deprecate unused legacy vote tx plumbing (backport of #274) (#275) * vote: deprecate unused legacy vote tx plumbing (#274) (cherry picked from commit b27c80a92077de291986a15a8440dfcf27f4b57c) # Conflicts: # sdk/src/feature_set.rs * fix conflicts --------- Co-authored-by: Ashwin Sekar Co-authored-by: Ashwin Sekar --- programs/vote/benches/process_vote.rs | 2 +- programs/vote/src/vote_state/mod.rs | 81 ++++++++++++++++++++------- sdk/program/src/vote/state/mod.rs | 23 ++++++-- sdk/src/feature_set.rs | 5 ++ 4 files changed, 87 insertions(+), 24 deletions(-) diff --git a/programs/vote/benches/process_vote.rs b/programs/vote/benches/process_vote.rs index 9008971f086237..a092056c9353ff 100644 --- a/programs/vote/benches/process_vote.rs +++ b/programs/vote/benches/process_vote.rs @@ -48,7 +48,7 @@ fn create_accounts() -> (Slot, SlotHashes, Vec, Vec = vec![0; VoteState::size_of()]; let versioned = VoteStateVersions::new_current(vote_state); diff --git a/programs/vote/src/vote_state/mod.rs b/programs/vote/src/vote_state/mod.rs index 871f4696c1a078..b68a0ee04ac135 100644 --- a/programs/vote/src/vote_state/mod.rs +++ b/programs/vote/src/vote_state/mod.rs @@ -616,6 +616,9 @@ pub fn process_new_vote_state( let timely_vote_credits = feature_set.map_or(false, |f| { f.is_active(&feature_set::timely_vote_credits::id()) }); + let deprecate_unused_legacy_vote_plumbing = feature_set.map_or(false, |f| { + f.is_active(&feature_set::deprecate_unused_legacy_vote_plumbing::id()) + }); let mut earned_credits = if timely_vote_credits { 0_u64 } else { 1_u64 }; if let Some(new_root) = new_root { @@ -625,7 +628,11 @@ pub fn process_new_vote_state( if current_vote.slot() <= new_root { if timely_vote_credits || (current_vote.slot() != new_root) { earned_credits = earned_credits - .checked_add(vote_state.credits_for_vote_at_index(current_vote_state_index)) + .checked_add(vote_state.credits_for_vote_at_index( + current_vote_state_index, + timely_vote_credits, + deprecate_unused_legacy_vote_plumbing, + )) .expect("`earned_credits` does not overflow"); } current_vote_state_index = current_vote_state_index @@ -738,11 +745,19 @@ pub fn process_vote_unfiltered( slot_hashes: &[SlotHash], epoch: Epoch, current_slot: Slot, + timely_vote_credits: bool, + deprecate_unused_legacy_vote_plumbing: bool, ) -> Result<(), VoteError> { check_slots_are_valid(vote_state, vote_slots, &vote.hash, slot_hashes)?; - vote_slots - .iter() - .for_each(|s| vote_state.process_next_vote_slot(*s, epoch, current_slot)); + vote_slots.iter().for_each(|s| { + vote_state.process_next_vote_slot( + *s, + epoch, + current_slot, + timely_vote_credits, + deprecate_unused_legacy_vote_plumbing, + ) + }); Ok(()) } @@ -752,6 +767,8 @@ pub fn process_vote( slot_hashes: &[SlotHash], epoch: Epoch, current_slot: Slot, + timely_vote_credits: bool, + deprecate_unused_legacy_vote_plumbing: bool, ) -> Result<(), VoteError> { if vote.slots.is_empty() { return Err(VoteError::EmptySlots); @@ -773,6 +790,8 @@ pub fn process_vote( slot_hashes, epoch, current_slot, + timely_vote_credits, + deprecate_unused_legacy_vote_plumbing, ) } @@ -789,6 +808,8 @@ pub fn process_vote_unchecked(vote_state: &mut VoteState, vote: Vote) -> Result< &slot_hashes, vote_state.current_epoch(), 0, + true, + true, ) } @@ -1036,7 +1057,18 @@ pub fn process_vote_with_account( ) -> Result<(), InstructionError> { let mut vote_state = verify_and_get_vote_state(vote_account, clock, signers)?; - process_vote(&mut vote_state, vote, slot_hashes, clock.epoch, clock.slot)?; + let timely_vote_credits = feature_set.is_active(&feature_set::timely_vote_credits::id()); + let deprecate_unused_legacy_vote_plumbing = + feature_set.is_active(&feature_set::deprecate_unused_legacy_vote_plumbing::id()); + process_vote( + &mut vote_state, + vote, + slot_hashes, + clock.epoch, + clock.slot, + timely_vote_credits, + deprecate_unused_legacy_vote_plumbing, + )?; if let Some(timestamp) = vote.timestamp { vote.slots .iter() @@ -1219,7 +1251,7 @@ mod tests { 134, 135, ] .into_iter() - .for_each(|v| vote_state.process_next_vote_slot(v, 4, 0)); + .for_each(|v| vote_state.process_next_vote_slot(v, 4, 0, false, true)); let version1_14_11_serialized = bincode::serialize(&VoteStateVersions::V1_14_11(Box::new( VoteState1_14_11::from(vote_state.clone()), @@ -1511,11 +1543,11 @@ mod tests { let slot_hashes: Vec<_> = vote.slots.iter().rev().map(|x| (*x, vote.hash)).collect(); assert_eq!( - process_vote(&mut vote_state_a, &vote, &slot_hashes, 0, 0), + process_vote(&mut vote_state_a, &vote, &slot_hashes, 0, 0, true, true), Ok(()) ); assert_eq!( - process_vote(&mut vote_state_b, &vote, &slot_hashes, 0, 0), + process_vote(&mut vote_state_b, &vote, &slot_hashes, 0, 0, true, true), Ok(()) ); assert_eq!(recent_votes(&vote_state_a), recent_votes(&vote_state_b)); @@ -1528,12 +1560,12 @@ mod tests { let vote = Vote::new(vec![0], Hash::default()); let slot_hashes: Vec<_> = vec![(0, vote.hash)]; assert_eq!( - process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0), + process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0, true, true), Ok(()) ); let recent = recent_votes(&vote_state); assert_eq!( - process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0), + process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0, true, true), Err(VoteError::VoteTooOld) ); assert_eq!(recent, recent_votes(&vote_state)); @@ -1593,7 +1625,7 @@ mod tests { let vote = Vote::new(vec![0], Hash::default()); let slot_hashes: Vec<_> = vec![(*vote.slots.last().unwrap(), vote.hash)]; assert_eq!( - process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0), + process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0, true, true), Ok(()) ); assert_eq!( @@ -1609,7 +1641,7 @@ mod tests { let vote = Vote::new(vec![0], Hash::default()); let slot_hashes: Vec<_> = vec![(*vote.slots.last().unwrap(), vote.hash)]; assert_eq!( - process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0), + process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0, true, true), Ok(()) ); @@ -1628,7 +1660,7 @@ mod tests { let vote = Vote::new(vec![0], Hash::default()); let slot_hashes: Vec<_> = vec![(*vote.slots.last().unwrap(), vote.hash)]; assert_eq!( - process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0), + process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0, true, true), Ok(()) ); @@ -1645,7 +1677,7 @@ mod tests { let vote = Vote::new(vec![], Hash::default()); assert_eq!( - process_vote(&mut vote_state, &vote, &[], 0, 0), + process_vote(&mut vote_state, &vote, &[], 0, 0, true, true), Err(VoteError::EmptySlots) ); } @@ -1901,7 +1933,9 @@ mod tests { &vote, &slot_hashes, 0, - vote_group.1 // vote_group.1 is the slot in which the vote was cast + vote_group.1, // vote_group.1 is the slot in which the vote was cast + true, + true ), Ok(()) ); @@ -2793,7 +2827,7 @@ mod tests { // error with `VotesTooOldAllFiltered` let slot_hashes = vec![(3, Hash::new_unique()), (2, Hash::new_unique())]; assert_eq!( - process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0), + process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0, true, true), Err(VoteError::VotesTooOldAllFiltered) ); @@ -2807,7 +2841,7 @@ mod tests { .1; let vote = Vote::new(vec![old_vote_slot, vote_slot], vote_slot_hash); - process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0).unwrap(); + process_vote(&mut vote_state, &vote, &slot_hashes, 0, 0, true, true).unwrap(); assert_eq!( vote_state .votes @@ -2836,8 +2870,17 @@ mod tests { .unwrap() .1; let vote = Vote::new(vote_slots, vote_hash); - process_vote_unfiltered(&mut vote_state, &vote.slots, &vote, slot_hashes, 0, 0) - .unwrap(); + process_vote_unfiltered( + &mut vote_state, + &vote.slots, + &vote, + slot_hashes, + 0, + 0, + true, + true, + ) + .unwrap(); } vote_state diff --git a/sdk/program/src/vote/state/mod.rs b/sdk/program/src/vote/state/mod.rs index 31e2ea6f31e7ee..eb9ec9282f4fd3 100644 --- a/sdk/program/src/vote/state/mod.rs +++ b/sdk/program/src/vote/state/mod.rs @@ -448,6 +448,8 @@ impl VoteState { next_vote_slot: Slot, epoch: Epoch, current_slot: Slot, + timely_vote_credits: bool, + deprecate_unused_legacy_vote_plumbing: bool, ) { // Ignore votes for slots earlier than we already have votes for if self @@ -460,13 +462,21 @@ impl VoteState { self.pop_expired_votes(next_vote_slot); let landed_vote = LandedVote { - latency: Self::compute_vote_latency(next_vote_slot, current_slot), + latency: if timely_vote_credits || !deprecate_unused_legacy_vote_plumbing { + Self::compute_vote_latency(next_vote_slot, current_slot) + } else { + 0 + }, lockout: Lockout::new(next_vote_slot), }; // Once the stack is full, pop the oldest lockout and distribute rewards if self.votes.len() == MAX_LOCKOUT_HISTORY { - let credits = self.credits_for_vote_at_index(0); + let credits = self.credits_for_vote_at_index( + 0, + timely_vote_credits, + deprecate_unused_legacy_vote_plumbing, + ); let landed_vote = self.votes.pop_front().unwrap(); self.root_slot = Some(landed_vote.slot()); @@ -511,7 +521,12 @@ impl VoteState { } /// Returns the credits to award for a vote at the given lockout slot index - pub fn credits_for_vote_at_index(&self, index: usize) -> u64 { + pub fn credits_for_vote_at_index( + &self, + index: usize, + timely_vote_credits: bool, + deprecate_unused_legacy_vote_plumbing: bool, + ) -> u64 { let latency = self .votes .get(index) @@ -519,7 +534,7 @@ impl VoteState { // If latency is 0, this means that the Lockout was created and stored from a software version that did not // store vote latencies; in this case, 1 credit is awarded - if latency == 0 { + if latency == 0 || (deprecate_unused_legacy_vote_plumbing && !timely_vote_credits) { 1 } else { match latency.checked_sub(VOTE_CREDITS_GRACE_SLOTS) { diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 4b8289d7c995b7..86c0b9e66784df 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -748,6 +748,10 @@ pub mod disable_bpf_loader_instructions { solana_sdk::declare_id!("7WeS1vfPRgeeoXArLh7879YcB9mgE9ktjPDtajXeWfXn"); } +pub mod deprecate_unused_legacy_vote_plumbing { + solana_sdk::declare_id!("6Uf8S75PVh91MYgPQSHnjRAPQq6an5BDv9vomrCwDqLe"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -930,6 +934,7 @@ lazy_static! { (index_erasure_conflict_duplicate_proofs::id(), "generate duplicate proofs for index and erasure conflicts #34360"), (curve25519_restrict_msm_length::id(), "restrict curve25519 multiscalar multiplication vector lengths #34763"), (disable_bpf_loader_instructions::id(), "disable bpf loader management instructions #34194"), + (deprecate_unused_legacy_vote_plumbing::id(), "Deprecate unused legacy vote tx plumbing"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() From 31e37b8bb1887341d902adefb497e37ef864862f Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Mon, 18 Mar 2024 00:13:12 -0500 Subject: [PATCH 193/213] Update version to v1.17.28 (#286) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d01f4af5267746..6962d58b802fa7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-install" -version = "1.17.27" +version = "1.17.28" dependencies = [ "atty", "bincode", @@ -110,7 +110,7 @@ dependencies = [ [[package]] name = "agave-ledger-tool" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_cmd", "bs58", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.27" +version = "1.17.28" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "agave-watchtower" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 2.33.3", "humantime", @@ -2314,7 +2314,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "regex", @@ -2322,7 +2322,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.27" +version = "1.17.28" dependencies = [ "regex", ] @@ -4243,7 +4243,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.27" +version = "1.17.28" dependencies = [ "protobuf-src", "tonic-build", @@ -4486,7 +4486,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.27" +version = "1.17.28" [[package]] name = "rcgen" @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.27" +version = "1.17.28" dependencies = [ "Inflector", "assert_matches", @@ -5301,7 +5301,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 2.33.3", "log", @@ -5315,7 +5315,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 2.33.3", "log", @@ -5345,7 +5345,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.27" +version = "1.17.28" dependencies = [ "arrayref", "assert_matches", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "bytemuck", @@ -5428,7 +5428,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -5439,7 +5439,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5463,7 +5463,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5480,7 +5480,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.27" +version = "1.17.28" dependencies = [ "serde", "solana-sdk", @@ -5489,7 +5489,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "crossbeam-channel", @@ -5507,7 +5507,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5518,7 +5518,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5559,7 +5559,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bv", "fnv", @@ -5576,7 +5576,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -5608,7 +5608,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bv", "bytemuck", @@ -5627,7 +5627,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "solana-logger", @@ -5635,7 +5635,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_cmd", "bzip2", @@ -5656,11 +5656,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.27" +version = "1.17.28" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.27" +version = "1.17.28" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5671,7 +5671,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "chrono", @@ -5688,7 +5688,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -5759,7 +5759,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.27" +version = "1.17.28" dependencies = [ "anyhow", "dirs-next", @@ -5774,7 +5774,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.27" +version = "1.17.28" dependencies = [ "Inflector", "base64 0.21.4", @@ -5800,7 +5800,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-trait", "bincode", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.27" +version = "1.17.28" dependencies = [ "futures-util", "rand 0.8.5", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5870,7 +5870,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "chrono", @@ -5883,7 +5883,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-trait", "bincode", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5990,7 +5990,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.27" +version = "1.17.28" dependencies = [ "lazy_static", "log", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "clap 3.2.23", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "console", "indicatif", @@ -6057,7 +6057,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "ed25519-dalek", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "byteorder", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.27" +version = "1.17.28" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.27" +version = "1.17.28" dependencies = [ "proc-macro2", "quote", @@ -6152,7 +6152,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.27" +version = "1.17.28" dependencies = [ "base64 0.21.4", "bincode", @@ -6177,7 +6177,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "solana-accounts-db", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.27" +version = "1.17.28" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -6213,7 +6213,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -6264,7 +6264,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bs58", "clap 3.2.23", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "log", @@ -6361,7 +6361,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6400,7 +6400,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.27" +version = "1.17.28" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.27" +version = "1.17.28" dependencies = [ "env_logger", "lazy_static", @@ -6421,7 +6421,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "solana-sdk", @@ -6429,11 +6429,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.27" +version = "1.17.28" [[package]] name = "solana-merkle-root-bench" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 2.33.3", "log", @@ -6446,7 +6446,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.27" +version = "1.17.28" dependencies = [ "fast-math", "hex", @@ -6455,7 +6455,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.27" +version = "1.17.28" dependencies = [ "crossbeam-channel", "env_logger", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6482,7 +6482,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "clap 3.2.23", @@ -6502,7 +6502,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "reqwest", @@ -6512,7 +6512,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.27" +version = "1.17.28" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6543,7 +6543,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -6564,7 +6564,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 3.2.23", "log", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "anyhow", "ark-bn254", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6665,7 +6665,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "async-trait", @@ -6694,7 +6694,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "anyhow", "crossbeam-channel", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-mutex", "async-trait", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.27" +version = "1.17.28" dependencies = [ "lazy_static", "num_cpus", @@ -6754,7 +6754,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "console", @@ -6773,7 +6773,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.27" +version = "1.17.28" dependencies = [ "base64 0.21.4", "bincode", @@ -6832,7 +6832,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "async-trait", @@ -6861,7 +6861,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.27" +version = "1.17.28" dependencies = [ "base64 0.21.4", "bs58", @@ -6881,7 +6881,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "anyhow", "clap 2.33.3", @@ -6898,7 +6898,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "bs58", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.27" +version = "1.17.28" dependencies = [ "arrayref", "assert_matches", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.27" +version = "1.17.28" dependencies = [ "anyhow", "assert_matches", @@ -7066,7 +7066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bs58", "proc-macro2", @@ -7083,7 +7083,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.27" +version = "1.17.28" dependencies = [ "crossbeam-channel", "log", @@ -7098,7 +7098,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7114,7 +7114,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -7131,7 +7131,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.27" +version = "1.17.28" dependencies = [ "backoff", "bincode", @@ -7163,7 +7163,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "bs58", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 2.33.3", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "async-channel", @@ -7223,7 +7223,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.27" +version = "1.17.28" dependencies = [ "base64 0.21.4", "bincode", @@ -7267,7 +7267,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "log", @@ -7281,7 +7281,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -7314,7 +7314,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-trait", "bincode", @@ -7336,7 +7336,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "clap 2.33.3", @@ -7363,7 +7363,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.27" +version = "1.17.28" dependencies = [ "Inflector", "base64 0.21.4", @@ -7386,7 +7386,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -7423,7 +7423,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-trait", "solana-connection-cache", @@ -7436,7 +7436,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.27" +version = "1.17.28" dependencies = [ "serde_json", "solana-metrics", @@ -7444,7 +7444,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "rustc_version 0.4.0", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "crossbeam-channel", @@ -7477,7 +7477,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.27" +version = "1.17.28" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 227d5f73c5f7b6..8aaa1056627bba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.27" +version = "1.17.28" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.27" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.27" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.27" } -solana-banks-client = { path = "banks-client", version = "=1.17.27" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.27" } -solana-banks-server = { path = "banks-server", version = "=1.17.27" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.27" } -solana-bloom = { path = "bloom", version = "=1.17.27" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.27" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.27" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.27", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.27" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.27" } -solana-cli = { path = "cli", version = "=1.17.27" } -solana-cli-config = { path = "cli-config", version = "=1.17.27" } -solana-cli-output = { path = "cli-output", version = "=1.17.27" } -solana-client = { path = "client", version = "=1.17.27" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.27" } -solana-config-program = { path = "programs/config", version = "=1.17.27" } -solana-core = { path = "core", version = "=1.17.27" } -solana-cost-model = { path = "cost-model", version = "=1.17.27" } -solana-download-utils = { path = "download-utils", version = "=1.17.27" } -solana-entry = { path = "entry", version = "=1.17.27" } -solana-faucet = { path = "faucet", version = "=1.17.27" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.27" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.27" } -solana-genesis = { path = "genesis", version = "=1.17.27" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.27" } -agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.27" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.27" } -solana-gossip = { path = "gossip", version = "=1.17.27" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.27" } -solana-ledger = { path = "ledger", version = "=1.17.27" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.27" } -solana-logger = { path = "logger", version = "=1.17.27" } -solana-measure = { path = "measure", version = "=1.17.27" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.27" } -solana-metrics = { path = "metrics", version = "=1.17.27" } -solana-net-utils = { path = "net-utils", version = "=1.17.27" } -solana-notifier = { path = "notifier", version = "=1.17.27" } -solana-perf = { path = "perf", version = "=1.17.27" } -solana-poh = { path = "poh", version = "=1.17.27" } -solana-program = { path = "sdk/program", version = "=1.17.27" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.27" } -solana-program-test = { path = "program-test", version = "=1.17.27" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.27" } -solana-quic-client = { path = "quic-client", version = "=1.17.27" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.27" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.27", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.27" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.27", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.27" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.27" } -solana-runtime = { path = "runtime", version = "=1.17.27" } -solana-sdk = { path = "sdk", version = "=1.17.27" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.27" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.27" } -solana-stake-program = { path = "programs/stake", version = "=1.17.27" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.27" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.27" } -solana-streamer = { path = "streamer", version = "=1.17.27" } -solana-system-program = { path = "programs/system", version = "=1.17.27" } -solana-test-validator = { path = "test-validator", version = "=1.17.27" } -solana-thin-client = { path = "thin-client", version = "=1.17.27" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.27", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.27" } -solana-turbine = { path = "turbine", version = "=1.17.27" } -solana-udp-client = { path = "udp-client", version = "=1.17.27" } -solana-version = { path = "version", version = "=1.17.27" } -solana-vote = { path = "vote", version = "=1.17.27" } -solana-vote-program = { path = "programs/vote", version = "=1.17.27" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.27" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.27" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.27" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.28" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.28" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.28" } +solana-banks-client = { path = "banks-client", version = "=1.17.28" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.28" } +solana-banks-server = { path = "banks-server", version = "=1.17.28" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.28" } +solana-bloom = { path = "bloom", version = "=1.17.28" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.28" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.28" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.28", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.28" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.28" } +solana-cli = { path = "cli", version = "=1.17.28" } +solana-cli-config = { path = "cli-config", version = "=1.17.28" } +solana-cli-output = { path = "cli-output", version = "=1.17.28" } +solana-client = { path = "client", version = "=1.17.28" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.28" } +solana-config-program = { path = "programs/config", version = "=1.17.28" } +solana-core = { path = "core", version = "=1.17.28" } +solana-cost-model = { path = "cost-model", version = "=1.17.28" } +solana-download-utils = { path = "download-utils", version = "=1.17.28" } +solana-entry = { path = "entry", version = "=1.17.28" } +solana-faucet = { path = "faucet", version = "=1.17.28" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.28" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.28" } +solana-genesis = { path = "genesis", version = "=1.17.28" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.28" } +agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.28" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.28" } +solana-gossip = { path = "gossip", version = "=1.17.28" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.28" } +solana-ledger = { path = "ledger", version = "=1.17.28" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.28" } +solana-logger = { path = "logger", version = "=1.17.28" } +solana-measure = { path = "measure", version = "=1.17.28" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.28" } +solana-metrics = { path = "metrics", version = "=1.17.28" } +solana-net-utils = { path = "net-utils", version = "=1.17.28" } +solana-notifier = { path = "notifier", version = "=1.17.28" } +solana-perf = { path = "perf", version = "=1.17.28" } +solana-poh = { path = "poh", version = "=1.17.28" } +solana-program = { path = "sdk/program", version = "=1.17.28" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.28" } +solana-program-test = { path = "program-test", version = "=1.17.28" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.28" } +solana-quic-client = { path = "quic-client", version = "=1.17.28" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.28" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.28", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.28" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.28", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.28" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.28" } +solana-runtime = { path = "runtime", version = "=1.17.28" } +solana-sdk = { path = "sdk", version = "=1.17.28" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.28" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.28" } +solana-stake-program = { path = "programs/stake", version = "=1.17.28" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.28" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.28" } +solana-streamer = { path = "streamer", version = "=1.17.28" } +solana-system-program = { path = "programs/system", version = "=1.17.28" } +solana-test-validator = { path = "test-validator", version = "=1.17.28" } +solana-thin-client = { path = "thin-client", version = "=1.17.28" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.28", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.28" } +solana-turbine = { path = "turbine", version = "=1.17.28" } +solana-udp-client = { path = "udp-client", version = "=1.17.28" } +solana-version = { path = "version", version = "=1.17.28" } +solana-vote = { path = "vote", version = "=1.17.28" } +solana-vote-program = { path = "programs/vote", version = "=1.17.28" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.28" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.28" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.28" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 59a9f888eba3bc..a6aacb65ab6354 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.27" +version = "1.17.28" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -4520,7 +4520,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.27" +version = "1.17.28" dependencies = [ "Inflector", "base64 0.21.4", @@ -4543,7 +4543,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.27" +version = "1.17.28" dependencies = [ "arrayref", "bincode", @@ -4600,7 +4600,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "bytemuck", @@ -4619,7 +4619,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4634,7 +4634,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.27" +version = "1.17.28" dependencies = [ "serde", "solana-sdk", @@ -4643,7 +4643,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "crossbeam-channel", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bv", "fnv", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4695,7 +4695,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.27" +version = "1.17.28" dependencies = [ "array-bytes", "serde", @@ -4705,7 +4705,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bv", "bytemuck", @@ -4721,7 +4721,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "chrono", "clap 2.33.3", @@ -4736,7 +4736,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.27" +version = "1.17.28" dependencies = [ "dirs-next", "lazy_static", @@ -4750,7 +4750,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.27" +version = "1.17.28" dependencies = [ "Inflector", "base64 0.21.4", @@ -4775,7 +4775,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-trait", "bincode", @@ -4806,7 +4806,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4814,7 +4814,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "chrono", @@ -4826,7 +4826,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-trait", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.27" +version = "1.17.28" dependencies = [ "base64 0.21.4", "bincode", @@ -4918,7 +4918,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.27" +version = "1.17.28" dependencies = [ "lazy_static", "log", @@ -4940,7 +4940,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "console", "indicatif", @@ -4952,7 +4952,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "crossbeam-channel", @@ -4972,7 +4972,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4994,7 +4994,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.27" +version = "1.17.28" dependencies = [ "ahash 0.8.5", "blake3", @@ -5022,7 +5022,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.27" +version = "1.17.28" dependencies = [ "proc-macro2", "quote", @@ -5032,7 +5032,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "solana-accounts-db", @@ -5043,7 +5043,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.27" +version = "1.17.28" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -5068,7 +5068,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "bincode", @@ -5180,7 +5180,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "solana-measure", @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.27" +version = "1.17.28" dependencies = [ "env_logger", "lazy_static", @@ -5200,7 +5200,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "solana-sdk", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.27" +version = "1.17.28" dependencies = [ "fast-math", "solana-program", @@ -5216,7 +5216,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.27" +version = "1.17.28" dependencies = [ "crossbeam-channel", "gethostname", @@ -5229,7 +5229,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "clap 3.1.6", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.27" +version = "1.17.28" dependencies = [ "ahash 0.8.5", "bincode", @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.27" +version = "1.17.28" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5292,7 +5292,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "ark-bn254", "ark-ec", @@ -5344,7 +5344,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.27" +version = "1.17.28" dependencies = [ "base64 0.21.4", "bincode", @@ -5370,7 +5370,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "async-trait", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "crossbeam-channel", "futures-util", @@ -5421,7 +5421,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-mutex", "async-trait", @@ -5446,7 +5446,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.27" +version = "1.17.28" dependencies = [ "lazy_static", "num_cpus", @@ -5454,7 +5454,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.27" +version = "1.17.28" dependencies = [ "console", "dialoguer", @@ -5471,7 +5471,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.27" +version = "1.17.28" dependencies = [ "base64 0.21.4", "bincode", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-trait", "base64 0.21.4", @@ -5550,7 +5550,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.27" +version = "1.17.28" dependencies = [ "base64 0.21.4", "bs58", @@ -5570,7 +5570,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.27" +version = "1.17.28" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.27" +version = "1.17.28" dependencies = [ "arrayref", "base64 0.21.4", @@ -5656,7 +5656,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5693,21 +5693,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.27" +version = "1.17.28" dependencies = [ "array-bytes", "solana-program", @@ -5715,7 +5715,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.27" +version = "1.17.28" dependencies = [ "array-bytes", "solana-program", @@ -5723,21 +5723,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5745,14 +5745,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.27" +version = "1.17.28" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5760,21 +5760,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.27" +version = "1.17.28" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5784,42 +5784,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.27" +version = "1.17.28" dependencies = [ "rustversion", "solana-program", @@ -5829,49 +5829,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5879,14 +5879,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-program-runtime", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5904,21 +5904,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5926,14 +5926,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.27" +version = "1.17.28" dependencies = [ "array-bytes", "solana-program", @@ -5941,7 +5941,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.27" +version = "1.17.28" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5950,14 +5950,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-program-runtime", @@ -5975,21 +5975,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-program-runtime", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.27" +version = "1.17.28" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -6007,7 +6007,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.27" +version = "1.17.28" dependencies = [ "blake3", "solana-program", @@ -6015,21 +6015,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.27" +version = "1.17.28" dependencies = [ "agave-validator", "solana-logger", @@ -6040,21 +6040,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", "solana-program-runtime", @@ -6064,21 +6064,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.27" +version = "1.17.28" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.27" +version = "1.17.28" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6130,7 +6130,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bs58", "proc-macro2", @@ -6147,7 +6147,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.27" +version = "1.17.28" dependencies = [ "crossbeam-channel", "log", @@ -6161,7 +6161,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "log", @@ -6174,7 +6174,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.27" +version = "1.17.28" dependencies = [ "backoff", "bincode", @@ -6206,7 +6206,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "bs58", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-channel", "bytes", @@ -6251,7 +6251,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "log", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.27" +version = "1.17.28" dependencies = [ "base64 0.21.4", "bincode", @@ -6293,7 +6293,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "log", @@ -6306,7 +6306,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-trait", "bincode", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.27" +version = "1.17.28" dependencies = [ "Inflector", "base64 0.21.4", @@ -6351,7 +6351,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "bytes", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.27" +version = "1.17.28" dependencies = [ "async-trait", "solana-connection-cache", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.27" +version = "1.17.28" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.27" +version = "1.17.28" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.27" +version = "1.17.28" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.27" +version = "1.17.28" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index b0e4458a9257da..43b9957bcdfb51 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.27" +version = "1.17.28" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.27" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.27" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.27" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.27" } -solana-ledger = { path = "../../ledger", version = "=1.17.27" } -solana-logger = { path = "../../logger", version = "=1.17.27" } -solana-measure = { path = "../../measure", version = "=1.17.27" } -solana-program = { path = "../../sdk/program", version = "=1.17.27" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.27" } -solana-program-test = { path = "../../program-test", version = "=1.17.27" } -solana-runtime = { path = "../../runtime", version = "=1.17.27" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.27" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.27" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.27", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.27" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.27" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.27" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.27", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.27" } -solana-sdk = { path = "../../sdk", version = "=1.17.27" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.27" } -agave-validator = { path = "../../validator", version = "=1.17.27" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.27" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.28" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.28" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.28" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.28" } +solana-ledger = { path = "../../ledger", version = "=1.17.28" } +solana-logger = { path = "../../logger", version = "=1.17.28" } +solana-measure = { path = "../../measure", version = "=1.17.28" } +solana-program = { path = "../../sdk/program", version = "=1.17.28" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.28" } +solana-program-test = { path = "../../program-test", version = "=1.17.28" } +solana-runtime = { path = "../../runtime", version = "=1.17.28" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.28" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.28" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.28", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.28" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.28" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.28" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.28", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.28" } +solana-sdk = { path = "../../sdk", version = "=1.17.28" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.28" } +agave-validator = { path = "../../validator", version = "=1.17.28" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.28" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 42a6e65085a8c8..d03e164772e99b 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.27" +version = "1.17.28" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.27" } +solana-program = { path = "../../../../program", version = "=1.17.28" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 6cf1edbeeac19b..998109038dd3b6 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.27" +version = "1.17.28" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.27" } +solana-program = { path = "../../../../program", version = "=1.17.28" } [lib] crate-type = ["cdylib"] From af153cba405aa3897d25f5e23d6b66b701eb1e69 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 13:13:52 +0800 Subject: [PATCH 194/213] v1.17: [anza migration]: add 'agave=info' to default log level (backport of #223) (#242) [anza migration]: add 'agave=info' to default log level (#223) Co-authored-by: yihau --- accounts-cluster-bench/src/main.rs | 2 +- bench-tps/src/main.rs | 2 +- dos/src/main.rs | 2 +- faucet/src/bin/faucet.rs | 2 +- gossip/src/main.rs | 2 +- ledger-tool/src/main.rs | 2 +- logger/src/lib.rs | 7 +++++++ runtime/store-tool/src/main.rs | 2 +- scripts/run.sh | 2 +- transaction-dos/src/main.rs | 2 +- validator/src/lib.rs | 5 ++--- watchtower/src/main.rs | 2 +- 12 files changed, 19 insertions(+), 13 deletions(-) diff --git a/accounts-cluster-bench/src/main.rs b/accounts-cluster-bench/src/main.rs index 9e592131a16905..2135e9ee19cbee 100644 --- a/accounts-cluster-bench/src/main.rs +++ b/accounts-cluster-bench/src/main.rs @@ -486,7 +486,7 @@ fn run_accounts_bench( } fn main() { - solana_logger::setup_with_default("solana=info"); + solana_logger::setup_with_default_filter(); let matches = App::new(crate_name!()) .about(crate_description!()) .version(solana_version::version!()) diff --git a/bench-tps/src/main.rs b/bench-tps/src/main.rs index 519612bd4237a7..e9cc2100635912 100644 --- a/bench-tps/src/main.rs +++ b/bench-tps/src/main.rs @@ -221,7 +221,7 @@ fn create_client( } fn main() { - solana_logger::setup_with_default("solana=info"); + solana_logger::setup_with_default_filter(); solana_metrics::set_panic_hook("bench-tps", /*version:*/ None); let matches = cli::build_args(solana_version::version!()).get_matches(); diff --git a/dos/src/main.rs b/dos/src/main.rs index 8e6c3c5b2b11b5..6a7968669f4c55 100644 --- a/dos/src/main.rs +++ b/dos/src/main.rs @@ -755,7 +755,7 @@ fn run_dos( } fn main() { - solana_logger::setup_with_default("solana=info"); + solana_logger::setup_with_default_filter(); let cmd_params = build_cli_parameters(); let (nodes, client) = if !cmd_params.skip_gossip { diff --git a/faucet/src/bin/faucet.rs b/faucet/src/bin/faucet.rs index 8e45ef98155a54..56cc7542623185 100644 --- a/faucet/src/bin/faucet.rs +++ b/faucet/src/bin/faucet.rs @@ -19,7 +19,7 @@ use { async fn main() { let default_keypair = solana_cli_config::Config::default().keypair_path; - solana_logger::setup_with_default("solana=info"); + solana_logger::setup_with_default_filter(); solana_metrics::set_panic_hook("faucet", /*version:*/ None); let matches = App::new(crate_name!()) .about(crate_description!()) diff --git a/gossip/src/main.rs b/gossip/src/main.rs index 226fab8d9d43a8..1f31195f431d36 100644 --- a/gossip/src/main.rs +++ b/gossip/src/main.rs @@ -326,7 +326,7 @@ fn process_rpc_url( } fn main() -> Result<(), Box> { - solana_logger::setup_with_default("solana=info"); + solana_logger::setup_with_default_filter(); let matches = parse_matches(); let socket_addr_space = SocketAddrSpace::new(matches.is_present("allow_private_addr")); diff --git a/ledger-tool/src/main.rs b/ledger-tool/src/main.rs index aeed15fc9c9bbf..f7b25ec279636c 100644 --- a/ledger-tool/src/main.rs +++ b/ledger-tool/src/main.rs @@ -1081,7 +1081,7 @@ fn main() { const DEFAULT_MAX_FULL_SNAPSHOT_ARCHIVES_TO_RETAIN: usize = std::usize::MAX; const DEFAULT_MAX_INCREMENTAL_SNAPSHOT_ARCHIVES_TO_RETAIN: usize = std::usize::MAX; - solana_logger::setup_with_default("solana=info"); + solana_logger::setup_with_default_filter(); let starting_slot_arg = Arg::with_name("starting_slot") .long("starting-slot") diff --git a/logger/src/lib.rs b/logger/src/lib.rs index 7b9ae30d881053..aa8dc5ca1db0ef 100644 --- a/logger/src/lib.rs +++ b/logger/src/lib.rs @@ -10,6 +10,8 @@ lazy_static! { Arc::new(RwLock::new(env_logger::Logger::from_default_env())); } +pub const DEFAULT_FILTER: &str = "solana=info,agave=info"; + struct LoggerShim {} impl log::Log for LoggerShim { @@ -49,6 +51,11 @@ pub fn setup_with_default(filter: &str) { replace_logger(logger); } +// Configures logging with the `DEFAULT_FILTER` if RUST_LOG is not set +pub fn setup_with_default_filter() { + setup_with_default(DEFAULT_FILTER); +} + // Configures logging with the default filter "error" if RUST_LOG is not set pub fn setup() { setup_with_default("error"); diff --git a/runtime/store-tool/src/main.rs b/runtime/store-tool/src/main.rs index 98140ed59ba0ea..8c2cf80148882d 100644 --- a/runtime/store-tool/src/main.rs +++ b/runtime/store-tool/src/main.rs @@ -11,7 +11,7 @@ use { }; fn main() { - solana_logger::setup_with_default("solana=info"); + solana_logger::setup_with_default_filter(); let matches = App::new(crate_name!()) .about(crate_description!()) .version(solana_version::version!()) diff --git a/scripts/run.sh b/scripts/run.sh index 2d8e1ec88ac450..70994c921f47ac 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -37,7 +37,7 @@ $ok || { exit 1 } -export RUST_LOG=${RUST_LOG:-solana=info,solana_runtime::message_processor=debug} # if RUST_LOG is unset, default to info +export RUST_LOG=${RUST_LOG:-solana=info,agave=info,solana_runtime::message_processor=debug} # if RUST_LOG is unset, default to info export RUST_BACKTRACE=1 dataDir=$PWD/config/"$(basename "$0" .sh)" ledgerDir=$PWD/config/ledger diff --git a/transaction-dos/src/main.rs b/transaction-dos/src/main.rs index 5d69e9e291b6b5..11f8548227cb58 100644 --- a/transaction-dos/src/main.rs +++ b/transaction-dos/src/main.rs @@ -425,7 +425,7 @@ fn run_transactions_dos( } fn main() { - solana_logger::setup_with_default("solana=info"); + solana_logger::setup_with_default_filter(); let matches = App::new(crate_name!()) .about(crate_description!()) .version(solana_version::version!()) diff --git a/validator/src/lib.rs b/validator/src/lib.rs index 4e7ed43ec78309..fab90fa98e06ca 100644 --- a/validator/src/lib.rs +++ b/validator/src/lib.rs @@ -46,10 +46,9 @@ pub fn redirect_stderr_to_file(logfile: Option) -> Option env::set_var("RUST_BACKTRACE", "1") } - let filter = "solana=info"; match logfile { None => { - solana_logger::setup_with_default(filter); + solana_logger::setup_with_default_filter(); None } Some(logfile) => { @@ -63,7 +62,7 @@ pub fn redirect_stderr_to_file(logfile: Option) -> Option exit(1); }); - solana_logger::setup_with_default(filter); + solana_logger::setup_with_default_filter(); redirect_stderr(&logfile); Some( std::thread::Builder::new() diff --git a/watchtower/src/main.rs b/watchtower/src/main.rs index 341b7903c0a33e..11dd70e27285dc 100644 --- a/watchtower/src/main.rs +++ b/watchtower/src/main.rs @@ -246,7 +246,7 @@ fn get_cluster_info( } fn main() -> Result<(), Box> { - solana_logger::setup_with_default("solana=info"); + solana_logger::setup_with_default_filter(); solana_metrics::set_panic_hook("watchtower", /*version:*/ None); let config = get_config(); From 29c004c39301f159cfe63ad301aa6b9bb96c5264 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 14:32:06 -0700 Subject: [PATCH 195/213] v1.17: Make the quic server connection table use an async lock, reducing thrashing (backport of #293) (#299) Make the quic server connection table use an async lock --- streamer/src/nonblocking/quic.rs | 34 ++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/streamer/src/nonblocking/quic.rs b/streamer/src/nonblocking/quic.rs index 04b2e66e8f319e..0c278ea818e814 100644 --- a/streamer/src/nonblocking/quic.rs +++ b/streamer/src/nonblocking/quic.rs @@ -30,13 +30,26 @@ use { std::{ iter::repeat_with, net::{IpAddr, SocketAddr, UdpSocket}, + // CAUTION: be careful not to introduce any awaits while holding an RwLock. sync::{ atomic::{AtomicBool, AtomicU64, Ordering}, - Arc, Mutex, MutexGuard, RwLock, + Arc, RwLock, }, time::{Duration, Instant}, }, - tokio::{task::JoinHandle, time::timeout}, + tokio::{ + // CAUTION: It's kind of sketch that we're mixing async and sync locks (see the RwLock above). + // This is done so that sync code can also access the stake table. + // Make sure we don't hold a sync lock across an await - including the await to + // lock an async Mutex. This does not happen now and should not happen as long as we + // don't hold an async Mutex and sync RwLock at the same time (currently true) + // but if we do, the scope of the RwLock must always be a subset of the async Mutex + // (i.e. lock order is always async Mutex -> RwLock). Also, be careful not to + // introduce any other awaits while holding the RwLock. + sync::{Mutex, MutexGuard}, + task::JoinHandle, + time::timeout, + }, }; /// Limit to 500K PPS @@ -383,7 +396,7 @@ fn handle_and_cache_new_connection( } } -fn prune_unstaked_connections_and_add_new_connection( +async fn prune_unstaked_connections_and_add_new_connection( connection: Connection, connection_table: Arc>, max_connections: usize, @@ -393,7 +406,7 @@ fn prune_unstaked_connections_and_add_new_connection( let stats = params.stats.clone(); if max_connections > 0 { let connection_table_clone = connection_table.clone(); - let mut connection_table = connection_table.lock().unwrap(); + let mut connection_table = connection_table.lock().await; prune_unstaked_connection_table(&mut connection_table, max_connections, stats); handle_and_cache_new_connection( connection, @@ -496,7 +509,8 @@ async fn setup_connection( ); if params.stake > 0 { - let mut connection_table_l = staked_connection_table.lock().unwrap(); + let mut connection_table_l = staked_connection_table.lock().await; + if connection_table_l.total_size >= max_staked_connections { let num_pruned = connection_table_l.prune_random(PRUNE_RANDOM_SAMPLE_SIZE, params.stake); @@ -525,7 +539,9 @@ async fn setup_connection( max_unstaked_connections, ¶ms, wait_for_chunk_timeout, - ) { + ) + .await + { stats .connection_added_from_staked_peer .fetch_add(1, Ordering::Relaxed); @@ -544,7 +560,9 @@ async fn setup_connection( max_unstaked_connections, ¶ms, wait_for_chunk_timeout, - ) { + ) + .await + { stats .connection_added_from_unstaked_peer .fetch_add(1, Ordering::Relaxed); @@ -807,7 +825,7 @@ async fn handle_connection( } } - let removed_connection_count = connection_table.lock().unwrap().remove_connection( + let removed_connection_count = connection_table.lock().await.remove_connection( ConnectionTableKey::new(remote_addr.ip(), params.remote_pubkey), remote_addr.port(), stable_id, From 4d499a361097092e54c876031cb68b787ab3a97a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:20:56 +0800 Subject: [PATCH 196/213] v1.17: [anza migration] fix: use the correct log filter for non-unix (backport of #245) (#287) [anza migration] fix: use the correct log filter for non-unix (#245) fix: use the correct log filter for non-unix (cherry picked from commit 2537e3e4ad1ebdfe833fa8b34249382fdb2198b9) Co-authored-by: Yihau Chen --- validator/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validator/src/lib.rs b/validator/src/lib.rs index fab90fa98e06ca..83fbb1c82d01f7 100644 --- a/validator/src/lib.rs +++ b/validator/src/lib.rs @@ -82,7 +82,7 @@ pub fn redirect_stderr_to_file(logfile: Option) -> Option #[cfg(not(unix))] { println!("logrotate is not supported on this platform"); - solana_logger::setup_file_with_default(&logfile, filter); + solana_logger::setup_file_with_default(&logfile, solana_logger::DEFAULT_FILTER); None } } From 6234bc9432222efe85cb1d8ca12f828d78efe125 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:41:39 +0800 Subject: [PATCH 197/213] [anza migration] v1.17: Use agave prefix in scripts for pre-installed binaries (backport of #155) (#349) Use agave prefix in scripts for pre-installed binaries (#155) (cherry picked from commit 68be105870d669b81999faafb4a1e6d217c26cbf) Co-authored-by: Justin Starry --- multinode-demo/common.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/multinode-demo/common.sh b/multinode-demo/common.sh index 1643208947b643..db43dd15cffaaf 100644 --- a/multinode-demo/common.sh +++ b/multinode-demo/common.sh @@ -30,7 +30,11 @@ if [[ -n $USE_INSTALL || ! -f "$SOLANA_ROOT"/Cargo.toml ]]; then if [[ -z $program ]]; then printf "solana" else - printf "solana-%s" "$program" + if [[ $program == "validator" || $program == "ledger-tool" || $program == "watchtower" || $program == "install" ]]; then + printf "agave-%s" "$program" + else + printf "solana-%s" "$program" + fi fi } else From 11d415658982cb6dfcd8039424c2597f6729d0ec Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:50:02 +0800 Subject: [PATCH 198/213] v1.17: [anza migration]: fix download link for net scripts (backport of #219) (#351) * [anza migration]: fix download link for net scripts (#219) (cherry picked from commit e682fec28e6c40741c7e6c5a566553d0c3f916f4) # Conflicts: # net/net.sh # scripts/agave-install-deploy.sh * fix conflict --------- Co-authored-by: Yihau Chen Co-authored-by: yihau --- net/net.sh | 2 +- scripts/agave-install-deploy.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/net/net.sh b/net/net.sh index 00261a135826d0..531d36b51659ef 100755 --- a/net/net.sh +++ b/net/net.sh @@ -560,7 +560,7 @@ prepareDeploy() { if [[ -n $releaseChannel ]]; then echo "Downloading release from channel: $releaseChannel" rm -f "$SOLANA_ROOT"/solana-release.tar.bz2 - declare updateDownloadUrl=https://release.solana.com/"$releaseChannel"/solana-release-x86_64-unknown-linux-gnu.tar.bz2 + declare updateDownloadUrl=https://release.anza.xyz/"$releaseChannel"/solana-release-x86_64-unknown-linux-gnu.tar.bz2 ( set -x curl -L -I "$updateDownloadUrl" diff --git a/scripts/agave-install-deploy.sh b/scripts/agave-install-deploy.sh index a8f8eeb65b3857..dcdec14ffb635d 100755 --- a/scripts/agave-install-deploy.sh +++ b/scripts/agave-install-deploy.sh @@ -57,10 +57,10 @@ esac case $TAG in edge|beta) - DOWNLOAD_URL=https://release.solana.com/"$TAG"/solana-release-$TARGET.tar.bz2 + DOWNLOAD_URL=https://release.anza.xyz/"$TAG"/solana-release-$TARGET.tar.bz2 ;; *) - DOWNLOAD_URL=https://github.com/solana-labs/solana/releases/download/"$TAG"/solana-release-$TARGET.tar.bz2 + DOWNLOAD_URL=https://github.com/anza-xyz/agave/releases/download/"$TAG"/solana-release-$TARGET.tar.bz2 ;; esac From d06a0a463215451c37943552436a1f77b9ee3129 Mon Sep 17 00:00:00 2001 From: Ashwin Sekar Date: Thu, 21 Mar 2024 09:51:18 -0700 Subject: [PATCH 199/213] v1.17: blockstore: relax parent slot meta check for clear_unconfirmed_slot (#67) blockstore: relax parent slot meta check for clear_unconfirmed_slot --- ledger/src/blockstore.rs | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index 8b964e5b3ce9a1..bd1d19b7d33619 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -1131,18 +1131,25 @@ impl Blockstore { // Clear this slot as a next slot from parent if let Some(parent_slot) = slot_meta.parent_slot { - let mut parent_slot_meta = self + if let Some(mut parent_slot_meta) = self .meta(parent_slot) .expect("Couldn't fetch from SlotMeta column family") - .expect("Unconfirmed slot should have had parent slot set"); - // .retain() is a linear scan; however, next_slots should - // only contain several elements so this isn't so bad - parent_slot_meta - .next_slots - .retain(|&next_slot| next_slot != slot); - self.meta_cf - .put(parent_slot, &parent_slot_meta) - .expect("Couldn't insert into SlotMeta column family"); + { + // .retain() is a linear scan; however, next_slots should + // only contain several elements so this isn't so bad + parent_slot_meta + .next_slots + .retain(|&next_slot| next_slot != slot); + self.meta_cf + .put(parent_slot, &parent_slot_meta) + .expect("Couldn't insert into SlotMeta column family"); + } else { + error!( + "Parent slot meta {} for child {} is missing or cleaned up. + Falling back to orphan repair to remedy the situation", + parent_slot, slot + ); + } } // Reinsert parts of `slot_meta` that are important to retain, like the `next_slots` // field. From adc63fb3c020ab3fac25f23acd2f73512a211ec8 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:18:58 -0600 Subject: [PATCH 200/213] v1.17: rpc-sts: add config options for stake-weighted qos (backport of #197) (#340) rpc-sts: add config options for stake-weighted qos (#197) * rpc-sts: plumb options for swqos config * rpc-sts: send to specific tpu peers when configured (cherry picked from commit f41fb84e1543d44610988bafd4c4a06afe515ca7) # Conflicts: # send-transaction-service/src/send_transaction_service.rs # validator/src/cli.rs # validator/src/main.rs Co-authored-by: Trent Nelson <490004+t-nelson@users.noreply.github.com> --- .../src/send_transaction_service.rs | 22 ++++++++++++--- validator/src/cli.rs | 16 +++++++++++ validator/src/main.rs | 28 +++++++++++++++---- 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/send-transaction-service/src/send_transaction_service.rs b/send-transaction-service/src/send_transaction_service.rs index 27aa1bea400ac4..3aec459a73ce0e 100644 --- a/send-transaction-service/src/send_transaction_service.rs +++ b/send-transaction-service/src/send_transaction_service.rs @@ -114,6 +114,7 @@ pub struct Config { pub batch_size: usize, /// How frequently batches are sent pub batch_send_rate_ms: u64, + pub tpu_peers: Option>, } impl Default for Config { @@ -125,6 +126,7 @@ impl Default for Config { service_max_retries: DEFAULT_SERVICE_MAX_RETRIES, batch_size: DEFAULT_TRANSACTION_BATCH_SIZE, batch_send_rate_ms: DEFAULT_BATCH_SEND_RATE_MS, + tpu_peers: None, } } } @@ -565,12 +567,18 @@ impl SendTransactionService { stats: &SendTransactionServiceStats, ) { // Processing the transactions in batch - let addresses = Self::get_tpu_addresses_with_slots( + let mut addresses = config + .tpu_peers + .as_ref() + .map(|addrs| addrs.iter().map(|a| (a, 0)).collect::>()) + .unwrap_or_default(); + let leader_addresses = Self::get_tpu_addresses_with_slots( tpu_address, leader_info, config, connection_cache.protocol(), ); + addresses.extend(leader_addresses); let wire_transactions = transactions .iter() @@ -583,8 +591,8 @@ impl SendTransactionService { }) .collect::>(); - for address in &addresses { - Self::send_transactions(address.0, &wire_transactions, connection_cache, stats); + for (address, _) in &addresses { + Self::send_transactions(address, &wire_transactions, connection_cache, stats); } } @@ -701,14 +709,20 @@ impl SendTransactionService { let iter = wire_transactions.chunks(config.batch_size); for chunk in iter { + let mut addresses = config + .tpu_peers + .as_ref() + .map(|addrs| addrs.iter().collect::>()) + .unwrap_or_default(); let mut leader_info_provider = leader_info_provider.lock().unwrap(); let leader_info = leader_info_provider.get_leader_info(); - let addresses = Self::get_tpu_addresses( + let leader_addresses = Self::get_tpu_addresses( tpu_address, leader_info, config, connection_cache.protocol(), ); + addresses.extend(leader_addresses); for address in &addresses { Self::send_transactions(address, chunk, connection_cache, stats); diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 2e40751840edf8..5a79463bd81e48 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -1045,6 +1045,22 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .default_value(&default_args.rpc_send_transaction_batch_size) .help("The size of transactions to be sent in batch."), ) + .arg( + Arg::with_name("rpc_send_transaction_tpu_peer") + .long("rpc-send-transaction-tpu-peer") + .takes_value(true) + .number_of_values(1) + .multiple(true) + .value_name("HOST:PORT") + .validator(solana_net_utils::is_host_port) + .help("Peer(s) to broadcast transactions to instead of the current leader") + ) + .arg( + Arg::with_name("rpc_send_transaction_also_leader") + .long("rpc-send-transaction-also-leader") + .requires("rpc_send_transaction_tpu_peer") + .help("With `--rpc-send-transaction-tpu-peer HOST:PORT`, also send to the current leader") + ) .arg( Arg::with_name("rpc_scan_and_fix_roots") .long("rpc-scan-and-fix-roots") diff --git a/validator/src/main.rs b/validator/src/main.rs index 680397a9d3c73c..f101f103bbc958 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -1266,6 +1266,27 @@ pub fn main() { ); exit(1); } + let rpc_send_transaction_tpu_peers = matches + .values_of("rpc_send_transaction_tpu_peer") + .map(|values| { + values + .map(solana_net_utils::parse_host_port) + .collect::, String>>() + }) + .transpose() + .unwrap_or_else(|e| { + eprintln!("failed to parse rpc send-transaction-service tpu peer address: {e}"); + exit(1); + }); + let rpc_send_transaction_also_leader = matches.is_present("rpc_send_transaction_also_leader"); + let leader_forward_count = + if rpc_send_transaction_tpu_peers.is_some() && !rpc_send_transaction_also_leader { + // rpc-sts is configured to send only to specific tpu peers. disable leader forwards + 0 + } else { + value_t_or_exit!(matches, "rpc_send_transaction_leader_forward_count", u64) + }; + let full_api = matches.is_present("full_rpc_api"); let mut validator_config = ValidatorConfig { @@ -1359,11 +1380,7 @@ pub fn main() { contact_debug_interval, send_transaction_service_config: send_transaction_service::Config { retry_rate_ms: rpc_send_retry_rate_ms, - leader_forward_count: value_t_or_exit!( - matches, - "rpc_send_transaction_leader_forward_count", - u64 - ), + leader_forward_count, default_max_retries: value_t!( matches, "rpc_send_transaction_default_max_retries", @@ -1377,6 +1394,7 @@ pub fn main() { ), batch_send_rate_ms: rpc_send_batch_send_rate_ms, batch_size: rpc_send_batch_size, + tpu_peers: rpc_send_transaction_tpu_peers, }, no_poh_speed_test: matches.is_present("no_poh_speed_test"), no_os_memory_stats_reporting: matches.is_present("no_os_memory_stats_reporting"), From 749c529d9ea9d9d96c834d22594e4bc80549cfca Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:37:15 -0700 Subject: [PATCH 201/213] v1.17: Discard packets statically known to fail (backport of #370) (#374) * Discard packets statically known to fail (#370) * Discard packets statically known to fail * add test (cherry picked from commit 5f1693224ebd48c5c4b40b78486650f50e2cd4a1) # Conflicts: # core/src/banking_stage/transaction_scheduler/scheduler_controller.rs * resolve conflict --------- Co-authored-by: Andrew Fitzgerald --- .../immutable_deserialized_packet.rs | 52 ++++++++++++++++++- core/src/banking_stage/packet_deserializer.rs | 13 ++++- core/src/banking_stage/packet_receiver.rs | 1 + 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/core/src/banking_stage/immutable_deserialized_packet.rs b/core/src/banking_stage/immutable_deserialized_packet.rs index 4617702059b202..0fd6a3f16e16a3 100644 --- a/core/src/banking_stage/immutable_deserialized_packet.rs +++ b/core/src/banking_stage/immutable_deserialized_packet.rs @@ -1,4 +1,5 @@ use { + solana_cost_model::block_cost_limits::BUILT_IN_INSTRUCTION_COSTS, solana_perf::packet::Packet, solana_runtime::transaction_priority_details::{ GetTransactionPriorityDetails, TransactionPriorityDetails, @@ -8,6 +9,7 @@ use { hash::Hash, message::Message, sanitize::SanitizeError, + saturating_add_assign, short_vec::decode_shortu16_len, signature::Signature, transaction::{ @@ -96,6 +98,22 @@ impl ImmutableDeserializedPacket { self.priority_details.compute_unit_limit } + /// Returns true if the transaction's compute unit limit is at least as + /// large as the sum of the static builtins' costs. + /// This is a simple sanity check so the leader can discard transactions + /// which are statically known to exceed the compute budget, and will + /// result in no useful state-change. + pub fn compute_unit_limit_above_static_builtins(&self) -> bool { + let mut static_builtin_cost_sum: u64 = 0; + for (program_id, _) in self.transaction.get_message().program_instructions_iter() { + if let Some(ix_cost) = BUILT_IN_INSTRUCTION_COSTS.get(program_id) { + saturating_add_assign!(static_builtin_cost_sum, *ix_cost); + } + } + + self.compute_unit_limit() >= static_builtin_cost_sum + } + // This function deserializes packets into transactions, computes the blake3 hash of transaction // messages, and verifies secp256k1 instructions. pub fn build_sanitized_transaction( @@ -148,7 +166,10 @@ fn packet_message(packet: &Packet) -> Result<&[u8], DeserializedPacketError> { mod tests { use { super::*, - solana_sdk::{signature::Keypair, system_transaction}, + solana_sdk::{ + compute_budget, instruction::Instruction, pubkey::Pubkey, signature::Keypair, + signer::Signer, system_instruction, system_transaction, transaction::Transaction, + }, }; #[test] @@ -164,4 +185,33 @@ mod tests { assert!(deserialized_packet.is_ok()); } + + #[test] + fn compute_unit_limit_above_static_builtins() { + // Cases: + // 1. compute_unit_limit under static builtins + // 2. compute_unit_limit equal to static builtins + // 3. compute_unit_limit above static builtins + for (cu_limit, expectation) in [(250, false), (300, true), (350, true)] { + let keypair = Keypair::new(); + let bpf_program_id = Pubkey::new_unique(); + let ixs = vec![ + system_instruction::transfer(&keypair.pubkey(), &Pubkey::new_unique(), 1), + compute_budget::ComputeBudgetInstruction::set_compute_unit_limit(cu_limit), + Instruction::new_with_bytes(bpf_program_id, &[], vec![]), // non-builtin - not counted in filter + ]; + let tx = Transaction::new_signed_with_payer( + &ixs, + Some(&keypair.pubkey()), + &[&keypair], + Hash::new_unique(), + ); + let packet = Packet::from_data(None, tx).unwrap(); + let deserialized_packet = ImmutableDeserializedPacket::new(packet).unwrap(); + assert_eq!( + deserialized_packet.compute_unit_limit_above_static_builtins(), + expectation + ); + } + } } diff --git a/core/src/banking_stage/packet_deserializer.rs b/core/src/banking_stage/packet_deserializer.rs index a405b626568482..1d1079eaf97fcd 100644 --- a/core/src/banking_stage/packet_deserializer.rs +++ b/core/src/banking_stage/packet_deserializer.rs @@ -50,6 +50,7 @@ impl PacketDeserializer { &self, recv_timeout: Duration, capacity: usize, + packet_filter: impl Fn(&ImmutableDeserializedPacket) -> bool, ) -> Result { let (packet_count, packet_batches) = self.receive_until(recv_timeout, capacity)?; @@ -62,6 +63,7 @@ impl PacketDeserializer { packet_count, &packet_batches, round_compute_unit_price_enabled, + &packet_filter, )) } @@ -71,6 +73,7 @@ impl PacketDeserializer { packet_count: usize, banking_batches: &[BankingPacketBatch], round_compute_unit_price_enabled: bool, + packet_filter: &impl Fn(&ImmutableDeserializedPacket) -> bool, ) -> ReceivePacketResults { let mut passed_sigverify_count: usize = 0; let mut failed_sigverify_count: usize = 0; @@ -88,6 +91,7 @@ impl PacketDeserializer { packet_batch, &packet_indexes, round_compute_unit_price_enabled, + packet_filter, )); } @@ -158,13 +162,16 @@ impl PacketDeserializer { packet_batch: &'a PacketBatch, packet_indexes: &'a [usize], round_compute_unit_price_enabled: bool, + packet_filter: &'a (impl Fn(&ImmutableDeserializedPacket) -> bool + 'a), ) -> impl Iterator + 'a { packet_indexes.iter().filter_map(move |packet_index| { let mut packet_clone = packet_batch[*packet_index].clone(); packet_clone .meta_mut() .set_round_compute_unit_price(round_compute_unit_price_enabled); - ImmutableDeserializedPacket::new(packet_clone).ok() + ImmutableDeserializedPacket::new(packet_clone) + .ok() + .filter(packet_filter) }) } } @@ -186,7 +193,7 @@ mod tests { #[test] fn test_deserialize_and_collect_packets_empty() { - let results = PacketDeserializer::deserialize_and_collect_packets(0, &[], false); + let results = PacketDeserializer::deserialize_and_collect_packets(0, &[], false, &|_| true); assert_eq!(results.deserialized_packets.len(), 0); assert!(results.new_tracer_stats_option.is_none()); assert_eq!(results.passed_sigverify_count, 0); @@ -204,6 +211,7 @@ mod tests { packet_count, &[BankingPacketBatch::new((packet_batches, None))], false, + &|_| true, ); assert_eq!(results.deserialized_packets.len(), 2); assert!(results.new_tracer_stats_option.is_none()); @@ -223,6 +231,7 @@ mod tests { packet_count, &[BankingPacketBatch::new((packet_batches, None))], false, + &|_| true, ); assert_eq!(results.deserialized_packets.len(), 1); assert!(results.new_tracer_stats_option.is_none()); diff --git a/core/src/banking_stage/packet_receiver.rs b/core/src/banking_stage/packet_receiver.rs index a566ef7cf3e4c1..bbb753967f20ce 100644 --- a/core/src/banking_stage/packet_receiver.rs +++ b/core/src/banking_stage/packet_receiver.rs @@ -49,6 +49,7 @@ impl PacketReceiver { .receive_packets( recv_timeout, unprocessed_transaction_storage.max_receive_size(), + |packet| packet.compute_unit_limit_above_static_builtins(), ) // Consumes results if Ok, otherwise we keep the Err .map(|receive_packet_results| { From 3abd2333aef99aee78d71f86bab6895e93cce04e Mon Sep 17 00:00:00 2001 From: Will Hickey Date: Sat, 23 Mar 2024 13:09:29 -0500 Subject: [PATCH 202/213] Update version to v1.17.29 (#407) --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6962d58b802fa7..ad212a2bd53c97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-install" -version = "1.17.28" +version = "1.17.29" dependencies = [ "atty", "bincode", @@ -110,7 +110,7 @@ dependencies = [ [[package]] name = "agave-ledger-tool" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_cmd", "bs58", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.28" +version = "1.17.29" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "agave-watchtower" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 2.33.3", "humantime", @@ -2314,7 +2314,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "regex", @@ -2322,7 +2322,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.28" +version = "1.17.29" dependencies = [ "regex", ] @@ -4243,7 +4243,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.28" +version = "1.17.29" dependencies = [ "protobuf-src", "tonic-build", @@ -4486,7 +4486,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.28" +version = "1.17.29" [[package]] name = "rcgen" @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.28" +version = "1.17.29" dependencies = [ "Inflector", "assert_matches", @@ -5301,7 +5301,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 2.33.3", "log", @@ -5315,7 +5315,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 2.33.3", "log", @@ -5345,7 +5345,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.28" +version = "1.17.29" dependencies = [ "arrayref", "assert_matches", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "bytemuck", @@ -5428,7 +5428,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -5439,7 +5439,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5463,7 +5463,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5480,7 +5480,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.28" +version = "1.17.29" dependencies = [ "serde", "solana-sdk", @@ -5489,7 +5489,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "crossbeam-channel", @@ -5507,7 +5507,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5518,7 +5518,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5559,7 +5559,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bv", "fnv", @@ -5576,7 +5576,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -5608,7 +5608,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bv", "bytemuck", @@ -5627,7 +5627,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "solana-logger", @@ -5635,7 +5635,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_cmd", "bzip2", @@ -5656,11 +5656,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.28" +version = "1.17.29" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.28" +version = "1.17.29" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5671,7 +5671,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "chrono", @@ -5688,7 +5688,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -5759,7 +5759,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.28" +version = "1.17.29" dependencies = [ "anyhow", "dirs-next", @@ -5774,7 +5774,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.28" +version = "1.17.29" dependencies = [ "Inflector", "base64 0.21.4", @@ -5800,7 +5800,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-trait", "bincode", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.28" +version = "1.17.29" dependencies = [ "futures-util", "rand 0.8.5", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5870,7 +5870,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "chrono", @@ -5883,7 +5883,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-trait", "bincode", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5990,7 +5990,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.28" +version = "1.17.29" dependencies = [ "lazy_static", "log", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "clap 3.2.23", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "console", "indicatif", @@ -6057,7 +6057,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "ed25519-dalek", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "byteorder", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.28" +version = "1.17.29" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.28" +version = "1.17.29" dependencies = [ "proc-macro2", "quote", @@ -6152,7 +6152,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.28" +version = "1.17.29" dependencies = [ "base64 0.21.4", "bincode", @@ -6177,7 +6177,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "solana-accounts-db", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.28" +version = "1.17.29" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -6213,7 +6213,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -6264,7 +6264,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bs58", "clap 3.2.23", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "log", @@ -6361,7 +6361,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6400,7 +6400,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.28" +version = "1.17.29" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.28" +version = "1.17.29" dependencies = [ "env_logger", "lazy_static", @@ -6421,7 +6421,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "solana-sdk", @@ -6429,11 +6429,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.28" +version = "1.17.29" [[package]] name = "solana-merkle-root-bench" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 2.33.3", "log", @@ -6446,7 +6446,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.28" +version = "1.17.29" dependencies = [ "fast-math", "hex", @@ -6455,7 +6455,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.28" +version = "1.17.29" dependencies = [ "crossbeam-channel", "env_logger", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6482,7 +6482,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "clap 3.2.23", @@ -6502,7 +6502,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "reqwest", @@ -6512,7 +6512,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.28" +version = "1.17.29" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6543,7 +6543,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -6564,7 +6564,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 3.2.23", "log", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "anyhow", "ark-bn254", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6665,7 +6665,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "async-trait", @@ -6694,7 +6694,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "anyhow", "crossbeam-channel", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-mutex", "async-trait", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.28" +version = "1.17.29" dependencies = [ "lazy_static", "num_cpus", @@ -6754,7 +6754,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "console", @@ -6773,7 +6773,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.28" +version = "1.17.29" dependencies = [ "base64 0.21.4", "bincode", @@ -6832,7 +6832,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "async-trait", @@ -6861,7 +6861,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.28" +version = "1.17.29" dependencies = [ "base64 0.21.4", "bs58", @@ -6881,7 +6881,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "anyhow", "clap 2.33.3", @@ -6898,7 +6898,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "bs58", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.28" +version = "1.17.29" dependencies = [ "arrayref", "assert_matches", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.28" +version = "1.17.29" dependencies = [ "anyhow", "assert_matches", @@ -7066,7 +7066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bs58", "proc-macro2", @@ -7083,7 +7083,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.28" +version = "1.17.29" dependencies = [ "crossbeam-channel", "log", @@ -7098,7 +7098,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7114,7 +7114,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -7131,7 +7131,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.28" +version = "1.17.29" dependencies = [ "backoff", "bincode", @@ -7163,7 +7163,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "bs58", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 2.33.3", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "async-channel", @@ -7223,7 +7223,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.28" +version = "1.17.29" dependencies = [ "base64 0.21.4", "bincode", @@ -7267,7 +7267,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "log", @@ -7281,7 +7281,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -7314,7 +7314,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-trait", "bincode", @@ -7336,7 +7336,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "clap 2.33.3", @@ -7363,7 +7363,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.28" +version = "1.17.29" dependencies = [ "Inflector", "base64 0.21.4", @@ -7386,7 +7386,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -7423,7 +7423,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-trait", "solana-connection-cache", @@ -7436,7 +7436,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.28" +version = "1.17.29" dependencies = [ "serde_json", "solana-metrics", @@ -7444,7 +7444,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "rustc_version 0.4.0", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "crossbeam-channel", @@ -7477,7 +7477,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.28" +version = "1.17.29" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 8aaa1056627bba..9db56e07b21ed4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.28" +version = "1.17.29" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.28" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.28" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.28" } -solana-banks-client = { path = "banks-client", version = "=1.17.28" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.28" } -solana-banks-server = { path = "banks-server", version = "=1.17.28" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.28" } -solana-bloom = { path = "bloom", version = "=1.17.28" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.28" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.28" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.28", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.28" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.28" } -solana-cli = { path = "cli", version = "=1.17.28" } -solana-cli-config = { path = "cli-config", version = "=1.17.28" } -solana-cli-output = { path = "cli-output", version = "=1.17.28" } -solana-client = { path = "client", version = "=1.17.28" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.28" } -solana-config-program = { path = "programs/config", version = "=1.17.28" } -solana-core = { path = "core", version = "=1.17.28" } -solana-cost-model = { path = "cost-model", version = "=1.17.28" } -solana-download-utils = { path = "download-utils", version = "=1.17.28" } -solana-entry = { path = "entry", version = "=1.17.28" } -solana-faucet = { path = "faucet", version = "=1.17.28" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.28" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.28" } -solana-genesis = { path = "genesis", version = "=1.17.28" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.28" } -agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.28" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.28" } -solana-gossip = { path = "gossip", version = "=1.17.28" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.28" } -solana-ledger = { path = "ledger", version = "=1.17.28" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.28" } -solana-logger = { path = "logger", version = "=1.17.28" } -solana-measure = { path = "measure", version = "=1.17.28" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.28" } -solana-metrics = { path = "metrics", version = "=1.17.28" } -solana-net-utils = { path = "net-utils", version = "=1.17.28" } -solana-notifier = { path = "notifier", version = "=1.17.28" } -solana-perf = { path = "perf", version = "=1.17.28" } -solana-poh = { path = "poh", version = "=1.17.28" } -solana-program = { path = "sdk/program", version = "=1.17.28" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.28" } -solana-program-test = { path = "program-test", version = "=1.17.28" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.28" } -solana-quic-client = { path = "quic-client", version = "=1.17.28" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.28" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.28", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.28" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.28", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.28" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.28" } -solana-runtime = { path = "runtime", version = "=1.17.28" } -solana-sdk = { path = "sdk", version = "=1.17.28" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.28" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.28" } -solana-stake-program = { path = "programs/stake", version = "=1.17.28" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.28" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.28" } -solana-streamer = { path = "streamer", version = "=1.17.28" } -solana-system-program = { path = "programs/system", version = "=1.17.28" } -solana-test-validator = { path = "test-validator", version = "=1.17.28" } -solana-thin-client = { path = "thin-client", version = "=1.17.28" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.28", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.28" } -solana-turbine = { path = "turbine", version = "=1.17.28" } -solana-udp-client = { path = "udp-client", version = "=1.17.28" } -solana-version = { path = "version", version = "=1.17.28" } -solana-vote = { path = "vote", version = "=1.17.28" } -solana-vote-program = { path = "programs/vote", version = "=1.17.28" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.28" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.28" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.28" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.29" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.29" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.29" } +solana-banks-client = { path = "banks-client", version = "=1.17.29" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.29" } +solana-banks-server = { path = "banks-server", version = "=1.17.29" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.29" } +solana-bloom = { path = "bloom", version = "=1.17.29" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.29" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.29" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.29", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.29" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.29" } +solana-cli = { path = "cli", version = "=1.17.29" } +solana-cli-config = { path = "cli-config", version = "=1.17.29" } +solana-cli-output = { path = "cli-output", version = "=1.17.29" } +solana-client = { path = "client", version = "=1.17.29" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.29" } +solana-config-program = { path = "programs/config", version = "=1.17.29" } +solana-core = { path = "core", version = "=1.17.29" } +solana-cost-model = { path = "cost-model", version = "=1.17.29" } +solana-download-utils = { path = "download-utils", version = "=1.17.29" } +solana-entry = { path = "entry", version = "=1.17.29" } +solana-faucet = { path = "faucet", version = "=1.17.29" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.29" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.29" } +solana-genesis = { path = "genesis", version = "=1.17.29" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.29" } +agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.29" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.29" } +solana-gossip = { path = "gossip", version = "=1.17.29" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.29" } +solana-ledger = { path = "ledger", version = "=1.17.29" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.29" } +solana-logger = { path = "logger", version = "=1.17.29" } +solana-measure = { path = "measure", version = "=1.17.29" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.29" } +solana-metrics = { path = "metrics", version = "=1.17.29" } +solana-net-utils = { path = "net-utils", version = "=1.17.29" } +solana-notifier = { path = "notifier", version = "=1.17.29" } +solana-perf = { path = "perf", version = "=1.17.29" } +solana-poh = { path = "poh", version = "=1.17.29" } +solana-program = { path = "sdk/program", version = "=1.17.29" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.29" } +solana-program-test = { path = "program-test", version = "=1.17.29" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.29" } +solana-quic-client = { path = "quic-client", version = "=1.17.29" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.29" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.29", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.29" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.29", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.29" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.29" } +solana-runtime = { path = "runtime", version = "=1.17.29" } +solana-sdk = { path = "sdk", version = "=1.17.29" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.29" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.29" } +solana-stake-program = { path = "programs/stake", version = "=1.17.29" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.29" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.29" } +solana-streamer = { path = "streamer", version = "=1.17.29" } +solana-system-program = { path = "programs/system", version = "=1.17.29" } +solana-test-validator = { path = "test-validator", version = "=1.17.29" } +solana-thin-client = { path = "thin-client", version = "=1.17.29" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.29", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.29" } +solana-turbine = { path = "turbine", version = "=1.17.29" } +solana-udp-client = { path = "udp-client", version = "=1.17.29" } +solana-version = { path = "version", version = "=1.17.29" } +solana-vote = { path = "vote", version = "=1.17.29" } +solana-vote-program = { path = "programs/vote", version = "=1.17.29" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.29" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.29" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.29" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index a6aacb65ab6354..5ac85c4f2847e8 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.28" +version = "1.17.29" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -4520,7 +4520,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.28" +version = "1.17.29" dependencies = [ "Inflector", "base64 0.21.4", @@ -4543,7 +4543,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.28" +version = "1.17.29" dependencies = [ "arrayref", "bincode", @@ -4600,7 +4600,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "bytemuck", @@ -4619,7 +4619,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4634,7 +4634,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.28" +version = "1.17.29" dependencies = [ "serde", "solana-sdk", @@ -4643,7 +4643,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "crossbeam-channel", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bv", "fnv", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4695,7 +4695,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.28" +version = "1.17.29" dependencies = [ "array-bytes", "serde", @@ -4705,7 +4705,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bv", "bytemuck", @@ -4721,7 +4721,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "chrono", "clap 2.33.3", @@ -4736,7 +4736,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.28" +version = "1.17.29" dependencies = [ "dirs-next", "lazy_static", @@ -4750,7 +4750,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.28" +version = "1.17.29" dependencies = [ "Inflector", "base64 0.21.4", @@ -4775,7 +4775,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-trait", "bincode", @@ -4806,7 +4806,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4814,7 +4814,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "chrono", @@ -4826,7 +4826,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-trait", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.28" +version = "1.17.29" dependencies = [ "base64 0.21.4", "bincode", @@ -4918,7 +4918,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.28" +version = "1.17.29" dependencies = [ "lazy_static", "log", @@ -4940,7 +4940,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "console", "indicatif", @@ -4952,7 +4952,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "crossbeam-channel", @@ -4972,7 +4972,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4994,7 +4994,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.28" +version = "1.17.29" dependencies = [ "ahash 0.8.5", "blake3", @@ -5022,7 +5022,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.28" +version = "1.17.29" dependencies = [ "proc-macro2", "quote", @@ -5032,7 +5032,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "solana-accounts-db", @@ -5043,7 +5043,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.28" +version = "1.17.29" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -5068,7 +5068,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "bincode", @@ -5180,7 +5180,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "solana-measure", @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.28" +version = "1.17.29" dependencies = [ "env_logger", "lazy_static", @@ -5200,7 +5200,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "solana-sdk", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.28" +version = "1.17.29" dependencies = [ "fast-math", "solana-program", @@ -5216,7 +5216,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.28" +version = "1.17.29" dependencies = [ "crossbeam-channel", "gethostname", @@ -5229,7 +5229,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "clap 3.1.6", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.28" +version = "1.17.29" dependencies = [ "ahash 0.8.5", "bincode", @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.28" +version = "1.17.29" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5292,7 +5292,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "ark-bn254", "ark-ec", @@ -5344,7 +5344,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.28" +version = "1.17.29" dependencies = [ "base64 0.21.4", "bincode", @@ -5370,7 +5370,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "async-trait", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "crossbeam-channel", "futures-util", @@ -5421,7 +5421,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-mutex", "async-trait", @@ -5446,7 +5446,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.28" +version = "1.17.29" dependencies = [ "lazy_static", "num_cpus", @@ -5454,7 +5454,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.28" +version = "1.17.29" dependencies = [ "console", "dialoguer", @@ -5471,7 +5471,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.28" +version = "1.17.29" dependencies = [ "base64 0.21.4", "bincode", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-trait", "base64 0.21.4", @@ -5550,7 +5550,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.28" +version = "1.17.29" dependencies = [ "base64 0.21.4", "bs58", @@ -5570,7 +5570,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.28" +version = "1.17.29" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.28" +version = "1.17.29" dependencies = [ "arrayref", "base64 0.21.4", @@ -5656,7 +5656,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5693,21 +5693,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.28" +version = "1.17.29" dependencies = [ "array-bytes", "solana-program", @@ -5715,7 +5715,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.28" +version = "1.17.29" dependencies = [ "array-bytes", "solana-program", @@ -5723,21 +5723,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5745,14 +5745,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.28" +version = "1.17.29" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5760,21 +5760,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.28" +version = "1.17.29" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5784,42 +5784,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.28" +version = "1.17.29" dependencies = [ "rustversion", "solana-program", @@ -5829,49 +5829,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5879,14 +5879,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-program-runtime", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5904,21 +5904,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5926,14 +5926,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.28" +version = "1.17.29" dependencies = [ "array-bytes", "solana-program", @@ -5941,7 +5941,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.28" +version = "1.17.29" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5950,14 +5950,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-program-runtime", @@ -5975,21 +5975,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-program-runtime", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.28" +version = "1.17.29" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -6007,7 +6007,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.28" +version = "1.17.29" dependencies = [ "blake3", "solana-program", @@ -6015,21 +6015,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.28" +version = "1.17.29" dependencies = [ "agave-validator", "solana-logger", @@ -6040,21 +6040,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", "solana-program-runtime", @@ -6064,21 +6064,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.28" +version = "1.17.29" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.28" +version = "1.17.29" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6130,7 +6130,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bs58", "proc-macro2", @@ -6147,7 +6147,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.28" +version = "1.17.29" dependencies = [ "crossbeam-channel", "log", @@ -6161,7 +6161,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "log", @@ -6174,7 +6174,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.28" +version = "1.17.29" dependencies = [ "backoff", "bincode", @@ -6206,7 +6206,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "bs58", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-channel", "bytes", @@ -6251,7 +6251,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "log", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.28" +version = "1.17.29" dependencies = [ "base64 0.21.4", "bincode", @@ -6293,7 +6293,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "log", @@ -6306,7 +6306,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-trait", "bincode", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.28" +version = "1.17.29" dependencies = [ "Inflector", "base64 0.21.4", @@ -6351,7 +6351,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "bytes", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.28" +version = "1.17.29" dependencies = [ "async-trait", "solana-connection-cache", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.28" +version = "1.17.29" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.28" +version = "1.17.29" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.28" +version = "1.17.29" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.28" +version = "1.17.29" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 43b9957bcdfb51..9b89a8ae81883c 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.28" +version = "1.17.29" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.28" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.28" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.28" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.28" } -solana-ledger = { path = "../../ledger", version = "=1.17.28" } -solana-logger = { path = "../../logger", version = "=1.17.28" } -solana-measure = { path = "../../measure", version = "=1.17.28" } -solana-program = { path = "../../sdk/program", version = "=1.17.28" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.28" } -solana-program-test = { path = "../../program-test", version = "=1.17.28" } -solana-runtime = { path = "../../runtime", version = "=1.17.28" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.28" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.28" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.28", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.28" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.28" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.28" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.28", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.28" } -solana-sdk = { path = "../../sdk", version = "=1.17.28" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.28" } -agave-validator = { path = "../../validator", version = "=1.17.28" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.28" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.29" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.29" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.29" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.29" } +solana-ledger = { path = "../../ledger", version = "=1.17.29" } +solana-logger = { path = "../../logger", version = "=1.17.29" } +solana-measure = { path = "../../measure", version = "=1.17.29" } +solana-program = { path = "../../sdk/program", version = "=1.17.29" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.29" } +solana-program-test = { path = "../../program-test", version = "=1.17.29" } +solana-runtime = { path = "../../runtime", version = "=1.17.29" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.29" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.29" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.29", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.29" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.29" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.29" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.29", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.29" } +solana-sdk = { path = "../../sdk", version = "=1.17.29" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.29" } +agave-validator = { path = "../../validator", version = "=1.17.29" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.29" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index d03e164772e99b..678bf2677ad2b9 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.28" +version = "1.17.29" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.28" } +solana-program = { path = "../../../../program", version = "=1.17.29" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 998109038dd3b6..904457e82f81eb 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.28" +version = "1.17.29" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.28" } +solana-program = { path = "../../../../program", version = "=1.17.29" } [lib] crate-type = ["cdylib"] From f94b53c038911e08d2ab700b1f5af29d57b7ca5a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:20:54 +0800 Subject: [PATCH 203/213] v1.17: ci: add release pipeline (backport of #466) (#486) ci: add release pipeline (#466) (cherry picked from commit 212cbdbc4e276c5136ae5cd51507f86a50283e44) Co-authored-by: Yihau Chen --- .github/workflows/release.yml | 88 +++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000000000..11ac0daca37078 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,88 @@ +name: Release + +on: + push: + tags: + - "*" + +jobs: + trigger-buildkite-pipeline: + runs-on: ubuntu-latest + steps: + - name: Trigger a Buildkite Build + uses: "buildkite/trigger-pipeline-action@v2.0.0" + with: + buildkite_api_access_token: ${{ secrets.TRIGGER_BK_BUILD_TOKEN }} + pipeline: "anza/agave-secondary" + branch: "${{ github.ref_name }}" + commit: "HEAD" + message: ":github: Triggered from a GitHub Action" + + draft-release: + runs-on: ubuntu-latest + steps: + - name: Create Release + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.repos.createRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + tag_name: '${{ github.ref_name }}', + name: 'Release ${{ github.ref_name }}', + body: '🚧', + draft: true, + prerelease: false + }) + + version-bump: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Parse Info + id: parse_info + run: | + # get the next version + version=${{ github.ref_name }} + major=$(echo $version | cut -d'.' -f1) + minor=$(echo $version | cut -d'.' -f2) + patch=$(echo $version | cut -d'.' -f3) + next_version=$major.$minor.$((patch+1)) + : "${next_version:?}" + + # get the traget branch + target_branch=$major.$minor + : "${target_branch:?}" + + echo "next_version=$next_version" | tee -a $GITHUB_OUTPUT + echo "target_branch=$target_branch" | tee -a $GITHUB_OUTPUT + + - name: Create branch and make changes + run: | + next_version=${{ steps.parse_info.outputs.next_version }} + + git checkout -b version-bump-$next_version + ./scripts/increment-cargo-version.sh patch + + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config user.name "github-actions[bot]" + git commit -am "Bump version to $next_version" + git push origin version-bump-$next_version + + - name: Create PR + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: 'Bump version to ${{ steps.parse_info.outputs.next_version }}', + head: 'version-bump-${{ steps.parse_info.outputs.next_version }}', + base: '${{ steps.parse_info.outputs.target_branch }}' + }) From b2ad8fb73d45d37162992526718101c13ec4d8f4 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 21:04:21 +0800 Subject: [PATCH 204/213] v1.17: ci: fix some issues for the release pipeline (backport of #493) (#498) ci: fix some issues for the release pipeline (#493) * add TRIGGERED_BUILDKITE_TAG to the pipeline * publish a pre-release for the release id (cherry picked from commit b1e17998b64203fe62f52efe3fe5ba87706ed446) Co-authored-by: Yihau Chen --- .github/workflows/release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 11ac0daca37078..78a6d029d4c063 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,6 +15,7 @@ jobs: buildkite_api_access_token: ${{ secrets.TRIGGER_BK_BUILD_TOKEN }} pipeline: "anza/agave-secondary" branch: "${{ github.ref_name }}" + build_env_vars: '{"TRIGGERED_BUILDKITE_TAG": "${{ github.ref_name }}"}' commit: "HEAD" message: ":github: Triggered from a GitHub Action" @@ -32,8 +33,8 @@ jobs: tag_name: '${{ github.ref_name }}', name: 'Release ${{ github.ref_name }}', body: '🚧', - draft: true, - prerelease: false + draft: false, + prerelease: true }) version-bump: From 5670a2081b9c50fa5d9d466b915cf2b4f2df5a9e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:51:29 +0000 Subject: [PATCH 205/213] Bump version to v1.17.30 (#500) * Bump version to v1.17.30 * revert unexpected changes --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: yihau --- Cargo.lock | 216 ++++++++-------- Cargo.toml | 150 +++++------ programs/sbf/Cargo.lock | 242 +++++++++--------- programs/sbf/Cargo.toml | 48 ++-- .../tests/crates/fail/Cargo.toml | 4 +- .../tests/crates/noop/Cargo.toml | 4 +- 6 files changed, 332 insertions(+), 332 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad212a2bd53c97..4e788a36ec38c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-install" -version = "1.17.29" +version = "1.17.30" dependencies = [ "atty", "bincode", @@ -110,7 +110,7 @@ dependencies = [ [[package]] name = "agave-ledger-tool" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_cmd", "bs58", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.29" +version = "1.17.30" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "agave-watchtower" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 2.33.3", "humantime", @@ -2314,7 +2314,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "regex", @@ -2322,7 +2322,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.17.29" +version = "1.17.30" dependencies = [ "regex", ] @@ -4243,7 +4243,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.17.29" +version = "1.17.30" dependencies = [ "protobuf-src", "tonic-build", @@ -4486,7 +4486,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.17.29" +version = "1.17.30" [[package]] name = "rcgen" @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.29" +version = "1.17.30" dependencies = [ "Inflector", "assert_matches", @@ -5301,7 +5301,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 2.33.3", "log", @@ -5315,7 +5315,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 2.33.3", "log", @@ -5345,7 +5345,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.29" +version = "1.17.30" dependencies = [ "arrayref", "assert_matches", @@ -5409,7 +5409,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "bytemuck", @@ -5428,7 +5428,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -5439,7 +5439,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5463,7 +5463,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -5480,7 +5480,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.29" +version = "1.17.30" dependencies = [ "serde", "solana-sdk", @@ -5489,7 +5489,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "crossbeam-channel", @@ -5507,7 +5507,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5518,7 +5518,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5559,7 +5559,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bv", "fnv", @@ -5576,7 +5576,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -5597,7 +5597,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -5608,7 +5608,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bv", "bytemuck", @@ -5627,7 +5627,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "solana-logger", @@ -5635,7 +5635,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_cmd", "bzip2", @@ -5656,11 +5656,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.17.29" +version = "1.17.30" [[package]] name = "solana-cargo-test-sbf" -version = "1.17.29" +version = "1.17.30" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5671,7 +5671,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "chrono", @@ -5688,7 +5688,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "chrono", @@ -5706,7 +5706,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -5759,7 +5759,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.29" +version = "1.17.30" dependencies = [ "anyhow", "dirs-next", @@ -5774,7 +5774,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.29" +version = "1.17.30" dependencies = [ "Inflector", "base64 0.21.4", @@ -5800,7 +5800,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-trait", "bincode", @@ -5832,7 +5832,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.17.29" +version = "1.17.30" dependencies = [ "futures-util", "rand 0.8.5", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5870,7 +5870,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "chrono", @@ -5883,7 +5883,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-trait", "bincode", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "base64 0.21.4", @@ -5990,7 +5990,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.29" +version = "1.17.30" dependencies = [ "lazy_static", "log", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "clap 3.2.23", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "console", "indicatif", @@ -6057,7 +6057,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "ed25519-dalek", @@ -6068,7 +6068,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -6090,7 +6090,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "byteorder", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.29" +version = "1.17.30" dependencies = [ "ahash 0.8.5", "bitflags 2.3.3", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.29" +version = "1.17.30" dependencies = [ "proc-macro2", "quote", @@ -6152,7 +6152,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.17.29" +version = "1.17.30" dependencies = [ "base64 0.21.4", "bincode", @@ -6177,7 +6177,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "solana-accounts-db", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.29" +version = "1.17.30" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -6213,7 +6213,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -6264,7 +6264,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bs58", "clap 3.2.23", @@ -6281,7 +6281,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "log", @@ -6361,7 +6361,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6400,7 +6400,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.17.29" +version = "1.17.30" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.29" +version = "1.17.30" dependencies = [ "env_logger", "lazy_static", @@ -6421,7 +6421,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "solana-sdk", @@ -6429,11 +6429,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.17.29" +version = "1.17.30" [[package]] name = "solana-merkle-root-bench" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 2.33.3", "log", @@ -6446,7 +6446,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.29" +version = "1.17.30" dependencies = [ "fast-math", "hex", @@ -6455,7 +6455,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.29" +version = "1.17.30" dependencies = [ "crossbeam-channel", "env_logger", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6482,7 +6482,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "clap 3.2.23", @@ -6502,7 +6502,7 @@ dependencies = [ [[package]] name = "solana-notifier" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "reqwest", @@ -6512,7 +6512,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.29" +version = "1.17.30" dependencies = [ "ahash 0.8.5", "assert_matches", @@ -6543,7 +6543,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -6564,7 +6564,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 3.2.23", "log", @@ -6579,7 +6579,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "anyhow", "ark-bn254", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6665,7 +6665,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "async-trait", @@ -6694,7 +6694,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "anyhow", "crossbeam-channel", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-mutex", "async-trait", @@ -6746,7 +6746,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.29" +version = "1.17.30" dependencies = [ "lazy_static", "num_cpus", @@ -6754,7 +6754,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "console", @@ -6773,7 +6773,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.29" +version = "1.17.30" dependencies = [ "base64 0.21.4", "bincode", @@ -6832,7 +6832,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "async-trait", @@ -6861,7 +6861,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.29" +version = "1.17.30" dependencies = [ "base64 0.21.4", "bs58", @@ -6881,7 +6881,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "anyhow", "clap 2.33.3", @@ -6898,7 +6898,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "bs58", @@ -6925,7 +6925,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.29" +version = "1.17.30" dependencies = [ "arrayref", "assert_matches", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.29" +version = "1.17.30" dependencies = [ "anyhow", "assert_matches", @@ -7066,7 +7066,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bs58", "proc-macro2", @@ -7083,7 +7083,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.29" +version = "1.17.30" dependencies = [ "crossbeam-channel", "log", @@ -7098,7 +7098,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7114,7 +7114,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -7131,7 +7131,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.29" +version = "1.17.30" dependencies = [ "backoff", "bincode", @@ -7163,7 +7163,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "bs58", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 2.33.3", "log", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "async-channel", @@ -7223,7 +7223,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.29" +version = "1.17.30" dependencies = [ "base64 0.21.4", "bincode", @@ -7267,7 +7267,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "log", @@ -7281,7 +7281,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -7314,7 +7314,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-trait", "bincode", @@ -7336,7 +7336,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "clap 2.33.3", @@ -7363,7 +7363,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.29" +version = "1.17.30" dependencies = [ "Inflector", "base64 0.21.4", @@ -7386,7 +7386,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -7423,7 +7423,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-trait", "solana-connection-cache", @@ -7436,7 +7436,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.17.29" +version = "1.17.30" dependencies = [ "serde_json", "solana-metrics", @@ -7444,7 +7444,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "rustc_version 0.4.0", @@ -7458,7 +7458,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "crossbeam-channel", @@ -7477,7 +7477,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bs58", "clap 3.2.23", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bytemuck", "criterion", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.29" +version = "1.17.30" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/Cargo.toml b/Cargo.toml index 9db56e07b21ed4..c13ee3763605d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,7 +123,7 @@ exclude = [ resolver = "2" [workspace.package] -version = "1.17.29" +version = "1.17.30" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -299,80 +299,80 @@ smpl_jwt = "0.7.1" socket2 = "0.5.4" soketto = "0.7" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "account-decoder", version = "=1.17.29" } -solana-accounts-db = { path = "accounts-db", version = "=1.17.29" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.29" } -solana-banks-client = { path = "banks-client", version = "=1.17.29" } -solana-banks-interface = { path = "banks-interface", version = "=1.17.29" } -solana-banks-server = { path = "banks-server", version = "=1.17.29" } -solana-bench-tps = { path = "bench-tps", version = "=1.17.29" } -solana-bloom = { path = "bloom", version = "=1.17.29" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.29" } -solana-bucket-map = { path = "bucket_map", version = "=1.17.29" } -solana-connection-cache = { path = "connection-cache", version = "=1.17.29", default-features = false } -solana-clap-utils = { path = "clap-utils", version = "=1.17.29" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.29" } -solana-cli = { path = "cli", version = "=1.17.29" } -solana-cli-config = { path = "cli-config", version = "=1.17.29" } -solana-cli-output = { path = "cli-output", version = "=1.17.29" } -solana-client = { path = "client", version = "=1.17.29" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.29" } -solana-config-program = { path = "programs/config", version = "=1.17.29" } -solana-core = { path = "core", version = "=1.17.29" } -solana-cost-model = { path = "cost-model", version = "=1.17.29" } -solana-download-utils = { path = "download-utils", version = "=1.17.29" } -solana-entry = { path = "entry", version = "=1.17.29" } -solana-faucet = { path = "faucet", version = "=1.17.29" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.17.29" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.29" } -solana-genesis = { path = "genesis", version = "=1.17.29" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.17.29" } -agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.29" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.29" } -solana-gossip = { path = "gossip", version = "=1.17.29" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.29" } -solana-ledger = { path = "ledger", version = "=1.17.29" } -solana-local-cluster = { path = "local-cluster", version = "=1.17.29" } -solana-logger = { path = "logger", version = "=1.17.29" } -solana-measure = { path = "measure", version = "=1.17.29" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.17.29" } -solana-metrics = { path = "metrics", version = "=1.17.29" } -solana-net-utils = { path = "net-utils", version = "=1.17.29" } -solana-notifier = { path = "notifier", version = "=1.17.29" } -solana-perf = { path = "perf", version = "=1.17.29" } -solana-poh = { path = "poh", version = "=1.17.29" } -solana-program = { path = "sdk/program", version = "=1.17.29" } -solana-program-runtime = { path = "program-runtime", version = "=1.17.29" } -solana-program-test = { path = "program-test", version = "=1.17.29" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.17.29" } -solana-quic-client = { path = "quic-client", version = "=1.17.29" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.29" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.17.29", default-features = false } -solana-rpc = { path = "rpc", version = "=1.17.29" } -solana-rpc-client = { path = "rpc-client", version = "=1.17.29", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.29" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.29" } -solana-runtime = { path = "runtime", version = "=1.17.29" } -solana-sdk = { path = "sdk", version = "=1.17.29" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.17.29" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.29" } -solana-stake-program = { path = "programs/stake", version = "=1.17.29" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.29" } -solana-storage-proto = { path = "storage-proto", version = "=1.17.29" } -solana-streamer = { path = "streamer", version = "=1.17.29" } -solana-system-program = { path = "programs/system", version = "=1.17.29" } -solana-test-validator = { path = "test-validator", version = "=1.17.29" } -solana-thin-client = { path = "thin-client", version = "=1.17.29" } -solana-tpu-client = { path = "tpu-client", version = "=1.17.29", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.17.29" } -solana-turbine = { path = "turbine", version = "=1.17.29" } -solana-udp-client = { path = "udp-client", version = "=1.17.29" } -solana-version = { path = "version", version = "=1.17.29" } -solana-vote = { path = "vote", version = "=1.17.29" } -solana-vote-program = { path = "programs/vote", version = "=1.17.29" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.17.29" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.29" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.29" } +solana-account-decoder = { path = "account-decoder", version = "=1.17.30" } +solana-accounts-db = { path = "accounts-db", version = "=1.17.30" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.17.30" } +solana-banks-client = { path = "banks-client", version = "=1.17.30" } +solana-banks-interface = { path = "banks-interface", version = "=1.17.30" } +solana-banks-server = { path = "banks-server", version = "=1.17.30" } +solana-bench-tps = { path = "bench-tps", version = "=1.17.30" } +solana-bloom = { path = "bloom", version = "=1.17.30" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.17.30" } +solana-bucket-map = { path = "bucket_map", version = "=1.17.30" } +solana-connection-cache = { path = "connection-cache", version = "=1.17.30", default-features = false } +solana-clap-utils = { path = "clap-utils", version = "=1.17.30" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.17.30" } +solana-cli = { path = "cli", version = "=1.17.30" } +solana-cli-config = { path = "cli-config", version = "=1.17.30" } +solana-cli-output = { path = "cli-output", version = "=1.17.30" } +solana-client = { path = "client", version = "=1.17.30" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.17.30" } +solana-config-program = { path = "programs/config", version = "=1.17.30" } +solana-core = { path = "core", version = "=1.17.30" } +solana-cost-model = { path = "cost-model", version = "=1.17.30" } +solana-download-utils = { path = "download-utils", version = "=1.17.30" } +solana-entry = { path = "entry", version = "=1.17.30" } +solana-faucet = { path = "faucet", version = "=1.17.30" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.17.30" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.17.30" } +solana-genesis = { path = "genesis", version = "=1.17.30" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.17.30" } +agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.17.30" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.17.30" } +solana-gossip = { path = "gossip", version = "=1.17.30" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.17.30" } +solana-ledger = { path = "ledger", version = "=1.17.30" } +solana-local-cluster = { path = "local-cluster", version = "=1.17.30" } +solana-logger = { path = "logger", version = "=1.17.30" } +solana-measure = { path = "measure", version = "=1.17.30" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.17.30" } +solana-metrics = { path = "metrics", version = "=1.17.30" } +solana-net-utils = { path = "net-utils", version = "=1.17.30" } +solana-notifier = { path = "notifier", version = "=1.17.30" } +solana-perf = { path = "perf", version = "=1.17.30" } +solana-poh = { path = "poh", version = "=1.17.30" } +solana-program = { path = "sdk/program", version = "=1.17.30" } +solana-program-runtime = { path = "program-runtime", version = "=1.17.30" } +solana-program-test = { path = "program-test", version = "=1.17.30" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.17.30" } +solana-quic-client = { path = "quic-client", version = "=1.17.30" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.17.30" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.17.30", default-features = false } +solana-rpc = { path = "rpc", version = "=1.17.30" } +solana-rpc-client = { path = "rpc-client", version = "=1.17.30", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.17.30" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.17.30" } +solana-runtime = { path = "runtime", version = "=1.17.30" } +solana-sdk = { path = "sdk", version = "=1.17.30" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.17.30" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.17.30" } +solana-stake-program = { path = "programs/stake", version = "=1.17.30" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.17.30" } +solana-storage-proto = { path = "storage-proto", version = "=1.17.30" } +solana-streamer = { path = "streamer", version = "=1.17.30" } +solana-system-program = { path = "programs/system", version = "=1.17.30" } +solana-test-validator = { path = "test-validator", version = "=1.17.30" } +solana-thin-client = { path = "thin-client", version = "=1.17.30" } +solana-tpu-client = { path = "tpu-client", version = "=1.17.30", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.17.30" } +solana-turbine = { path = "turbine", version = "=1.17.30" } +solana-udp-client = { path = "udp-client", version = "=1.17.30" } +solana-version = { path = "version", version = "=1.17.30" } +solana-vote = { path = "vote", version = "=1.17.30" } +solana-vote-program = { path = "programs/vote", version = "=1.17.30" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.17.30" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.17.30" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.17.30" } spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" spl-memo = "=4.0.0" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 5ac85c4f2847e8..2c8e54384ef51d 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ [[package]] name = "agave-geyser-plugin-interface" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "solana-sdk", @@ -75,7 +75,7 @@ dependencies = [ [[package]] name = "agave-validator" -version = "1.17.29" +version = "1.17.30" dependencies = [ "agave-geyser-plugin-interface", "chrono", @@ -4520,7 +4520,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.29" +version = "1.17.30" dependencies = [ "Inflector", "base64 0.21.4", @@ -4543,7 +4543,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.29" +version = "1.17.30" dependencies = [ "arrayref", "bincode", @@ -4600,7 +4600,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "bytemuck", @@ -4619,7 +4619,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "borsh 0.10.3", "futures 0.3.28", @@ -4634,7 +4634,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.29" +version = "1.17.30" dependencies = [ "serde", "solana-sdk", @@ -4643,7 +4643,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "crossbeam-channel", @@ -4661,7 +4661,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bv", "fnv", @@ -4678,7 +4678,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4695,7 +4695,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.17.29" +version = "1.17.30" dependencies = [ "array-bytes", "serde", @@ -4705,7 +4705,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bv", "bytemuck", @@ -4721,7 +4721,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "chrono", "clap 2.33.3", @@ -4736,7 +4736,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.29" +version = "1.17.30" dependencies = [ "dirs-next", "lazy_static", @@ -4750,7 +4750,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.29" +version = "1.17.30" dependencies = [ "Inflector", "base64 0.21.4", @@ -4775,7 +4775,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-trait", "bincode", @@ -4806,7 +4806,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4814,7 +4814,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "chrono", @@ -4826,7 +4826,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-trait", "bincode", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.17.29" +version = "1.17.30" dependencies = [ "base64 0.21.4", "bincode", @@ -4918,7 +4918,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.29" +version = "1.17.30" dependencies = [ "lazy_static", "log", @@ -4940,7 +4940,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "console", "indicatif", @@ -4952,7 +4952,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "crossbeam-channel", @@ -4972,7 +4972,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "byteorder 1.4.3", @@ -4994,7 +4994,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.29" +version = "1.17.30" dependencies = [ "ahash 0.8.5", "blake3", @@ -5022,7 +5022,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.29" +version = "1.17.30" dependencies = [ "proc-macro2", "quote", @@ -5032,7 +5032,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "solana-accounts-db", @@ -5043,7 +5043,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.17.29" +version = "1.17.30" dependencies = [ "agave-geyser-plugin-interface", "bs58", @@ -5068,7 +5068,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -5116,7 +5116,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "bincode", @@ -5180,7 +5180,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "solana-measure", @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.29" +version = "1.17.30" dependencies = [ "env_logger", "lazy_static", @@ -5200,7 +5200,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "solana-sdk", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.17.29" +version = "1.17.30" dependencies = [ "fast-math", "solana-program", @@ -5216,7 +5216,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.29" +version = "1.17.30" dependencies = [ "crossbeam-channel", "gethostname", @@ -5229,7 +5229,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "clap 3.1.6", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.17.29" +version = "1.17.30" dependencies = [ "ahash 0.8.5", "bincode", @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.17.29" +version = "1.17.30" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5292,7 +5292,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "ark-bn254", "ark-ec", @@ -5344,7 +5344,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.29" +version = "1.17.30" dependencies = [ "base64 0.21.4", "bincode", @@ -5370,7 +5370,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "async-trait", @@ -5398,7 +5398,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "crossbeam-channel", "futures-util", @@ -5421,7 +5421,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-mutex", "async-trait", @@ -5446,7 +5446,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.29" +version = "1.17.30" dependencies = [ "lazy_static", "num_cpus", @@ -5454,7 +5454,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.29" +version = "1.17.30" dependencies = [ "console", "dialoguer", @@ -5471,7 +5471,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.17.29" +version = "1.17.30" dependencies = [ "base64 0.21.4", "bincode", @@ -5526,7 +5526,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-trait", "base64 0.21.4", @@ -5550,7 +5550,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.29" +version = "1.17.30" dependencies = [ "base64 0.21.4", "bs58", @@ -5570,7 +5570,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.29" +version = "1.17.30" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5581,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.29" +version = "1.17.30" dependencies = [ "arrayref", "base64 0.21.4", @@ -5656,7 +5656,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "byteorder 1.4.3", @@ -5685,7 +5685,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5693,21 +5693,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.17.29" +version = "1.17.30" dependencies = [ "array-bytes", "solana-program", @@ -5715,7 +5715,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.17.29" +version = "1.17.30" dependencies = [ "array-bytes", "solana-program", @@ -5723,21 +5723,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5745,14 +5745,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.17.29" +version = "1.17.30" dependencies = [ "byteorder 1.4.3", "solana-program", @@ -5760,21 +5760,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.17.29" +version = "1.17.30" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5784,42 +5784,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.17.29" +version = "1.17.30" dependencies = [ "rustversion", "solana-program", @@ -5829,49 +5829,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -5879,14 +5879,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-program-runtime", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -5904,21 +5904,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -5926,14 +5926,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.17.29" +version = "1.17.30" dependencies = [ "array-bytes", "solana-program", @@ -5941,7 +5941,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.17.29" +version = "1.17.30" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -5950,14 +5950,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-program-runtime", @@ -5975,21 +5975,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-program-runtime", @@ -5999,7 +5999,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.17.29" +version = "1.17.30" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -6007,7 +6007,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.17.29" +version = "1.17.30" dependencies = [ "blake3", "solana-program", @@ -6015,21 +6015,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.17.29" +version = "1.17.30" dependencies = [ "agave-validator", "solana-logger", @@ -6040,21 +6040,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", "solana-program-runtime", @@ -6064,21 +6064,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.17.29" +version = "1.17.30" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.17.29" +version = "1.17.30" dependencies = [ "assert_matches", "base64 0.21.4", @@ -6130,7 +6130,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bs58", "proc-macro2", @@ -6147,7 +6147,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.29" +version = "1.17.30" dependencies = [ "crossbeam-channel", "log", @@ -6161,7 +6161,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "log", @@ -6174,7 +6174,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.17.29" +version = "1.17.30" dependencies = [ "backoff", "bincode", @@ -6206,7 +6206,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "bs58", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-channel", "bytes", @@ -6251,7 +6251,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "log", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.17.29" +version = "1.17.30" dependencies = [ "base64 0.21.4", "bincode", @@ -6293,7 +6293,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "log", @@ -6306,7 +6306,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-trait", "bincode", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.29" +version = "1.17.30" dependencies = [ "Inflector", "base64 0.21.4", @@ -6351,7 +6351,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "bytes", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.17.29" +version = "1.17.30" dependencies = [ "async-trait", "solana-connection-cache", @@ -6399,7 +6399,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.29" +version = "1.17.30" dependencies = [ "log", "rustc_version", @@ -6413,7 +6413,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.29" +version = "1.17.30" dependencies = [ "crossbeam-channel", "itertools", @@ -6430,7 +6430,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bincode", "log", @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.29" +version = "1.17.30" dependencies = [ "bytemuck", "num-derive 0.3.0", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.29" +version = "1.17.30" dependencies = [ "aes-gcm-siv", "base64 0.21.4", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 9b89a8ae81883c..c8f7ffb76ce413 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.17.29" +version = "1.17.30" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -26,29 +26,29 @@ rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" solana_rbpf = "=0.8.0" -solana-account-decoder = { path = "../../account-decoder", version = "=1.17.29" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.17.29" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.29" } -solana-cli-output = { path = "../../cli-output", version = "=1.17.29" } -solana-ledger = { path = "../../ledger", version = "=1.17.29" } -solana-logger = { path = "../../logger", version = "=1.17.29" } -solana-measure = { path = "../../measure", version = "=1.17.29" } -solana-program = { path = "../../sdk/program", version = "=1.17.29" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.17.29" } -solana-program-test = { path = "../../program-test", version = "=1.17.29" } -solana-runtime = { path = "../../runtime", version = "=1.17.29" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.29" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.29" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.29", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.29" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.29" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.29" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.29", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.29" } -solana-sdk = { path = "../../sdk", version = "=1.17.29" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.17.29" } -agave-validator = { path = "../../validator", version = "=1.17.29" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.29" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.17.30" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.17.30" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.17.30" } +solana-cli-output = { path = "../../cli-output", version = "=1.17.30" } +solana-ledger = { path = "../../ledger", version = "=1.17.30" } +solana-logger = { path = "../../logger", version = "=1.17.30" } +solana-measure = { path = "../../measure", version = "=1.17.30" } +solana-program = { path = "../../sdk/program", version = "=1.17.30" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.17.30" } +solana-program-test = { path = "../../program-test", version = "=1.17.30" } +solana-runtime = { path = "../../runtime", version = "=1.17.30" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.17.30" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.17.30" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.17.30", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.17.30" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.17.30" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.17.30" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.17.30", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.17.30" } +solana-sdk = { path = "../../sdk", version = "=1.17.30" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.17.30" } +agave-validator = { path = "../../validator", version = "=1.17.30" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.17.30" } static_assertions = "1.1.0" thiserror = "1.0" diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 678bf2677ad2b9..75683c2e17c344 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.17.29" +version = "1.17.30" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.29" } +solana-program = { path = "../../../../program", version = "=1.17.30" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index 904457e82f81eb..f032115b8cc551 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.17.29" +version = "1.17.30" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.17.29" } +solana-program = { path = "../../../../program", version = "=1.17.30" } [lib] crate-type = ["cdylib"] From 8545209f67ead31f8fd65750cc565d5b2173c37f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 6 Apr 2024 00:35:26 +0800 Subject: [PATCH 206/213] v1.17: Bump h2 (backport of #570) (#608) Bump h2 (#570) (cherry picked from commit f6e02e669d0b86e249c79d9efee36424adf0aa7f) Co-authored-by: Tyera --- Cargo.lock | 4 ++-- programs/sbf/Cargo.lock | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e788a36ec38c9..e6ac4cc8cf2c57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2440,9 +2440,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 2c8e54384ef51d..5a3a8994d77019 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -1963,9 +1963,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", From 2199f6e6fc977fbb1acee9d5fce536856d72f23b Mon Sep 17 00:00:00 2001 From: Lijun Wang <83639177+lijunwangs@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:35:27 -0700 Subject: [PATCH 207/213] =?UTF-8?q?Adjust=20receive=20window=20to=20make?= =?UTF-8?q?=20them=20linear=20to=20the=20count=20of=20streams=20(#3?= =?UTF-8?q?=E2=80=A6=20(#595)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adjust receive window to make them linear to the count of streams (#33913) Adjust receive window to make them linear to the count of streams to reduce fragmentations --- sdk/src/quic.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/src/quic.rs b/sdk/src/quic.rs index dd75efccf70fc0..d304d8fe6c528b 100644 --- a/sdk/src/quic.rs +++ b/sdk/src/quic.rs @@ -26,12 +26,12 @@ pub const QUIC_CONNECTION_HANDSHAKE_TIMEOUT: Duration = Duration::from_secs(60); /// The receive window for QUIC connection from unstaked nodes is /// set to this ratio times [`solana_sdk::packet::PACKET_DATA_SIZE`] -pub const QUIC_UNSTAKED_RECEIVE_WINDOW_RATIO: u64 = 1; +pub const QUIC_UNSTAKED_RECEIVE_WINDOW_RATIO: u64 = 128; /// The receive window for QUIC connection from minimum staked nodes is /// set to this ratio times [`solana_sdk::packet::PACKET_DATA_SIZE`] -pub const QUIC_MIN_STAKED_RECEIVE_WINDOW_RATIO: u64 = 2; +pub const QUIC_MIN_STAKED_RECEIVE_WINDOW_RATIO: u64 = 128; /// The receive window for QUIC connection from maximum staked nodes is /// set to this ratio times [`solana_sdk::packet::PACKET_DATA_SIZE`] -pub const QUIC_MAX_STAKED_RECEIVE_WINDOW_RATIO: u64 = 10; +pub const QUIC_MAX_STAKED_RECEIVE_WINDOW_RATIO: u64 = 512; From e3006ce99933888890ba1ee4850ce0b8c6ac541f Mon Sep 17 00:00:00 2001 From: Trent Nelson Date: Fri, 5 Apr 2024 02:36:44 -0600 Subject: [PATCH 208/213] net-utils: support SO_REUSEPORT --- net-utils/src/lib.rs | 127 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 117 insertions(+), 10 deletions(-) diff --git a/net-utils/src/lib.rs b/net-utils/src/lib.rs index 1ff48173def0da..eced07a226a00c 100644 --- a/net-utils/src/lib.rs +++ b/net-utils/src/lib.rs @@ -381,14 +381,45 @@ pub fn is_host_port(string: String) -> Result<(), String> { parse_host_port(&string).map(|_| ()) } +#[derive(Clone, Debug)] +pub struct SocketConfig { + pub reuseaddr: bool, + pub reuseport: bool, +} + +impl Default for SocketConfig { + #[allow(clippy::derivable_impls)] + fn default() -> Self { + Self { + reuseaddr: false, + reuseport: false, + } + } +} + #[cfg(any(windows, target_os = "ios"))] fn udp_socket(_reuseaddr: bool) -> io::Result { let sock = Socket::new(Domain::IPV4, Type::DGRAM, None)?; Ok(sock) } +#[cfg(any(windows, target_os = "ios"))] +fn udp_socket_with_config(_config: SocketConfig) -> io::Result { + let sock = Socket::new(Domain::IPV4, Type::DGRAM, None)?; + Ok(sock) +} + #[cfg(not(any(windows, target_os = "ios")))] fn udp_socket(reuseaddr: bool) -> io::Result { + let config = SocketConfig { + reuseaddr, + reuseport: false, + }; + udp_socket_with_config(config) +} + +#[cfg(not(any(windows, target_os = "ios")))] +fn udp_socket_with_config(config: SocketConfig) -> io::Result { use { nix::sys::socket::{ setsockopt, @@ -396,14 +427,21 @@ fn udp_socket(reuseaddr: bool) -> io::Result { }, std::os::unix::io::AsRawFd, }; + let SocketConfig { + reuseaddr, + mut reuseport, + } = config; let sock = Socket::new(Domain::IPV4, Type::DGRAM, None)?; let sock_fd = sock.as_raw_fd(); + // best effort, i.e. ignore setsockopt() errors, we'll get the failure in caller if reuseaddr { - // best effort, i.e. ignore errors here, we'll get the failure in caller - setsockopt(sock_fd, ReusePort, &true).ok(); setsockopt(sock_fd, ReuseAddr, &true).ok(); + reuseport = true; + } + if reuseport { + setsockopt(sock_fd, ReusePort, &true).ok(); } Ok(sock) @@ -427,7 +465,16 @@ pub fn bind_common_in_range( } pub fn bind_in_range(ip_addr: IpAddr, range: PortRange) -> io::Result<(u16, UdpSocket)> { - let sock = udp_socket(false)?; + let config = SocketConfig::default(); + bind_in_range_with_config(ip_addr, range, config) +} + +pub fn bind_in_range_with_config( + ip_addr: IpAddr, + range: PortRange, + config: SocketConfig, +) -> io::Result<(u16, UdpSocket)> { + let sock = udp_socket_with_config(config)?; for port in range.0..range.1 { let addr = SocketAddr::new(ip_addr, port); @@ -481,8 +528,12 @@ pub fn multi_bind_in_range( port }; // drop the probe, port should be available... briefly. + let config = SocketConfig { + reuseaddr: true, + reuseport: true, + }; for _ in 0..num { - let sock = bind_to(ip_addr, port, true); + let sock = bind_to_with_config(ip_addr, port, config.clone()); if let Ok(sock) = sock { sockets.push(sock); } else { @@ -503,7 +554,19 @@ pub fn multi_bind_in_range( } pub fn bind_to(ip_addr: IpAddr, port: u16, reuseaddr: bool) -> io::Result { - let sock = udp_socket(reuseaddr)?; + let config = SocketConfig { + reuseaddr, + reuseport: false, + }; + bind_to_with_config(ip_addr, port, config) +} + +pub fn bind_to_with_config( + ip_addr: IpAddr, + port: u16, + config: SocketConfig, +) -> io::Result { + let sock = udp_socket_with_config(config)?; let addr = SocketAddr::new(ip_addr, port); @@ -516,7 +579,20 @@ pub fn bind_common( port: u16, reuseaddr: bool, ) -> io::Result<(UdpSocket, TcpListener)> { - let sock = udp_socket(reuseaddr)?; + let config = SocketConfig { + reuseaddr, + reuseport: false, + }; + bind_common_with_config(ip_addr, port, config) +} + +// binds both a UdpSocket and a TcpListener +pub fn bind_common_with_config( + ip_addr: IpAddr, + port: u16, + config: SocketConfig, +) -> io::Result<(UdpSocket, TcpListener)> { + let sock = udp_socket_with_config(config)?; let addr = SocketAddr::new(ip_addr, port); let sock_addr = SockAddr::from(addr); @@ -528,6 +604,18 @@ pub fn bind_two_in_range_with_offset( ip_addr: IpAddr, range: PortRange, offset: u16, +) -> io::Result<((u16, UdpSocket), (u16, UdpSocket))> { + let sock1_config = SocketConfig::default(); + let sock2_config = SocketConfig::default(); + bind_two_in_range_with_offset_and_config(ip_addr, range, offset, sock1_config, sock2_config) +} + +pub fn bind_two_in_range_with_offset_and_config( + ip_addr: IpAddr, + range: PortRange, + offset: u16, + sock1_config: SocketConfig, + sock2_config: SocketConfig, ) -> io::Result<((u16, UdpSocket), (u16, UdpSocket))> { if range.1.saturating_sub(range.0) < offset { return Err(io::Error::new( @@ -536,9 +624,11 @@ pub fn bind_two_in_range_with_offset( )); } for port in range.0..range.1 { - if let Ok(first_bind) = bind_to(ip_addr, port, false) { + if let Ok(first_bind) = bind_to_with_config(ip_addr, port, sock1_config.clone()) { if range.1.saturating_sub(port) >= offset { - if let Ok(second_bind) = bind_to(ip_addr, port + offset, false) { + if let Ok(second_bind) = + bind_to_with_config(ip_addr, port + offset, sock2_config.clone()) + { return Ok(( (first_bind.local_addr().unwrap().port(), first_bind), (second_bind.local_addr().unwrap().port(), second_bind), @@ -578,6 +668,19 @@ pub fn find_available_port_in_range(ip_addr: IpAddr, range: PortRange) -> io::Re } } +pub fn bind_more_with_config( + socket: UdpSocket, + num: usize, + config: SocketConfig, +) -> io::Result> { + let addr = socket.local_addr().unwrap(); + let ip = addr.ip(); + let port = addr.port(); + std::iter::once(Ok(socket)) + .chain((1..num).map(|_| bind_to_with_config(ip, port, config.clone()))) + .collect() +} + #[cfg(test)] mod tests { use {super::*, std::net::Ipv4Addr}; @@ -681,8 +784,12 @@ mod tests { let ip_addr = IpAddr::V4(Ipv4Addr::UNSPECIFIED); assert_eq!(bind_in_range(ip_addr, (2000, 2001)).unwrap().0, 2000); let ip_addr = IpAddr::V4(Ipv4Addr::UNSPECIFIED); - let x = bind_to(ip_addr, 2002, true).unwrap(); - let y = bind_to(ip_addr, 2002, true).unwrap(); + let config = SocketConfig { + reuseaddr: true, + reuseport: true, + }; + let x = bind_to_with_config(ip_addr, 2002, config.clone()).unwrap(); + let y = bind_to_with_config(ip_addr, 2002, config).unwrap(); assert_eq!( x.local_addr().unwrap().port(), y.local_addr().unwrap().port() From 0b12b21fa39e97354c4229f88fb58246ca0c7ac3 Mon Sep 17 00:00:00 2001 From: Alessandro Decina Date: Tue, 2 Apr 2024 11:45:28 +0000 Subject: [PATCH 209/213] tpu: use multiple quic endpoints --- Cargo.lock | 2 + client/src/connection_cache.rs | 5 +- core/src/tpu.rs | 10 +- gossip/src/cluster_info.rs | 99 ++++++++++++++++--- net-utils/src/lib.rs | 12 +-- programs/sbf/Cargo.lock | 1 + quic-client/tests/quic_client.rs | 6 +- streamer/Cargo.toml | 2 + streamer/src/nonblocking/quic.rs | 161 +++++++++++++++++++++++++++---- streamer/src/quic.rs | 40 +++++++- validator/src/bootstrap.rs | 4 +- 11 files changed, 287 insertions(+), 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e6ac4cc8cf2c57..468693b0a7a568 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7197,6 +7197,7 @@ dependencies = [ "async-channel", "bytes", "crossbeam-channel", + "futures 0.3.28", "futures-util", "histogram", "indexmap 2.0.2", @@ -7212,6 +7213,7 @@ dependencies = [ "rand 0.8.5", "rcgen", "rustls", + "socket2 0.5.5", "solana-logger", "solana-metrics", "solana-perf", diff --git a/client/src/connection_cache.rs b/client/src/connection_cache.rs index 44673c06f4d087..2463cb4ed427a4 100644 --- a/client/src/connection_cache.rs +++ b/client/src/connection_cache.rs @@ -245,7 +245,7 @@ mod tests { let staked_nodes = Arc::new(RwLock::new(StakedNodes::default())); - let (response_recv_endpoint, response_recv_thread) = solana_streamer::quic::spawn_server( + let (response_recv_endpoints, response_recv_thread) = solana_streamer::quic::spawn_server( "quic_streamer_test", response_recv_socket, &keypair2, @@ -261,6 +261,9 @@ mod tests { ) .unwrap(); + let response_recv_endpoint = response_recv_endpoints + .pop() + .expect("at least one endpoint"); let connection_cache = ConnectionCache::new_with_client_options( "connection_cache_test", 1, // connection_pool_size diff --git a/core/src/tpu.rs b/core/src/tpu.rs index 028a88f416e1fe..93e76e70b179ca 100644 --- a/core/src/tpu.rs +++ b/core/src/tpu.rs @@ -34,7 +34,7 @@ use { solana_sdk::{clock::Slot, pubkey::Pubkey, signature::Keypair}, solana_streamer::{ nonblocking::quic::DEFAULT_WAIT_FOR_CHUNK_TIMEOUT, - quic::{spawn_server, MAX_STAKED_CONNECTIONS, MAX_UNSTAKED_CONNECTIONS}, + quic::{spawn_server_multi, MAX_STAKED_CONNECTIONS, MAX_UNSTAKED_CONNECTIONS}, streamer::StakedNodes, }, solana_turbine::broadcast_stage::{BroadcastStage, BroadcastStageType}, @@ -57,8 +57,8 @@ pub struct TpuSockets { pub transaction_forwards: Vec, pub vote: Vec, pub broadcast: Vec, - pub transactions_quic: UdpSocket, - pub transactions_forwards_quic: UdpSocket, + pub transactions_quic: Vec, + pub transactions_forwards_quic: Vec, } pub struct Tpu { @@ -148,7 +148,7 @@ impl Tpu { let (non_vote_sender, non_vote_receiver) = banking_tracer.create_channel_non_vote(); - let (_, tpu_quic_t) = spawn_server( + let (_, tpu_quic_t) = spawn_server_multi( "quic_streamer_tpu", transactions_quic_sockets, keypair, @@ -168,7 +168,7 @@ impl Tpu { ) .unwrap(); - let (_, tpu_forwards_quic_t) = spawn_server( + let (_, tpu_forwards_quic_t) = spawn_server_multi( "quic_streamer_tpu_forwards", transactions_forwards_quic_sockets, keypair, diff --git a/gossip/src/cluster_info.rs b/gossip/src/cluster_info.rs index 4e4193a19fd880..102550045a0e85 100644 --- a/gossip/src/cluster_info.rs +++ b/gossip/src/cluster_info.rs @@ -52,8 +52,9 @@ use { solana_ledger::shred::Shred, solana_measure::measure::Measure, solana_net_utils::{ - bind_common, bind_common_in_range, bind_in_range, bind_two_in_range_with_offset, - find_available_port_in_range, multi_bind_in_range, PortRange, + bind_common, bind_common_in_range, bind_in_range, bind_in_range_with_config, + bind_more_with_config, bind_two_in_range_with_offset_and_config, + find_available_port_in_range, multi_bind_in_range, PortRange, SocketConfig, }, solana_perf::{ data_budget::DataBudget, @@ -2803,10 +2804,12 @@ pub struct Sockets { pub serve_repair: UdpSocket, pub serve_repair_quic: UdpSocket, pub ancestor_hashes_requests: UdpSocket, - pub tpu_quic: UdpSocket, - pub tpu_forwards_quic: UdpSocket, + pub tpu_quic: Vec, + pub tpu_forwards_quic: Vec, } +const QUIC_ENDPOINTS: usize = 10; + #[derive(Debug)] pub struct Node { pub info: ContactInfo, @@ -2824,15 +2827,41 @@ impl Node { let unspecified_bind_addr = format!("{:?}:0", IpAddr::V4(Ipv4Addr::UNSPECIFIED)); let port_range = (1024, 65535); + let udp_config = SocketConfig { + reuseaddr: false, + reuseport: false, + }; + let quic_config = SocketConfig { + reuseaddr: false, + reuseport: true, + }; let ((_tpu_port, tpu), (_tpu_quic_port, tpu_quic)) = - bind_two_in_range_with_offset(localhost_ip_addr, port_range, QUIC_PORT_OFFSET).unwrap(); + bind_two_in_range_with_offset_and_config( + localhost_ip_addr, + port_range, + QUIC_PORT_OFFSET, + udp_config.clone(), + quic_config.clone(), + ) + .unwrap(); + let tpu_quic = + bind_more_with_config(tpu_quic, QUIC_ENDPOINTS, quic_config.clone()).unwrap(); let (gossip_port, (gossip, ip_echo)) = bind_common_in_range(localhost_ip_addr, port_range).unwrap(); let gossip_addr = SocketAddr::new(localhost_ip_addr, gossip_port); let tvu = UdpSocket::bind(&localhost_bind_addr).unwrap(); let tvu_quic = UdpSocket::bind(&localhost_bind_addr).unwrap(); let ((_tpu_forwards_port, tpu_forwards), (_tpu_forwards_quic_port, tpu_forwards_quic)) = - bind_two_in_range_with_offset(localhost_ip_addr, port_range, QUIC_PORT_OFFSET).unwrap(); + bind_two_in_range_with_offset_and_config( + localhost_ip_addr, + port_range, + QUIC_PORT_OFFSET, + udp_config, + quic_config.clone(), + ) + .unwrap(); + let tpu_forwards_quic = + bind_more_with_config(tpu_forwards_quic, QUIC_ENDPOINTS, quic_config).unwrap(); let tpu_vote = UdpSocket::bind(&localhost_bind_addr).unwrap(); let repair = UdpSocket::bind(&localhost_bind_addr).unwrap(); let rpc_port = find_available_port_in_range(localhost_ip_addr, port_range).unwrap(); @@ -2919,7 +2948,19 @@ impl Node { } } fn bind(bind_ip_addr: IpAddr, port_range: PortRange) -> (u16, UdpSocket) { - bind_in_range(bind_ip_addr, port_range).expect("Failed to bind") + let config = SocketConfig { + reuseaddr: false, + reuseport: false, + }; + Self::bind_with_config(bind_ip_addr, port_range, config) + } + + fn bind_with_config( + bind_ip_addr: IpAddr, + port_range: PortRange, + config: SocketConfig, + ) -> (u16, UdpSocket) { + bind_in_range_with_config(bind_ip_addr, port_range, config).expect("Failed to bind") } pub fn new_single_bind( @@ -2932,10 +2973,36 @@ impl Node { Self::get_gossip_port(gossip_addr, port_range, bind_ip_addr); let (tvu_port, tvu) = Self::bind(bind_ip_addr, port_range); let (tvu_quic_port, tvu_quic) = Self::bind(bind_ip_addr, port_range); + let udp_config = SocketConfig { + reuseaddr: false, + reuseport: false, + }; + let quic_config = SocketConfig { + reuseaddr: false, + reuseport: true, + }; let ((tpu_port, tpu), (_tpu_quic_port, tpu_quic)) = - bind_two_in_range_with_offset(bind_ip_addr, port_range, QUIC_PORT_OFFSET).unwrap(); + bind_two_in_range_with_offset_and_config( + bind_ip_addr, + port_range, + QUIC_PORT_OFFSET, + udp_config.clone(), + quic_config.clone(), + ) + .unwrap(); + let tpu_quic = + bind_more_with_config(tpu_quic, QUIC_ENDPOINTS, quic_config.clone()).unwrap(); let ((tpu_forwards_port, tpu_forwards), (_tpu_forwards_quic_port, tpu_forwards_quic)) = - bind_two_in_range_with_offset(bind_ip_addr, port_range, QUIC_PORT_OFFSET).unwrap(); + bind_two_in_range_with_offset_and_config( + bind_ip_addr, + port_range, + QUIC_PORT_OFFSET, + udp_config, + quic_config.clone(), + ) + .unwrap(); + let tpu_forwards_quic = + bind_more_with_config(tpu_forwards_quic, QUIC_ENDPOINTS, quic_config).unwrap(); let (tpu_vote_port, tpu_vote) = Self::bind(bind_ip_addr, port_range); let (_, retransmit_socket) = Self::bind(bind_ip_addr, port_range); let (_, repair) = Self::bind(bind_ip_addr, port_range); @@ -3016,21 +3083,31 @@ impl Node { let (tpu_port, tpu_sockets) = multi_bind_in_range(bind_ip_addr, port_range, 32).expect("tpu multi_bind"); - let (_tpu_port_quic, tpu_quic) = Self::bind( + let quic_config = SocketConfig { + reuseaddr: false, + reuseport: true, + }; + let (_tpu_port_quic, tpu_quic) = Self::bind_with_config( bind_ip_addr, (tpu_port + QUIC_PORT_OFFSET, tpu_port + QUIC_PORT_OFFSET + 1), + quic_config.clone(), ); + let tpu_quic = + bind_more_with_config(tpu_quic, QUIC_ENDPOINTS, quic_config.clone()).unwrap(); let (tpu_forwards_port, tpu_forwards_sockets) = multi_bind_in_range(bind_ip_addr, port_range, 8).expect("tpu_forwards multi_bind"); - let (_tpu_forwards_port_quic, tpu_forwards_quic) = Self::bind( + let (_tpu_forwards_port_quic, tpu_forwards_quic) = Self::bind_with_config( bind_ip_addr, ( tpu_forwards_port + QUIC_PORT_OFFSET, tpu_forwards_port + QUIC_PORT_OFFSET + 1, ), + quic_config.clone(), ); + let tpu_forwards_quic = + bind_more_with_config(tpu_forwards_quic, QUIC_ENDPOINTS, quic_config.clone()).unwrap(); let (tpu_vote_port, tpu_vote_sockets) = multi_bind_in_range(bind_ip_addr, port_range, 1).expect("tpu_vote multi_bind"); diff --git a/net-utils/src/lib.rs b/net-utils/src/lib.rs index eced07a226a00c..5e71a13d61d506 100644 --- a/net-utils/src/lib.rs +++ b/net-utils/src/lib.rs @@ -381,22 +381,12 @@ pub fn is_host_port(string: String) -> Result<(), String> { parse_host_port(&string).map(|_| ()) } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Default)] pub struct SocketConfig { pub reuseaddr: bool, pub reuseport: bool, } -impl Default for SocketConfig { - #[allow(clippy::derivable_impls)] - fn default() -> Self { - Self { - reuseaddr: false, - reuseport: false, - } - } -} - #[cfg(any(windows, target_os = "ios"))] fn udp_socket(_reuseaddr: bool) -> io::Result { let sock = Socket::new(Domain::IPV4, Type::DGRAM, None)?; diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 5a3a8994d77019..68ce913f2bf614 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6226,6 +6226,7 @@ dependencies = [ "async-channel", "bytes", "crossbeam-channel", + "futures 0.3.28", "futures-util", "histogram", "indexmap 2.0.1", diff --git a/quic-client/tests/quic_client.rs b/quic-client/tests/quic_client.rs index 7986e7a3b728d7..fdaf1dc4e984be 100644 --- a/quic-client/tests/quic_client.rs +++ b/quic-client/tests/quic_client.rs @@ -222,7 +222,7 @@ mod tests { ) .unwrap(); - drop(request_recv_endpoint); + drop(request_recv_endpoints); // Response Receiver: let (response_recv_socket, response_recv_exit, keypair2, response_recv_ip) = server_args(); let (sender2, receiver2) = unbounded(); @@ -260,6 +260,10 @@ mod tests { key: priv_key, }); + let response_recv_endpoint = response_recv_endpoints + .pop() + .expect("at least one endpoint"); + drop(response_recv_endpoints); let endpoint = QuicLazyInitializedEndpoint::new(client_certificate, Some(response_recv_endpoint)); let request_sender = diff --git a/streamer/Cargo.toml b/streamer/Cargo.toml index 21ae96d11fd9a4..576ec0d51fa356 100644 --- a/streamer/Cargo.toml +++ b/streamer/Cargo.toml @@ -13,6 +13,7 @@ edition = { workspace = true } async-channel = { workspace = true } bytes = { workspace = true } crossbeam-channel = { workspace = true } +futures = { workspace = true } futures-util = { workspace = true } histogram = { workspace = true } indexmap = { workspace = true } @@ -37,6 +38,7 @@ x509-parser = { workspace = true } [dev-dependencies] assert_matches = { workspace = true } +socket2 = { workspace = true } solana-logger = { workspace = true } [lib] diff --git a/streamer/src/nonblocking/quic.rs b/streamer/src/nonblocking/quic.rs index 0c278ea818e814..e55090507c2d91 100644 --- a/streamer/src/nonblocking/quic.rs +++ b/streamer/src/nonblocking/quic.rs @@ -9,9 +9,10 @@ use { }, bytes::Bytes, crossbeam_channel::Sender, + futures::{stream::FuturesUnordered, Future, StreamExt as _}, indexmap::map::{Entry, IndexMap}, percentage::Percentage, - quinn::{Connecting, Connection, Endpoint, EndpointConfig, TokioRuntime, VarInt}, + quinn::{Accept, Connecting, Connection, Endpoint, EndpointConfig, TokioRuntime, VarInt}, quinn_proto::VarIntBoundsExceeded, rand::{thread_rng, Rng}, solana_perf::packet::{PacketBatch, PACKETS_PER_BATCH}, @@ -30,11 +31,13 @@ use { std::{ iter::repeat_with, net::{IpAddr, SocketAddr, UdpSocket}, + pin::Pin, // CAUTION: be careful not to introduce any awaits while holding an RwLock. sync::{ atomic::{AtomicBool, AtomicU64, Ordering}, Arc, RwLock, }, + task::Poll, time::{Duration, Instant}, }, tokio::{ @@ -46,6 +49,7 @@ use { // but if we do, the scope of the RwLock must always be a subset of the async Mutex // (i.e. lock order is always async Mutex -> RwLock). Also, be careful not to // introduce any other awaits while holding the RwLock. + select, sync::{Mutex, MutexGuard}, task::JoinHandle, time::timeout, @@ -113,20 +117,57 @@ pub fn spawn_server( wait_for_chunk_timeout: Duration, coalesce: Duration, ) -> Result<(Endpoint, Arc, JoinHandle<()>), QuicServerError> { - info!("Start {name} quic server on {sock:?}"); + spawn_server_multi( + name, + vec![sock], + keypair, + gossip_host, + packet_sender, + exit, + max_connections_per_peer, + staked_nodes, + max_staked_connections, + max_unstaked_connections, + wait_for_chunk_timeout, + coalesce, + ) + .map(|(mut endpoints, stats, handle)| (endpoints.remove(0), stats, handle)) +} + +#[allow(clippy::too_many_arguments, clippy::type_complexity)] +pub fn spawn_server_multi( + name: &'static str, + sockets: Vec, + keypair: &Keypair, + gossip_host: IpAddr, + packet_sender: Sender, + exit: Arc, + max_connections_per_peer: usize, + staked_nodes: Arc>, + max_staked_connections: usize, + max_unstaked_connections: usize, + wait_for_chunk_timeout: Duration, + coalesce: Duration, +) -> Result<(Vec, Arc, JoinHandle<()>), QuicServerError> { + info!("Start {name} quic server on {sockets:?}"); let (config, _cert) = configure_server(keypair, gossip_host)?; - let endpoint = Endpoint::new( - EndpointConfig::default(), - Some(config), - sock, - Arc::new(TokioRuntime), - ) - .map_err(QuicServerError::EndpointFailed)?; + let endpoints = sockets + .into_iter() + .map(|sock| { + Endpoint::new( + EndpointConfig::default(), + Some(config.clone()), + sock, + Arc::new(TokioRuntime), + ) + .map_err(QuicServerError::EndpointFailed) + }) + .collect::, _>>()?; let stats = Arc::::default(); let handle = tokio::spawn(run_server( name, - endpoint.clone(), + endpoints.clone(), packet_sender, exit, max_connections_per_peer, @@ -137,13 +178,13 @@ pub fn spawn_server( wait_for_chunk_timeout, coalesce, )); - Ok((endpoint, stats, handle)) + Ok((endpoints, stats, handle)) } #[allow(clippy::too_many_arguments)] async fn run_server( name: &'static str, - incoming: Endpoint, + incoming: Vec, packet_sender: Sender, exit: Arc, max_connections_per_peer: usize, @@ -170,8 +211,37 @@ async fn run_server( stats.clone(), coalesce, )); + + let mut accepts = incoming + .iter() + .enumerate() + .map(|(i, incoming)| { + Box::pin(EndpointAccept { + accept: incoming.accept(), + endpoint: i, + }) + }) + .collect::>(); while !exit.load(Ordering::Relaxed) { - let timeout_connection = timeout(WAIT_FOR_CONNECTION_TIMEOUT, incoming.accept()).await; + let timeout_connection = select! { + ready = accepts.next() => { + if let Some((connecting, i)) = ready { + accepts.push( + Box::pin(EndpointAccept { + accept: incoming[i].accept(), + endpoint: i, + } + )); + Ok(connecting) + } else { + // we can't really get here - we never poll an empty FuturesUnordered + continue + } + } + _ = tokio::time::sleep(WAIT_FOR_CONNECTION_TIMEOUT) => { + Err(()) + } + }; if last_datapoint.elapsed().as_secs() >= 5 { stats.report(name); @@ -1148,6 +1218,25 @@ impl ConnectionTable { } } +struct EndpointAccept<'a> { + endpoint: usize, + accept: Accept<'a>, +} + +impl<'a> Future for EndpointAccept<'a> { + type Output = (Option, usize); + + fn poll(self: Pin<&mut Self>, cx: &mut std::task::Context) -> Poll { + let i = self.endpoint; + // Safety: + // self is pinned and accept is a field so it can't get moved out. See safety docs of + // map_unchecked_mut. + unsafe { self.map_unchecked_mut(|this| &mut this.accept) } + .poll(cx) + .map(|r| (r, i)) + } +} + #[cfg(test)] pub mod test { use { @@ -1167,7 +1256,12 @@ pub mod test { signature::Keypair, signer::Signer, }, - std::{collections::HashMap, net::Ipv4Addr}, + std::{ + collections::HashMap, + net::Ipv4Addr, + os::fd::{FromRawFd, IntoRawFd}, + str::FromStr as _, + }, tokio::time::sleep, }; @@ -1228,16 +1322,43 @@ pub mod test { SocketAddr, Arc, ) { - let s = UdpSocket::bind("127.0.0.1:0").unwrap(); + let sockets = { + #[cfg(not(target_os = "windows"))] + { + use std::{ + os::fd::{FromRawFd, IntoRawFd}, + str::FromStr as _, + }; + (0..10) + .map(|_| { + let sock = socket2::Socket::new( + socket2::Domain::IPV4, + socket2::Type::DGRAM, + Some(socket2::Protocol::UDP), + ) + .unwrap(); + sock.set_reuse_port(true).unwrap(); + sock.bind(&SocketAddr::from_str("127.0.0.1:0").unwrap().into()) + .unwrap(); + unsafe { UdpSocket::from_raw_fd(sock.into_raw_fd()) } + }) + .collect::>() + } + #[cfg(target_os = "windows")] + { + vec![UdpSocket::bind("127.0.0.1:0").unwrap()] + } + }; + let exit = Arc::new(AtomicBool::new(false)); let (sender, receiver) = unbounded(); let keypair = Keypair::new(); - let ip = "127.0.0.1".parse().unwrap(); - let server_address = s.local_addr().unwrap(); + let server_address = sockets[0].local_addr().unwrap(); + let ip = server_address.ip(); let staked_nodes = Arc::new(RwLock::new(option_staked_nodes.unwrap_or_default())); - let (_, stats, t) = spawn_server( - "quic_streamer_test", - s, + let (_, stats, t) = spawn_server_multi( + "one-million-sol", + sockets, &keypair, ip, sender, diff --git a/streamer/src/quic.rs b/streamer/src/quic.rs index 8b2b4f9d852cac..8d8d2e468543cf 100644 --- a/streamer/src/quic.rs +++ b/streamer/src/quic.rs @@ -411,12 +411,44 @@ pub fn spawn_server( wait_for_chunk_timeout: Duration, coalesce: Duration, ) -> Result<(Endpoint, thread::JoinHandle<()>), QuicServerError> { + spawn_server_multi( + name, + vec![sock], + keypair, + gossip_host, + packet_sender, + exit, + max_connections_per_peer, + staked_nodes, + max_staked_connections, + max_unstaked_connections, + wait_for_chunk_timeout, + coalesce, + ) + .map(|(mut endpoints, thread_handle)| (endpoints.remove(0), thread_handle)) +} + +#[allow(clippy::too_many_arguments)] +pub fn spawn_server_multi( + name: &'static str, + sockets: Vec, + keypair: &Keypair, + gossip_host: IpAddr, + packet_sender: Sender, + exit: Arc, + max_connections_per_peer: usize, + staked_nodes: Arc>, + max_staked_connections: usize, + max_unstaked_connections: usize, + wait_for_chunk_timeout: Duration, + coalesce: Duration, +) -> Result<(Vec, thread::JoinHandle<()>), QuicServerError> { let runtime = rt(); - let (endpoint, _stats, task) = { + let (endpoints, _stats, task) = { let _guard = runtime.enter(); - crate::nonblocking::quic::spawn_server( + crate::nonblocking::quic::spawn_server_multi( name, - sock, + sockets, keypair, gossip_host, packet_sender, @@ -437,7 +469,7 @@ pub fn spawn_server( } }) .unwrap(); - Ok((endpoint, handle)) + Ok((endpoints, handle)) } #[cfg(test)] diff --git a/validator/src/bootstrap.rs b/validator/src/bootstrap.rs index 0fe1ae7e6d5eda..95db216d802a06 100644 --- a/validator/src/bootstrap.rs +++ b/validator/src/bootstrap.rs @@ -86,11 +86,11 @@ fn verify_reachable_ports( } if verify_address(&node.info.tpu(Protocol::UDP).ok()) { udp_sockets.extend(node.sockets.tpu.iter()); - udp_sockets.push(&node.sockets.tpu_quic); + udp_sockets.extend(&node.sockets.tpu_quic); } if verify_address(&node.info.tpu_forwards(Protocol::UDP).ok()) { udp_sockets.extend(node.sockets.tpu_forwards.iter()); - udp_sockets.push(&node.sockets.tpu_forwards_quic); + udp_sockets.extend(&node.sockets.tpu_forwards_quic); } if verify_address(&node.info.tpu_vote().ok()) { udp_sockets.extend(node.sockets.tpu_vote.iter()); From 496dea34c2dfe2875c1cde8d5112cef4b10ef38a Mon Sep 17 00:00:00 2001 From: Trent Nelson Date: Sat, 6 Apr 2024 17:04:04 -0600 Subject: [PATCH 210/213] cluster-info: manage port range by hand... --- gossip/src/cluster_info.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/gossip/src/cluster_info.rs b/gossip/src/cluster_info.rs index 102550045a0e85..10bc5901d5790c 100644 --- a/gossip/src/cluster_info.rs +++ b/gossip/src/cluster_info.rs @@ -2835,7 +2835,7 @@ impl Node { reuseaddr: false, reuseport: true, }; - let ((_tpu_port, tpu), (_tpu_quic_port, tpu_quic)) = + let ((tpu_port, tpu), (_tpu_quic_port, tpu_quic)) = bind_two_in_range_with_offset_and_config( localhost_ip_addr, port_range, @@ -2846,12 +2846,14 @@ impl Node { .unwrap(); let tpu_quic = bind_more_with_config(tpu_quic, QUIC_ENDPOINTS, quic_config.clone()).unwrap(); + let port_range = (tpu_port + 1, port_range.1); let (gossip_port, (gossip, ip_echo)) = bind_common_in_range(localhost_ip_addr, port_range).unwrap(); let gossip_addr = SocketAddr::new(localhost_ip_addr, gossip_port); let tvu = UdpSocket::bind(&localhost_bind_addr).unwrap(); let tvu_quic = UdpSocket::bind(&localhost_bind_addr).unwrap(); - let ((_tpu_forwards_port, tpu_forwards), (_tpu_forwards_quic_port, tpu_forwards_quic)) = + let port_range = (gossip_port + 1, port_range.1); + let ((tpu_forwards_port, tpu_forwards), (_tpu_forwards_quic_port, tpu_forwards_quic)) = bind_two_in_range_with_offset_and_config( localhost_ip_addr, port_range, @@ -2862,6 +2864,7 @@ impl Node { .unwrap(); let tpu_forwards_quic = bind_more_with_config(tpu_forwards_quic, QUIC_ENDPOINTS, quic_config).unwrap(); + let port_range = (tpu_forwards_port + 1, port_range.1); let tpu_vote = UdpSocket::bind(&localhost_bind_addr).unwrap(); let repair = UdpSocket::bind(&localhost_bind_addr).unwrap(); let rpc_port = find_available_port_in_range(localhost_ip_addr, port_range).unwrap(); @@ -2992,6 +2995,7 @@ impl Node { .unwrap(); let tpu_quic = bind_more_with_config(tpu_quic, QUIC_ENDPOINTS, quic_config.clone()).unwrap(); + let port_range = (tpu_port + 1, port_range.1); let ((tpu_forwards_port, tpu_forwards), (_tpu_forwards_quic_port, tpu_forwards_quic)) = bind_two_in_range_with_offset_and_config( bind_ip_addr, @@ -3003,6 +3007,7 @@ impl Node { .unwrap(); let tpu_forwards_quic = bind_more_with_config(tpu_forwards_quic, QUIC_ENDPOINTS, quic_config).unwrap(); + let port_range = (tpu_forwards_port + 1, port_range.1); let (tpu_vote_port, tpu_vote) = Self::bind(bind_ip_addr, port_range); let (_, retransmit_socket) = Self::bind(bind_ip_addr, port_range); let (_, repair) = Self::bind(bind_ip_addr, port_range); @@ -3080,6 +3085,7 @@ impl Node { let (tvu_port, tvu_sockets) = multi_bind_in_range(bind_ip_addr, port_range, 8).expect("tvu multi_bind"); let (tvu_quic_port, tvu_quic) = Self::bind(bind_ip_addr, port_range); + let port_range = (tvu_quic_port + 1, port_range.1); let (tpu_port, tpu_sockets) = multi_bind_in_range(bind_ip_addr, port_range, 32).expect("tpu multi_bind"); @@ -3087,7 +3093,8 @@ impl Node { reuseaddr: false, reuseport: true, }; - let (_tpu_port_quic, tpu_quic) = Self::bind_with_config( + let port_range = (tpu_port + 1, port_range.1); + let (tpu_port_quic, tpu_quic) = Self::bind_with_config( bind_ip_addr, (tpu_port + QUIC_PORT_OFFSET, tpu_port + QUIC_PORT_OFFSET + 1), quic_config.clone(), @@ -3095,10 +3102,12 @@ impl Node { let tpu_quic = bind_more_with_config(tpu_quic, QUIC_ENDPOINTS, quic_config.clone()).unwrap(); + let port_range = (tpu_port_quic + 1, port_range.1); let (tpu_forwards_port, tpu_forwards_sockets) = multi_bind_in_range(bind_ip_addr, port_range, 8).expect("tpu_forwards multi_bind"); - let (_tpu_forwards_port_quic, tpu_forwards_quic) = Self::bind_with_config( + let port_range = (tpu_forwards_port + 1, port_range.1); + let (tpu_forwards_port_quic, tpu_forwards_quic) = Self::bind_with_config( bind_ip_addr, ( tpu_forwards_port + QUIC_PORT_OFFSET, @@ -3109,6 +3118,7 @@ impl Node { let tpu_forwards_quic = bind_more_with_config(tpu_forwards_quic, QUIC_ENDPOINTS, quic_config.clone()).unwrap(); + let port_range = (tpu_forwards_port_quic + 1, port_range.1); let (tpu_vote_port, tpu_vote_sockets) = multi_bind_in_range(bind_ip_addr, port_range, 1).expect("tpu_vote multi_bind"); @@ -3275,7 +3285,6 @@ mod tests { }, itertools::izip, solana_ledger::shred::Shredder, - solana_net_utils::MINIMUM_VALIDATOR_PORT_RANGE_WIDTH, solana_sdk::signature::{Keypair, Signer}, solana_vote_program::{vote_instruction, vote_state::Vote}, std::{ @@ -3744,11 +3753,8 @@ mod tests { fn new_with_external_ip_test_gossip() { // Can't use VALIDATOR_PORT_RANGE because if this test runs in parallel with others, the // port returned by `bind_in_range()` might be snatched up before `Node::new_with_external_ip()` runs - let port_range = ( - VALIDATOR_PORT_RANGE.1 + MINIMUM_VALIDATOR_PORT_RANGE_WIDTH, - VALIDATOR_PORT_RANGE.1 + (2 * MINIMUM_VALIDATOR_PORT_RANGE_WIDTH), - ); - + let (start, end) = VALIDATOR_PORT_RANGE; + let port_range = (end, end + (end - start)); let ip = IpAddr::V4(Ipv4Addr::LOCALHOST); let port = bind_in_range(ip, port_range).expect("Failed to bind").0; let node = Node::new_with_external_ip( From 66da8cae9982545fb0704b4870d994d3c8da5749 Mon Sep 17 00:00:00 2001 From: "trent@tns-MacBook-Pro.local" Date: Sun, 7 Apr 2024 13:30:06 -0600 Subject: [PATCH 211/213] local-cluster: keep udp tpu socket around for tests --- local-cluster/src/local_cluster.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local-cluster/src/local_cluster.rs b/local-cluster/src/local_cluster.rs index d180a4abaf0e3a..76cf85176d41ae 100644 --- a/local-cluster/src/local_cluster.rs +++ b/local-cluster/src/local_cluster.rs @@ -293,7 +293,7 @@ impl LocalCluster { socket_addr_space, DEFAULT_TPU_USE_QUIC, DEFAULT_TPU_CONNECTION_POOL_SIZE, - DEFAULT_TPU_ENABLE_UDP, + true, Arc::new(RwLock::new(None)), ) .expect("assume successful validator start"); From 0265c5fba32ee9be1426d8c3d9dad3adf7bf78e8 Mon Sep 17 00:00:00 2001 From: Lijun Wang <83639177+lijunwangs@users.noreply.github.com> Date: Sun, 7 Apr 2024 15:40:15 -0700 Subject: [PATCH 212/213] Fixed unit test failures --- client/src/connection_cache.rs | 5 +---- quic-client/tests/quic_client.rs | 6 +----- streamer/src/nonblocking/quic.rs | 11 +++-------- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/client/src/connection_cache.rs b/client/src/connection_cache.rs index 2463cb4ed427a4..44673c06f4d087 100644 --- a/client/src/connection_cache.rs +++ b/client/src/connection_cache.rs @@ -245,7 +245,7 @@ mod tests { let staked_nodes = Arc::new(RwLock::new(StakedNodes::default())); - let (response_recv_endpoints, response_recv_thread) = solana_streamer::quic::spawn_server( + let (response_recv_endpoint, response_recv_thread) = solana_streamer::quic::spawn_server( "quic_streamer_test", response_recv_socket, &keypair2, @@ -261,9 +261,6 @@ mod tests { ) .unwrap(); - let response_recv_endpoint = response_recv_endpoints - .pop() - .expect("at least one endpoint"); let connection_cache = ConnectionCache::new_with_client_options( "connection_cache_test", 1, // connection_pool_size diff --git a/quic-client/tests/quic_client.rs b/quic-client/tests/quic_client.rs index fdaf1dc4e984be..a9b9e636476176 100644 --- a/quic-client/tests/quic_client.rs +++ b/quic-client/tests/quic_client.rs @@ -206,7 +206,7 @@ mod tests { let (sender, receiver) = unbounded(); let staked_nodes = Arc::new(RwLock::new(StakedNodes::default())); let (request_recv_socket, request_recv_exit, keypair, request_recv_ip) = server_args(); - let (request_recv_endpoint, request_recv_thread) = solana_streamer::quic::spawn_server( + let (request_recv_endpoints, request_recv_thread) = solana_streamer::quic::spawn_server( "quic_streamer_test", request_recv_socket.try_clone().unwrap(), &keypair, @@ -260,10 +260,6 @@ mod tests { key: priv_key, }); - let response_recv_endpoint = response_recv_endpoints - .pop() - .expect("at least one endpoint"); - drop(response_recv_endpoints); let endpoint = QuicLazyInitializedEndpoint::new(client_certificate, Some(response_recv_endpoint)); let request_sender = diff --git a/streamer/src/nonblocking/quic.rs b/streamer/src/nonblocking/quic.rs index e55090507c2d91..a7f12baaf9361e 100644 --- a/streamer/src/nonblocking/quic.rs +++ b/streamer/src/nonblocking/quic.rs @@ -1256,12 +1256,7 @@ pub mod test { signature::Keypair, signer::Signer, }, - std::{ - collections::HashMap, - net::Ipv4Addr, - os::fd::{FromRawFd, IntoRawFd}, - str::FromStr as _, - }, + std::{collections::HashMap, net::Ipv4Addr}, tokio::time::sleep, }; @@ -1323,7 +1318,7 @@ pub mod test { Arc, ) { let sockets = { - #[cfg(not(target_os = "windows"))] + #[cfg(not(any(target_os = "macos", target_os = "windows")))] { use std::{ os::fd::{FromRawFd, IntoRawFd}, @@ -1344,7 +1339,7 @@ pub mod test { }) .collect::>() } - #[cfg(target_os = "windows")] + #[cfg(any(target_os = "macos", target_os = "windows"))] { vec![UdpSocket::bind("127.0.0.1:0").unwrap()] } From d8daff8d1d1ce4b783cf18fb1a70e5ec23fbe2e4 Mon Sep 17 00:00:00 2001 From: HaoranYi Date: Mon, 8 Apr 2024 16:49:21 +0000 Subject: [PATCH 213/213] use feature all to fix build --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c13ee3763605d7..cb571d72d2f552 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -296,7 +296,7 @@ sha3 = "0.10.4" signal-hook = "0.3.17" siphasher = "0.3.11" smpl_jwt = "0.7.1" -socket2 = "0.5.4" +socket2 = { version= "0.5.4", features=["all"]} soketto = "0.7" solana_rbpf = "=0.8.0" solana-account-decoder = { path = "account-decoder", version = "=1.17.30" }