diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000..2f7896d1d1
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+target/
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index c2fc36a3e6..0000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-# To get started with Dependabot version updates, you'll need to specify which
-# package ecosystems to update and where the package manifests are located.
-# Please see the documentation for all configuration options:
-# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
-
-version: 2
-updates:
-- package-ecosystem: cargo
- directory: "/"
- schedule:
- interval: daily
- time: "01:00"
- timezone: America/Los_Angeles
- #labels:
- # - "automerge"
- open-pull-requests-limit: 3
-
-- package-ecosystem: npm
- directory: "/web3.js"
- schedule:
- interval: daily
- time: "01:00"
- timezone: America/Los_Angeles
- labels:
- - "automerge"
- commit-message:
- prefix: "chore:"
- open-pull-requests-limit: 3
-
-- package-ecosystem: npm
- directory: "/explorer"
- schedule:
- interval: daily
- time: "01:00"
- timezone: America/Los_Angeles
- labels:
- - "automerge"
- commit-message:
- prefix: "chore:"
- include: "scope"
- open-pull-requests-limit: 3
diff --git a/.github/workflows/client-targets.yml b/.github/workflows/client-targets.yml
index e7b78d83e9..12578422b4 100644
--- a/.github/workflows/client-targets.yml
+++ b/.github/workflows/client-targets.yml
@@ -45,8 +45,10 @@ jobs:
platform: android
os: ubuntu-latest
steps:
- - name: Checkout code
- uses: actions/checkout@v2
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ ssh-key: ${{ secrets.DEPLOYER_SSH_KEY }}
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
diff --git a/.gitignore b/.gitignore
index e2bf6fbb7a..9b7f0cdb54 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,6 @@ log-*/
.DS_Store
# scripts that may be generated by cargo *-bpf commands
**/cargo-*-bpf-child-script-*.sh
+
+.env
+docker-output/
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000..5ee418f4a8
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,9 @@
+[submodule "anchor"]
+ path = anchor
+ url = org-87542516@github.com:jito-labs/anchor.git
+[submodule "jito-programs"]
+ path = jito-programs
+ url = org-87542516@github.com:jito-labs/jito-programs.git
+[submodule "jito-protos/protos"]
+ path = jito-protos/protos
+ url = org-87542516@github.com:jito-labs/mev-protos-priv.git
diff --git a/Cargo.lock b/Cargo.lock
index 4864e616ef..18f8d056c1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -24,7 +24,7 @@ version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877"
dependencies = [
- "generic-array 0.14.6",
+ "generic-array",
]
[[package]]
@@ -36,7 +36,7 @@ dependencies = [
"cfg-if 1.0.0",
"cipher 0.3.0",
"cpufeatures",
- "opaque-debug 0.3.0",
+ "opaque-debug",
]
[[package]]
@@ -60,16 +60,16 @@ version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
dependencies = [
- "getrandom 0.2.3",
+ "getrandom 0.2.7",
"once_cell",
"version_check",
]
[[package]]
name = "aho-corasick"
-version = "0.7.18"
+version = "0.7.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
+checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e"
dependencies = [
"memchr",
]
@@ -82,48 +82,187 @@ checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd"
[[package]]
name = "alloc-no-stdlib"
-version = "2.0.3"
+version = "2.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3"
+checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
[[package]]
name = "alloc-stdlib"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2"
+checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
dependencies = [
"alloc-no-stdlib",
]
+[[package]]
+name = "anchor-attribute-access-control"
+version = "0.24.2"
+dependencies = [
+ "anchor-syn",
+ "anyhow",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "regex",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "anchor-attribute-account"
+version = "0.24.2"
+dependencies = [
+ "anchor-syn",
+ "anyhow",
+ "bs58 0.4.0",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "rustversion",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "anchor-attribute-constant"
+version = "0.24.2"
+dependencies = [
+ "anchor-syn",
+ "proc-macro2 1.0.46",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "anchor-attribute-error"
+version = "0.24.2"
+dependencies = [
+ "anchor-syn",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "anchor-attribute-event"
+version = "0.24.2"
+dependencies = [
+ "anchor-syn",
+ "anyhow",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "anchor-attribute-interface"
+version = "0.24.2"
+dependencies = [
+ "anchor-syn",
+ "anyhow",
+ "heck 0.3.3",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "anchor-attribute-program"
+version = "0.24.2"
+dependencies = [
+ "anchor-syn",
+ "anyhow",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "anchor-attribute-state"
+version = "0.24.2"
+dependencies = [
+ "anchor-syn",
+ "anyhow",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "anchor-derive-accounts"
+version = "0.24.2"
+dependencies = [
+ "anchor-syn",
+ "anyhow",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "anchor-lang"
+version = "0.24.2"
+dependencies = [
+ "anchor-attribute-access-control",
+ "anchor-attribute-account",
+ "anchor-attribute-constant",
+ "anchor-attribute-error",
+ "anchor-attribute-event",
+ "anchor-attribute-interface",
+ "anchor-attribute-program",
+ "anchor-attribute-state",
+ "anchor-derive-accounts",
+ "arrayref",
+ "base64 0.13.0",
+ "bincode",
+ "borsh",
+ "bytemuck",
+ "solana-program 1.15.0",
+ "thiserror",
+]
+
+[[package]]
+name = "anchor-syn"
+version = "0.24.2"
+dependencies = [
+ "anyhow",
+ "bs58 0.3.1",
+ "heck 0.3.3",
+ "proc-macro2 1.0.46",
+ "proc-macro2-diagnostics",
+ "quote 1.0.21",
+ "serde",
+ "serde_json",
+ "sha2 0.9.9",
+ "syn 1.0.102",
+ "thiserror",
+]
+
[[package]]
name = "android_system_properties"
-version = "0.1.4"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7ed72e1635e121ca3e79420540282af22da58be50de153d36f81ddc6b83aa9e"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
dependencies = [
"libc",
]
[[package]]
name = "ansi_term"
-version = "0.11.0"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "anyhow"
-version = "1.0.58"
+version = "1.0.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704"
+checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602"
[[package]]
name = "arc-swap"
-version = "1.5.0"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5d78ce20460b82d3fa150275ed9d55e21064fc7951177baacf86a145c4a4b1f"
+checksum = "983cd8b9d4b02a6dc6ffa557262eb5858a27a0038ffffe21a0f133eaa819a164"
[[package]]
name = "arrayref"
@@ -156,7 +295,7 @@ dependencies = [
"num-traits",
"rusticata-macros",
"thiserror",
- "time 0.3.9",
+ "time 0.3.15",
]
[[package]]
@@ -165,9 +304,9 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
"synstructure",
]
@@ -177,9 +316,9 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -204,9 +343,9 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9"
[[package]]
name = "async-compression"
-version = "0.3.14"
+version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "345fd392ab01f746c717b1357165b76f0b67a60192007b234058c9045fdcf695"
+checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a"
dependencies = [
"brotli",
"flate2",
@@ -227,9 +366,9 @@ dependencies = [
[[package]]
name = "async-stream"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625"
+checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e"
dependencies = [
"async-stream-impl",
"futures-core",
@@ -237,13 +376,13 @@ dependencies = [
[[package]]
name = "async-stream-impl"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308"
+checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -252,9 +391,9 @@ version = "0.1.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -285,9 +424,9 @@ dependencies = [
[[package]]
name = "axum"
-version = "0.5.1"
+version = "0.5.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47594e438a243791dba58124b6669561f5baa14cb12046641d8008bf035e5a25"
+checksum = "c9e3356844c4d6a6d6467b8da2cffb4a2820be256f50a3a386c9d152bab31043"
dependencies = [
"async-trait",
"axum-core",
@@ -297,11 +436,11 @@ dependencies = [
"http",
"http-body",
"hyper",
- "itoa 1.0.1",
+ "itoa 1.0.4",
"matchit",
"memchr",
"mime",
- "percent-encoding 2.1.0",
+ "percent-encoding 2.2.0",
"pin-project-lite",
"serde",
"sync_wrapper",
@@ -335,7 +474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1"
dependencies = [
"futures-core",
- "getrandom 0.2.3",
+ "getrandom 0.2.7",
"instant",
"pin-project-lite",
"rand 0.8.5",
@@ -356,9 +495,32 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
[[package]]
name = "base64ct"
-version = "1.3.3"
+version = "1.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea2b2456fd614d856680dcd9fcc660a51a820fa09daef2e49772b56a193c8474"
+
+[[package]]
+name = "bench-get-confirmed-blocks-with-data"
+version = "1.15.0"
+dependencies = [
+ "env_logger",
+ "log",
+ "solana-sdk 1.15.0",
+ "solana-storage-bigtable",
+ "solana-transaction-status",
+ "tokio",
+]
+
+[[package]]
+name = "bigdecimal"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "874f8444adcb4952a8bc51305c8be95c8ec8237bb0d2e78d2e039f771f8828a0"
+checksum = "6aaf33151a6429fe9211d1b276eafdf70cdff28b071e76c0b0e1503221ea3744"
+dependencies = [
+ "num-bigint 0.4.3",
+ "num-integer",
+ "num-traits",
+]
[[package]]
name = "bincode"
@@ -381,8 +543,8 @@ dependencies = [
"lazy_static",
"lazycell",
"peeking_take_while",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
"regex",
"rustc-hash",
"shlex",
@@ -390,9 +552,9 @@ dependencies = [
[[package]]
name = "bit-set"
-version = "0.5.2"
+version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
+checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
dependencies = [
"bit-vec",
]
@@ -429,19 +591,7 @@ dependencies = [
"cc",
"cfg-if 1.0.0",
"constant_time_eq",
- "digest 0.10.3",
-]
-
-[[package]]
-name = "block-buffer"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
-dependencies = [
- "block-padding 0.1.5",
- "byte-tools",
- "byteorder",
- "generic-array 0.12.4",
+ "digest 0.10.5",
]
[[package]]
@@ -450,26 +600,17 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
dependencies = [
- "block-padding 0.2.1",
- "generic-array 0.14.6",
+ "block-padding",
+ "generic-array",
]
[[package]]
name = "block-buffer"
-version = "0.10.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324"
-dependencies = [
- "generic-array 0.14.6",
-]
-
-[[package]]
-name = "block-padding"
-version = "0.1.5"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
+checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
dependencies = [
- "byte-tools",
+ "generic-array",
]
[[package]]
@@ -497,8 +638,8 @@ dependencies = [
"borsh-derive-internal",
"borsh-schema-derive-internal",
"proc-macro-crate 0.1.5",
- "proc-macro2 1.0.41",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "syn 1.0.102",
]
[[package]]
@@ -507,9 +648,9 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -518,9 +659,9 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -544,6 +685,12 @@ dependencies = [
"alloc-stdlib",
]
+[[package]]
+name = "bs58"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb"
+
[[package]]
name = "bs58"
version = "0.4.0"
@@ -564,9 +711,9 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.8.0"
+version = "3.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c"
+checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d"
[[package]]
name = "bv"
@@ -578,12 +725,6 @@ dependencies = [
"serde",
]
-[[package]]
-name = "byte-tools"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
-
[[package]]
name = "byte-unit"
version = "4.0.14"
@@ -601,22 +742,22 @@ checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c"
[[package]]
name = "bytemuck"
-version = "1.11.0"
+version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5377c8865e74a160d21f29c2d40669f53286db6eab59b88540cbb12ffc8b835"
+checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da"
dependencies = [
"bytemuck_derive",
]
[[package]]
name = "bytemuck_derive"
-version = "1.1.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "562e382481975bc61d11275ac5e62a19abd00b0547d99516a415336f183dcd0e"
+checksum = "1b9e1f5fa78f69496407a27ae9ed989e3c3b072310286f5ef385525e4cbc24a9"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -660,9 +801,9 @@ dependencies = [
[[package]]
name = "camino"
-version = "1.0.9"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "869119e97797867fd90f5e22af7d0bd274bd4635ebb9eb68c04f3f513ae6c412"
+checksum = "88ad0e1e3e88dd237a156ab9f571021b8a158caa0ae44b1968a241efb5144c1e"
dependencies = [
"serde",
]
@@ -694,7 +835,7 @@ checksum = "3abb7553d5b9b8421c6de7cb02606ff15e0c6eea7d8eadd75ef013fd636bec36"
dependencies = [
"camino",
"cargo-platform",
- "semver 1.0.14",
+ "semver",
"serde",
"serde_json",
]
@@ -705,7 +846,7 @@ version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a"
dependencies = [
- "rustc_version 0.4.0",
+ "rustc_version",
]
[[package]]
@@ -749,16 +890,16 @@ dependencies = [
"num-integer",
"num-traits",
"serde",
- "time 0.1.43",
+ "time 0.1.44",
"wasm-bindgen",
"winapi 0.3.9",
]
[[package]]
name = "chrono-humanize"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2eddc119501d583fd930cb92144e605f44e0252c38dd89d9247fffa1993375cb"
+checksum = "32dce1ea1988dbdf9f9815ff11425828523bd2a134ec0805d2ac8af26ee6096e"
dependencies = [
"chrono",
]
@@ -769,7 +910,7 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7"
dependencies = [
- "generic-array 0.14.6",
+ "generic-array",
]
[[package]]
@@ -784,9 +925,9 @@ dependencies = [
[[package]]
name = "clang-sys"
-version = "1.2.2"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10612c0ec0e0a1ff0e97980647cb058a6e7aedb913d01d009c406b8b7d0b26ee"
+checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3"
dependencies = [
"glob",
"libc",
@@ -795,9 +936,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "2.33.3"
+version = "2.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
dependencies = [
"ansi_term",
"atty",
@@ -810,32 +951,51 @@ dependencies = [
[[package]]
name = "clap"
-version = "3.1.8"
+version = "3.2.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71c47df61d9e16dc010b55dba1952a57d8c215dbb533fd13cdd13369aac73b1c"
+checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750"
dependencies = [
"atty",
"bitflags",
"clap_derive",
+ "clap_lex",
"indexmap",
- "lazy_static",
- "os_str_bytes",
+ "once_cell",
"strsim 0.10.0",
"termcolor",
- "textwrap 0.15.0",
+ "textwrap 0.15.1",
]
[[package]]
name = "clap_derive"
-version = "3.1.7"
+version = "3.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1"
+checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65"
dependencies = [
"heck 0.4.0",
"proc-macro-error",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
]
[[package]]
@@ -853,14 +1013,13 @@ dependencies = [
[[package]]
name = "console"
-version = "0.15.0"
+version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31"
+checksum = "c050367d967ced717c04b65d8c619d863ef9292ce0c5760028655a2fb298718c"
dependencies = [
"encode_unicode",
+ "lazy_static",
"libc",
- "once_cell",
- "regex",
"terminal_size",
"unicode-width",
"winapi 0.3.9",
@@ -894,22 +1053,22 @@ checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3"
[[package]]
name = "const_format"
-version = "0.2.26"
+version = "0.2.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "939dc9e2eb9077e0679d2ce32de1ded8531779360b003b4a972a7a39ec263495"
+checksum = "7309d9b4d3d2c0641e018d449232f2e28f1b22933c137f157d3dbc14228b8c0e"
dependencies = [
"const_format_proc_macros",
]
[[package]]
name = "const_format_proc_macros"
-version = "0.2.22"
+version = "0.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef196d5d972878a48da7decb7686eded338b4858fbabeed513d63a7c98b2b82d"
+checksum = "d897f47bf7270cf70d370f8f98c1abb6d2d4cf60a6845d30e05bfb90c6568650"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "unicode-xid 0.2.2",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "unicode-xid 0.2.4",
]
[[package]]
@@ -926,9 +1085,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
[[package]]
name = "core-foundation"
-version = "0.9.2"
+version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
dependencies = [
"core-foundation-sys",
"libc",
@@ -954,18 +1113,18 @@ dependencies = [
[[package]]
name = "cpufeatures"
-version = "0.2.1"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469"
+checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
-version = "1.2.1"
+version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
dependencies = [
"cfg-if 1.0.0",
]
@@ -995,9 +1154,9 @@ dependencies = [
[[package]]
name = "crossbeam-deque"
-version = "0.8.1"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
+checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
dependencies = [
"cfg-if 1.0.0",
"crossbeam-epoch",
@@ -1018,12 +1177,11 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.8"
+version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38"
+checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac"
dependencies = [
"cfg-if 1.0.0",
- "lazy_static",
]
[[package]]
@@ -1034,11 +1192,11 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "crypto-common"
-version = "0.1.3"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
- "generic-array 0.14.6",
+ "generic-array",
"typenum",
]
@@ -1048,7 +1206,7 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"
dependencies = [
- "generic-array 0.14.6",
+ "generic-array",
"subtle",
]
@@ -1107,6 +1265,50 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "cxx"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19f39818dcfc97d45b03953c1292efc4e80954e1583c4aa770bac1383e2310a4"
+dependencies = [
+ "cc",
+ "cxxbridge-flags",
+ "cxxbridge-macro",
+ "link-cplusplus",
+]
+
+[[package]]
+name = "cxx-build"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e580d70777c116df50c390d1211993f62d40302881e54d4b79727acb83d0199"
+dependencies = [
+ "cc",
+ "codespan-reporting",
+ "once_cell",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "scratch",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "cxxbridge-flags"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56a46460b88d1cec95112c8c363f0e2c39afdb237f60583b0b36343bf627ea9c"
+
+[[package]]
+name = "cxxbridge-macro"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "747b608fecf06b0d72d440f27acc99288207324b793be2c17991839f3d4995ea"
+dependencies = [
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
[[package]]
name = "dashmap"
version = "4.0.2"
@@ -1120,13 +1322,15 @@ dependencies = [
[[package]]
name = "dashmap"
-version = "5.2.0"
+version = "5.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c"
+checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc"
dependencies = [
"cfg-if 1.0.0",
- "num_cpus",
- "parking_lot 0.12.1",
+ "hashbrown 0.12.3",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core 0.9.3",
]
[[package]]
@@ -1166,15 +1370,15 @@ checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0"
[[package]]
name = "derive_more"
-version = "0.99.16"
+version = "0.99.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df"
+checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
dependencies = [
"convert_case",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "rustc_version 0.3.3",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "rustc_version",
+ "syn 1.0.102",
]
[[package]]
@@ -1194,31 +1398,22 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
-[[package]]
-name = "digest"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
-dependencies = [
- "generic-array 0.12.4",
-]
-
[[package]]
name = "digest"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
dependencies = [
- "generic-array 0.14.6",
+ "generic-array",
]
[[package]]
name = "digest"
-version = "0.10.3"
+version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506"
+checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c"
dependencies = [
- "block-buffer 0.10.2",
+ "block-buffer 0.10.3",
"crypto-common",
"subtle",
]
@@ -1259,9 +1454,9 @@ version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -1301,9 +1496,9 @@ checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3"
[[package]]
name = "ed25519"
-version = "1.2.0"
+version = "1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4620d40f6d2601794401d6dd95a5cf69b6c157852539470eeda433a99b3c0efc"
+checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369"
dependencies = [
"signature",
]
@@ -1331,26 +1526,26 @@ dependencies = [
"derivation-path",
"ed25519-dalek",
"hmac 0.12.1",
- "sha2 0.10.5",
+ "sha2 0.10.6",
]
[[package]]
name = "educe"
-version = "0.4.18"
+version = "0.4.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f86b50932a01e7ec5c06160492ab660fb19b6bb2a7878030dd6cd68d21df9d4d"
+checksum = "c07b7cc9cd8c08d10db74fca3b20949b9b6199725c04a0cce6d543496098fcac"
dependencies = [
"enum-ordinalize",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "either"
-version = "1.7.0"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be"
+checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
[[package]]
name = "encode_unicode"
@@ -1360,9 +1555,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
[[package]]
name = "encoding_rs"
-version = "0.8.29"
+version = "0.8.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746"
+checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b"
dependencies = [
"cfg-if 1.0.0",
]
@@ -1382,22 +1577,23 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "828de45d0ca18782232dfb8f3ea9cc428e8ced380eb26a520baaacfc70de39ce"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "enum-ordinalize"
-version = "3.1.10"
+version = "3.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b166c9e378360dd5a6666a9604bb4f54ae0cac39023ffbac425e917a2a04fef"
+checksum = "2170fc0efee383079a8bdd05d6ea2a184d2a0f07a1c1dcabdb2fd5e9f24bc36c"
dependencies = [
"num-bigint 0.4.3",
"num-traits",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "rustc_version",
+ "syn 1.0.102",
]
[[package]]
@@ -1407,9 +1603,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eb359f1476bf611266ac1f5355bc14aeca37b299d0ebccc038ee7058891c9cb"
dependencies = [
"once_cell",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -1463,15 +1659,9 @@ dependencies = [
[[package]]
name = "event-listener"
-version = "2.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71"
-
-[[package]]
-name = "fake-simd"
-version = "0.1.2"
+version = "2.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
[[package]]
name = "fast-math"
@@ -1484,9 +1674,9 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "1.6.0"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "779d043b6a0b90cc4c0ed7ee380a6504394cee7efd7db050e3774eee387324b2"
+checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
dependencies = [
"instant",
]
@@ -1499,7 +1689,7 @@ checksum = "e11dcc7e4d79a8c89b9ab4c6f5c30b1fc4a83c420792da3542fd31179ed5f517"
dependencies = [
"cfg-if 1.0.0",
"rustix",
- "windows-sys 0.36.1",
+ "windows-sys",
]
[[package]]
@@ -1510,9 +1700,9 @@ checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da"
[[package]]
name = "filedescriptor"
-version = "0.8.1"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ed3d8a5e20435ff00469e51a0d82049bae66504b5c429920dadf9bb54d47b3f"
+checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e"
dependencies = [
"libc",
"thiserror",
@@ -1521,21 +1711,27 @@ dependencies = [
[[package]]
name = "filetime"
-version = "0.2.15"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98"
+checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c"
dependencies = [
"cfg-if 1.0.0",
"libc",
"redox_syscall",
- "winapi 0.3.9",
+ "windows-sys",
]
[[package]]
name = "fixedbitset"
-version = "0.4.0"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d"
+
+[[package]]
+name = "fixedbitset"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "398ea4fabe40b9b0d885340a2a991a44c8a645624075ad966d21f88688e2b69e"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
[[package]]
name = "flate2"
@@ -1579,12 +1775,11 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]]
name = "form_urlencoded"
-version = "1.0.1"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
dependencies = [
- "matches",
- "percent-encoding 2.1.0",
+ "percent-encoding 2.2.0",
]
[[package]]
@@ -1660,9 +1855,9 @@ version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -1730,15 +1925,6 @@ dependencies = [
"regex",
]
-[[package]]
-name = "generic-array"
-version = "0.12.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
-dependencies = [
- "typenum",
-]
-
[[package]]
name = "generic-array"
version = "0.14.6"
@@ -1775,14 +1961,14 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.3"
+version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
+checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
"libc",
- "wasi 0.10.2+wasi-snapshot-preview1",
+ "wasi 0.11.0+wasi-snapshot-preview1",
"wasm-bindgen",
]
@@ -1794,9 +1980,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]]
name = "globset"
-version = "0.4.8"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd"
+checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a"
dependencies = [
"aho-corasick",
"bstr",
@@ -1820,15 +2006,15 @@ dependencies = [
"serde_json",
"simpl",
"smpl_jwt",
- "time 0.3.9",
+ "time 0.3.15",
"tokio",
]
[[package]]
name = "goblin"
-version = "0.5.1"
+version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c955ab4e0ad8c843ea653a3d143048b87490d9be56bd7132a435c2407846ac8f"
+checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143"
dependencies = [
"log",
"plain",
@@ -1837,9 +2023,9 @@ dependencies = [
[[package]]
name = "h2"
-version = "0.3.11"
+version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9f1f717ddc7b2ba36df7e871fd88db79326551d3d6f1fc406fbfd28b582ff8e"
+checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be"
dependencies = [
"bytes",
"fnv",
@@ -1850,7 +2036,7 @@ dependencies = [
"indexmap",
"slab",
"tokio",
- "tokio-util 0.6.9",
+ "tokio-util 0.7.2",
"tracing",
]
@@ -1883,9 +2069,9 @@ dependencies = [
[[package]]
name = "headers"
-version = "0.3.7"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cff78e5788be1e0ab65b04d306b2ed5092c815ec97ec70f4ebd5aee158aa55d"
+checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584"
dependencies = [
"base64 0.13.0",
"bitflags",
@@ -1894,7 +2080,7 @@ dependencies = [
"http",
"httpdate",
"mime",
- "sha-1 0.10.0",
+ "sha1",
]
[[package]]
@@ -1938,9 +2124,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "hidapi"
-version = "1.4.1"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38b1717343691998deb81766bfcd1dce6df0d5d6c37070b5a3de2bb6d39f7822"
+checksum = "9d26e1151deaab68f34fbfd16d491a2a0170cf98d69d3efa23873b567a4199e1"
dependencies = [
"cc",
"libc",
@@ -1969,7 +2155,7 @@ version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
dependencies = [
- "digest 0.10.3",
+ "digest 0.10.5",
]
[[package]]
@@ -1979,7 +2165,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1"
dependencies = [
"digest 0.9.0",
- "generic-array 0.14.6",
+ "generic-array",
"hmac 0.8.1",
]
@@ -1991,7 +2177,7 @@ checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
dependencies = [
"bytes",
"fnv",
- "itoa 1.0.1",
+ "itoa 1.0.4",
]
[[package]]
@@ -2013,15 +2199,15 @@ checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
[[package]]
name = "httparse"
-version = "1.7.1"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
[[package]]
name = "httpdate"
-version = "1.0.1"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
[[package]]
name = "humantime"
@@ -2044,7 +2230,7 @@ dependencies = [
"http-body",
"httparse",
"httpdate",
- "itoa 1.0.1",
+ "itoa 1.0.4",
"pin-project-lite",
"socket2",
"tokio",
@@ -2081,7 +2267,7 @@ dependencies = [
"hyper",
"rustls 0.20.6",
"tokio",
- "tokio-rustls 0.23.3",
+ "tokio-rustls 0.23.4",
]
[[package]]
@@ -2111,17 +2297,28 @@ dependencies = [
[[package]]
name = "iana-time-zone"
-version = "0.1.46"
+version = "0.1.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad2bfd338099682614d3ee3fe0cd72e0b6a41ca6a87f6a74a3bd593c91650501"
+checksum = "f5a6ef98976b22b3b7f2f3a806f858cb862044cfa66805aa3ad84cb3d3b785ed"
dependencies = [
"android_system_properties",
"core-foundation-sys",
+ "iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
"winapi 0.3.9",
]
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fde6edd6cef363e9359ed3c98ba64590ba9eecba2293eb5a723ab32aee8926aa"
+dependencies = [
+ "cxx",
+ "cxx-build",
+]
+
[[package]]
name = "idna"
version = "0.1.5"
@@ -2135,11 +2332,10 @@ dependencies = [
[[package]]
name = "idna"
-version = "0.2.3"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
dependencies = [
- "matches",
"unicode-bidi",
"unicode-normalization",
]
@@ -2157,7 +2353,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9"
dependencies = [
"bitmaps",
- "rand_core 0.6.3",
+ "rand_core 0.6.4",
"rand_xoshiro",
"rayon",
"serde",
@@ -2196,11 +2392,11 @@ dependencies = [
[[package]]
name = "inout"
-version = "0.1.2"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1f03d4ab4d5dc9ec2d219f86c15d2a15fc08239d1cd3b2d6a19717c0a2f443"
+checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
dependencies = [
- "generic-array 0.14.6",
+ "generic-array",
]
[[package]]
@@ -2220,9 +2416,9 @@ checksum = "1ea37f355c05dde75b84bba2d767906ad522e97cd9e2eef2be7a4ab7fb442c06"
[[package]]
name = "ipnet"
-version = "2.3.1"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9"
+checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b"
[[package]]
name = "itertools"
@@ -2241,24 +2437,35 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
[[package]]
name = "itoa"
-version = "1.0.1"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
+checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
+
+[[package]]
+name = "jito-protos"
+version = "1.15.0"
+dependencies = [
+ "bytes",
+ "prost 0.8.0",
+ "prost-types 0.8.0",
+ "tonic 0.5.2",
+ "tonic-build 0.5.2",
+]
[[package]]
name = "jobserver"
-version = "0.1.24"
+version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa"
+checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b"
dependencies = [
"libc",
]
[[package]]
name = "js-sys"
-version = "0.3.59"
+version = "0.3.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2"
+checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47"
dependencies = [
"wasm-bindgen",
]
@@ -2325,9 +2532,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2"
dependencies = [
"proc-macro-crate 0.1.5",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -2390,15 +2597,15 @@ dependencies = [
"log",
"tokio",
"tokio-stream",
- "tokio-util 0.6.9",
+ "tokio-util 0.6.10",
"unicase",
]
[[package]]
name = "keccak"
-version = "0.1.0"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7"
+checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838"
[[package]]
name = "kernel32-sys"
@@ -2424,9 +2631,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
-version = "0.2.131"
+version = "0.2.135"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04c3b4822ccebfa39c02fc03d1534441b22ead323fa0f48bb7ddd8e6ba076a40"
+checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c"
[[package]]
name = "libloading"
@@ -2440,9 +2647,9 @@ dependencies = [
[[package]]
name = "libm"
-version = "0.2.1"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
+checksum = "292a948cd991e376cf75541fe5b97a1081d713c618b4f1b9500f8844e49eb565"
[[package]]
name = "librocksdb-sys"
@@ -2508,20 +2715,29 @@ dependencies = [
[[package]]
name = "libz-sys"
-version = "1.1.3"
+version = "1.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66"
+checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf"
dependencies = [
"cc",
"pkg-config",
"vcpkg",
]
+[[package]]
+name = "link-cplusplus"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369"
+dependencies = [
+ "cc",
+]
+
[[package]]
name = "linked-hash-map"
-version = "0.5.4"
+version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
+checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
[[package]]
name = "linux-raw-sys"
@@ -2531,10 +2747,11 @@ checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d"
[[package]]
name = "lock_api"
-version = "0.4.6"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
dependencies = [
+ "autocfg",
"scopeguard",
]
@@ -2576,12 +2793,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "maplit"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
-
[[package]]
name = "matches"
version = "0.1.9"
@@ -2596,24 +2807,24 @@ checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb"
[[package]]
name = "memchr"
-version = "2.4.1"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "memmap2"
-version = "0.5.3"
+version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f"
+checksum = "95af15f345b17af2efc8ead6080fb8bc376f8cec1b35277b935637595fe77498"
dependencies = [
"libc",
]
[[package]]
name = "memoffset"
-version = "0.6.4"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
dependencies = [
"autocfg",
]
@@ -2626,7 +2837,7 @@ checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d"
dependencies = [
"byteorder",
"keccak",
- "rand_core 0.6.3",
+ "rand_core 0.6.4",
"zeroize",
]
@@ -2644,15 +2855,15 @@ checksum = "2687e6cf9c00f48e9284cf9fd15f2ef341d03cc7743abf9df4c5f07fdee50b18"
[[package]]
name = "minimal-lexical"
-version = "0.1.4"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c64630dcdd71f1a64c435f54885086a0de5d6a12d104d69b165fb7d5286d677"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
-version = "0.5.1"
+version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082"
+checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34"
dependencies = [
"adler",
]
@@ -2695,9 +2906,9 @@ version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -2708,9 +2919,9 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
[[package]]
name = "native-tls"
-version = "0.2.8"
+version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d"
+checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9"
dependencies = [
"lazy_static",
"libc",
@@ -2751,13 +2962,12 @@ dependencies = [
[[package]]
name = "nom"
-version = "7.0.0"
+version = "7.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffd9d26838a953b4af82cbeb9f1592c6798916983959be223a7124e992742c1"
+checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
dependencies = [
"memchr",
"minimal-lexical",
- "version_check",
]
[[package]]
@@ -2768,9 +2978,9 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
[[package]]
name = "ntapi"
-version = "0.3.6"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44"
+checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f"
dependencies = [
"winapi 0.3.9",
]
@@ -2827,16 +3037,16 @@ version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "num-integer"
-version = "0.1.44"
+version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
dependencies = [
"autocfg",
"num-traits",
@@ -2899,17 +3109,17 @@ version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce"
dependencies = [
- "proc-macro-crate 1.1.0",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro-crate 1.2.1",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "num_threads"
-version = "0.1.3"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97ba99ba6393e2c3734791401b66902d981cb03bf190af674ca69949b6d5fb15"
+checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
dependencies = [
"libc",
]
@@ -2931,15 +3141,9 @@ dependencies = [
[[package]]
name = "once_cell"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
-
-[[package]]
-name = "opaque-debug"
-version = "0.2.3"
+version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
+checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
[[package]]
name = "opaque-debug"
@@ -2949,9 +3153,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]]
name = "openssl"
-version = "0.10.41"
+version = "0.10.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0"
+checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13"
dependencies = [
"bitflags",
"cfg-if 1.0.0",
@@ -2968,16 +3172,16 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "openssl-probe"
-version = "0.1.4"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-src"
@@ -2990,9 +3194,9 @@ dependencies = [
[[package]]
name = "openssl-sys"
-version = "0.9.75"
+version = "0.9.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f"
+checksum = "5230151e44c0f05157effb743e8d517472843121cf9243e8b81393edb5acd9ce"
dependencies = [
"autocfg",
"cc",
@@ -3015,7 +3219,7 @@ dependencies = [
"futures-util",
"js-sys",
"lazy_static",
- "percent-encoding 2.1.0",
+ "percent-encoding 2.2.0",
"pin-project",
"rand 0.8.5",
"thiserror",
@@ -3023,35 +3227,31 @@ dependencies = [
[[package]]
name = "os_str_bytes"
-version = "6.0.0"
+version = "6.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64"
-dependencies = [
- "memchr",
-]
+checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
[[package]]
name = "ouroboros"
-version = "0.15.0"
+version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f31a3b678685b150cba82b702dcdc5e155893f63610cf388d30cd988d4ca2bf"
+checksum = "dfbb50b356159620db6ac971c6d5c9ab788c9cc38a6f49619fca2a27acb062ca"
dependencies = [
"aliasable",
"ouroboros_macro",
- "stable_deref_trait",
]
[[package]]
name = "ouroboros_macro"
-version = "0.15.0"
+version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "084fd65d5dd8b3772edccb5ffd1e4b7eba43897ecd0f9401e330e8c542959408"
+checksum = "4a0d9d1a6191c4f391f87219d1ea42b23f09ee84d64763cd05ee6ea88d9f384d"
dependencies = [
"Inflector",
"proc-macro-error",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -3086,7 +3286,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.3",
]
[[package]]
@@ -3105,15 +3305,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.1"
+version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954"
+checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929"
dependencies = [
"cfg-if 1.0.0",
"libc",
"redox_syscall",
"smallvec",
- "windows-sys 0.32.0",
+ "windows-sys",
]
[[package]]
@@ -3131,7 +3331,7 @@ version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
dependencies = [
- "digest 0.10.3",
+ "digest 0.10.5",
]
[[package]]
@@ -3157,9 +3357,9 @@ checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
[[package]]
name = "percent-encoding"
-version = "2.1.0"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
[[package]]
name = "percentage"
@@ -3172,18 +3372,19 @@ dependencies = [
[[package]]
name = "pest"
-version = "2.1.3"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53"
+checksum = "dbc7bc69c062e492337d74d59b120c274fd3d261b6bf6d3207d499b4b379c41a"
dependencies = [
+ "thiserror",
"ucd-trie",
]
[[package]]
name = "pest_derive"
-version = "2.1.0"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0"
+checksum = "60b75706b9642ebcb34dab3bc7750f811609a0eb1dd8b88c2d15bf628c1c65b2"
dependencies = [
"pest",
"pest_generator",
@@ -3191,35 +3392,45 @@ dependencies = [
[[package]]
name = "pest_generator"
-version = "2.1.3"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55"
+checksum = "f4f9272122f5979a6511a749af9db9bfc810393f63119970d7085fed1c4ea0db"
dependencies = [
"pest",
"pest_meta",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "pest_meta"
-version = "2.1.3"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d"
+checksum = "4c8717927f9b79515e565a64fe46c38b8cd0427e64c40680b14a7365ab09ac8d"
dependencies = [
- "maplit",
+ "once_cell",
"pest",
- "sha-1 0.8.2",
+ "sha1",
]
[[package]]
name = "petgraph"
-version = "0.6.0"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7"
+dependencies = [
+ "fixedbitset 0.2.0",
+ "indexmap",
+]
+
+[[package]]
+name = "petgraph"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f"
+checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143"
dependencies = [
- "fixedbitset",
+ "fixedbitset 0.4.2",
"indexmap",
]
@@ -3235,29 +3446,29 @@ dependencies = [
[[package]]
name = "pin-project"
-version = "1.0.8"
+version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08"
+checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
dependencies = [
"pin-project-internal",
]
[[package]]
name = "pin-project-internal"
-version = "1.0.8"
+version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389"
+checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "pin-project-lite"
-version = "0.2.7"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
[[package]]
name = "pin-utils"
@@ -3278,9 +3489,9 @@ dependencies = [
[[package]]
name = "pkg-config"
-version = "0.3.22"
+version = "0.3.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f"
+checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
[[package]]
name = "plain"
@@ -3296,15 +3507,15 @@ checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1"
dependencies = [
"cfg-if 1.0.0",
"cpufeatures",
- "opaque-debug 0.3.0",
+ "opaque-debug",
"universal-hash",
]
[[package]]
name = "ppv-lite86"
-version = "0.2.15"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba"
+checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
[[package]]
name = "predicates"
@@ -3322,15 +3533,15 @@ dependencies = [
[[package]]
name = "predicates-core"
-version = "1.0.2"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57e35a3326b75e49aa85f5dc6ec15b41108cf5aee58eabb1f274dd18b73c2451"
+checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb"
[[package]]
name = "predicates-tree"
-version = "1.0.4"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "338c7be2905b732ae3984a2f40032b5e94fd8f52505b186c7d4d68d193445df7"
+checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032"
dependencies = [
"predicates-core",
"termtree",
@@ -3344,12 +3555,12 @@ checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5"
[[package]]
name = "prettyplease"
-version = "0.1.9"
+version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b83ec2d0af5c5c556257ff52c9f98934e243b9fd39604bfb2a9b75ec2e97f18"
+checksum = "83fead41e178796ef8274dc612a7d8ce4c7e10ca35cd2c5b5ad24cac63aeb6c0"
dependencies = [
- "proc-macro2 1.0.41",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "syn 1.0.102",
]
[[package]]
@@ -3363,10 +3574,11 @@ dependencies = [
[[package]]
name = "proc-macro-crate"
-version = "1.1.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83"
+checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9"
dependencies = [
+ "once_cell",
"thiserror",
"toml",
]
@@ -3378,9 +3590,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
"version_check",
]
@@ -3390,8 +3602,8 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
"version_check",
]
@@ -3406,13 +3618,26 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.41"
+version = "1.0.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdcc2916cde080c1876ff40292a396541241fe0072ef928cd76582e9ea5d60d2"
+checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b"
dependencies = [
"unicode-ident",
]
+[[package]]
+name = "proc-macro2-diagnostics"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada"
+dependencies = [
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+ "version_check",
+ "yansi",
+]
+
[[package]]
name = "proptest"
version = "1.0.0"
@@ -3433,6 +3658,16 @@ dependencies = [
"tempfile",
]
+[[package]]
+name = "prost"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de5e2533f59d08fcf364fd374ebda0692a70bd6d7e66ef97f306f45c6c5d8020"
+dependencies = [
+ "bytes",
+ "prost-derive 0.8.0",
+]
+
[[package]]
name = "prost"
version = "0.9.0"
@@ -3453,6 +3688,24 @@ dependencies = [
"prost-derive 0.11.0",
]
+[[package]]
+name = "prost-build"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "355f634b43cdd80724ee7848f95770e7e70eefa6dcf14fea676216573b8fd603"
+dependencies = [
+ "bytes",
+ "heck 0.3.3",
+ "itertools",
+ "log",
+ "multimap",
+ "petgraph 0.5.1",
+ "prost 0.8.0",
+ "prost-types 0.8.0",
+ "tempfile",
+ "which",
+]
+
[[package]]
name = "prost-build"
version = "0.9.0"
@@ -3465,7 +3718,7 @@ dependencies = [
"lazy_static",
"log",
"multimap",
- "petgraph",
+ "petgraph 0.6.2",
"prost 0.9.0",
"prost-types 0.9.0",
"regex",
@@ -3475,9 +3728,9 @@ dependencies = [
[[package]]
name = "prost-build"
-version = "0.11.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d49d928704208aba2cb1fb022ce1a319bdedcb03caf51ddf82734fa903407762"
+checksum = "7f835c582e6bd972ba8347313300219fed5bfa52caf175298d860b61ff6069bb"
dependencies = [
"bytes",
"heck 0.4.0",
@@ -3485,7 +3738,7 @@ dependencies = [
"lazy_static",
"log",
"multimap",
- "petgraph",
+ "petgraph 0.6.2",
"prost 0.11.0",
"prost-types 0.11.1",
"regex",
@@ -3493,6 +3746,19 @@ dependencies = [
"which",
]
+[[package]]
+name = "prost-derive"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "600d2f334aa05acb02a755e217ef1ab6dea4d51b58b7846588b747edec04efba"
+dependencies = [
+ "anyhow",
+ "itertools",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
[[package]]
name = "prost-derive"
version = "0.9.0"
@@ -3501,9 +3767,9 @@ checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe"
dependencies = [
"anyhow",
"itertools",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -3514,9 +3780,19 @@ checksum = "7345d5f0e08c0536d7ac7229952590239e77abf0a0100a1b1d890add6ea96364"
dependencies = [
"anyhow",
"itertools",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
+[[package]]
+name = "prost-types"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "603bbd6394701d13f3f25aada59c7de9d35a6a5887cfc156181234a44002771b"
+dependencies = [
+ "bytes",
+ "prost 0.8.0",
]
[[package]]
@@ -3541,9 +3817,9 @@ dependencies = [
[[package]]
name = "protobuf-src"
-version = "1.0.5+3.19.3"
+version = "1.1.0+21.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe57f68bf9767f48f8cbcbceb5da21524e2b1330a821c1c2502c447d8043f078"
+checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1"
dependencies = [
"autotools",
]
@@ -3554,7 +3830,7 @@ version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e"
dependencies = [
- "percent-encoding 2.1.0",
+ "percent-encoding 2.2.0",
]
[[package]]
@@ -3571,9 +3847,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
[[package]]
name = "quinn"
-version = "0.8.4"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21afdc492bf2a8688cb386be6605d1163b6ace89afa5e3b529037d2b4334b860"
+checksum = "5b435e71d9bfa0d8889927231970c51fb89c58fa63bffcab117c9c7a41e5ef8f"
dependencies = [
"bytes",
"futures-channel",
@@ -3599,7 +3875,7 @@ dependencies = [
"rand 0.8.5",
"ring",
"rustls 0.20.6",
- "rustls-native-certs",
+ "rustls-native-certs 0.6.2",
"rustls-pemfile 0.2.1",
"slab",
"thiserror",
@@ -3633,11 +3909,11 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.18"
+version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1"
+checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
dependencies = [
- "proc-macro2 1.0.41",
+ "proc-macro2 1.0.46",
]
[[package]]
@@ -3674,7 +3950,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha 0.3.1",
- "rand_core 0.6.3",
+ "rand_core 0.6.4",
]
[[package]]
@@ -3694,7 +3970,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
- "rand_core 0.6.3",
+ "rand_core 0.6.4",
]
[[package]]
@@ -3723,11 +3999,11 @@ dependencies = [
[[package]]
name = "rand_core"
-version = "0.6.3"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
- "getrandom 0.2.3",
+ "getrandom 0.2.7",
]
[[package]]
@@ -3745,7 +4021,7 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f"
dependencies = [
- "rand_core 0.6.3",
+ "rand_core 0.6.4",
]
[[package]]
@@ -3754,7 +4030,7 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa"
dependencies = [
- "rand_core 0.6.3",
+ "rand_core 0.6.4",
]
[[package]]
@@ -3777,9 +4053,9 @@ dependencies = [
[[package]]
name = "rayon-core"
-version = "1.9.2"
+version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4"
+checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
@@ -3791,7 +4067,7 @@ dependencies = [
name = "rbpf-cli"
version = "1.15.0"
dependencies = [
- "clap 3.1.8",
+ "clap 3.2.22",
"serde",
"serde_json",
"solana-bpf-loader-program",
@@ -3803,13 +4079,13 @@ dependencies = [
[[package]]
name = "rcgen"
-version = "0.9.2"
+version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7fa2d386df8533b02184941c76ae2e0d0c1d053f5d43339169d80f21275fc5e"
+checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd"
dependencies = [
"pem",
"ring",
- "time 0.3.9",
+ "time 0.3.15",
"yasna",
]
@@ -3824,21 +4100,22 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.2.10"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
"bitflags",
]
[[package]]
name = "redox_users"
-version = "0.4.0"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
dependencies = [
- "getrandom 0.2.3",
+ "getrandom 0.2.7",
"redox_syscall",
+ "thiserror",
]
[[package]]
@@ -3853,7 +4130,7 @@ dependencies = [
"lru",
"parking_lot 0.11.2",
"smallvec",
- "spin 0.9.2",
+ "spin 0.9.4",
]
[[package]]
@@ -3912,23 +4189,23 @@ dependencies = [
"mime",
"native-tls",
"once_cell",
- "percent-encoding 2.1.0",
+ "percent-encoding 2.2.0",
"pin-project-lite",
"rustls 0.20.6",
- "rustls-pemfile 1.0.0",
+ "rustls-pemfile 1.0.1",
"serde",
"serde_json",
"serde_urlencoded",
"tokio",
"tokio-native-tls",
- "tokio-rustls 0.23.3",
- "tokio-util 0.7.1",
+ "tokio-rustls 0.23.4",
+ "tokio-util 0.7.2",
"tower-service",
- "url 2.2.2",
+ "url 2.3.1",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
- "webpki-roots",
+ "webpki-roots 0.22.5",
"winreg",
]
@@ -3979,22 +4256,13 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
-[[package]]
-name = "rustc_version"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee"
-dependencies = [
- "semver 0.11.0",
-]
-
[[package]]
name = "rustc_version"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [
- "semver 1.0.14",
+ "semver",
]
[[package]]
@@ -4008,16 +4276,16 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.35.9"
+version = "0.35.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72c825b8aa8010eb9ee99b75f05e10180b9278d161583034d7574c9d617aeada"
+checksum = "fbb2fda4666def1433b1b05431ab402e42a1084285477222b72d6c564c417cef"
dependencies = [
"bitflags",
"errno",
"io-lifetimes",
"libc",
"linux-raw-sys",
- "windows-sys 0.36.1",
+ "windows-sys",
]
[[package]]
@@ -4047,12 +4315,24 @@ dependencies = [
[[package]]
name = "rustls-native-certs"
-version = "0.6.1"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca9ebdfa27d3fc180e42879037b5338ab1c040c06affd00d8338598e7800943"
+checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092"
dependencies = [
"openssl-probe",
- "rustls-pemfile 0.2.1",
+ "rustls 0.19.1",
+ "schannel",
+ "security-framework",
+]
+
+[[package]]
+name = "rustls-native-certs"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50"
+dependencies = [
+ "openssl-probe",
+ "rustls-pemfile 1.0.1",
"schannel",
"security-framework",
]
@@ -4068,9 +4348,9 @@ dependencies = [
[[package]]
name = "rustls-pemfile"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9"
+checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55"
dependencies = [
"base64 0.13.0",
]
@@ -4095,9 +4375,9 @@ dependencies = [
[[package]]
name = "ryu"
-version = "1.0.5"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
[[package]]
name = "same-file"
@@ -4110,12 +4390,12 @@ dependencies = [
[[package]]
name = "schannel"
-version = "0.1.19"
+version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75"
+checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2"
dependencies = [
"lazy_static",
- "winapi 0.3.9",
+ "windows-sys",
]
[[package]]
@@ -4124,6 +4404,12 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+[[package]]
+name = "scratch"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898"
+
[[package]]
name = "scroll"
version = "0.11.0"
@@ -4139,9 +4425,9 @@ version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -4166,9 +4452,9 @@ dependencies = [
[[package]]
name = "security-framework"
-version = "2.4.2"
+version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87"
+checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c"
dependencies = [
"bitflags",
"core-foundation",
@@ -4179,23 +4465,14 @@ dependencies = [
[[package]]
name = "security-framework-sys"
-version = "2.4.2"
+version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e"
+checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556"
dependencies = [
"core-foundation-sys",
"libc",
]
-[[package]]
-name = "semver"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6"
-dependencies = [
- "semver-parser",
-]
-
[[package]]
name = "semver"
version = "1.0.14"
@@ -4205,20 +4482,11 @@ dependencies = [
"serde",
]
-[[package]]
-name = "semver-parser"
-version = "0.10.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7"
-dependencies = [
- "pest",
-]
-
[[package]]
name = "serde"
-version = "1.0.144"
+version = "1.0.145"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860"
+checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b"
dependencies = [
"serde_derive",
]
@@ -4234,22 +4502,22 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.144"
+version = "1.0.145"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00"
+checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "serde_json"
-version = "1.0.83"
+version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7"
+checksum = "41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074"
dependencies = [
- "itoa 1.0.1",
+ "itoa 1.0.4",
"ryu",
"serde",
]
@@ -4261,7 +4529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
dependencies = [
"form_urlencoded",
- "itoa 1.0.1",
+ "itoa 1.0.4",
"ryu",
"serde",
]
@@ -4284,7 +4552,7 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92761393ee4dc3ff8f4af487bd58f4307c9329bbedea02cac0089ad9c411e153"
dependencies = [
- "dashmap 5.2.0",
+ "dashmap 5.4.0",
"futures 0.3.24",
"lazy_static",
"log",
@@ -4299,21 +4567,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b6f5d1c3087fb119617cff2966fe3808a80e5eb59a8c1601d5994d66f4346a5"
dependencies = [
"proc-macro-error",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
-]
-
-[[package]]
-name = "sha-1"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
-dependencies = [
- "block-buffer 0.7.3",
- "digest 0.8.1",
- "fake-simd",
- "opaque-debug 0.2.3",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -4326,7 +4582,7 @@ dependencies = [
"cfg-if 1.0.0",
"cpufeatures",
"digest 0.9.0",
- "opaque-debug 0.3.0",
+ "opaque-debug",
]
[[package]]
@@ -4337,7 +4593,18 @@ checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f"
dependencies = [
"cfg-if 1.0.0",
"cpufeatures",
- "digest 0.10.3",
+ "digest 0.10.5",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "digest 0.10.5",
]
[[package]]
@@ -4350,18 +4617,18 @@ dependencies = [
"cfg-if 1.0.0",
"cpufeatures",
"digest 0.9.0",
- "opaque-debug 0.3.0",
+ "opaque-debug",
]
[[package]]
name = "sha2"
-version = "0.10.5"
+version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
dependencies = [
"cfg-if 1.0.0",
"cpufeatures",
- "digest 0.10.3",
+ "digest 0.10.5",
]
[[package]]
@@ -4373,16 +4640,16 @@ dependencies = [
"block-buffer 0.9.0",
"digest 0.9.0",
"keccak",
- "opaque-debug 0.3.0",
+ "opaque-debug",
]
[[package]]
name = "sha3"
-version = "0.10.4"
+version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaedf34ed289ea47c2b741bb72e5357a209512d67bcd4bda44359e5bf0470f56"
+checksum = "e2904bea16a1ae962b483322a1c7b81d976029203aea1f461e51cd7705db7ba9"
dependencies = [
- "digest 0.10.3",
+ "digest 0.10.5",
"keccak",
]
@@ -4422,9 +4689,9 @@ dependencies = [
[[package]]
name = "signature"
-version = "1.4.0"
+version = "1.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788"
+checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
[[package]]
name = "simpl"
@@ -4444,15 +4711,18 @@ dependencies = [
[[package]]
name = "slab"
-version = "0.4.5"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5"
+checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
+dependencies = [
+ "autocfg",
+]
[[package]]
name = "smallvec"
-version = "1.7.0"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
[[package]]
name = "smpl_jwt"
@@ -4467,14 +4737,14 @@ dependencies = [
"serde_derive",
"serde_json",
"simpl",
- "time 0.3.9",
+ "time 0.3.15",
]
[[package]]
name = "socket2"
-version = "0.4.4"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0"
+checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
dependencies = [
"libc",
"winapi 0.3.9",
@@ -4502,7 +4772,7 @@ dependencies = [
"Inflector",
"base64 0.13.0",
"bincode",
- "bs58",
+ "bs58 0.4.0",
"bv",
"lazy_static",
"serde",
@@ -4521,7 +4791,7 @@ dependencies = [
name = "solana-accounts-bench"
version = "1.15.0"
dependencies = [
- "clap 2.33.3",
+ "clap 2.34.0",
"log",
"rayon",
"solana-logger 1.15.0",
@@ -4535,7 +4805,7 @@ dependencies = [
name = "solana-accounts-cluster-bench"
version = "1.15.0"
dependencies = [
- "clap 2.33.3",
+ "clap 2.34.0",
"log",
"rand 0.7.3",
"rayon",
@@ -4568,7 +4838,7 @@ dependencies = [
"log",
"num-derive",
"num-traits",
- "rustc_version 0.4.0",
+ "rustc_version",
"serde",
"solana-frozen-abi 1.15.0",
"solana-frozen-abi-macro 1.15.0",
@@ -4593,7 +4863,7 @@ dependencies = [
name = "solana-banking-bench"
version = "1.15.0"
dependencies = [
- "clap 3.1.8",
+ "clap 3.2.22",
"crossbeam-channel",
"log",
"rand 0.7.3",
@@ -4647,9 +4917,11 @@ dependencies = [
"futures 0.3.24",
"solana-banks-interface",
"solana-client",
+ "solana-gossip",
"solana-runtime",
"solana-sdk 1.15.0",
"solana-send-transaction-service",
+ "solana-streamer",
"solana-tpu-client",
"tarpc",
"tokio",
@@ -4657,11 +4929,26 @@ dependencies = [
"tokio-stream",
]
+[[package]]
+name = "solana-bench-batch-simulate-bundle"
+version = "1.15.0"
+dependencies = [
+ "clap 3.2.22",
+ "env_logger",
+ "log",
+ "num-traits",
+ "rayon",
+ "solana-client",
+ "solana-runtime",
+ "solana-sdk 1.15.0",
+ "solana-transaction-status",
+]
+
[[package]]
name = "solana-bench-streamer"
version = "1.15.0"
dependencies = [
- "clap 3.1.8",
+ "clap 3.2.22",
"crossbeam-channel",
"solana-net-utils",
"solana-streamer",
@@ -4672,7 +4959,7 @@ dependencies = [
name = "solana-bench-tps"
version = "1.15.0"
dependencies = [
- "clap 2.33.3",
+ "clap 2.34.0",
"crossbeam-channel",
"log",
"rand 0.7.3",
@@ -4715,7 +5002,7 @@ dependencies = [
"log",
"rand 0.7.3",
"rayon",
- "rustc_version 0.4.0",
+ "rustc_version",
"serde",
"serde_derive",
"solana-frozen-abi 1.15.0",
@@ -4774,7 +5061,7 @@ name = "solana-cargo-build-bpf"
version = "1.15.0"
dependencies = [
"cargo_metadata",
- "clap 3.1.8",
+ "clap 3.2.22",
"log",
"solana-logger 1.15.0",
"solana-sdk 1.15.0",
@@ -4787,7 +5074,7 @@ dependencies = [
"assert_cmd",
"bzip2",
"cargo_metadata",
- "clap 3.1.8",
+ "clap 3.2.22",
"log",
"predicates",
"regex",
@@ -4803,7 +5090,7 @@ name = "solana-cargo-test-bpf"
version = "1.15.0"
dependencies = [
"cargo_metadata",
- "clap 3.1.8",
+ "clap 3.2.22",
]
[[package]]
@@ -4811,7 +5098,7 @@ name = "solana-cargo-test-sbf"
version = "1.15.0"
dependencies = [
"cargo_metadata",
- "clap 3.1.8",
+ "clap 3.2.22",
]
[[package]]
@@ -4819,7 +5106,7 @@ name = "solana-clap-utils"
version = "1.15.0"
dependencies = [
"chrono",
- "clap 2.33.3",
+ "clap 2.34.0",
"rpassword",
"solana-perf",
"solana-remote-wallet",
@@ -4828,7 +5115,7 @@ dependencies = [
"thiserror",
"tiny-bip39",
"uriparse",
- "url 2.2.2",
+ "url 2.3.1",
]
[[package]]
@@ -4836,7 +5123,7 @@ name = "solana-clap-v3-utils"
version = "1.15.0"
dependencies = [
"chrono",
- "clap 3.1.8",
+ "clap 3.2.22",
"rpassword",
"solana-perf",
"solana-remote-wallet",
@@ -4845,7 +5132,7 @@ dependencies = [
"thiserror",
"tiny-bip39",
"uriparse",
- "url 2.2.2",
+ "url 2.3.1",
]
[[package]]
@@ -4853,8 +5140,8 @@ name = "solana-cli"
version = "1.15.0"
dependencies = [
"bincode",
- "bs58",
- "clap 2.33.3",
+ "bs58 0.4.0",
+ "clap 2.34.0",
"console",
"const_format",
"criterion-stats",
@@ -4865,7 +5152,7 @@ dependencies = [
"num-traits",
"pretty-hex",
"reqwest",
- "semver 1.0.14",
+ "semver",
"serde",
"serde_derive",
"serde_json",
@@ -4910,7 +5197,7 @@ dependencies = [
"serde_yaml",
"solana-clap-utils",
"solana-sdk 1.15.0",
- "url 2.2.2",
+ "url 2.3.1",
]
[[package]]
@@ -4920,13 +5207,13 @@ dependencies = [
"Inflector",
"base64 0.13.0",
"chrono",
- "clap 2.33.3",
+ "clap 2.34.0",
"console",
"ed25519-dalek",
"humantime",
"indicatif",
"pretty-hex",
- "semver 1.0.14",
+ "semver",
"serde",
"serde_json",
"solana-account-decoder",
@@ -5008,28 +5295,37 @@ name = "solana-core"
version = "1.15.0"
dependencies = [
"ahash",
+ "anchor-lang",
"base64 0.13.0",
"bincode",
- "bs58",
+ "bs58 0.4.0",
+ "bytes",
"chrono",
+ "clap 3.2.22",
"crossbeam-channel",
"dashmap 4.0.2",
"eager",
"etcd-client",
"fs_extra",
+ "futures 0.3.24",
+ "futures-util",
"histogram",
+ "indexmap",
"itertools",
+ "jito-protos",
"lazy_static",
"log",
"lru",
"matches",
"min-max-heap",
"num_enum",
+ "prost 0.8.0",
+ "prost-types 0.8.0",
"rand 0.7.3",
"rand_chacha 0.2.2",
"raptorq",
"rayon",
- "rustc_version 0.4.0",
+ "rustc_version",
"serde",
"serde_derive",
"serde_json",
@@ -5068,8 +5364,14 @@ dependencies = [
"tempfile",
"test-case",
"thiserror",
+ "tip-distribution",
+ "tip-payment",
"tokio",
+ "tokio-stream",
+ "tonic 0.5.2",
+ "tonic-build 0.5.2",
"trees",
+ "uuid",
]
[[package]]
@@ -5077,7 +5379,7 @@ name = "solana-dos"
version = "1.15.0"
dependencies = [
"bincode",
- "clap 3.1.8",
+ "clap 3.2.22",
"crossbeam-channel",
"itertools",
"log",
@@ -5154,7 +5456,7 @@ version = "1.15.0"
dependencies = [
"bincode",
"byteorder",
- "clap 2.33.3",
+ "clap 2.34.0",
"crossbeam-channel",
"log",
"serde",
@@ -5172,19 +5474,19 @@ dependencies = [
[[package]]
name = "solana-frozen-abi"
-version = "1.11.5"
+version = "1.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28e4e35bc58c465f161bde764ebce41fdfcb503583cf3a77e0211274cc12b22d"
+checksum = "3f07a997db3dac7b9da06b007d4a8df6dbd8281182e6ebbbd8a56f935f540b0a"
dependencies = [
"ahash",
"blake3",
"block-buffer 0.9.0",
- "bs58",
+ "bs58 0.4.0",
"bv",
"byteorder",
"cc",
"either",
- "generic-array 0.14.6",
+ "generic-array",
"getrandom 0.1.16",
"hashbrown 0.12.3",
"im",
@@ -5192,14 +5494,14 @@ dependencies = [
"log",
"memmap2",
"once_cell",
- "rand_core 0.6.3",
- "rustc_version 0.4.0",
+ "rand_core 0.6.4",
+ "rustc_version",
"serde",
"serde_bytes",
"serde_derive",
"serde_json",
- "sha2 0.10.5",
- "solana-frozen-abi-macro 1.11.5",
+ "sha2 0.10.6",
+ "solana-frozen-abi-macro 1.14.5",
"subtle",
"thiserror",
]
@@ -5211,12 +5513,12 @@ dependencies = [
"ahash",
"blake3",
"block-buffer 0.9.0",
- "bs58",
+ "bs58 0.4.0",
"bv",
"byteorder",
"cc",
"either",
- "generic-array 0.14.6",
+ "generic-array",
"getrandom 0.1.16",
"hashbrown 0.12.3",
"im",
@@ -5224,13 +5526,13 @@ dependencies = [
"log",
"memmap2",
"once_cell",
- "rand_core 0.6.3",
- "rustc_version 0.4.0",
+ "rand_core 0.6.4",
+ "rustc_version",
"serde",
"serde_bytes",
"serde_derive",
"serde_json",
- "sha2 0.10.5",
+ "sha2 0.10.6",
"solana-frozen-abi-macro 1.15.0",
"solana-logger 1.15.0",
"subtle",
@@ -5239,24 +5541,24 @@ dependencies = [
[[package]]
name = "solana-frozen-abi-macro"
-version = "1.11.5"
+version = "1.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "708f837d748e574b1e53b250ab1f4a69ba330bbc10d041d02381165f0f36291a"
+checksum = "dcd7d529da0fa5b3b5ca71645122fc94c2aaf867744497969c109e1d4b8ad02d"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "rustc_version 0.4.0",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "rustc_version",
+ "syn 1.0.102",
]
[[package]]
name = "solana-frozen-abi-macro"
version = "1.15.0"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "rustc_version 0.4.0",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "rustc_version",
+ "syn 1.0.102",
]
[[package]]
@@ -5264,7 +5566,7 @@ name = "solana-genesis"
version = "1.15.0"
dependencies = [
"base64 0.13.0",
- "clap 2.33.3",
+ "clap 2.34.0",
"serde",
"serde_json",
"serde_yaml",
@@ -5304,7 +5606,7 @@ dependencies = [
name = "solana-geyser-plugin-manager"
version = "1.15.0"
dependencies = [
- "bs58",
+ "bs58 0.4.0",
"crossbeam-channel",
"json5",
"libloading",
@@ -5326,7 +5628,7 @@ version = "1.15.0"
dependencies = [
"bincode",
"bv",
- "clap 2.33.3",
+ "clap 2.34.0",
"crossbeam-channel",
"flate2",
"indexmap",
@@ -5340,7 +5642,7 @@ dependencies = [
"rand_chacha 0.2.2",
"rayon",
"regex",
- "rustc_version 0.4.0",
+ "rustc_version",
"serde",
"serde_bytes",
"serde_derive",
@@ -5375,7 +5677,7 @@ dependencies = [
"bincode",
"bzip2",
"chrono",
- "clap 2.33.3",
+ "clap 2.34.0",
"console",
"crossbeam-channel",
"ctrlc",
@@ -5384,7 +5686,7 @@ dependencies = [
"lazy_static",
"nix",
"reqwest",
- "semver 1.0.14",
+ "semver",
"serde",
"serde_yaml",
"solana-clap-utils",
@@ -5395,7 +5697,7 @@ dependencies = [
"solana-version",
"tar",
"tempfile",
- "url 2.2.2",
+ "url 2.3.1",
"winapi 0.3.9",
"winreg",
]
@@ -5404,8 +5706,8 @@ dependencies = [
name = "solana-keygen"
version = "1.15.0"
dependencies = [
- "bs58",
- "clap 3.1.8",
+ "bs58 0.4.0",
+ "clap 3.2.22",
"dirs-next",
"num_cpus",
"solana-clap-v3-utils",
@@ -5423,7 +5725,7 @@ dependencies = [
"assert_matches",
"bincode",
"bitflags",
- "bs58",
+ "bs58 0.4.0",
"byteorder",
"chrono",
"chrono-humanize",
@@ -5445,10 +5747,10 @@ dependencies = [
"rayon",
"reed-solomon-erasure",
"rocksdb",
- "rustc_version 0.4.0",
+ "rustc_version",
"serde",
"serde_bytes",
- "sha2 0.10.5",
+ "sha2 0.10.6",
"solana-account-decoder",
"solana-bpf-loader-program",
"solana-entry",
@@ -5483,10 +5785,10 @@ name = "solana-ledger-tool"
version = "1.15.0"
dependencies = [
"assert_cmd",
- "bs58",
+ "bs58 0.4.0",
"bytecount",
"chrono",
- "clap 2.33.3",
+ "clap 2.34.0",
"crossbeam-channel",
"csv",
"dashmap 4.0.2",
@@ -5555,7 +5857,7 @@ name = "solana-log-analyzer"
version = "1.15.0"
dependencies = [
"byte-unit",
- "clap 3.1.8",
+ "clap 3.2.22",
"serde",
"serde_json",
"solana-logger 1.15.0",
@@ -5564,9 +5866,9 @@ dependencies = [
[[package]]
name = "solana-logger"
-version = "1.11.5"
+version = "1.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7ea6fc68d63d33d862d919d4c8ad7f613ec243ccf6762d595c660020b289b57"
+checksum = "c690a6ae623bdd2d71229880a9f668ff714b5c6a9bc180a1abef4887da8b6f27"
dependencies = [
"env_logger",
"lazy_static",
@@ -5598,7 +5900,7 @@ version = "1.15.0"
name = "solana-merkle-root-bench"
version = "1.15.0"
dependencies = [
- "clap 2.33.3",
+ "clap 2.34.0",
"log",
"solana-logger 1.15.0",
"solana-measure",
@@ -5636,7 +5938,7 @@ dependencies = [
name = "solana-net-shaper"
version = "1.15.0"
dependencies = [
- "clap 3.1.8",
+ "clap 3.2.22",
"rand 0.7.3",
"serde",
"serde_json",
@@ -5648,7 +5950,7 @@ name = "solana-net-utils"
version = "1.15.0"
dependencies = [
"bincode",
- "clap 3.1.8",
+ "clap 3.2.22",
"crossbeam-channel",
"log",
"nix",
@@ -5660,7 +5962,7 @@ dependencies = [
"solana-sdk 1.15.0",
"solana-version",
"tokio",
- "url 2.2.2",
+ "url 2.3.1",
]
[[package]]
@@ -5726,7 +6028,7 @@ dependencies = [
name = "solana-poh-bench"
version = "1.15.0"
dependencies = [
- "clap 3.1.8",
+ "clap 3.2.22",
"log",
"rand 0.7.3",
"rayon",
@@ -5740,9 +6042,9 @@ dependencies = [
[[package]]
name = "solana-program"
-version = "1.11.5"
+version = "1.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdd314d85b171bb20ccdcaf07346a9d52a012b10d84f4706f0628813d002fef8"
+checksum = "f835be7a20e172209538241cdf46451c08b38eaaca65cf16e65658700c447b17"
dependencies = [
"base64 0.13.0",
"bincode",
@@ -5750,14 +6052,14 @@ dependencies = [
"blake3",
"borsh",
"borsh-derive",
- "bs58",
+ "bs58 0.4.0",
"bv",
"bytemuck",
"cc",
"console_error_panic_hook",
"console_log",
"curve25519-dalek",
- "getrandom 0.2.3",
+ "getrandom 0.2.7",
"itertools",
"js-sys",
"lazy_static",
@@ -5770,17 +6072,17 @@ dependencies = [
"parking_lot 0.12.1",
"rand 0.7.3",
"rand_chacha 0.2.2",
- "rustc_version 0.4.0",
+ "rustc_version",
"rustversion",
"serde",
"serde_bytes",
"serde_derive",
"serde_json",
- "sha2 0.10.5",
- "sha3 0.10.4",
- "solana-frozen-abi 1.11.5",
- "solana-frozen-abi-macro 1.11.5",
- "solana-sdk-macro 1.11.5",
+ "sha2 0.10.6",
+ "sha3 0.10.5",
+ "solana-frozen-abi 1.14.5",
+ "solana-frozen-abi-macro 1.14.5",
+ "solana-sdk-macro 1.14.5",
"thiserror",
"tiny-bip39",
"wasm-bindgen",
@@ -5799,14 +6101,14 @@ dependencies = [
"blake3",
"borsh",
"borsh-derive",
- "bs58",
+ "bs58 0.4.0",
"bv",
"bytemuck",
"cc",
"console_error_panic_hook",
"console_log",
"curve25519-dalek",
- "getrandom 0.2.3",
+ "getrandom 0.2.7",
"itertools",
"js-sys",
"lazy_static",
@@ -5819,14 +6121,14 @@ dependencies = [
"parking_lot 0.12.1",
"rand 0.7.3",
"rand_chacha 0.2.2",
- "rustc_version 0.4.0",
+ "rustc_version",
"rustversion",
"serde",
"serde_bytes",
"serde_derive",
"serde_json",
- "sha2 0.10.5",
- "sha3 0.10.4",
+ "sha2 0.10.6",
+ "sha3 0.10.5",
"solana-frozen-abi 1.15.0",
"solana-frozen-abi-macro 1.15.0",
"solana-logger 1.15.0",
@@ -5853,7 +6155,7 @@ dependencies = [
"num-derive",
"num-traits",
"rand 0.7.3",
- "rustc_version 0.4.0",
+ "rustc_version",
"serde",
"solana-frozen-abi 1.15.0",
"solana-frozen-abi-macro 1.15.0",
@@ -5897,7 +6199,7 @@ dependencies = [
"futures-util",
"log",
"reqwest",
- "semver 1.0.14",
+ "semver",
"serde",
"serde_derive",
"serde_json",
@@ -5909,7 +6211,7 @@ dependencies = [
"tokio-stream",
"tokio-tungstenite",
"tungstenite",
- "url 2.2.2",
+ "url 2.3.1",
]
[[package]]
@@ -5943,7 +6245,7 @@ dependencies = [
"num-traits",
"parking_lot 0.12.1",
"qstring",
- "semver 1.0.14",
+ "semver",
"solana-sdk 1.15.0",
"thiserror",
"uriparse",
@@ -5955,7 +6257,7 @@ version = "1.15.0"
dependencies = [
"base64 0.13.0",
"bincode",
- "bs58",
+ "bs58 0.4.0",
"crossbeam-channel",
"dashmap 4.0.2",
"itertools",
@@ -6002,7 +6304,7 @@ dependencies = [
"symlink",
"thiserror",
"tokio",
- "tokio-util 0.6.9",
+ "tokio-util 0.6.10",
]
[[package]]
@@ -6013,7 +6315,7 @@ dependencies = [
"async-trait",
"base64 0.13.0",
"bincode",
- "bs58",
+ "bs58 0.4.0",
"crossbeam-channel",
"futures 0.3.24",
"indicatif",
@@ -6021,7 +6323,7 @@ dependencies = [
"jsonrpc-http-server",
"log",
"reqwest",
- "semver 1.0.14",
+ "semver",
"serde",
"serde_derive",
"serde_json",
@@ -6039,10 +6341,10 @@ name = "solana-rpc-client-api"
version = "1.15.0"
dependencies = [
"base64 0.13.0",
- "bs58",
+ "bs58 0.4.0",
"jsonrpc-core",
"reqwest",
- "semver 1.0.14",
+ "semver",
"serde",
"serde_derive",
"serde_json",
@@ -6059,7 +6361,7 @@ name = "solana-rpc-client-nonce-utils"
version = "1.15.0"
dependencies = [
"anyhow",
- "clap 2.33.3",
+ "clap 2.34.0",
"futures 0.3.24",
"serde_json",
"solana-account-decoder",
@@ -6076,7 +6378,7 @@ name = "solana-rpc-test"
version = "1.15.0"
dependencies = [
"bincode",
- "bs58",
+ "bs58 0.4.0",
"crossbeam-channel",
"futures-util",
"log",
@@ -6133,7 +6435,7 @@ dependencies = [
"rand_chacha 0.2.2",
"rayon",
"regex",
- "rustc_version 0.4.0",
+ "rustc_version",
"serde",
"serde_derive",
"solana-address-lookup-table-program",
@@ -6164,24 +6466,24 @@ dependencies = [
[[package]]
name = "solana-sdk"
-version = "1.11.5"
+version = "1.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad7d954df63b267857e26670e3aacfd8e2943ca703653b0418e5afc85046c2f3"
+checksum = "f74e8d699c3a441a5b0cd94c718e75b25c1a4295c2180a714b12fb1bcf66a51e"
dependencies = [
"assert_matches",
"base64 0.13.0",
"bincode",
"bitflags",
"borsh",
- "bs58",
+ "bs58 0.4.0",
"bytemuck",
"byteorder",
"chrono",
"derivation-path",
- "digest 0.10.3",
+ "digest 0.10.5",
"ed25519-dalek",
"ed25519-dalek-bip32",
- "generic-array 0.14.6",
+ "generic-array",
"hmac 0.12.1",
"itertools",
"js-sys",
@@ -6195,19 +6497,19 @@ dependencies = [
"qstring",
"rand 0.7.3",
"rand_chacha 0.2.2",
- "rustc_version 0.4.0",
+ "rustc_version",
"rustversion",
"serde",
"serde_bytes",
"serde_derive",
"serde_json",
- "sha2 0.10.5",
- "sha3 0.10.4",
- "solana-frozen-abi 1.11.5",
- "solana-frozen-abi-macro 1.11.5",
- "solana-logger 1.11.5",
- "solana-program 1.11.5",
- "solana-sdk-macro 1.11.5",
+ "sha2 0.10.6",
+ "sha3 0.10.5",
+ "solana-frozen-abi 1.14.5",
+ "solana-frozen-abi-macro 1.14.5",
+ "solana-logger 1.14.5",
+ "solana-program 1.14.5",
+ "solana-sdk-macro 1.14.5",
"thiserror",
"uriparse",
"wasm-bindgen",
@@ -6217,22 +6519,23 @@ dependencies = [
name = "solana-sdk"
version = "1.15.0"
dependencies = [
+ "anchor-lang",
"anyhow",
"assert_matches",
"base64 0.13.0",
"bincode",
"bitflags",
"borsh",
- "bs58",
+ "bs58 0.4.0",
"bytemuck",
"byteorder",
"chrono",
"curve25519-dalek",
"derivation-path",
- "digest 0.10.3",
+ "digest 0.10.5",
"ed25519-dalek",
"ed25519-dalek-bip32",
- "generic-array 0.14.6",
+ "generic-array",
"hex",
"hmac 0.12.1",
"itertools",
@@ -6247,14 +6550,14 @@ dependencies = [
"qstring",
"rand 0.7.3",
"rand_chacha 0.2.2",
- "rustc_version 0.4.0",
+ "rustc_version",
"rustversion",
"serde",
"serde_bytes",
"serde_derive",
"serde_json",
- "sha2 0.10.5",
- "sha3 0.10.4",
+ "sha2 0.10.6",
+ "sha3 0.10.5",
"solana-frozen-abi 1.15.0",
"solana-frozen-abi-macro 1.15.0",
"solana-logger 1.15.0",
@@ -6264,31 +6567,32 @@ dependencies = [
"thiserror",
"tiny-bip39",
"uriparse",
+ "uuid",
"wasm-bindgen",
]
[[package]]
name = "solana-sdk-macro"
-version = "1.11.5"
+version = "1.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0d9e81bc46edcc517b2df504856d57a5101c7586ec63f3143ae11fbe2eba613"
+checksum = "92ffde9b5b7313629780baca10eaffec7421d53be725c76031ca409a5298705c"
dependencies = [
- "bs58",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
+ "bs58 0.4.0",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
"rustversion",
- "syn 1.0.98",
+ "syn 1.0.102",
]
[[package]]
name = "solana-sdk-macro"
version = "1.15.0"
dependencies = [
- "bs58",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
+ "bs58 0.4.0",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
"rustversion",
- "syn 1.0.98",
+ "syn 1.0.102",
]
[[package]]
@@ -6297,11 +6601,13 @@ version = "1.15.0"
dependencies = [
"crossbeam-channel",
"log",
+ "solana-gossip",
"solana-logger 1.15.0",
"solana-measure",
"solana-metrics",
"solana-runtime",
"solana-sdk 1.15.0",
+ "solana-streamer",
"solana-tpu-client",
]
@@ -6309,7 +6615,7 @@ dependencies = [
name = "solana-stake-accounts"
version = "1.15.0"
dependencies = [
- "clap 2.33.3",
+ "clap 2.34.0",
"solana-clap-utils",
"solana-cli-config",
"solana-remote-wallet",
@@ -6328,7 +6634,7 @@ dependencies = [
"bincode",
"log",
"proptest",
- "rustc_version 0.4.0",
+ "rustc_version",
"solana-config-program",
"solana-logger 1.15.0",
"solana-program-runtime",
@@ -6365,7 +6671,7 @@ dependencies = [
"solana-transaction-status",
"thiserror",
"tokio",
- "tonic 0.8.0",
+ "tonic 0.8.2",
"zstd",
]
@@ -6374,7 +6680,7 @@ name = "solana-storage-proto"
version = "1.15.0"
dependencies = [
"bincode",
- "bs58",
+ "bs58 0.4.0",
"enum-iterator",
"prost 0.11.0",
"protobuf-src",
@@ -6382,14 +6688,14 @@ dependencies = [
"solana-account-decoder",
"solana-sdk 1.15.0",
"solana-transaction-status",
- "tonic-build 0.8.0",
+ "tonic-build 0.8.2",
]
[[package]]
name = "solana-store-tool"
version = "1.15.0"
dependencies = [
- "clap 2.33.3",
+ "clap 2.34.0",
"log",
"solana-logger 1.15.0",
"solana-runtime",
@@ -6431,7 +6737,7 @@ dependencies = [
name = "solana-sys-tuner"
version = "1.15.0"
dependencies = [
- "clap 2.33.3",
+ "clap 2.34.0",
"libc",
"log",
"nix",
@@ -6482,13 +6788,41 @@ dependencies = [
"solana-tpu-client",
]
+[[package]]
+name = "solana-tip-distributor"
+version = "1.15.0"
+dependencies = [
+ "anchor-lang",
+ "bigdecimal",
+ "clap 3.2.22",
+ "env_logger",
+ "futures 0.3.24",
+ "im",
+ "itertools",
+ "log",
+ "num-traits",
+ "serde",
+ "serde_json",
+ "solana-client",
+ "solana-genesis-utils",
+ "solana-ledger",
+ "solana-merkle-tree",
+ "solana-program 1.15.0",
+ "solana-runtime",
+ "solana-sdk 1.15.0",
+ "solana-stake-program",
+ "thiserror",
+ "tip-distribution",
+ "tokio",
+]
+
[[package]]
name = "solana-tokens"
version = "1.15.0"
dependencies = [
"bincode",
"chrono",
- "clap 2.33.3",
+ "clap 2.34.0",
"console",
"csv",
"ctrlc",
@@ -6556,7 +6890,7 @@ name = "solana-transaction-dos"
version = "1.15.0"
dependencies = [
"bincode",
- "clap 2.33.3",
+ "clap 2.34.0",
"log",
"rand 0.7.3",
"rayon",
@@ -6586,7 +6920,7 @@ dependencies = [
"base64 0.13.0",
"bincode",
"borsh",
- "bs58",
+ "bs58 0.4.0",
"lazy_static",
"log",
"serde",
@@ -6623,7 +6957,7 @@ name = "solana-validator"
version = "1.15.0"
dependencies = [
"chrono",
- "clap 2.33.3",
+ "clap 2.34.0",
"console",
"core_affinity",
"crossbeam-channel",
@@ -6672,6 +7006,7 @@ dependencies = [
"solana-vote-program",
"symlink",
"tikv-jemallocator",
+ "tonic 0.5.2",
]
[[package]]
@@ -6679,8 +7014,8 @@ name = "solana-version"
version = "1.15.0"
dependencies = [
"log",
- "rustc_version 0.4.0",
- "semver 1.0.14",
+ "rustc_version",
+ "semver",
"serde",
"serde_derive",
"solana-frozen-abi 1.15.0",
@@ -6696,7 +7031,7 @@ dependencies = [
"log",
"num-derive",
"num-traits",
- "rustc_version 0.4.0",
+ "rustc_version",
"serde",
"serde_derive",
"solana-frozen-abi 1.15.0",
@@ -6713,7 +7048,7 @@ dependencies = [
name = "solana-watchtower"
version = "1.15.0"
dependencies = [
- "clap 2.33.3",
+ "clap 2.34.0",
"humantime",
"log",
"solana-clap-utils",
@@ -6743,9 +7078,9 @@ dependencies = [
[[package]]
name = "solana-zk-token-sdk"
-version = "1.11.5"
+version = "1.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62415c05a9ebfffaf8befaa61b24492ebf88269cf84cbeba714bac4125ec4ea3"
+checksum = "0a23a2c443027e8cc2981131a38928cb37e554970c497b5735e888049cc85d3f"
dependencies = [
"aes-gcm-siv",
"arrayref",
@@ -6756,6 +7091,7 @@ dependencies = [
"cipher 0.4.3",
"curve25519-dalek",
"getrandom 0.1.16",
+ "itertools",
"lazy_static",
"merlin",
"num-derive",
@@ -6764,8 +7100,8 @@ dependencies = [
"serde",
"serde_json",
"sha3 0.9.1",
- "solana-program 1.11.5",
- "solana-sdk 1.11.5",
+ "solana-program 1.14.5",
+ "solana-sdk 1.14.5",
"subtle",
"thiserror",
"zeroize",
@@ -6826,9 +7162,9 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]]
name = "spin"
-version = "0.9.2"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5"
+checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09"
[[package]]
name = "spki"
@@ -6850,7 +7186,7 @@ dependencies = [
"borsh",
"num-derive",
"num-traits",
- "solana-program 1.11.5",
+ "solana-program 1.14.5",
"spl-token",
"spl-token-2022",
"thiserror",
@@ -6862,7 +7198,7 @@ version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325"
dependencies = [
- "solana-program 1.11.5",
+ "solana-program 1.14.5",
]
[[package]]
@@ -6876,7 +7212,7 @@ dependencies = [
"num-derive",
"num-traits",
"num_enum",
- "solana-program 1.11.5",
+ "solana-program 1.14.5",
"thiserror",
]
@@ -6891,19 +7227,13 @@ dependencies = [
"num-derive",
"num-traits",
"num_enum",
- "solana-program 1.11.5",
- "solana-zk-token-sdk 1.11.5",
+ "solana-program 1.14.5",
+ "solana-zk-token-sdk 1.14.5",
"spl-memo",
"spl-token",
"thiserror",
]
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
-
[[package]]
name = "static_assertions"
version = "1.1.0"
@@ -6935,24 +7265,24 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "strum"
-version = "0.24.0"
+version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8"
+checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
dependencies = [
"strum_macros",
]
[[package]]
name = "strum_macros"
-version = "0.24.0"
+version = "0.24.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef"
+checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59"
dependencies = [
"heck 0.4.0",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
"rustversion",
- "syn 1.0.98",
+ "syn 1.0.102",
]
[[package]]
@@ -6980,12 +7310,12 @@ dependencies = [
[[package]]
name = "syn"
-version = "1.0.98"
+version = "1.0.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd"
+checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
"unicode-ident",
]
@@ -7001,10 +7331,10 @@ version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
- "unicode-xid 0.2.2",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
+ "unicode-xid 0.2.4",
]
[[package]]
@@ -7019,9 +7349,9 @@ dependencies = [
[[package]]
name = "sysctl"
-version = "0.4.4"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1123645dfaf2b5eac6b6c88addafc359c789b8ef2a770ecaef758c1ddf363ea4"
+checksum = "225e483f02d0ad107168dc57381a8a40c3aeea6abe47f37506931f861643cfa8"
dependencies = [
"bitflags",
"byteorder",
@@ -7032,15 +7362,15 @@ dependencies = [
[[package]]
name = "systemstat"
-version = "0.2.0"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79ef8054a60d76603befaecaf7efe08d32d1a05a1e5df70c547b07507e9e262d"
+checksum = "795b3ce9d477f1e022df48a26626c1deff9ff6cadcf2b7d6cc782b13895c3d4c"
dependencies = [
"bytesize",
"lazy_static",
"libc",
"nom",
- "time 0.3.9",
+ "time 0.3.15",
"winapi 0.3.9",
]
@@ -7074,7 +7404,7 @@ dependencies = [
"thiserror",
"tokio",
"tokio-serde",
- "tokio-util 0.6.9",
+ "tokio-util 0.6.10",
"tracing",
"tracing-opentelemetry",
]
@@ -7085,9 +7415,9 @@ version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -7106,9 +7436,9 @@ dependencies = [
[[package]]
name = "termcolor"
-version = "1.1.2"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
+checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
dependencies = [
"winapi-util",
]
@@ -7125,30 +7455,30 @@ dependencies = [
[[package]]
name = "termtree"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16"
+checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b"
[[package]]
name = "test-case"
-version = "2.1.0"
+version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "196e8a70562e252cc51eaaaee3ecddc39803d9b7fd4a772b7c7dae7cdf42a859"
+checksum = "21d6cf5a7dffb3f9dceec8e6b8ca528d9bd71d36c9f074defb548ce161f598c0"
dependencies = [
"test-case-macros",
]
[[package]]
name = "test-case-macros"
-version = "2.1.0"
+version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8dd461f47ade621665c9f4e44b20449341769911c253275dc5cb03726cbb852c"
+checksum = "e45b7bf6e19353ddd832745c8fcf77a17a93171df7151187f26623f2b75b5b26"
dependencies = [
"cfg-if 1.0.0",
"proc-macro-error",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -7162,28 +7492,28 @@ dependencies = [
[[package]]
name = "textwrap"
-version = "0.15.0"
+version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
+checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16"
[[package]]
name = "thiserror"
-version = "1.0.31"
+version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a"
+checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.31"
+version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a"
+checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -7203,9 +7533,9 @@ dependencies = [
[[package]]
name = "tikv-jemalloc-sys"
-version = "0.4.2+5.2.1-patched.2"
+version = "0.4.3+5.2.1-patched.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5844e429d797c62945a566f8da4e24c7fe3fbd5d6617fd8bf7a0b7dc1ee0f22e"
+checksum = "a1792ccb507d955b46af42c123ea8863668fae24d03721e40cad6a41773dbb49"
dependencies = [
"cc",
"fs_extra",
@@ -7214,9 +7544,9 @@ dependencies = [
[[package]]
name = "tikv-jemallocator"
-version = "0.4.1"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c14a5a604eb8715bc5785018a37d00739b180bcf609916ddf4393d33d49ccdf"
+checksum = "a5b7bcecfafe4998587d636f9ae9d55eb9d0499877b88757767c346875067098"
dependencies = [
"libc",
"tikv-jemalloc-sys",
@@ -7224,21 +7554,22 @@ dependencies = [
[[package]]
name = "time"
-version = "0.1.43"
+version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
dependencies = [
"libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
"winapi 0.3.9",
]
[[package]]
name = "time"
-version = "0.3.9"
+version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd"
+checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c"
dependencies = [
- "itoa 1.0.1",
+ "itoa 1.0.4",
"libc",
"num_threads",
"time-macros",
@@ -7271,9 +7602,9 @@ dependencies = [
[[package]]
name = "tinyvec"
-version = "1.5.0"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
dependencies = [
"tinyvec_macros",
]
@@ -7284,6 +7615,21 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+[[package]]
+name = "tip-distribution"
+version = "0.1.0"
+dependencies = [
+ "anchor-lang",
+ "solana-program 1.15.0",
+]
+
+[[package]]
+name = "tip-payment"
+version = "0.1.0"
+dependencies = [
+ "anchor-lang",
+]
+
[[package]]
name = "tokio"
version = "1.14.1"
@@ -7306,9 +7652,9 @@ dependencies = [
[[package]]
name = "tokio-io-timeout"
-version = "1.1.1"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90c49f106be240de154571dd31fbe48acb10ba6c6dd6f6517ad603abffa42de9"
+checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
dependencies = [
"pin-project-lite",
"tokio",
@@ -7316,13 +7662,13 @@ dependencies = [
[[package]]
name = "tokio-macros"
-version = "1.7.0"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7"
+checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
@@ -7348,9 +7694,9 @@ dependencies = [
[[package]]
name = "tokio-rustls"
-version = "0.23.3"
+version = "0.23.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4151fda0cf2798550ad0b34bcfc9b9dcc2a9d2471c895c68f3a8818e54f2389e"
+checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
dependencies = [
"rustls 0.20.6",
"tokio",
@@ -7375,9 +7721,9 @@ dependencies = [
[[package]]
name = "tokio-stream"
-version = "0.1.9"
+version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9"
+checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce"
dependencies = [
"futures-core",
"pin-project-lite",
@@ -7394,17 +7740,17 @@ dependencies = [
"log",
"rustls 0.20.6",
"tokio",
- "tokio-rustls 0.23.3",
+ "tokio-rustls 0.23.4",
"tungstenite",
"webpki 0.22.0",
- "webpki-roots",
+ "webpki-roots 0.22.5",
]
[[package]]
name = "tokio-util"
-version = "0.6.9"
+version = "0.6.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0"
+checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507"
dependencies = [
"bytes",
"futures-core",
@@ -7418,9 +7764,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.1"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764"
+checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c"
dependencies = [
"bytes",
"futures-core",
@@ -7432,13 +7778,47 @@ dependencies = [
[[package]]
name = "toml"
-version = "0.5.8"
+version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
+checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
dependencies = [
"serde",
]
+[[package]]
+name = "tonic"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "796c5e1cd49905e65dd8e700d4cb1dffcbfdb4fc9d017de08c1a537afd83627c"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "base64 0.13.0",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-timeout",
+ "percent-encoding 2.2.0",
+ "pin-project",
+ "prost 0.8.0",
+ "prost-derive 0.8.0",
+ "rustls-native-certs 0.5.0",
+ "tokio",
+ "tokio-rustls 0.22.0",
+ "tokio-stream",
+ "tokio-util 0.6.10",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+ "tracing-futures",
+ "webpki-roots 0.21.1",
+]
+
[[package]]
name = "tonic"
version = "0.6.2"
@@ -7456,14 +7836,14 @@ dependencies = [
"http-body",
"hyper",
"hyper-timeout",
- "percent-encoding 2.1.0",
+ "percent-encoding 2.2.0",
"pin-project",
"prost 0.9.0",
"prost-derive 0.9.0",
"tokio",
"tokio-rustls 0.22.0",
"tokio-stream",
- "tokio-util 0.6.9",
+ "tokio-util 0.6.10",
"tower",
"tower-layer",
"tower-service",
@@ -7473,9 +7853,9 @@ dependencies = [
[[package]]
name = "tonic"
-version = "0.8.0"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "498f271adc46acce75d66f639e4d35b31b2394c295c82496727dafa16d465dd2"
+checksum = "55b9af819e54b8f33d453655bef9b9acc171568fb49523078d0cc4e7484200ec"
dependencies = [
"async-stream",
"async-trait",
@@ -7489,15 +7869,15 @@ dependencies = [
"http-body",
"hyper",
"hyper-timeout",
- "percent-encoding 2.1.0",
+ "percent-encoding 2.2.0",
"pin-project",
"prost 0.11.0",
"prost-derive 0.11.0",
- "rustls-pemfile 1.0.0",
+ "rustls-pemfile 1.0.1",
"tokio",
- "tokio-rustls 0.23.3",
+ "tokio-rustls 0.23.4",
"tokio-stream",
- "tokio-util 0.7.1",
+ "tokio-util 0.7.2",
"tower",
"tower-layer",
"tower-service",
@@ -7505,36 +7885,48 @@ dependencies = [
"tracing-futures",
]
+[[package]]
+name = "tonic-build"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12b52d07035516c2b74337d2ac7746075e7dcae7643816c1b12c5ff8a7484c08"
+dependencies = [
+ "proc-macro2 1.0.46",
+ "prost-build 0.8.0",
+ "quote 1.0.21",
+ "syn 1.0.102",
+]
+
[[package]]
name = "tonic-build"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757"
dependencies = [
- "proc-macro2 1.0.41",
+ "proc-macro2 1.0.46",
"prost-build 0.9.0",
- "quote 1.0.18",
- "syn 1.0.98",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "tonic-build"
-version = "0.8.0"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fbcd2800e34e743b9ae795867d5f77b535d3a3be69fd731e39145719752df8c"
+checksum = "48c6fd7c2581e36d63388a9e04c350c21beb7a8b059580b2e93993c526899ddc"
dependencies = [
"prettyplease",
- "proc-macro2 1.0.41",
- "prost-build 0.11.0",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "prost-build 0.11.1",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "tower"
-version = "0.4.12"
+version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a89fd63ad6adf737582df5db40d286574513c69a11dac5214dc3b5603d6713e"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
dependencies = [
"futures-core",
"futures-util",
@@ -7544,7 +7936,7 @@ dependencies = [
"rand 0.8.5",
"slab",
"tokio",
- "tokio-util 0.7.1",
+ "tokio-util 0.7.2",
"tower-layer",
"tower-service",
"tracing",
@@ -7552,9 +7944,9 @@ dependencies = [
[[package]]
name = "tower-http"
-version = "0.2.5"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8"
+checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba"
dependencies = [
"bitflags",
"bytes",
@@ -7571,21 +7963,21 @@ dependencies = [
[[package]]
name = "tower-layer"
-version = "0.3.1"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62"
+checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
[[package]]
name = "tower-service"
-version = "0.3.1"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
[[package]]
name = "tracing"
-version = "0.1.29"
+version = "0.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
dependencies = [
"cfg-if 1.0.0",
"log",
@@ -7596,22 +7988,23 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.18"
+version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e"
+checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
]
[[package]]
name = "tracing-core"
-version = "0.1.21"
+version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
dependencies = [
- "lazy_static",
+ "once_cell",
+ "valuable",
]
[[package]]
@@ -7626,10 +8019,11 @@ dependencies = [
[[package]]
name = "tracing-opentelemetry"
-version = "0.17.2"
+version = "0.17.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f9378e96a9361190ae297e7f3a8ff644aacd2897f244b1ff81f381669196fa6"
+checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f"
dependencies = [
+ "once_cell",
"opentelemetry",
"tracing",
"tracing-core",
@@ -7638,9 +8032,9 @@ dependencies = [
[[package]]
name = "tracing-subscriber"
-version = "0.3.7"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5312f325fe3588e277415f5a6cca1f4ccad0f248c4cd5a4bd33032d7286abc22"
+checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
dependencies = [
"sharded-slab",
"thread_local",
@@ -7675,10 +8069,10 @@ dependencies = [
"rustls 0.20.6",
"sha-1 0.10.0",
"thiserror",
- "url 2.2.2",
+ "url 2.3.1",
"utf-8",
"webpki 0.22.0",
- "webpki-roots",
+ "webpki-roots 0.22.5",
]
[[package]]
@@ -7689,9 +8083,9 @@ checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
[[package]]
name = "ucd-trie"
-version = "0.1.3"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
+checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81"
[[package]]
name = "unicase"
@@ -7704,36 +8098,36 @@ dependencies = [
[[package]]
name = "unicode-bidi"
-version = "0.3.7"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
+checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
[[package]]
name = "unicode-ident"
-version = "1.0.2"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7"
+checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
[[package]]
name = "unicode-normalization"
-version = "0.1.19"
+version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
dependencies = [
"tinyvec",
]
[[package]]
name = "unicode-segmentation"
-version = "1.9.0"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99"
+checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a"
[[package]]
name = "unicode-width"
-version = "0.1.9"
+version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
[[package]]
name = "unicode-xid"
@@ -7743,9 +8137,9 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
[[package]]
name = "unicode-xid"
-version = "0.2.2"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]]
name = "universal-hash"
@@ -7753,7 +8147,7 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05"
dependencies = [
- "generic-array 0.14.6",
+ "generic-array",
"subtle",
]
@@ -7804,14 +8198,13 @@ dependencies = [
[[package]]
name = "url"
-version = "2.2.2"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
dependencies = [
"form_urlencoded",
- "idna 0.2.3",
- "matches",
- "percent-encoding 2.1.0",
+ "idna 0.3.0",
+ "percent-encoding 2.2.0",
]
[[package]]
@@ -7832,9 +8225,25 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
name = "utf8-width"
-version = "0.1.5"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1"
+
+[[package]]
+name = "uuid"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "feb41e78f93363bb2df8b0e86a2ca30eed7806ea16ea0c790d757cf93f79be83"
+dependencies = [
+ "getrandom 0.2.7",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cf7d77f457ef8dfa11e4cd5933c5ddb5dc52a94664071951219a97710f0a32b"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]]
name = "vcpkg"
@@ -7850,9 +8259,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "version_check"
-version = "0.9.3"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "void"
@@ -7898,15 +8307,21 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]]
name = "wasi"
-version = "0.10.2+wasi-snapshot-preview1"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.82"
+version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d"
+checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268"
dependencies = [
"cfg-if 1.0.0",
"wasm-bindgen-macro",
@@ -7914,24 +8329,24 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.82"
+version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f"
+checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142"
dependencies = [
"bumpalo",
"log",
"once_cell",
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.28"
+version = "0.4.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39"
+checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
@@ -7941,38 +8356,38 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.82"
+version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602"
+checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
dependencies = [
- "quote 1.0.18",
+ "quote 1.0.21",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.82"
+version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da"
+checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.82"
+version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a"
+checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f"
[[package]]
name = "web-sys"
-version = "0.3.55"
+version = "0.3.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb"
+checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -8000,22 +8415,31 @@ dependencies = [
[[package]]
name = "webpki-roots"
-version = "0.22.1"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940"
+dependencies = [
+ "webpki 0.21.4",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c475786c6f47219345717a043a37ec04cb4bc185e28853adcc4fa0a947eba630"
+checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be"
dependencies = [
"webpki 0.22.0",
]
[[package]]
name = "which"
-version = "4.2.2"
+version = "4.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea187a8ef279bc014ec368c27a920da2024d2a711109bfbe3440585d5cf27ad9"
+checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b"
dependencies = [
"either",
- "lazy_static",
"libc",
+ "once_cell",
]
[[package]]
@@ -8061,86 +8485,43 @@ 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.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
dependencies = [
- "windows_aarch64_msvc 0.36.1",
- "windows_i686_gnu 0.36.1",
- "windows_i686_msvc 0.36.1",
- "windows_x86_64_gnu 0.36.1",
- "windows_x86_64_msvc 0.36.1",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_msvc",
]
-[[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.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
-[[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.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
-[[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.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
-[[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.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
-[[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.36.1"
@@ -8171,14 +8552,14 @@ dependencies = [
"oid-registry",
"rusticata-macros",
"thiserror",
- "time 0.3.9",
+ "time 0.3.15",
]
[[package]]
name = "xattr"
-version = "0.2.2"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c"
+checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc"
dependencies = [
"libc",
]
@@ -8192,13 +8573,19 @@ dependencies = [
"linked-hash-map",
]
+[[package]]
+name = "yansi"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
+
[[package]]
name = "yasna"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c"
dependencies = [
- "time 0.3.9",
+ "time 0.3.15",
]
[[package]]
@@ -8212,13 +8599,13 @@ dependencies = [
[[package]]
name = "zeroize_derive"
-version = "1.2.0"
+version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdff2024a851a322b08f179173ae2ba620445aef1e838f0c196820eade4ae0c7"
+checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17"
dependencies = [
- "proc-macro2 1.0.41",
- "quote 1.0.18",
- "syn 1.0.98",
+ "proc-macro2 1.0.46",
+ "quote 1.0.21",
+ "syn 1.0.102",
"synstructure",
]
@@ -8233,9 +8620,9 @@ dependencies = [
[[package]]
name = "zstd-safe"
-version = "5.0.1+zstd.1.5.2"
+version = "5.0.2+zstd.1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c12659121420dd6365c5c3de4901f97145b79651fb1d25814020ed2ed0585ae"
+checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db"
dependencies = [
"libc",
"zstd-sys",
diff --git a/Cargo.toml b/Cargo.toml
index 848ff87bfd..035893384c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,6 +7,8 @@ members = [
"banks-client",
"banks-interface",
"banks-server",
+ "bench-batch-simulate-bundle",
+ "bench-get-confirmed-blocks-with-data",
"bench-streamer",
"bench-tps",
"bloom",
@@ -30,6 +32,7 @@ members = [
"geyser-plugin-manager",
"gossip",
"install",
+ "jito-protos",
"keygen",
"ledger",
"ledger-tool",
@@ -85,6 +88,7 @@ members = [
"sys-tuner",
"test-validator",
"thin-client",
+ "tip-distributor",
"tokens",
"tpu-client",
"transaction-dos",
@@ -98,6 +102,8 @@ members = [
]
exclude = [
+ "anchor",
+ "jito-programs",
"programs/bpf",
]
diff --git a/README.md b/README.md
index b5499fa0e5..2a0d41a109 100644
--- a/README.md
+++ b/README.md
@@ -4,10 +4,14 @@
-[![Solana crate](https://img.shields.io/crates/v/solana-core.svg)](https://crates.io/crates/solana-core)
-[![Solana documentation](https://docs.rs/solana-core/badge.svg)](https://docs.rs/solana-core)
-[![Build status](https://badge.buildkite.com/8cc350de251d61483db98bdfc895b9ea0ac8ffa4a32ee850ed.svg?branch=master)](https://buildkite.com/solana-labs/solana/builds?branch=master)
-[![codecov](https://codecov.io/gh/solana-labs/solana/branch/master/graph/badge.svg)](https://codecov.io/gh/solana-labs/solana)
+[![Build status](https://badge.buildkite.com/a6981eb34c6e0c7c09e3a3cb4bda09579f0ff2dcb1bd74b2ad.svg?branch=master)](https://buildkite.com/jito-labs/jito-solana)
+
+[//]: # ([![Solana crate](https://img.shields.io/crates/v/solana-core.svg)](https://crates.io/crates/solana-core))
+[//]: # ([![Solana documentation](https://docs.rs/solana-core/badge.svg)](https://docs.rs/solana-core))
+[//]: # ([![codecov](https://codecov.io/gh/solana-labs/solana/branch/master/graph/badge.svg)](https://codecov.io/gh/solana-labs/solana))
+
+# About
+This repository contains Jito Lab's fork of the Solana validator.
# Building
diff --git a/anchor b/anchor
new file mode 160000
index 0000000000..7532647bb8
--- /dev/null
+++ b/anchor
@@ -0,0 +1 @@
+Subproject commit 7532647bb86d26fd7497d9cbc7ac99e2b3941e86
diff --git a/banking-bench/src/main.rs b/banking-bench/src/main.rs
index 65b48d2505..06307b5061 100644
--- a/banking-bench/src/main.rs
+++ b/banking-bench/src/main.rs
@@ -1,11 +1,12 @@
#![allow(clippy::integer_arithmetic)]
+
use {
clap::{crate_description, crate_name, Arg, ArgEnum, Command},
crossbeam_channel::{unbounded, Receiver},
log::*,
rand::{thread_rng, Rng},
rayon::prelude::*,
- solana_core::banking_stage::BankingStage,
+ solana_core::{banking_stage::BankingStage, bundle_account_locker::BundleAccountLocker},
solana_gossip::cluster_info::{ClusterInfo, Node},
solana_ledger::{
blockstore::Blockstore,
@@ -30,6 +31,7 @@ use {
solana_streamer::socket::SocketAddrSpace,
solana_tpu_client::connection_cache::{ConnectionCache, DEFAULT_TPU_CONNECTION_POOL_SIZE},
std::{
+ collections::HashSet,
sync::{atomic::Ordering, Arc, RwLock},
thread::sleep,
time::{Duration, Instant},
@@ -45,9 +47,15 @@ fn check_txs(
let now = Instant::now();
let mut no_bank = false;
loop {
- if let Ok((_bank, (entry, _tick_height))) = receiver.recv_timeout(Duration::from_millis(10))
+ if let Ok(WorkingBankEntry {
+ bank: _,
+ entries_ticks,
+ }) = receiver.recv_timeout(Duration::from_millis(10))
{
- total += entry.transactions.len();
+ total += entries_ticks
+ .iter()
+ .map(|e| e.0.transactions.len())
+ .sum::();
}
if total >= ref_tx_count {
break;
@@ -359,6 +367,8 @@ fn main() {
None,
Arc::new(connection_cache),
bank_forks.clone(),
+ HashSet::default(),
+ BundleAccountLocker::default(),
);
poh_recorder.write().unwrap().set_bank(&bank, false);
diff --git a/banks-server/Cargo.toml b/banks-server/Cargo.toml
index af32367fc2..f89527e6e3 100644
--- a/banks-server/Cargo.toml
+++ b/banks-server/Cargo.toml
@@ -15,6 +15,7 @@ crossbeam-channel = "0.5"
futures = "0.3"
solana-banks-interface = { path = "../banks-interface", version = "=1.15.0" }
solana-client = { path = "../client", version = "=1.15.0" }
+solana-gossip = { path = "../gossip", version = "=1.15.0" }
solana-runtime = { path = "../runtime", version = "=1.15.0" }
solana-sdk = { path = "../sdk", version = "=1.15.0" }
solana-send-transaction-service = { path = "../send-transaction-service", version = "=1.15.0" }
@@ -24,6 +25,9 @@ tokio = { version = "1", features = ["full"] }
tokio-serde = { version = "0.8", features = ["bincode"] }
tokio-stream = "0.1"
+[dev-dependencies]
+solana-streamer = { path = "../streamer", version = "=1.15.0" }
+
[lib]
crate-type = ["lib"]
name = "solana_banks_server"
diff --git a/banks-server/src/banks_server.rs b/banks-server/src/banks_server.rs
index d33eebdbdb..eb4ad9cb33 100644
--- a/banks-server/src/banks_server.rs
+++ b/banks-server/src/banks_server.rs
@@ -6,6 +6,7 @@ use {
Banks, BanksRequest, BanksResponse, BanksTransactionResultWithSimulation,
TransactionConfirmationStatus, TransactionSimulationDetails, TransactionStatus,
},
+ solana_gossip::cluster_info::ClusterInfo,
solana_runtime::{
bank::{Bank, TransactionSimulationResult},
bank_forks::BankForks,
@@ -387,7 +388,7 @@ pub async fn start_local_server(
pub async fn start_tcp_server(
listen_addr: SocketAddr,
- tpu_addr: SocketAddr,
+ cluster_info: Arc,
bank_forks: Arc>,
block_commitment_cache: Arc>,
connection_cache: Arc,
@@ -411,7 +412,7 @@ pub async fn start_tcp_server(
let (sender, receiver) = unbounded();
SendTransactionService::new::(
- tpu_addr,
+ cluster_info.clone(),
&bank_forks,
None,
receiver,
diff --git a/banks-server/src/rpc_banks_service.rs b/banks-server/src/rpc_banks_service.rs
index 85ab418885..408397383f 100644
--- a/banks-server/src/rpc_banks_service.rs
+++ b/banks-server/src/rpc_banks_service.rs
@@ -3,6 +3,7 @@
use {
crate::banks_server::start_tcp_server,
futures::{future::FutureExt, pin_mut, prelude::stream::StreamExt, select},
+ solana_gossip::cluster_info::ClusterInfo,
solana_runtime::{bank_forks::BankForks, commitment::BlockCommitmentCache},
solana_tpu_client::connection_cache::ConnectionCache,
std::{
@@ -27,7 +28,7 @@ pub struct RpcBanksService {
/// Run the TCP service until `exit` is set to true
async fn start_abortable_tcp_server(
listen_addr: SocketAddr,
- tpu_addr: SocketAddr,
+ cluster_info: Arc,
bank_forks: Arc>,
block_commitment_cache: Arc>,
connection_cache: Arc,
@@ -35,7 +36,7 @@ async fn start_abortable_tcp_server(
) {
let server = start_tcp_server(
listen_addr,
- tpu_addr,
+ cluster_info,
bank_forks.clone(),
block_commitment_cache.clone(),
connection_cache,
@@ -58,7 +59,7 @@ async fn start_abortable_tcp_server(
impl RpcBanksService {
fn run(
listen_addr: SocketAddr,
- tpu_addr: SocketAddr,
+ cluster_info: Arc,
bank_forks: Arc>,
block_commitment_cache: Arc>,
connection_cache: Arc,
@@ -66,7 +67,7 @@ impl RpcBanksService {
) {
let server = start_abortable_tcp_server(
listen_addr,
- tpu_addr,
+ cluster_info,
bank_forks,
block_commitment_cache,
connection_cache,
@@ -77,7 +78,7 @@ impl RpcBanksService {
pub fn new(
listen_addr: SocketAddr,
- tpu_addr: SocketAddr,
+ cluster_info: Arc,
bank_forks: &Arc>,
block_commitment_cache: &Arc>,
connection_cache: &Arc,
@@ -92,7 +93,7 @@ impl RpcBanksService {
.spawn(move || {
Self::run(
listen_addr,
- tpu_addr,
+ cluster_info,
bank_forks,
block_commitment_cache,
connection_cache,
@@ -111,7 +112,14 @@ impl RpcBanksService {
#[cfg(test)]
mod tests {
- use {super::*, solana_runtime::bank::Bank};
+ use {
+ super::*,
+ solana_gossip::contact_info::ContactInfo,
+ solana_runtime::bank::Bank,
+ solana_sdk::signature::Keypair,
+ solana_streamer::socket::SocketAddrSpace,
+ std::net::{IpAddr, Ipv4Addr},
+ };
#[test]
fn test_rpc_banks_server_exit() {
@@ -120,9 +128,18 @@ mod tests {
let connection_cache = Arc::new(ConnectionCache::default());
let exit = Arc::new(AtomicBool::new(false));
let addr = "127.0.0.1:0".parse().unwrap();
+ let contact_info = ContactInfo {
+ tpu: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080),
+ ..ContactInfo::default()
+ };
+ let cluster_info: Arc = Arc::new(ClusterInfo::new(
+ contact_info,
+ Arc::new(Keypair::new()),
+ SocketAddrSpace::new(false),
+ ));
let service = RpcBanksService::new(
addr,
- addr,
+ cluster_info,
&bank_forks,
&block_commitment_cache,
&connection_cache,
diff --git a/bench-batch-simulate-bundle/Cargo.toml b/bench-batch-simulate-bundle/Cargo.toml
new file mode 100644
index 0000000000..ba49e0360d
--- /dev/null
+++ b/bench-batch-simulate-bundle/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "solana-bench-batch-simulate-bundle"
+version = "1.15.0"
+edition = "2021"
+publish = false
+
+[dependencies]
+clap = { version = "3.1.12", features = ["derive", "env"] }
+env_logger = "0.9.0"
+log = "0.4.17"
+num-traits = "0.2.15"
+rayon = "1.5.2"
+solana-client = { path = "../client" }
+solana-runtime = { path = "../runtime" }
+solana-sdk = { path = "../sdk" }
+solana-transaction-status = { path = "../transaction-status" }
diff --git a/bench-batch-simulate-bundle/src/main.rs b/bench-batch-simulate-bundle/src/main.rs
new file mode 100644
index 0000000000..56e8762ddb
--- /dev/null
+++ b/bench-batch-simulate-bundle/src/main.rs
@@ -0,0 +1,396 @@
+mod simulator;
+
+use {
+ crate::simulator::{Simulator, Stats},
+ clap::Parser,
+ log::*,
+ num_traits::abs_sub,
+ solana_client::{
+ pubsub_client::PubsubClient, rpc_client::RpcClient, rpc_config::RpcBlockConfig,
+ },
+ solana_runtime::cost_model::CostModel,
+ solana_sdk::{
+ bundle::VersionedBundle,
+ clock::Slot,
+ commitment_config::{CommitmentConfig, CommitmentLevel},
+ message::{
+ v0::{LoadedAddresses, MessageAddressTableLookup},
+ AddressLoaderError,
+ },
+ transaction::{AddressLoader, SanitizedTransaction, VersionedTransaction},
+ },
+ solana_transaction_status::{TransactionDetails, UiConfirmedBlock, UiTransactionEncoding},
+ std::{
+ cmp::Reverse,
+ collections::BinaryHeap,
+ sync::{
+ atomic::{AtomicBool, AtomicU64, Ordering},
+ Arc, RwLock,
+ },
+ thread::{self, sleep, Builder, JoinHandle},
+ time::Duration,
+ },
+};
+
+#[derive(Parser, Debug)]
+#[clap(author, version, about, long_about = None)]
+struct Args {
+ /// URL of the RPC server with no simulations running
+ #[clap(long, env, default_value = "https://api.testnet.solana.com")]
+ baseline_rpc_url: String,
+
+ /// websocket URL of the RPC server with no simulations running
+ #[clap(long, env, default_value = "ws://api.testnet.solana.com")]
+ baseline_ws_url: String,
+
+ /// URL of the RPC server running simulations against
+ #[clap(long, env)]
+ simulation_rpc_url: String,
+
+ /// websocket URL of the RPC server running simulations against
+ #[clap(long, env)]
+ simulation_ws_url: String,
+
+ /// duration to run the test for, must be >= [SIMULATION_REFRESH_SECS]
+ #[clap(long, env, default_value_t = 60)]
+ test_duration_secs: u64,
+
+ /// size of the bundle batch being sent for simulation
+ #[clap(long, env, default_value_t = 5)]
+ bundle_batch_size: usize,
+
+ /// number of threads sharing a single RPC connection
+ #[clap(long, env, default_value_t = 16)]
+ n_threads: usize,
+
+ /// number of unique RPC connections
+ #[clap(long, env, default_value_t = 32)]
+ n_rpc_connections: u64,
+}
+
+const SIMULATION_REFRESH_SECS: u64 = 5;
+const BUNDLE_SIZE: usize = 3;
+
+pub struct BundleBatch {
+ pub bundles: Vec,
+ pub simulation_slot: Slot,
+}
+
+fn main() {
+ env_logger::init();
+
+ println!("starting load test...");
+
+ let args = Args::parse();
+ assert!(args.test_duration_secs >= SIMULATION_REFRESH_SECS);
+
+ let stats = Arc::new(Stats {
+ total_rpc_errs: Arc::new(AtomicU64::new(0)),
+ total_sim_errs: Arc::new(AtomicU64::new(0)),
+ total_sim_success: Arc::new(AtomicU64::new(0)),
+ });
+ let simulation_refresh_interval = Duration::from_secs(SIMULATION_REFRESH_SECS);
+ let exit = Arc::new(AtomicBool::new(false));
+
+ // get the current finalized slots of each node and make sure they're not too far off
+ const TOLERABLE_SLOT_DIFF: i64 = 3;
+ let baseline_rpc_client = RpcClient::new(args.baseline_rpc_url.clone());
+ let simulation_rpc_client = RpcClient::new(args.simulation_rpc_url.clone());
+ let (baseline_node_slot, simulation_node_slot) = fetch_and_assert_slot_diff(
+ &baseline_rpc_client,
+ &simulation_rpc_client,
+ Some(TOLERABLE_SLOT_DIFF),
+ );
+ println!(
+ "[baseline_node_slot: {}, simulation_node_slot: {}, diff: {}]",
+ baseline_node_slot,
+ simulation_node_slot,
+ abs_sub(baseline_node_slot, simulation_node_slot)
+ );
+
+ let t_hdls = vec![
+ spawn_slots_subscribe_thread(
+ args.simulation_ws_url,
+ "simulation-node".into(),
+ exit.clone(),
+ ),
+ spawn_slots_subscribe_thread(args.baseline_ws_url, "baseline-node".into(), exit.clone()),
+ ];
+
+ let rpc_client = RpcClient::new(args.baseline_rpc_url.clone());
+ let (transactions, simulation_slot) =
+ fetch_n_highest_cost_transactions(&rpc_client, BUNDLE_SIZE);
+
+ let bundle = VersionedBundle { transactions };
+ let bundles = (0..args.bundle_batch_size)
+ .map(|_| bundle.clone())
+ .collect::>();
+ drop(bundle);
+
+ // This object is read-locked by all Simulator threads and write-locked by `spawn_highest_cost_bundle_scraper`
+ // periodically to update.
+ let bundle_batch = BundleBatch {
+ bundles,
+ simulation_slot,
+ };
+ let bundle_batch = Arc::new(RwLock::new(bundle_batch));
+
+ spawn_highest_cost_bundle_scraper(
+ bundle_batch.clone(),
+ rpc_client,
+ simulation_refresh_interval,
+ args.bundle_batch_size,
+ BUNDLE_SIZE,
+ );
+
+ let simulators: Vec> = (0..args.n_rpc_connections)
+ .map(|_| {
+ let stats = stats.clone();
+ let rpc_client = RpcClient::new(args.simulation_rpc_url.clone());
+ Arc::new(Simulator::new(
+ rpc_client,
+ stats,
+ args.n_threads,
+ exit.clone(),
+ ))
+ })
+ .collect();
+ for s in &simulators {
+ let s = s.clone();
+ let bundle_batch = bundle_batch.clone();
+ thread::spawn(move || {
+ s.start(bundle_batch);
+ });
+ }
+
+ sleep(Duration::from_secs(args.test_duration_secs));
+ exit.store(true, Ordering::Relaxed);
+
+ for t in t_hdls {
+ info!("joining...");
+ t.join().unwrap();
+ }
+
+ {
+ let t0 = stats.total_sim_success.load(Ordering::Acquire) as f64;
+ let t1 = stats.total_sim_errs.load(Ordering::Acquire) as f64;
+ let actual_rps = (t0 + t1) / args.test_duration_secs as f64;
+ println!(
+ "[successful simulations: {}, total_sim_errs: {}, total_rpc_errs: {}, actual_rps: {}]",
+ stats.total_sim_success.load(Ordering::Acquire),
+ stats.total_sim_errs.load(Ordering::Acquire),
+ stats.total_rpc_errs.load(Ordering::Acquire),
+ actual_rps,
+ );
+
+ let (baseline_node_slot, simulation_node_slot) =
+ fetch_and_assert_slot_diff(&baseline_rpc_client, &simulation_rpc_client, None);
+ println!(
+ "[baseline_node_slot: {}, simulation_node_slot: {}, diff: {}]",
+ baseline_node_slot,
+ simulation_node_slot,
+ abs_sub(baseline_node_slot, simulation_node_slot)
+ );
+ }
+
+ println!("finished load test...");
+}
+
+fn spawn_highest_cost_bundle_scraper(
+ bundle_batch: Arc>,
+ rpc_client: RpcClient,
+ refresh: Duration,
+ batch_size: usize,
+ bundle_size: usize,
+) -> JoinHandle<()> {
+ Builder::new()
+ .name("highest-cost-tx-scraper".into())
+ .spawn(move || loop {
+ let (transactions, simulation_slot) =
+ fetch_n_highest_cost_transactions(&rpc_client, bundle_size);
+
+ let bundle = VersionedBundle { transactions };
+ let bundles = (0..batch_size)
+ .map(|_| bundle.clone())
+ .collect::>();
+ drop(bundle);
+
+ let mut w_bundle_batch = bundle_batch.write().unwrap();
+ *w_bundle_batch = BundleBatch {
+ bundles,
+ simulation_slot,
+ };
+ drop(w_bundle_batch);
+
+ sleep(refresh);
+ })
+ .unwrap()
+}
+
+fn spawn_slots_subscribe_thread(
+ pubsub_addr: String,
+ node_name: String,
+ exit: Arc,
+) -> JoinHandle<()> {
+ let mut slots_sub = PubsubClient::slot_subscribe(&*pubsub_addr).unwrap();
+ thread::spawn(move || loop {
+ if exit.load(Ordering::Acquire) {
+ let _ = slots_sub.0.shutdown();
+ break;
+ }
+
+ match slots_sub.1.recv() {
+ Ok(slot_info) => info!("[RPC={} slot={:?}]", node_name, slot_info.slot),
+ Err(e) => {
+ error!("error receiving on slots_sub channel: {}", e);
+ slots_sub = PubsubClient::slot_subscribe(&*pubsub_addr).unwrap();
+ }
+ }
+ })
+}
+
+/// Fetches the N highest cost transactions from the last confirmed block and returns said block's parent slot
+fn fetch_n_highest_cost_transactions(
+ rpc_client: &RpcClient,
+ n: usize,
+) -> (Vec, Slot) {
+ let slot = rpc_client
+ .get_slot_with_commitment(CommitmentConfig::confirmed())
+ .unwrap();
+ info!("fetched slot {}", slot);
+
+ let config = RpcBlockConfig {
+ encoding: Some(UiTransactionEncoding::Base64),
+ transaction_details: Some(TransactionDetails::Full),
+ rewards: None,
+ commitment: Some(CommitmentConfig {
+ commitment: CommitmentLevel::Confirmed,
+ }),
+ max_supported_transaction_version: None,
+ };
+ let block = rpc_client
+ .get_block_with_config(slot, config)
+ .expect(&*format!("failed to fetch block at slot: {}", slot));
+
+ let parent_slot = block.parent_slot;
+ (
+ n_highest_cost_transactions_from_block(block, &CostModel::default(), n),
+ parent_slot,
+ )
+}
+
+#[derive(Eq)]
+struct TransactionCost {
+ transaction: VersionedTransaction,
+ cost: u64,
+}
+
+impl PartialEq for TransactionCost {
+ fn eq(&self, other: &Self) -> bool {
+ self.cost == other.cost
+ }
+}
+
+impl PartialOrd for TransactionCost {
+ fn partial_cmp(&self, other: &Self) -> Option {
+ self.cost.partial_cmp(&other.cost)
+ }
+}
+
+impl Ord for TransactionCost {
+ fn cmp(&self, other: &Self) -> std::cmp::Ordering {
+ self.cost.cmp(&other.cost)
+ }
+}
+
+/// Returns the N highest cost transactions from a given block
+fn n_highest_cost_transactions_from_block(
+ block: UiConfirmedBlock,
+ cost_model: &CostModel,
+ n: usize,
+) -> Vec {
+ let txs: Vec = block
+ .transactions
+ .unwrap()
+ .into_iter()
+ .filter(|encoded_tx| encoded_tx.meta.as_ref().unwrap().err.is_none())
+ .filter_map(|encoded_tx| encoded_tx.transaction.decode())
+ .collect();
+ let mut max_costs: BinaryHeap> = BinaryHeap::with_capacity(n);
+
+ for tx in txs {
+ if let Ok(sanitized_tx) = SanitizedTransaction::try_create(
+ tx.clone(),
+ tx.message.hash(),
+ None,
+ MockAddressLoader {},
+ false,
+ ) {
+ let cost = cost_model.calculate_cost(&sanitized_tx).sum();
+ if let Some(min_cost) = max_costs.peek() {
+ if cost > min_cost.0.cost {
+ if max_costs.len() == n {
+ let _ = max_costs.pop();
+ }
+ max_costs.push(Reverse(TransactionCost {
+ cost,
+ transaction: tx.clone(),
+ }));
+ }
+ } else {
+ max_costs.push(Reverse(TransactionCost {
+ cost,
+ transaction: tx.clone(),
+ }));
+ }
+ }
+ }
+
+ max_costs
+ .into_iter()
+ .map(|tx_cost| tx_cost.0.transaction)
+ .collect::>()
+}
+
+fn fetch_and_assert_slot_diff(
+ rpc_client_0: &RpcClient,
+ rpc_client_1: &RpcClient,
+ tolerable_diff: Option,
+) -> (i64, i64) {
+ let slot_0 = rpc_client_0
+ .get_slot_with_commitment(CommitmentConfig {
+ commitment: CommitmentLevel::Finalized,
+ })
+ .unwrap() as i64;
+ let slot_1 = rpc_client_1
+ .get_slot_with_commitment(CommitmentConfig {
+ commitment: CommitmentLevel::Finalized,
+ })
+ .unwrap() as i64;
+
+ if let Some(tolerable_diff) = tolerable_diff {
+ let actual_diff = abs_sub(slot_0, slot_1);
+ assert!(
+ actual_diff < tolerable_diff,
+ "{}",
+ format!(
+ "actual_diff: {}, tolerable_diff: {}",
+ actual_diff, tolerable_diff
+ )
+ );
+ }
+
+ (slot_0, slot_1)
+}
+
+#[derive(Clone)]
+struct MockAddressLoader;
+
+impl AddressLoader for MockAddressLoader {
+ fn load_addresses(
+ self,
+ _lookups: &[MessageAddressTableLookup],
+ ) -> Result {
+ Ok(LoadedAddresses::default())
+ }
+}
diff --git a/bench-batch-simulate-bundle/src/simulator.rs b/bench-batch-simulate-bundle/src/simulator.rs
new file mode 100644
index 0000000000..e8d844ba58
--- /dev/null
+++ b/bench-batch-simulate-bundle/src/simulator.rs
@@ -0,0 +1,149 @@
+use {
+ crate::{BundleBatch, Slot},
+ log::*,
+ rayon::{ThreadPool, ThreadPoolBuilder},
+ solana_client::{
+ rpc_client::RpcClient,
+ rpc_config::{RpcSimulateBundleConfig, SimulationSlotConfig},
+ rpc_response::RpcBundleSimulationSummary,
+ },
+ solana_sdk::bundle::VersionedBundle,
+ std::{
+ sync::{
+ atomic::{AtomicBool, AtomicU64, Ordering},
+ Arc, RwLock,
+ },
+ thread::sleep,
+ time::Duration,
+ },
+};
+
+pub struct Simulator {
+ t_pool: ThreadPool,
+ /// shared tcp socket amongst the thread pool
+ rpc_client: Arc,
+ stats: Arc,
+ exit: Arc,
+}
+
+pub struct Stats {
+ pub total_rpc_errs: Arc,
+ pub total_sim_errs: Arc,
+ pub total_sim_success: Arc,
+}
+
+impl Simulator {
+ pub fn new(
+ rpc_client: RpcClient,
+ stats: Arc,
+ n_threads: usize,
+ exit: Arc,
+ ) -> Self {
+ let t_pool = ThreadPoolBuilder::new()
+ .num_threads(n_threads)
+ .build()
+ .unwrap();
+ let rpc_client = Arc::new(rpc_client);
+
+ Self {
+ t_pool,
+ rpc_client,
+ stats,
+ exit,
+ }
+ }
+
+ pub fn start(&self, bundle_batch: Arc>) {
+ info!("starting bundle batch simulator...");
+
+ loop {
+ if self.exit.load(Ordering::Relaxed) {
+ info!("simulator exiting...");
+ break;
+ }
+
+ let (bundles, simulation_slot) = {
+ let r_bundle_batch = bundle_batch.read().unwrap();
+ (
+ r_bundle_batch.bundles.clone(),
+ r_bundle_batch.simulation_slot,
+ )
+ };
+ let rpc_client = self.rpc_client.clone();
+ let stats = self.stats.clone();
+
+ self.t_pool.spawn(move || {
+ // TODO: is this slow?
+ if let Some((n_succeeded, n_failed)) =
+ Self::do_simulate(bundles, simulation_slot, &rpc_client)
+ {
+ stats
+ .total_sim_success
+ .fetch_add(n_succeeded, Ordering::Relaxed);
+ stats.total_sim_errs.fetch_add(n_failed, Ordering::Relaxed);
+ info!(
+ "succeeded={}, failed={}, simulation_slot={}",
+ n_succeeded, n_failed, simulation_slot
+ );
+ } else {
+ stats.total_rpc_errs.fetch_add(1, Ordering::Relaxed);
+ }
+ });
+
+ sleep(Duration::from_millis(10));
+ }
+ }
+
+ /// returns (num_succeeded, num_failed) simulations
+ fn do_simulate(
+ bundles: Vec,
+ simulation_slot: Slot,
+ rpc_client: &Arc,
+ ) -> Option<(u64, u64)> {
+ let configs = bundles
+ .iter()
+ .map(|b| RpcSimulateBundleConfig {
+ // TODO: Let's set some accounts data for more realistic performance metrics.
+ pre_execution_accounts_configs: vec![None; b.transactions.len()],
+ post_execution_accounts_configs: vec![None; b.transactions.len()],
+ replace_recent_blockhash: true,
+ simulation_bank: Some(SimulationSlotConfig::Slot(simulation_slot)),
+ skip_sig_verify: true,
+ transaction_encoding: None,
+ })
+ .collect::>();
+
+ match rpc_client
+ .batch_simulate_bundle_with_config(bundles.into_iter().zip(configs).collect())
+ {
+ Ok(response) => {
+ let mut n_succeeded: u64 = 0;
+ let mut n_failed: u64 = 0;
+
+ for result in response {
+ match result.result.value.summary {
+ RpcBundleSimulationSummary::Failed {
+ error,
+ tx_signature,
+ } => {
+ error!(
+ "bundle simulation failed [error={:?}, tx_signature={}]",
+ error, tx_signature
+ );
+ n_failed = n_failed.checked_add(1).unwrap();
+ }
+ RpcBundleSimulationSummary::Succeeded => {
+ n_succeeded = n_succeeded.checked_add(1).unwrap()
+ }
+ }
+ }
+
+ Some((n_succeeded, n_failed))
+ }
+ Err(e) => {
+ error!("error from rpc {}", e);
+ None
+ }
+ }
+ }
+}
diff --git a/bench-get-confirmed-blocks-with-data/Cargo.toml b/bench-get-confirmed-blocks-with-data/Cargo.toml
new file mode 100644
index 0000000000..e3648fd640
--- /dev/null
+++ b/bench-get-confirmed-blocks-with-data/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "bench-get-confirmed-blocks-with-data"
+version = "1.15.0"
+edition = "2021"
+
+[dependencies]
+env_logger = "0.9.0"
+log = "0.4.17"
+solana-sdk = { path = "../sdk", version = "=1.15.0" }
+solana-storage-bigtable = { path = "../storage-bigtable", version = "=1.15.0" }
+solana-transaction-status = { path = "../transaction-status", version = "=1.15.0" }
+tokio = { version = "1", features = ["full"] }
diff --git a/bench-get-confirmed-blocks-with-data/src/main.rs b/bench-get-confirmed-blocks-with-data/src/main.rs
new file mode 100644
index 0000000000..5361ab667c
--- /dev/null
+++ b/bench-get-confirmed-blocks-with-data/src/main.rs
@@ -0,0 +1,120 @@
+use {
+ log::info,
+ solana_sdk::clock::Slot,
+ solana_transaction_status::ConfirmedBlock,
+ std::{
+ sync::{Arc, Mutex},
+ thread::{self, sleep},
+ time::{Duration, Instant},
+ },
+ tokio::task::JoinHandle,
+};
+
+fn main() {
+ env_logger::init();
+
+ let num_blocks_to_fetch: Vec = vec![10];
+ let num_tasks = 128;
+ let lowest_slot: Slot = 1_000_000;
+ let highest_slot: Slot = 135_000_000;
+ let task_unit = (highest_slot.checked_sub(lowest_slot).unwrap())
+ .checked_div(num_tasks)
+ .unwrap();
+ let test_duration_s = 4_u64.checked_mul(60).unwrap().checked_mul(60).unwrap();
+
+ let log_duration = Duration::from_secs(1);
+
+ let test_duration = Duration::from_secs(test_duration_s);
+
+ for chunk_size in num_blocks_to_fetch {
+ info!(
+ "Benchmarking performance of get_confirmed_blocks_with_data for {:?} blocks",
+ chunk_size
+ );
+
+ let total_blocks_read = Arc::new(Mutex::new(0_usize));
+
+ let thread = {
+ let total_blocks_read = total_blocks_read.clone();
+ thread::spawn(move || {
+ let test_start = Instant::now();
+
+ let mut last_update_time = Instant::now();
+ let mut last_update_count = 0;
+
+ while test_start.elapsed() < test_duration {
+ let elapsed = last_update_time.elapsed();
+ if elapsed > log_duration {
+ let total_blocks_read = *total_blocks_read.lock().unwrap();
+ let blocks_received =
+ total_blocks_read.checked_sub(last_update_count).unwrap();
+ let recent_block_rate = blocks_received as f64 / elapsed.as_secs_f64();
+ let total_block_rate =
+ total_blocks_read as f64 / test_start.elapsed().as_secs_f64();
+ info!(
+ "tasks: {}, chunk_size: {}, recent_block_rate: {:.2}, total_blocks_read: {}, total_elapsed: {:.2}, total blocks/s: {:.2}",
+ num_tasks,
+ chunk_size,
+ recent_block_rate,
+ total_blocks_read,
+ test_start.elapsed().as_secs_f64(),
+ total_block_rate
+ );
+
+ last_update_time = Instant::now();
+ last_update_count = total_blocks_read;
+ }
+
+ sleep(Duration::from_millis(100));
+ }
+ })
+ };
+
+ let runtime = tokio::runtime::Runtime::new().unwrap();
+ runtime.block_on(async {
+ let tasks: Vec> = (0..num_tasks)
+ .map(|i| {
+ let total_blocks_read = total_blocks_read.clone();
+ runtime.spawn(async move {
+ let bigtable =
+ solana_storage_bigtable::LedgerStorage::new(true, None, None)
+ .await
+ .expect("connected to bigtable");
+
+ let start = Instant::now();
+ let mut starting_slot = (task_unit.checked_mul(i).unwrap())
+ .checked_add(lowest_slot)
+ .unwrap();
+ let stopping_slot = starting_slot.checked_add(task_unit).unwrap();
+
+ while start.elapsed() < test_duration {
+ let slot_requests: Vec<_> = (starting_slot
+ ..starting_slot.checked_add(chunk_size).unwrap_or(u64::MAX))
+ .collect();
+ let slots_blocks: Vec<(Slot, ConfirmedBlock)> = bigtable
+ .get_confirmed_blocks_with_data(slot_requests.as_slice())
+ .await
+ .expect("got blocks")
+ .collect();
+ starting_slot = slots_blocks.last().unwrap().0;
+ {
+ let mut total_blocks_read = total_blocks_read.lock().unwrap();
+ *total_blocks_read =
+ total_blocks_read.checked_add(slots_blocks.len()).unwrap();
+ }
+ if starting_slot >= stopping_slot {
+ info!("work here is done!!");
+ break;
+ }
+ }
+ })
+ })
+ .collect();
+ for t in tasks {
+ t.await.expect("results fetched");
+ }
+ });
+
+ thread.join().unwrap();
+ }
+}
diff --git a/bootstrap b/bootstrap
new file mode 100755
index 0000000000..b01bc6734f
--- /dev/null
+++ b/bootstrap
@@ -0,0 +1,21 @@
+#!/usr/bin/env sh
+bank_hash=$(./target/release/solana-ledger-tool -l config/bootstrap-validator bank-hash)
+
+# NOTE: make sure tip-payment and tip-distribution program are deployed using the correct pubkeys
+RUST_LOG=INFO,solana_core::bundle_stage=DEBUG \
+ NDEBUG=1 ./multinode-demo/bootstrap-validator.sh \
+ --wait-for-supermajority 0 \
+ --expected-bank-hash $bank_hash \
+ --block-engine-address http://127.0.0.1:1003 \
+ --block-engine-auth-service-address http://127.0.0.1:1005 \
+ --relayer-auth-service-address http://127.0.0.1:11226 \
+ --relayer-address http://127.0.0.1:11226 \
+ --rpc-pubsub-enable-block-subscription \
+ --enable-rpc-transaction-history \
+ --tip-payment-program-pubkey 6veFRUKJBNGMR58LEcKn5Bc6MR17WZF4rsgD4Lqq7fsU \
+ --tip-distribution-program-pubkey 3PX9z1qPj37eNZqH7e5fyaVDyG7ARqkjkYEe1a4xsBkA \
+ --commission-bps 0 \
+ --shred-receiver-address 127.0.0.1:1002 \
+ --allow-private-addr \
+ --trust-relayer-packets \
+ --trust-block-engine-packets
diff --git a/ci/buildkite-pipeline-in-disk.sh b/ci/buildkite-pipeline-in-disk.sh
index 361bef9f36..1f9461193c 100644
--- a/ci/buildkite-pipeline-in-disk.sh
+++ b/ci/buildkite-pipeline-in-disk.sh
@@ -186,7 +186,7 @@ all_test_steps() {
queue: "gcp"
EOF
else
- annotate --style info \
+ annotate --style info --context test-stable-bpf \
"Stable-SBF skipped as no relevant files were modified"
fi
@@ -204,16 +204,20 @@ EOF
^programs/ \
^sdk/ \
; then
- cat >> "$output_file" <<"EOF"
- - command: "ci/test-stable-perf.sh"
- name: "stable-perf"
- timeout_in_minutes: 20
- artifact_paths: "log-*.txt"
- agents:
- queue: "cuda"
-EOF
+
+annotate --style warning --context test-stable-perf \
+ "test-stable-perf is currently disabled because it requires GPUs (LB)"
+#cat >> "$output_file" <<"EOF"
+# - command: "ci/test-stable-perf.sh"
+# name: "stable-perf"
+# timeout_in_minutes: 20
+# artifact_paths: "log-*.txt"
+# agents:
+# queue: "cuda"
+#EOF
+
else
- annotate --style info \
+ annotate --style info --context test-stable-perf \
"Stable-perf skipped as no relevant files were modified"
fi
@@ -238,7 +242,7 @@ EOF
timeout_in_minutes: 30
EOF
else
- annotate --style info \
+ annotate --style info --context test-downstream-projects \
"downstream-projects skipped as no relevant files were modified"
fi
@@ -248,9 +252,11 @@ EOF
^ci/test-stable.sh \
^sdk/ \
; then
- command_step wasm ". ci/rust-version.sh; ci/docker-run.sh \$\$rust_stable_docker_image ci/test-wasm.sh" 20
+ annotate --style warning --context test-wasm \
+ "test-wasm is currently disabled because it times out (LB)"
+# command_step wasm ". ci/rust-version.sh; ci/docker-run.sh \$\$rust_stable_docker_image ci/test-wasm.sh" 20
else
- annotate --style info \
+ annotate --style info --context test-wasm \
"wasm skipped as no relevant files were modified"
fi
@@ -313,7 +319,7 @@ if [[ -n $BUILDKITE_TAG ]]; then
"https://github.com/solana-labs/solana/releases/$BUILDKITE_TAG"
# Jump directly to the secondary build to publish release artifacts quickly
- trigger_secondary_step
+# trigger_secondary_step
exit 0
fi
@@ -341,5 +347,5 @@ fi
start_pipeline "Push pipeline for ${BUILDKITE_BRANCH:-?unknown branch?}"
pull_or_push_steps
wait_step
-trigger_secondary_step
+#trigger_secondary_step
exit 0
diff --git a/ci/buildkite-pipeline.sh b/ci/buildkite-pipeline.sh
index 53c3f23756..3cec8b2715 100755
--- a/ci/buildkite-pipeline.sh
+++ b/ci/buildkite-pipeline.sh
@@ -186,7 +186,7 @@ all_test_steps() {
queue: "gcp"
EOF
else
- annotate --style info \
+ annotate --style info --context test-stable-bpf \
"Stable-SBF skipped as no relevant files were modified"
fi
@@ -204,16 +204,20 @@ EOF
^programs/ \
^sdk/ \
; then
- cat >> "$output_file" <<"EOF"
- - command: "ci/test-stable-perf.sh"
- name: "stable-perf"
- timeout_in_minutes: 20
- artifact_paths: "log-*.txt"
- agents:
- queue: "cuda"
-EOF
+
+annotate --style warning --context test-stable-perf \
+ "test-stable-perf is currently disabled because it requires GPUs (LB)"
+#cat >> "$output_file" <<"EOF"
+# - command: "ci/test-stable-perf.sh"
+# name: "stable-perf"
+# timeout_in_minutes: 20
+# artifact_paths: "log-*.txt"
+# agents:
+# queue: "cuda"
+#EOF
+
else
- annotate --style info \
+ annotate --style info --context test-stable-perf \
"Stable-perf skipped as no relevant files were modified"
fi
@@ -240,7 +244,7 @@ EOF
queue: "solana"
EOF
else
- annotate --style info \
+ annotate --style info --context test-downstream-projects \
"downstream-projects skipped as no relevant files were modified"
fi
@@ -250,9 +254,11 @@ EOF
^ci/test-stable.sh \
^sdk/ \
; then
- command_step wasm ". ci/rust-version.sh; ci/docker-run.sh \$\$rust_stable_docker_image ci/test-wasm.sh" 20
+ annotate --style warning --context test-wasm \
+ "test-wasm is currently disabled because it times out (LB)"
+# command_step wasm ". ci/rust-version.sh; ci/docker-run.sh \$\$rust_stable_docker_image ci/test-wasm.sh" 20
else
- annotate --style info \
+ annotate --style info --context test-wasm \
"wasm skipped as no relevant files were modified"
fi
@@ -315,7 +321,7 @@ if [[ -n $BUILDKITE_TAG ]]; then
"https://github.com/solana-labs/solana/releases/$BUILDKITE_TAG"
# Jump directly to the secondary build to publish release artifacts quickly
- trigger_secondary_step
+# trigger_secondary_step
exit 0
fi
@@ -343,5 +349,5 @@ fi
start_pipeline "Push pipeline for ${BUILDKITE_BRANCH:-?unknown branch?}"
pull_or_push_steps
wait_step
-trigger_secondary_step
+#trigger_secondary_step
exit 0
diff --git a/ci/buildkite-solana-private.sh b/ci/buildkite-solana-private.sh
index d05972808a..7b755dc5a3 100644
--- a/ci/buildkite-solana-private.sh
+++ b/ci/buildkite-solana-private.sh
@@ -186,7 +186,7 @@ all_test_steps() {
queue: "sol-private"
EOF
else
- annotate --style info \
+ annotate --style info --context test-stable-bpf \
"Stable-SBF skipped as no relevant files were modified"
fi
@@ -204,16 +204,19 @@ EOF
^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
+
+annotate --style warning --context test-stable-perf \
+ "test-stable-perf is currently disabled because it requires GPUs (LB)"
+# 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 \
+ annotate --style info --context test-stable-perf \
"Stable-perf skipped as no relevant files were modified"
fi
@@ -240,7 +243,7 @@ EOF
queue: "sol-private"
EOF
else
- annotate --style info \
+ annotate --style info --context test-downstream-projects \
"downstream-projects skipped as no relevant files were modified"
fi
@@ -250,9 +253,11 @@ EOF
^ci/test-stable.sh \
^sdk/ \
; then
- command_step wasm ". ci/rust-version.sh; ci/docker-run.sh \$\$rust_stable_docker_image ci/test-wasm.sh" 20
+ annotate --style warning --context test-wasm \
+ "test-wasm is currently disabled because it times out (LB)"
+# command_step wasm ". ci/rust-version.sh; ci/docker-run.sh \$\$rust_stable_docker_image ci/test-wasm.sh" 20
else
- annotate --style info \
+ annotate --style info --context test-wasm \
"wasm skipped as no relevant files were modified"
fi
diff --git a/ci/docker-rust/Dockerfile b/ci/docker-rust/Dockerfile
index f1e4a8b156..b979e76ca6 100644
--- a/ci/docker-rust/Dockerfile
+++ b/ci/docker-rust/Dockerfile
@@ -40,6 +40,7 @@ RUN set -x \
&& cargo install mdbook-linkcheck \
&& cargo install svgbob_cli \
&& cargo install wasm-pack \
+ && cargo install sccache \
&& rustc --version \
&& cargo --version \
&& curl -OL https://github.com/google/protobuf/releases/download/v$PROTOC_VERSION/$PROTOC_ZIP \
diff --git a/ci/test-stable.sh b/ci/test-stable.sh
index ccd75adca2..4a86bba528 100755
--- a/ci/test-stable.sh
+++ b/ci/test-stable.sh
@@ -119,7 +119,7 @@ test-stable-sbf)
# latest mainbeta release version.
solana_program_count=$(grep -c 'solana-program v' cargo.log)
rm -f cargo.log
- if ((solana_program_count > 4)); then
+ if ((solana_program_count > 20)); then
echo "Regression of build redundancy ${solana_program_count}."
echo "Review dependency features that trigger redundant rebuilds of solana-program."
exit 1
diff --git a/core/Cargo.toml b/core/Cargo.toml
index b0f6e6ac69..b74fa21ee2 100644
--- a/core/Cargo.toml
+++ b/core/Cargo.toml
@@ -15,22 +15,31 @@ codecov = { repository = "solana-labs/solana", branch = "master", service = "git
[dependencies]
ahash = "0.7.6"
+anchor-lang = { path = "../anchor/lang" }
base64 = "0.13.0"
bincode = "1.3.3"
bs58 = "0.4.0"
+bytes = "1.1.0"
chrono = { version = "0.4.22", features = ["serde"] }
+clap = { version = "3.1.15", features = ["derive"] }
crossbeam-channel = "0.5"
dashmap = { version = "4.0.2", features = ["rayon", "raw-api"] }
eager = "0.1.0"
etcd-client = { version = "0.8.1", features = ["tls"] }
fs_extra = "1.2.0"
+futures = "0.3"
+futures-util = "0.3"
histogram = "0.6.9"
+indexmap = "1.8.1"
itertools = "0.10.5"
+jito-protos = { path = "../jito-protos", version = "=1.15.0" }
lazy_static = "1.4.0"
log = "0.4.17"
lru = "0.7.7"
min-max-heap = "1.3.0"
num_enum = "0.5.7"
+prost = "0.8.0"
+prost-types = "0.8.0"
rand = "0.7.0"
rand_chacha = "0.2.2"
rayon = "1.5.3"
@@ -64,8 +73,13 @@ solana-vote-program = { path = "../programs/vote", version = "=1.15.0" }
sys-info = "0.9.1"
tempfile = "3.3.0"
thiserror = "1.0"
+tip-distribution = { path = "../jito-programs/tip-payment/programs/tip-distribution", features = ["no-entrypoint"] }
+tip-payment = { path = "../jito-programs/tip-payment/programs/tip-payment", features = ["no-entrypoint"] }
tokio = { version = "~1.14.1", features = ["full"] }
+tokio-stream = "0.1.8"
+tonic = { version = "0.5.2", features = ["tls"] }
trees = "0.4.2"
+uuid = { version = "1.0.0", features = ["v4", "fast-rng"] }
[dev-dependencies]
matches = "0.1.9"
@@ -84,6 +98,7 @@ sysctl = "0.4.4"
[build-dependencies]
rustc_version = "0.4"
+tonic-build = "0.5.2"
[[bench]]
name = "banking_stage"
diff --git a/core/benches/banking_stage.rs b/core/benches/banking_stage.rs
index ae0bd6b07b..8e8833e00f 100644
--- a/core/benches/banking_stage.rs
+++ b/core/benches/banking_stage.rs
@@ -10,6 +10,7 @@ use {
rayon::prelude::*,
solana_core::{
banking_stage::{BankingStage, BankingStageStats},
+ bundle_account_locker::BundleAccountLocker,
leader_slot_banking_stage_metrics::LeaderSlotMetricsTracker,
qos_service::QosService,
unprocessed_packet_batches::*,
@@ -41,6 +42,7 @@ use {
vote_state::VoteStateUpdate, vote_transaction::new_vote_state_update_transaction,
},
std::{
+ collections::HashSet,
sync::{atomic::Ordering, Arc, RwLock},
time::{Duration, Instant},
},
@@ -51,8 +53,15 @@ fn check_txs(receiver: &Arc>, ref_tx_count: usize) {
let mut total = 0;
let now = Instant::now();
loop {
- if let Ok((_bank, (entry, _tick_height))) = receiver.recv_timeout(Duration::new(1, 0)) {
- total += entry.transactions.len();
+ if let Ok(WorkingBankEntry {
+ bank: _,
+ entries_ticks,
+ }) = receiver.recv_timeout(Duration::new(1, 0))
+ {
+ total += entries_ticks
+ .iter()
+ .map(|e| e.0.transactions.len())
+ .sum::();
}
if total >= ref_tx_count {
break;
@@ -103,6 +112,8 @@ fn bench_consume_buffered(bencher: &mut Bencher) {
&mut LeaderSlotMetricsTracker::new(0),
10,
None,
+ &HashSet::default(),
+ &BundleAccountLocker::default(),
);
});
@@ -287,6 +298,8 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
None,
Arc::new(ConnectionCache::default()),
bank_forks,
+ HashSet::new(),
+ BundleAccountLocker::default(),
);
poh_recorder.write().unwrap().set_bank(&bank, false);
diff --git a/core/benches/cluster_info.rs b/core/benches/cluster_info.rs
index ea12f7d089..84e9d5685e 100644
--- a/core/benches/cluster_info.rs
+++ b/core/benches/cluster_info.rs
@@ -79,6 +79,7 @@ fn broadcast_shreds_bench(bencher: &mut Bencher) {
&cluster_info,
&bank_forks,
&SocketAddrSpace::Unspecified,
+ None,
)
.unwrap();
});
diff --git a/core/benches/proto_to_packet.rs b/core/benches/proto_to_packet.rs
new file mode 100644
index 0000000000..87f85f9c7f
--- /dev/null
+++ b/core/benches/proto_to_packet.rs
@@ -0,0 +1,56 @@
+#![feature(test)]
+
+extern crate test;
+
+use {
+ jito_protos::proto::packet::{
+ Meta as PbMeta, Packet as PbPacket, PacketBatch, PacketFlags as PbFlags,
+ },
+ solana_core::proto_packet_to_packet,
+ solana_sdk::packet::{Packet, PACKET_DATA_SIZE},
+ std::iter::repeat,
+ test::{black_box, Bencher},
+};
+
+fn get_proto_packet(i: u8) -> PbPacket {
+ PbPacket {
+ data: repeat(i).take(PACKET_DATA_SIZE).collect(),
+ meta: Some(PbMeta {
+ size: PACKET_DATA_SIZE as u64,
+ addr: "255.255.255.255:65535".to_string(),
+ port: 65535,
+ flags: Some(PbFlags {
+ discard: false,
+ forwarded: false,
+ repair: false,
+ simple_vote_tx: false,
+ tracer_packet: false,
+ }),
+ sender_stake: 0,
+ }),
+ }
+}
+
+#[bench]
+fn bench_proto_to_packet(bencher: &mut Bencher) {
+ bencher.iter(|| {
+ black_box(proto_packet_to_packet(get_proto_packet(1)));
+ });
+}
+
+#[bench]
+fn bench_batch_list_to_packets(bencher: &mut Bencher) {
+ let packet_batch = PacketBatch {
+ packets: (0..128).map(get_proto_packet).collect(),
+ };
+
+ bencher.iter(|| {
+ black_box(
+ packet_batch
+ .packets
+ .iter()
+ .map(|p| proto_packet_to_packet(p.clone()))
+ .collect::>(),
+ );
+ });
+}
diff --git a/core/benches/retransmit_stage.rs b/core/benches/retransmit_stage.rs
index bad02d043a..c6bec24fbd 100644
--- a/core/benches/retransmit_stage.rs
+++ b/core/benches/retransmit_stage.rs
@@ -121,6 +121,7 @@ fn bench_retransmitter(bencher: &mut Bencher) {
shreds_receiver,
Arc::default(), // solana_rpc::max_slots::MaxSlots
None,
+ None,
);
let mut index = 0;
diff --git a/core/src/backoff.rs b/core/src/backoff.rs
new file mode 100644
index 0000000000..223b3d30ac
--- /dev/null
+++ b/core/src/backoff.rs
@@ -0,0 +1,45 @@
+// BackoffStrategy currently implements a simple
+// Fibonacci backoff strategy with hardcoded values.
+// Currently the only use case is for retrying long lived
+// connection loops in recv_verify_stage, as use cases
+// expand more strategies will be added.
+
+use std::cmp::min;
+
+const INITIAL_LAST_WAIT: u64 = 0;
+const INITIAL_CUR_WAIT: u64 = 100;
+const MAX_WAIT: u64 = 1000;
+
+#[derive(Copy, Clone)]
+pub struct BackoffStrategy {
+ // Wait times in ms
+ last_wait: u64,
+ cur_wait: u64,
+}
+
+impl Default for BackoffStrategy {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl BackoffStrategy {
+ pub fn new() -> BackoffStrategy {
+ BackoffStrategy {
+ last_wait: INITIAL_LAST_WAIT,
+ cur_wait: INITIAL_CUR_WAIT,
+ }
+ }
+
+ pub fn next_wait(&mut self) -> u64 {
+ let next_wait = min(self.cur_wait + self.last_wait, MAX_WAIT);
+ self.last_wait = self.cur_wait;
+ self.cur_wait = next_wait;
+ next_wait
+ }
+
+ pub fn reset(&mut self) {
+ self.last_wait = INITIAL_LAST_WAIT;
+ self.cur_wait = INITIAL_CUR_WAIT;
+ }
+}
diff --git a/core/src/banking_stage.rs b/core/src/banking_stage.rs
index 70105973de..c10b625e84 100644
--- a/core/src/banking_stage.rs
+++ b/core/src/banking_stage.rs
@@ -4,6 +4,7 @@
use {
crate::{
+ bundle_account_locker::BundleAccountLocker,
forward_packet_batches_by_accounts::ForwardPacketBatchesByAccounts,
immutable_deserialized_packet::ImmutableDeserializedPacket,
leader_slot_banking_stage_metrics::{LeaderSlotMetricsTracker, ProcessTransactionsSummary},
@@ -65,7 +66,7 @@ use {
solana_transaction_status::token_balances::TransactionTokenBalancesSet,
std::{
cmp,
- collections::HashMap,
+ collections::{HashMap, HashSet},
env,
net::{SocketAddr, UdpSocket},
sync::{
@@ -403,6 +404,8 @@ impl BankingStage {
log_messages_bytes_limit: Option,
connection_cache: Arc,
bank_forks: Arc>,
+ blacklisted_accounts: HashSet,
+ bundle_account_locker: BundleAccountLocker,
) -> Self {
Self::new_num_threads(
cluster_info,
@@ -417,6 +420,8 @@ impl BankingStage {
log_messages_bytes_limit,
connection_cache,
bank_forks,
+ blacklisted_accounts,
+ bundle_account_locker,
)
}
@@ -434,6 +439,8 @@ impl BankingStage {
log_messages_bytes_limit: Option,
connection_cache: Arc,
bank_forks: Arc>,
+ blacklisted_accounts: HashSet,
+ bundle_account_locker: BundleAccountLocker,
) -> Self {
assert!(num_threads >= MIN_TOTAL_THREADS);
// Single thread to generate entries from many banks.
@@ -467,6 +474,9 @@ impl BankingStage {
let data_budget = data_budget.clone();
let cost_model = cost_model.clone();
let connection_cache = connection_cache.clone();
+ let blacklisted_accounts = blacklisted_accounts.clone();
+ let bundle_account_locker = bundle_account_locker.clone();
+
let bank_forks = bank_forks.clone();
Builder::new()
.name(format!("solBanknStgTx{:02}", i))
@@ -486,6 +496,8 @@ impl BankingStage {
log_messages_bytes_limit,
connection_cache,
&bank_forks,
+ blacklisted_accounts,
+ bundle_account_locker,
);
})
.unwrap()
@@ -604,12 +616,15 @@ impl BankingStage {
slot_metrics_tracker: &mut LeaderSlotMetricsTracker,
num_packets_to_process_per_iteration: usize,
log_messages_bytes_limit: Option,
+ blacklisted_accounts: &HashSet,
+ bundle_account_locker: &BundleAccountLocker,
) {
let mut rebuffered_packet_count = 0;
let mut consumed_buffered_packets_count = 0;
let buffered_packets_len = buffered_packet_batches.len();
let mut proc_start = Measure::start("consume_buffered_process");
let mut reached_end_of_slot = false;
+
let mut retryable_packets = {
let capacity = buffered_packet_batches.capacity();
std::mem::replace(
@@ -651,7 +666,9 @@ impl BankingStage {
banking_stage_stats,
qos_service,
slot_metrics_tracker,
- log_messages_bytes_limit
+ log_messages_bytes_limit,
+ blacklisted_accounts,
+ bundle_account_locker,
),
"process_packets_transactions",
);
@@ -806,6 +823,8 @@ impl BankingStage {
connection_cache: &ConnectionCache,
tracer_packet_stats: &mut TracerPacketStats,
bank_forks: &Arc>,
+ blacklisted_accounts: &HashSet,
+ bundle_account_locker: &BundleAccountLocker,
) {
let ((metrics_action, decision), make_decision_time) = measure!(
{
@@ -865,7 +884,9 @@ impl BankingStage {
qos_service,
slot_metrics_tracker,
UNPROCESSED_BUFFER_STEP_SIZE,
- log_messages_bytes_limit
+ log_messages_bytes_limit,
+ blacklisted_accounts,
+ bundle_account_locker
),
"consume_buffered_packets",
);
@@ -1329,6 +1350,8 @@ impl BankingStage {
log_messages_bytes_limit: Option,
connection_cache: Arc,
bank_forks: &Arc>,
+ blacklisted_accounts: HashSet,
+ bundle_account_locker: BundleAccountLocker,
) {
let recorder = poh_recorder.read().unwrap().recorder();
let socket = UdpSocket::bind("0.0.0.0:0").unwrap();
@@ -1364,6 +1387,8 @@ impl BankingStage {
&connection_cache,
&mut tracer_packet_stats,
bank_forks,
+ &blacklisted_accounts,
+ &bundle_account_locker,
),
"process_buffered_packets",
);
@@ -1435,8 +1460,10 @@ impl BankingStage {
let (hash, hash_time) = measure!(hash_transactions(&transactions), "hash");
record_transactions_timings.hash_us = hash_time.as_us();
- let (res, poh_record_time) =
- measure!(recorder.record(bank_slot, hash, transactions), "hash");
+ let (res, poh_record_time) = measure!(
+ recorder.record(bank_slot, vec![(hash, transactions)]),
+ "hash"
+ );
record_transactions_timings.poh_record_us = poh_record_time.as_us();
match res {
@@ -1490,7 +1517,7 @@ impl BankingStage {
};
let pre_token_balances = if transaction_status_sender.is_some() {
- collect_token_balances(bank, batch, &mut mint_decimals)
+ collect_token_balances(bank, batch, &mut mint_decimals, None)
} else {
vec![]
};
@@ -1635,7 +1662,7 @@ impl BankingStage {
let txs = batch.sanitized_transactions().to_vec();
let post_balances = bank.collect_balances(batch);
let post_token_balances =
- collect_token_balances(bank, batch, &mut mint_decimals);
+ collect_token_balances(bank, batch, &mut mint_decimals, None);
let mut transaction_index = starting_transaction_index.unwrap_or_default();
let batch_transaction_indexes: Vec<_> = tx_results
.execution_results
@@ -1716,6 +1743,7 @@ impl BankingStage {
gossip_vote_sender: &ReplayVoteSender,
qos_service: &QosService,
log_messages_bytes_limit: Option,
+ bundle_account_locker: &BundleAccountLocker,
) -> ProcessTransactionBatchOutput {
let mut cost_model_time = Measure::start("cost_model");
@@ -1736,9 +1764,20 @@ impl BankingStage {
// Only lock accounts for those transactions are selected for the block;
// Once accounts are locked, other threads cannot encode transactions that will modify the
- // same account state
+ // same account state.
let mut lock_time = Measure::start("lock_time");
- let batch = bank.prepare_sanitized_batch_with_results(txs, transactions_qos_results.iter());
+
+ let batch = {
+ // BundleStage locks ALL accounts in ALL transactions in a bundle to avoid race
+ // conditions with BankingStage
+ let account_locks = bundle_account_locker.account_locks();
+ bank.prepare_sanitized_batch_with_results(
+ txs,
+ transactions_qos_results.iter(),
+ &account_locks.read_locks(),
+ &account_locks.write_locks(),
+ )
+ };
lock_time.stop();
// retryable_txs includes AccountInUse, WouldExceedMaxBlockCostLimit
@@ -1909,6 +1948,7 @@ impl BankingStage {
gossip_vote_sender: &ReplayVoteSender,
qos_service: &QosService,
log_messages_bytes_limit: Option,
+ bundle_account_locker: &BundleAccountLocker,
) -> ProcessTransactionsSummary {
let mut chunk_start = 0;
let mut all_retryable_tx_indexes = vec![];
@@ -1941,6 +1981,7 @@ impl BankingStage {
gossip_vote_sender,
qos_service,
log_messages_bytes_limit,
+ bundle_account_locker,
);
let ProcessTransactionBatchOutput {
@@ -2136,6 +2177,8 @@ impl BankingStage {
qos_service: &'a QosService,
slot_metrics_tracker: &'a mut LeaderSlotMetricsTracker,
log_messages_bytes_limit: Option,
+ blacklisted_accounts: &HashSet,
+ bundle_account_locker: &BundleAccountLocker,
) -> ProcessTransactionsSummary {
// Convert packets to transactions
let ((transactions, transaction_to_packet_indexes), packet_conversion_time): (
@@ -2151,6 +2194,12 @@ impl BankingStage {
bank.vote_only_bank(),
bank.as_ref(),
)
+ .filter(|tx| {
+ !tx.message()
+ .account_keys()
+ .iter()
+ .any(|acc| blacklisted_accounts.contains(acc))
+ })
.map(|transaction| (transaction, i))
})
.unzip(),
@@ -2175,6 +2224,7 @@ impl BankingStage {
gossip_vote_sender,
qos_service,
log_messages_bytes_limit,
+ bundle_account_locker
),
"process_transaction_time",
);
@@ -2396,7 +2446,7 @@ mod tests {
super::*,
crossbeam_channel::{unbounded, Receiver},
solana_address_lookup_table_program::state::{AddressLookupTable, LookupTableMeta},
- solana_entry::entry::{next_entry, next_versioned_entry, Entry, EntrySlice},
+ solana_entry::entry::{next_entry, next_versioned_entry, EntrySlice},
solana_gossip::{cluster_info::Node, contact_info::ContactInfo},
solana_ledger::{
blockstore::{entries_to_test_shreds, Blockstore},
@@ -2466,6 +2516,8 @@ mod tests {
let cluster_info = Arc::new(cluster_info);
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
+
let banking_stage = BankingStage::new(
&cluster_info,
&poh_recorder,
@@ -2478,6 +2530,8 @@ mod tests {
None,
Arc::new(ConnectionCache::default()),
bank_forks,
+ HashSet::default(),
+ bundle_locker,
);
drop(verified_sender);
drop(gossip_verified_vote_sender);
@@ -2492,6 +2546,7 @@ mod tests {
#[test]
fn test_banking_stage_tick() {
solana_logger::setup();
+
let GenesisConfigInfo {
mut genesis_config, ..
} = create_genesis_config(2);
@@ -2520,6 +2575,8 @@ mod tests {
let (verified_gossip_vote_sender, verified_gossip_vote_receiver) = unbounded();
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
+
let banking_stage = BankingStage::new(
&cluster_info,
&poh_recorder,
@@ -2532,6 +2589,8 @@ mod tests {
None,
Arc::new(ConnectionCache::default()),
bank_forks,
+ HashSet::default(),
+ bundle_locker,
);
trace!("sending bank");
drop(verified_sender);
@@ -2544,7 +2603,12 @@ mod tests {
trace!("getting entries");
let entries: Vec<_> = entry_receiver
.iter()
- .map(|(_bank, (entry, _tick_height))| entry)
+ .flat_map(
+ |WorkingBankEntry {
+ bank: _,
+ entries_ticks,
+ }| entries_ticks.into_iter().map(|e| e.0),
+ )
.collect();
trace!("done");
assert_eq!(entries.len(), genesis_config.ticks_per_slot as usize);
@@ -2569,6 +2633,7 @@ mod tests {
#[test]
fn test_banking_stage_entries_only() {
solana_logger::setup();
+
let GenesisConfigInfo {
genesis_config,
mint_keypair,
@@ -2599,6 +2664,7 @@ mod tests {
let cluster_info = Arc::new(cluster_info);
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
let banking_stage = BankingStage::new(
&cluster_info,
&poh_recorder,
@@ -2611,6 +2677,8 @@ mod tests {
None,
Arc::new(ConnectionCache::default()),
bank_forks,
+ HashSet::default(),
+ bundle_locker,
);
// fund another account so we can send 2 good transactions in a single batch.
@@ -2662,9 +2730,14 @@ mod tests {
bank.process_transaction(&fund_tx).unwrap();
//receive entries + ticks
loop {
- let entries: Vec = entry_receiver
+ let entries: Vec<_> = entry_receiver
.iter()
- .map(|(_bank, (entry, _tick_height))| entry)
+ .flat_map(
+ |WorkingBankEntry {
+ bank: _,
+ entries_ticks,
+ }| entries_ticks.into_iter().map(|e| e.0),
+ )
.collect();
assert!(entries.verify(&blockhash));
@@ -2695,6 +2768,7 @@ mod tests {
#[test]
fn test_banking_stage_entryfication() {
solana_logger::setup();
+
// In this attack we'll demonstrate that a verifier can interpret the ledger
// differently if either the server doesn't signal the ledger to add an
// Entry OR if the verifier tries to parallelize across multiple Entries.
@@ -2754,6 +2828,9 @@ mod tests {
create_test_recorder(&bank, &blockstore, Some(poh_config), None);
let cluster_info = new_test_cluster_info(Node::new_localhost().info);
let cluster_info = Arc::new(cluster_info);
+
+ let bundle_locker = BundleAccountLocker::default();
+
let _banking_stage = BankingStage::new_num_threads(
&cluster_info,
&poh_recorder,
@@ -2767,6 +2844,8 @@ mod tests {
None,
Arc::new(ConnectionCache::default()),
bank_forks,
+ HashSet::default(),
+ bundle_locker,
);
// wait for banking_stage to eat the packets
@@ -2785,7 +2864,12 @@ mod tests {
// check that the balance is what we expect.
let entries: Vec<_> = entry_receiver
.iter()
- .map(|(_bank, (entry, _tick_height))| entry)
+ .flat_map(
+ |WorkingBankEntry {
+ bank: _,
+ entries_ticks,
+ }| entries_ticks.into_iter().map(|e| e.0),
+ )
.collect();
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
@@ -2853,7 +2937,12 @@ mod tests {
];
let _ = BankingStage::record_transactions(bank.slot(), txs.clone(), &recorder);
- let (_bank, (entry, _tick_height)) = entry_receiver.recv().unwrap();
+ let WorkingBankEntry {
+ bank: _,
+ entries_ticks,
+ } = entry_receiver.recv().unwrap();
+ assert_eq!(entries_ticks.len(), 1);
+ let entry = entries_ticks.get(0).unwrap().0.clone();
assert_eq!(entry.transactions, txs);
// Once bank is set to a new bank (setting bank.slot() + 1 in record_transactions),
@@ -2885,7 +2974,7 @@ mod tests {
Ok(()),
Err(TransactionError::BlockhashNotFound),
Ok(()),
- Ok(())
+ Ok(()),
]
);
@@ -2914,7 +3003,7 @@ mod tests {
(Ok(()), None),
(Ok(()), None),
],
- &[2, 4, 5, 9, 11, 13]
+ &[2, 4, 5, 9, 11, 13],
),
[5, 11, 13]
);
@@ -2929,7 +3018,7 @@ mod tests {
(Ok(()), None),
(Ok(()), None),
],
- &[1, 6, 7, 9, 31, 43]
+ &[1, 6, 7, 9, 31, 43],
),
[1, 9, 31, 43]
);
@@ -3027,6 +3116,7 @@ mod tests {
#[test]
fn test_bank_process_and_record_transactions() {
solana_logger::setup();
+
let GenesisConfigInfo {
genesis_config,
mint_keypair,
@@ -3066,6 +3156,8 @@ mod tests {
poh_recorder.write().unwrap().set_bank(&bank, false);
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
+
let process_transactions_batch_output = BankingStage::process_and_record_transactions(
&bank,
&transactions,
@@ -3075,6 +3167,7 @@ mod tests {
&gossip_vote_sender,
&QosService::new(Arc::new(RwLock::new(CostModel::default())), 1),
None,
+ &bundle_locker,
);
let ExecuteAndCommitTransactionsOutput {
@@ -3097,7 +3190,13 @@ mod tests {
let mut done = false;
// read entries until I find mine, might be ticks...
- while let Ok((_bank, (entry, _tick_height))) = entry_receiver.recv() {
+ while let Ok(WorkingBankEntry {
+ bank: _,
+ entries_ticks,
+ }) = entry_receiver.recv()
+ {
+ assert_eq!(entries_ticks.len(), 1);
+ let entry = entries_ticks.get(0).unwrap().0.clone();
if !entry.is_tick() {
trace!("got entry");
assert_eq!(entry.transactions.len(), transactions.len());
@@ -3119,6 +3218,8 @@ mod tests {
genesis_config.hash(),
)]);
+ let bundle_locker = BundleAccountLocker::default();
+
let process_transactions_batch_output = BankingStage::process_and_record_transactions(
&bank,
&transactions,
@@ -3128,6 +3229,7 @@ mod tests {
&gossip_vote_sender,
&QosService::new(Arc::new(RwLock::new(CostModel::default())), 1),
None,
+ &bundle_locker,
);
let ExecuteAndCommitTransactionsOutput {
@@ -3163,6 +3265,7 @@ mod tests {
#[test]
fn test_bank_process_and_record_transactions_all_unexecuted() {
solana_logger::setup();
+
let GenesisConfigInfo {
genesis_config,
mint_keypair,
@@ -3203,6 +3306,8 @@ mod tests {
poh_recorder.write().unwrap().set_bank(&bank, false);
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
+
let process_transactions_batch_output = BankingStage::process_and_record_transactions(
&bank,
&transactions,
@@ -3212,6 +3317,7 @@ mod tests {
&gossip_vote_sender,
&QosService::new(Arc::new(RwLock::new(CostModel::default())), 1),
None,
+ &bundle_locker,
);
let ExecuteAndCommitTransactionsOutput {
@@ -3245,6 +3351,7 @@ mod tests {
#[test]
fn test_bank_process_and_record_transactions_cost_tracker() {
solana_logger::setup();
+
let GenesisConfigInfo {
genesis_config,
mint_keypair,
@@ -3295,6 +3402,8 @@ mod tests {
genesis_config.hash(),
)]);
+ let bundle_locker = BundleAccountLocker::default();
+
let process_transactions_batch_output = BankingStage::process_and_record_transactions(
&bank,
&transactions,
@@ -3304,6 +3413,7 @@ mod tests {
&gossip_vote_sender,
&qos_service,
None,
+ &bundle_locker,
);
let ExecuteAndCommitTransactionsOutput {
@@ -3344,6 +3454,7 @@ mod tests {
&gossip_vote_sender,
&qos_service,
None,
+ &bundle_locker,
);
let ExecuteAndCommitTransactionsOutput {
@@ -3393,6 +3504,7 @@ mod tests {
#[test]
fn test_bank_process_and_record_transactions_account_in_use() {
solana_logger::setup();
+
let GenesisConfigInfo {
genesis_config,
mint_keypair,
@@ -3431,6 +3543,7 @@ mod tests {
let poh_simulator = simulate_poh(record_receiver, &poh_recorder);
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
let process_transactions_batch_output = BankingStage::process_and_record_transactions(
&bank,
@@ -3441,6 +3554,7 @@ mod tests {
&gossip_vote_sender,
&QosService::new(Arc::new(RwLock::new(CostModel::default())), 1),
None,
+ &bundle_locker,
);
poh_recorder
@@ -3607,6 +3721,7 @@ mod tests {
#[test]
fn test_process_transactions_returns_unprocessed_txs() {
solana_logger::setup();
+
let GenesisConfigInfo {
genesis_config,
mint_keypair,
@@ -3648,6 +3763,8 @@ mod tests {
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
+
let process_transactions_summary = BankingStage::process_transactions(
&bank,
&Instant::now(),
@@ -3657,6 +3774,7 @@ mod tests {
&gossip_vote_sender,
&QosService::new(Arc::new(RwLock::new(CostModel::default())), 1),
None,
+ &bundle_locker,
);
let ProcessTransactionsSummary {
@@ -3715,6 +3833,8 @@ mod tests {
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
+
let process_transactions_summary = BankingStage::process_transactions(
&bank,
&Instant::now(),
@@ -3724,6 +3844,7 @@ mod tests {
&gossip_vote_sender,
&QosService::new(Arc::new(RwLock::new(CostModel::default())), 1),
None,
+ &bundle_locker,
);
poh_recorder
@@ -3797,6 +3918,7 @@ mod tests {
(1..transactions_count - 1).collect::>()
);
}
+
#[test]
fn test_process_transactions_account_in_use() {
solana_logger::setup();
@@ -3817,7 +3939,7 @@ mod tests {
&mint_keypair,
&Pubkey::new_unique(),
1,
- genesis_config.hash()
+ genesis_config.hash(),
);
MAX_NUM_TRANSACTIONS_PER_BATCH
];
@@ -3859,6 +3981,7 @@ mod tests {
#[test]
fn test_write_persist_transaction_status() {
solana_logger::setup();
+
let GenesisConfigInfo {
mut genesis_config,
mint_keypair,
@@ -3943,6 +4066,8 @@ mod tests {
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
+
let _ = BankingStage::process_and_record_transactions(
&bank,
&transactions,
@@ -3954,6 +4079,7 @@ mod tests {
&gossip_vote_sender,
&QosService::new(Arc::new(RwLock::new(CostModel::default())), 1),
None,
+ &bundle_locker,
);
transaction_status_service.join().unwrap();
@@ -4020,6 +4146,7 @@ mod tests {
#[test]
fn test_write_persist_loaded_addresses() {
solana_logger::setup();
+
let GenesisConfigInfo {
genesis_config,
mint_keypair,
@@ -4112,6 +4239,8 @@ mod tests {
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
+
let _ = BankingStage::process_and_record_transactions(
&bank,
&[sanitized_tx.clone()],
@@ -4123,6 +4252,7 @@ mod tests {
&gossip_vote_sender,
&QosService::new(Arc::new(RwLock::new(CostModel::default())), 1),
None,
+ &bundle_locker,
);
transaction_status_service.join().unwrap();
@@ -4230,6 +4360,8 @@ mod tests {
let (gossip_vote_sender, _gossip_vote_receiver) = unbounded();
+ let bundle_locker = BundleAccountLocker::default();
+
// When the working bank in poh_recorder is None, no packets should be processed
assert!(!poh_recorder.read().unwrap().has_bank());
let max_tx_processing_ns = std::u128::MAX;
@@ -4247,6 +4379,8 @@ mod tests {
&mut LeaderSlotMetricsTracker::new(0),
num_conflicting_transactions,
None,
+ &HashSet::default(),
+ &bundle_locker,
);
assert_eq!(buffered_packet_batches.len(), num_conflicting_transactions);
// When the poh recorder has a bank, should process all non conflicting buffered packets.
@@ -4268,6 +4402,8 @@ mod tests {
&mut LeaderSlotMetricsTracker::new(0),
num_packets_to_process_per_iteration,
None,
+ &HashSet::default(),
+ &bundle_locker,
);
if num_expected_unprocessed == 0 {
assert!(buffered_packet_batches.is_empty())
@@ -4328,6 +4464,9 @@ mod tests {
.iter()
.map(|packet| *packet.immutable_section().message_hash())
.collect();
+
+ let bundle_locker = BundleAccountLocker::default();
+
BankingStage::consume_buffered_packets(
&Pubkey::default(),
std::u128::MAX,
@@ -4342,6 +4481,8 @@ mod tests {
&mut LeaderSlotMetricsTracker::new(0),
num_packets_to_process_per_iteration,
None,
+ &HashSet::default(),
+ &bundle_locker,
);
// Check everything is correct. All indexes after `interrupted_iteration`
@@ -4740,4 +4881,7 @@ mod tests {
BankingStage::filter_processed_packets(retryable_indexes.iter(), f);
assert_eq!(non_retryable_indexes, vec![(0, 1), (4, 5), (6, 8)]);
}
+
+ // TODO (LB): test that banking stage doesn't process packets that contain accounts
+ // in BundleAccountLocker
}
diff --git a/core/src/broadcast_stage.rs b/core/src/broadcast_stage.rs
index a42c8a6885..1d34ec7ac8 100644
--- a/core/src/broadcast_stage.rs
+++ b/core/src/broadcast_stage.rs
@@ -35,7 +35,7 @@ use {
},
std::{
collections::{HashMap, HashSet},
- net::UdpSocket,
+ net::{SocketAddr, UdpSocket},
sync::{
atomic::{AtomicBool, Ordering},
Arc, Mutex, RwLock,
@@ -86,6 +86,7 @@ impl BroadcastStageType {
blockstore: Arc,
bank_forks: Arc>,
shred_version: u16,
+ shred_receiver_addr: Option,
) -> BroadcastStage {
match self {
BroadcastStageType::Standard => BroadcastStage::new(
@@ -97,6 +98,7 @@ impl BroadcastStageType {
blockstore,
bank_forks,
StandardBroadcastRun::new(shred_version),
+ shred_receiver_addr,
),
BroadcastStageType::FailEntryVerification => BroadcastStage::new(
@@ -108,6 +110,7 @@ impl BroadcastStageType {
blockstore,
bank_forks,
FailEntryVerificationBroadcastRun::new(shred_version),
+ None,
),
BroadcastStageType::BroadcastFakeShreds => BroadcastStage::new(
@@ -119,6 +122,7 @@ impl BroadcastStageType {
blockstore,
bank_forks,
BroadcastFakeShredsRun::new(0, shred_version),
+ None,
),
BroadcastStageType::BroadcastDuplicates(config) => BroadcastStage::new(
@@ -130,6 +134,7 @@ impl BroadcastStageType {
blockstore,
bank_forks,
BroadcastDuplicatesRun::new(shred_version, config.clone()),
+ None,
),
}
}
@@ -150,6 +155,7 @@ trait BroadcastRun {
cluster_info: &ClusterInfo,
sock: &UdpSocket,
bank_forks: &RwLock,
+ shred_receiver_addr: Option,
) -> Result<()>;
fn record(&mut self, receiver: &Mutex, blockstore: &Blockstore) -> Result<()>;
}
@@ -245,6 +251,7 @@ impl BroadcastStage {
blockstore: Arc,
bank_forks: Arc>,
broadcast_stage_run: impl BroadcastRun + Send + 'static + Clone,
+ shred_receiver_addr: Option,
) -> Self {
let (socket_sender, socket_receiver) = unbounded();
let (blockstore_sender, blockstore_receiver) = unbounded();
@@ -279,8 +286,13 @@ impl BroadcastStage {
let t = Builder::new()
.name("solBroadcastTx".to_string())
.spawn(move || loop {
- let res =
- bs_transmit.transmit(&socket_receiver, &cluster_info, &sock, &bank_forks);
+ let res = bs_transmit.transmit(
+ &socket_receiver,
+ &cluster_info,
+ &sock,
+ &bank_forks,
+ shred_receiver_addr,
+ );
let res = Self::handle_error(res, "solana-broadcaster-transmit");
if let Some(res) = res {
return res;
@@ -396,6 +408,7 @@ pub fn broadcast_shreds(
cluster_info: &ClusterInfo,
bank_forks: &RwLock,
socket_addr_space: &SocketAddrSpace,
+ shred_receiver_addr: Option,
) -> Result<()> {
let mut result = Ok(());
let mut shred_select = Measure::start("shred_select");
@@ -405,18 +418,23 @@ pub fn broadcast_shreds(
};
let packets: Vec<_> = shreds
.iter()
- .group_by(|shred| shred.slot())
- .into_iter()
- .flat_map(|(slot, shreds)| {
- let cluster_nodes =
- cluster_nodes_cache.get(slot, &root_bank, &working_bank, cluster_info);
- update_peer_stats(&cluster_nodes, last_datapoint_submit);
- shreds.flat_map(move |shred| {
- let node = cluster_nodes.get_broadcast_peer(&shred.id())?;
- ContactInfo::is_valid_address(&node.tvu, socket_addr_space)
- .then(|| (shred.payload(), node.tvu))
- })
- })
+ .filter_map(|s| Some((s.payload(), shred_receiver_addr?)))
+ .chain(
+ shreds
+ .iter()
+ .group_by(|shred| shred.slot())
+ .into_iter()
+ .flat_map(|(slot, shreds)| {
+ let cluster_nodes =
+ cluster_nodes_cache.get(slot, &root_bank, &working_bank, cluster_info);
+ update_peer_stats(&cluster_nodes, last_datapoint_submit);
+ shreds.flat_map(move |shred| {
+ let node = cluster_nodes.get_broadcast_peer(&shred.id())?;
+ ContactInfo::is_valid_address(&node.tvu, socket_addr_space)
+ .then(|| (shred.payload(), node.tvu))
+ })
+ }),
+ )
.collect();
shred_select.stop();
transmit_stats.shred_select += shred_select.as_us();
@@ -617,6 +635,7 @@ pub mod test {
blockstore.clone(),
bank_forks,
StandardBroadcastRun::new(0),
+ None,
);
MockBroadcastStage {
@@ -656,7 +675,10 @@ pub mod test {
let ticks = create_ticks(max_tick_height - start_tick_height, 0, Hash::default());
for (i, tick) in ticks.into_iter().enumerate() {
entry_sender
- .send((bank.clone(), (tick, i as u64 + 1)))
+ .send(WorkingBankEntry {
+ bank: bank.clone(),
+ entries_ticks: vec![(tick, i as u64 + 1)],
+ })
.expect("Expect successful send to broadcast service");
}
}
diff --git a/core/src/broadcast_stage/broadcast_duplicates_run.rs b/core/src/broadcast_stage/broadcast_duplicates_run.rs
index 0315a343b9..3aee2d123d 100644
--- a/core/src/broadcast_stage/broadcast_duplicates_run.rs
+++ b/core/src/broadcast_stage/broadcast_duplicates_run.rs
@@ -10,7 +10,7 @@ use {
signature::{Keypair, Signature, Signer},
system_transaction,
},
- std::collections::HashSet,
+ std::{collections::HashSet, net::SocketAddr},
};
pub const MINIMUM_DUPLICATE_SLOT: Slot = 20;
@@ -266,6 +266,7 @@ impl BroadcastRun for BroadcastDuplicatesRun {
cluster_info: &ClusterInfo,
sock: &UdpSocket,
bank_forks: &RwLock,
+ _shred_receiver_addr: Option,
) -> Result<()> {
let (shreds, _) = receiver.lock().unwrap().recv()?;
if shreds.is_empty() {
diff --git a/core/src/broadcast_stage/broadcast_fake_shreds_run.rs b/core/src/broadcast_stage/broadcast_fake_shreds_run.rs
index 69aaf410af..867a424f91 100644
--- a/core/src/broadcast_stage/broadcast_fake_shreds_run.rs
+++ b/core/src/broadcast_stage/broadcast_fake_shreds_run.rs
@@ -3,6 +3,7 @@ use {
solana_entry::entry::Entry,
solana_ledger::shred::{ProcessShredsStats, ReedSolomonCache, Shredder},
solana_sdk::{hash::Hash, signature::Keypair},
+ std::net::SocketAddr,
};
#[derive(Clone)]
@@ -132,6 +133,7 @@ impl BroadcastRun for BroadcastFakeShredsRun {
cluster_info: &ClusterInfo,
sock: &UdpSocket,
_bank_forks: &RwLock,
+ _shred_receiver_addr: Option,
) -> Result<()> {
for (data_shreds, batch_info) in receiver.lock().unwrap().iter() {
let fake = batch_info.is_some();
diff --git a/core/src/broadcast_stage/broadcast_utils.rs b/core/src/broadcast_stage/broadcast_utils.rs
index f9485d59a9..6150bf4fec 100644
--- a/core/src/broadcast_stage/broadcast_utils.rs
+++ b/core/src/broadcast_stage/broadcast_utils.rs
@@ -36,13 +36,22 @@ pub(super) fn recv_slot_entries(receiver: &Receiver) -> Result
32 * ShredData::capacity(/*merkle_proof_size*/ None).unwrap() as u64;
let timer = Duration::new(1, 0);
let recv_start = Instant::now();
- let (mut bank, (entry, mut last_tick_height)) = receiver.recv_timeout(timer)?;
- let mut entries = vec![entry];
+
+ let WorkingBankEntry {
+ mut bank,
+ entries_ticks,
+ } = receiver.recv_timeout(timer)?;
+ let mut last_tick_height = entries_ticks.iter().last().unwrap().1;
+ let mut entries: Vec = entries_ticks.into_iter().map(|(e, _)| e).collect();
+
assert!(last_tick_height <= bank.max_tick_height());
// Drain channel
while last_tick_height != bank.max_tick_height() {
- let (try_bank, (entry, tick_height)) = match receiver.try_recv() {
+ let WorkingBankEntry {
+ bank: try_bank,
+ entries_ticks: new_entries_ticks,
+ } = match receiver.try_recv() {
Ok(working_bank_entry) => working_bank_entry,
Err(_) => break,
};
@@ -53,8 +62,8 @@ pub(super) fn recv_slot_entries(receiver: &Receiver) -> Result
entries.clear();
bank = try_bank;
}
- last_tick_height = tick_height;
- entries.push(entry);
+ last_tick_height = new_entries_ticks.iter().last().unwrap().1;
+ entries.extend(new_entries_ticks.into_iter().map(|(entry, _)| entry));
assert!(last_tick_height <= bank.max_tick_height());
}
@@ -65,11 +74,13 @@ pub(super) fn recv_slot_entries(receiver: &Receiver) -> Result
while last_tick_height != bank.max_tick_height()
&& serialized_batch_byte_count < target_serialized_batch_byte_count
{
- let (try_bank, (entry, tick_height)) =
- match receiver.recv_deadline(coalesce_start + ENTRY_COALESCE_DURATION) {
- Ok(working_bank_entry) => working_bank_entry,
- Err(_) => break,
- };
+ let WorkingBankEntry {
+ bank: try_bank,
+ entries_ticks: new_entries_ticks,
+ } = match receiver.recv_deadline(coalesce_start + ENTRY_COALESCE_DURATION) {
+ Ok(working_bank_entry) => working_bank_entry,
+ Err(_) => break,
+ };
// If the bank changed, that implies the previous slot was interrupted and we do not have to
// broadcast its entries.
if try_bank.slot() != bank.slot() {
@@ -79,10 +90,12 @@ pub(super) fn recv_slot_entries(receiver: &Receiver) -> Result
bank = try_bank;
coalesce_start = Instant::now();
}
- last_tick_height = tick_height;
- let entry_bytes = serialized_size(&entry)?;
- serialized_batch_byte_count += entry_bytes;
- entries.push(entry);
+ last_tick_height = new_entries_ticks.iter().last().unwrap().1;
+
+ for (entry, _) in &new_entries_ticks {
+ serialized_batch_byte_count += serialized_size(entry)?;
+ }
+ entries.extend(new_entries_ticks.into_iter().map(|(entry, _)| entry));
assert!(last_tick_height <= bank.max_tick_height());
}
let time_coalesced = coalesce_start.elapsed();
@@ -139,7 +152,11 @@ mod tests {
.map(|i| {
let entry = Entry::new(&last_hash, 1, vec![tx.clone()]);
last_hash = entry.hash;
- s.send((bank1.clone(), (entry.clone(), i))).unwrap();
+ s.send(WorkingBankEntry {
+ bank: bank1.clone(),
+ entries_ticks: vec![(entry.clone(), i)],
+ })
+ .unwrap();
entry
})
.collect();
@@ -173,11 +190,18 @@ mod tests {
last_hash = entry.hash;
// Interrupt slot 1 right before the last tick
if tick_height == expected_last_height {
- s.send((bank2.clone(), (entry.clone(), tick_height)))
- .unwrap();
+ s.send(WorkingBankEntry {
+ bank: bank2.clone(),
+ entries_ticks: vec![(entry.clone(), tick_height)],
+ })
+ .unwrap();
Some(entry)
} else {
- s.send((bank1.clone(), (entry, tick_height))).unwrap();
+ s.send(WorkingBankEntry {
+ bank: bank1.clone(),
+ entries_ticks: vec![(entry, tick_height)],
+ })
+ .unwrap();
None
}
})
diff --git a/core/src/broadcast_stage/fail_entry_verification_broadcast_run.rs b/core/src/broadcast_stage/fail_entry_verification_broadcast_run.rs
index e7b899ab0f..57cb9532da 100644
--- a/core/src/broadcast_stage/fail_entry_verification_broadcast_run.rs
+++ b/core/src/broadcast_stage/fail_entry_verification_broadcast_run.rs
@@ -3,7 +3,7 @@ use {
crate::cluster_nodes::ClusterNodesCache,
solana_ledger::shred::{ProcessShredsStats, ReedSolomonCache, Shredder},
solana_sdk::{hash::Hash, signature::Keypair},
- std::{thread::sleep, time::Duration},
+ std::{net::SocketAddr, thread::sleep, time::Duration},
};
pub const NUM_BAD_SLOTS: u64 = 10;
@@ -162,6 +162,7 @@ impl BroadcastRun for FailEntryVerificationBroadcastRun {
cluster_info: &ClusterInfo,
sock: &UdpSocket,
bank_forks: &RwLock,
+ shred_receiver_addr: Option,
) -> Result<()> {
let (shreds, _) = receiver.lock().unwrap().recv()?;
broadcast_shreds(
@@ -173,6 +174,7 @@ impl BroadcastRun for FailEntryVerificationBroadcastRun {
cluster_info,
bank_forks,
cluster_info.socket_addr_space(),
+ shred_receiver_addr,
)
}
fn record(&mut self, receiver: &Mutex, blockstore: &Blockstore) -> Result<()> {
diff --git a/core/src/broadcast_stage/standard_broadcast_run.rs b/core/src/broadcast_stage/standard_broadcast_run.rs
index f58ab368e9..ea8a8b62b4 100644
--- a/core/src/broadcast_stage/standard_broadcast_run.rs
+++ b/core/src/broadcast_stage/standard_broadcast_run.rs
@@ -15,7 +15,7 @@ use {
signature::Keypair,
timing::{duration_as_us, AtomicInterval},
},
- std::{sync::RwLock, time::Duration},
+ std::{net::SocketAddr, sync::RwLock, time::Duration},
};
#[derive(Clone)]
@@ -180,10 +180,10 @@ impl StandardBroadcastRun {
let brecv = Arc::new(Mutex::new(brecv));
//data
- let _ = self.transmit(&srecv, cluster_info, sock, bank_forks);
+ let _ = self.transmit(&srecv, cluster_info, sock, bank_forks, None);
let _ = self.record(&brecv, blockstore);
//coding
- let _ = self.transmit(&srecv, cluster_info, sock, bank_forks);
+ let _ = self.transmit(&srecv, cluster_info, sock, bank_forks, None);
let _ = self.record(&brecv, blockstore);
Ok(())
}
@@ -378,6 +378,7 @@ impl StandardBroadcastRun {
shreds: Arc>,
broadcast_shred_batch_info: Option,
bank_forks: &RwLock,
+ shred_receiver_addr: Option,
) -> Result<()> {
trace!("Broadcasting {:?} shreds", shreds.len());
let mut transmit_stats = TransmitShredsStats::default();
@@ -393,6 +394,7 @@ impl StandardBroadcastRun {
cluster_info,
bank_forks,
cluster_info.socket_addr_space(),
+ shred_receiver_addr,
)?;
transmit_time.stop();
@@ -462,9 +464,17 @@ impl BroadcastRun for StandardBroadcastRun {
cluster_info: &ClusterInfo,
sock: &UdpSocket,
bank_forks: &RwLock,
+ shred_receiver_addr: Option,
) -> Result<()> {
let (shreds, batch_info) = receiver.lock().unwrap().recv()?;
- self.broadcast(sock, cluster_info, shreds, batch_info, bank_forks)
+ self.broadcast(
+ sock,
+ cluster_info,
+ shreds,
+ batch_info,
+ bank_forks,
+ shred_receiver_addr,
+ )
}
fn record(&mut self, receiver: &Mutex, blockstore: &Blockstore) -> Result<()> {
let (shreds, slot_start_ts) = receiver.lock().unwrap().recv()?;
diff --git a/core/src/bundle_account_locker.rs b/core/src/bundle_account_locker.rs
new file mode 100644
index 0000000000..955a4dd170
--- /dev/null
+++ b/core/src/bundle_account_locker.rs
@@ -0,0 +1,334 @@
+///! Handles pre-locking bundle accounts so that accounts bundles touch can be reserved ahead
+/// of time for execution. Also, ensures that ALL accounts mentioned across a bundle are locked
+/// to avoid race conditions between BundleStage and BankingStage.
+///
+/// For instance, imagine a bundle with three transactions and the set of accounts for each transaction
+/// is: {{A, B}, {B, C}, {C, D}}. We need to lock A, B, and C even though only one is executed at a time.
+/// Imagine BundleStage is in the middle of processing {C, D} and we didn't have a lock on accounts {A, B, C}.
+/// In this situation, there's a chance that BankingStage can process a transaction containing A or B
+/// and commit the results before the bundle completes. By the time the bundle commits the new account
+/// state for {A, B, C}, A and B would be incorrect and the entries containing the bundle would be
+/// replayed improperly and that leader would have produced an invalid block.
+use {
+ solana_runtime::bank::Bank,
+ solana_sdk::{
+ bundle::sanitized::SanitizedBundle, pubkey::Pubkey, transaction::TransactionAccountLocks,
+ },
+ std::collections::{hash_map::Entry, HashMap, HashSet},
+ std::sync::{Arc, Mutex, MutexGuard},
+};
+
+#[derive(Debug)]
+pub enum BundleAccountLockerError {
+ LockingError,
+}
+
+pub type BundleAccountLockerResult = Result;
+
+pub struct LockedBundle<'a, 'b> {
+ bundle_account_locker: &'a BundleAccountLocker,
+ sanitized_bundle: &'b SanitizedBundle,
+ bank: Arc,
+}
+
+impl<'a, 'b> LockedBundle<'a, 'b> {
+ pub fn new(
+ bundle_account_locker: &'a BundleAccountLocker,
+ sanitized_bundle: &'b SanitizedBundle,
+ bank: &Arc,
+ ) -> Self {
+ Self {
+ bundle_account_locker,
+ sanitized_bundle,
+ bank: bank.clone(),
+ }
+ }
+
+ pub fn sanitized_bundle(&self) -> &SanitizedBundle {
+ self.sanitized_bundle
+ }
+}
+
+// Automatically unlock bundle accounts when destructed
+impl<'a, 'b> Drop for LockedBundle<'a, 'b> {
+ fn drop(&mut self) {
+ let _ = self
+ .bundle_account_locker
+ .unlock_bundle_accounts(self.sanitized_bundle, &self.bank);
+ }
+}
+
+#[derive(Default, Clone)]
+pub struct BundleAccountLocks {
+ read_locks: HashMap,
+ write_locks: HashMap,
+}
+
+impl BundleAccountLocks {
+ pub fn read_locks(&self) -> HashSet {
+ self.read_locks.keys().cloned().collect()
+ }
+
+ pub fn write_locks(&self) -> HashSet {
+ self.write_locks.keys().cloned().collect()
+ }
+
+ pub fn lock_accounts(
+ &mut self,
+ read_locks: HashMap,
+ write_locks: HashMap,
+ ) {
+ for (acc, count) in read_locks {
+ *self.read_locks.entry(acc).or_insert(0) += count;
+ }
+ for (acc, count) in write_locks {
+ *self.write_locks.entry(acc).or_insert(0) += count;
+ }
+ }
+
+ pub fn unlock_accounts(
+ &mut self,
+ read_locks: HashMap,
+ write_locks: HashMap,
+ ) {
+ for (acc, count) in read_locks {
+ if let Entry::Occupied(mut entry) = self.read_locks.entry(acc) {
+ let val = entry.get_mut();
+ *val = val.saturating_sub(count);
+ if entry.get() == &0 {
+ let _ = entry.remove();
+ }
+ } else {
+ warn!("error unlocking read-locked account, account: {:?}", acc);
+ }
+ }
+ for (acc, count) in write_locks {
+ if let Entry::Occupied(mut entry) = self.write_locks.entry(acc) {
+ let val = entry.get_mut();
+ *val = val.saturating_sub(count);
+ if entry.get() == &0 {
+ let _ = entry.remove();
+ }
+ } else {
+ warn!("error unlocking write-locked account, account: {:?}", acc);
+ }
+ }
+ }
+}
+
+#[derive(Clone, Default)]
+pub struct BundleAccountLocker {
+ account_locks: Arc>,
+}
+
+impl BundleAccountLocker {
+ /// used in BankingStage during TransactionBatch construction to ensure that BankingStage
+ /// doesn't lock anything currently locked in the BundleAccountLocker
+ pub fn read_locks(&self) -> HashSet {
+ self.account_locks.lock().unwrap().read_locks()
+ }
+
+ /// used in BankingStage during TransactionBatch construction to ensure that BankingStage
+ /// doesn't lock anything currently locked in the BundleAccountLocker
+ pub fn write_locks(&self) -> HashSet {
+ self.account_locks.lock().unwrap().write_locks()
+ }
+
+ /// used in BankingStage during TransactionBatch construction to ensure that BankingStage
+ /// doesn't lock anything currently locked in the BundleAccountLocker
+ pub fn account_locks(&self) -> MutexGuard {
+ self.account_locks.lock().unwrap()
+ }
+
+ /// Prepares a locked bundle and returns a LockedBundle containing locked accounts.
+ /// When a LockedBundle is dropped, the accounts are automatically unlocked
+ pub fn prepare_locked_bundle<'a, 'b>(
+ &'a self,
+ sanitized_bundle: &'b SanitizedBundle,
+ bank: &Arc,
+ ) -> BundleAccountLockerResult> {
+ let (read_locks, write_locks) = Self::get_read_write_locks(sanitized_bundle, bank)?;
+
+ self.account_locks
+ .lock()
+ .unwrap()
+ .lock_accounts(read_locks, write_locks);
+ Ok(LockedBundle::new(self, sanitized_bundle, bank))
+ }
+
+ /// Unlocks bundle accounts. Note that LockedBundle::drop will auto-drop the bundle account locks
+ fn unlock_bundle_accounts(
+ &self,
+ sanitized_bundle: &SanitizedBundle,
+ bank: &Bank,
+ ) -> BundleAccountLockerResult<()> {
+ let (read_locks, write_locks) = Self::get_read_write_locks(sanitized_bundle, bank)?;
+
+ self.account_locks
+ .lock()
+ .unwrap()
+ .unlock_accounts(read_locks, write_locks);
+ Ok(())
+ }
+
+ /// Returns the read and write locks for this bundle
+ /// Each lock type contains a HashMap which maps Pubkey to number of locks held
+ fn get_read_write_locks(
+ bundle: &SanitizedBundle,
+ bank: &Bank,
+ ) -> BundleAccountLockerResult<(HashMap, HashMap)> {
+ let transaction_locks: Vec = bundle
+ .transactions
+ .iter()
+ .filter_map(|tx| {
+ tx.get_account_locks(bank.get_transaction_account_lock_limit())
+ .ok()
+ })
+ .collect();
+
+ if transaction_locks.len() != bundle.transactions.len() {
+ return Err(BundleAccountLockerError::LockingError);
+ }
+
+ let bundle_read_locks = transaction_locks
+ .iter()
+ .flat_map(|tx| tx.readonly.iter().map(|a| **a));
+ let bundle_read_locks =
+ bundle_read_locks
+ .into_iter()
+ .fold(HashMap::new(), |mut map, acc| {
+ *map.entry(acc).or_insert(0) += 1;
+ map
+ });
+
+ let bundle_write_locks = transaction_locks
+ .iter()
+ .flat_map(|tx| tx.writable.iter().map(|a| **a));
+ let bundle_write_locks =
+ bundle_write_locks
+ .into_iter()
+ .fold(HashMap::new(), |mut map, acc| {
+ *map.entry(acc).or_insert(0) += 1;
+ map
+ });
+
+ Ok((bundle_read_locks, bundle_write_locks))
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use {
+ crate::{
+ bundle_account_locker::BundleAccountLocker, bundle_sanitizer::get_sanitized_bundle,
+ packet_bundle::PacketBundle,
+ },
+ solana_ledger::genesis_utils::create_genesis_config,
+ solana_perf::packet::PacketBatch,
+ solana_runtime::{
+ bank::Bank, genesis_utils::GenesisConfigInfo,
+ transaction_error_metrics::TransactionErrorMetrics,
+ },
+ solana_sdk::{
+ packet::Packet, signature::Signer, signer::keypair::Keypair, system_program,
+ system_transaction::transfer, transaction::VersionedTransaction,
+ },
+ std::{collections::HashSet, sync::Arc},
+ uuid::Uuid,
+ };
+
+ #[test]
+ fn test_simple_lock_bundles() {
+ let GenesisConfigInfo {
+ genesis_config,
+ mint_keypair,
+ ..
+ } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let bundle_account_locker = BundleAccountLocker::default();
+
+ let kp0 = Keypair::new();
+ let kp1 = Keypair::new();
+
+ let tx0 = VersionedTransaction::from(transfer(
+ &mint_keypair,
+ &kp0.pubkey(),
+ 1,
+ genesis_config.hash(),
+ ));
+ let tx1 = VersionedTransaction::from(transfer(
+ &mint_keypair,
+ &kp1.pubkey(),
+ 1,
+ genesis_config.hash(),
+ ));
+
+ let packet_bundle0 = PacketBundle {
+ batch: PacketBatch::new(vec![Packet::from_data(None, &tx0).unwrap()]),
+ uuid: Uuid::new_v4(),
+ };
+ let packet_bundle1 = PacketBundle {
+ batch: PacketBatch::new(vec![Packet::from_data(None, &tx1).unwrap()]),
+ uuid: Uuid::new_v4(),
+ };
+
+ let mut transaction_errors = TransactionErrorMetrics::default();
+
+ let sanitized_bundle0 = get_sanitized_bundle(
+ &packet_bundle0,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors,
+ )
+ .expect("sanitize bundle 0");
+ let sanitized_bundle1 = get_sanitized_bundle(
+ &packet_bundle1,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors,
+ )
+ .expect("sanitize bundle 1");
+
+ let locked_bundle0 = bundle_account_locker
+ .prepare_locked_bundle(&sanitized_bundle0, &bank)
+ .unwrap();
+
+ assert_eq!(
+ bundle_account_locker.write_locks(),
+ HashSet::from_iter([mint_keypair.pubkey(), kp0.pubkey()])
+ );
+ assert_eq!(
+ bundle_account_locker.read_locks(),
+ HashSet::from_iter([system_program::id()])
+ );
+
+ let locked_bundle1 = bundle_account_locker
+ .prepare_locked_bundle(&sanitized_bundle1, &bank)
+ .unwrap();
+ assert_eq!(
+ bundle_account_locker.write_locks(),
+ HashSet::from_iter([mint_keypair.pubkey(), kp0.pubkey(), kp1.pubkey()])
+ );
+ assert_eq!(
+ bundle_account_locker.read_locks(),
+ HashSet::from_iter([system_program::id()])
+ );
+
+ drop(locked_bundle0);
+ assert_eq!(
+ bundle_account_locker.write_locks(),
+ HashSet::from_iter([mint_keypair.pubkey(), kp1.pubkey()])
+ );
+ assert_eq!(
+ bundle_account_locker.read_locks(),
+ HashSet::from_iter([system_program::id()])
+ );
+
+ drop(locked_bundle1);
+ assert!(bundle_account_locker.write_locks().is_empty());
+ assert!(bundle_account_locker.read_locks().is_empty());
+ }
+}
diff --git a/core/src/bundle_sanitizer.rs b/core/src/bundle_sanitizer.rs
new file mode 100644
index 0000000000..4fde24e57b
--- /dev/null
+++ b/core/src/bundle_sanitizer.rs
@@ -0,0 +1,612 @@
+///! Turns packets into SanitizedTransactions and ensure they pass sanity checks
+use {
+ crate::immutable_deserialized_packet::ImmutableDeserializedPacket,
+ crate::packet_bundle::PacketBundle,
+ crate::unprocessed_packet_batches::deserialize_packets,
+ solana_perf::sigverify::verify_packet,
+ solana_runtime::{bank::Bank, transaction_error_metrics::TransactionErrorMetrics},
+ solana_sdk::{
+ bundle::sanitized::SanitizedBundle,
+ clock::MAX_PROCESSING_AGE,
+ feature_set::FeatureSet,
+ pubkey::Pubkey,
+ signature::Signature,
+ transaction::{AddressLoader, SanitizedTransaction},
+ },
+ std::{
+ collections::{hash_map::RandomState, HashSet},
+ iter::repeat,
+ sync::Arc,
+ },
+ thiserror::Error,
+};
+
+pub const MAX_PACKETS_PER_BUNDLE: usize = 5;
+
+#[derive(Error, Debug, PartialEq, Eq, Clone)]
+pub enum BundleSanitizerError {
+ #[error("Bank is in vote-only mode")]
+ VoteOnlyMode,
+ #[error("Bundle packet batch failed pre-check")]
+ FailedPacketBatchPreCheck,
+ #[error("Bundle mentions blacklisted account")]
+ BlacklistedAccount,
+ #[error("Bundle contains a transaction that failed to serialize")]
+ FailedToSerializeTransaction,
+ #[error("Bundle contains a duplicate transaction")]
+ DuplicateTransaction,
+ #[error("Bundle failed check_transactions")]
+ FailedCheckTransactions,
+}
+
+pub type BundleSanitizationResult = Result;
+
+/// An invalid bundle contains one of the following:
+/// No packets.
+/// Too many packets.
+/// Packets marked for discard (not sure why someone would do this)
+/// One of the packets fails signature verification.
+/// Mentions an account in consensus or blacklisted accounts.
+/// Contains a packet that failed to serialize to a transaction.
+/// Contains duplicate transactions within the same bundle.
+/// Contains a transaction that was already processed or one with an invalid blockhash.
+/// NOTE: bundles need to be sanitized for a given bank. For instance, a bundle sanitized
+/// on bank n-1 will be valid for all of bank n-1, and may or may not be valid for bank n
+pub fn get_sanitized_bundle(
+ packet_bundle: &PacketBundle,
+ bank: &Arc,
+ consensus_accounts_cache: &HashSet,
+ blacklisted_accounts: &HashSet,
+ transaction_error_metrics: &mut TransactionErrorMetrics,
+) -> BundleSanitizationResult {
+ if bank.vote_only_bank() {
+ return Err(BundleSanitizerError::VoteOnlyMode);
+ }
+
+ if packet_bundle.batch.is_empty()
+ || packet_bundle.batch.len() > MAX_PACKETS_PER_BUNDLE
+ || packet_bundle.batch.iter().any(|p| p.meta.discard())
+ || packet_bundle
+ .batch
+ .iter()
+ .any(|p| !verify_packet(&mut p.clone(), false))
+ {
+ return Err(BundleSanitizerError::FailedPacketBatchPreCheck);
+ }
+
+ let packet_indexes = (0..packet_bundle.batch.len()).collect::>();
+ let deserialized_packets = deserialize_packets(&packet_bundle.batch, &packet_indexes);
+ let transactions: Vec = deserialized_packets
+ .filter_map(|p| {
+ let immutable_packet = p.immutable_section().clone();
+ transaction_from_deserialized_packet(
+ &immutable_packet,
+ &bank.feature_set,
+ bank.as_ref(),
+ )
+ })
+ .collect();
+
+ let unique_signatures: HashSet<&Signature, RandomState> =
+ HashSet::from_iter(transactions.iter().map(|tx| tx.signature()));
+ let contains_blacklisted_account = transactions.iter().any(|tx| {
+ let accounts = tx.message().account_keys();
+ accounts
+ .iter()
+ .any(|acc| blacklisted_accounts.contains(acc) || consensus_accounts_cache.contains(acc))
+ });
+
+ if contains_blacklisted_account {
+ return Err(BundleSanitizerError::BlacklistedAccount);
+ }
+
+ if transactions.is_empty() || packet_bundle.batch.len() != transactions.len() {
+ return Err(BundleSanitizerError::FailedToSerializeTransaction);
+ }
+
+ if unique_signatures.len() != transactions.len() {
+ return Err(BundleSanitizerError::DuplicateTransaction);
+ }
+
+ // assume everything locks okay to check for already-processed transaction or expired/invalid blockhash
+ let lock_results: Vec<_> = repeat(Ok(())).take(transactions.len()).collect();
+ let check_results = bank.check_transactions(
+ &transactions,
+ &lock_results,
+ MAX_PROCESSING_AGE,
+ transaction_error_metrics,
+ );
+ if check_results.iter().any(|r| r.0.is_err()) {
+ return Err(BundleSanitizerError::FailedCheckTransactions);
+ }
+
+ Ok(SanitizedBundle { transactions })
+}
+
+// This function deserializes packets into transactions, computes the blake3 hash of transaction
+// messages, and verifies secp256k1 instructions. A list of sanitized transactions are returned
+// with their packet indexes.
+// NOTES on tx v2:
+// - tx v2 can only load addresses set in previous slots
+// - tx v2 can't reorg indices in a lookup table
+// - tx v2 transaction loading fails if it tries to access an invalid index (either doesn't exist
+// or exists but was set in the current slot
+#[allow(clippy::needless_collect)]
+fn transaction_from_deserialized_packet(
+ deserialized_packet: &ImmutableDeserializedPacket,
+ feature_set: &Arc,
+ address_loader: impl AddressLoader,
+) -> Option {
+ let tx = SanitizedTransaction::try_new(
+ deserialized_packet.transaction().clone(),
+ *deserialized_packet.message_hash(),
+ deserialized_packet.is_simple_vote(),
+ address_loader,
+ )
+ .ok()?;
+ tx.verify_precompiles(feature_set).ok()?;
+ Some(tx)
+}
+
+#[cfg(test)]
+mod tests {
+ use {
+ crate::{
+ bundle_sanitizer::{get_sanitized_bundle, MAX_PACKETS_PER_BUNDLE},
+ packet_bundle::PacketBundle,
+ tip_manager::{TipDistributionAccountConfig, TipManager, TipManagerConfig},
+ },
+ solana_address_lookup_table_program::instruction::create_lookup_table,
+ solana_ledger::genesis_utils::create_genesis_config,
+ solana_perf::packet::PacketBatch,
+ solana_runtime::{
+ bank::Bank, genesis_utils::GenesisConfigInfo,
+ transaction_error_metrics::TransactionErrorMetrics,
+ },
+ solana_sdk::{
+ hash::Hash,
+ instruction::Instruction,
+ packet::Packet,
+ pubkey::Pubkey,
+ signature::{Keypair, Signer},
+ system_transaction::transfer,
+ transaction::{SanitizedTransaction, Transaction, VersionedTransaction},
+ },
+ std::{collections::HashSet, sync::Arc},
+ uuid::Uuid,
+ };
+
+ #[test]
+ fn test_simple_get_sanitized_bundle() {
+ solana_logger::setup();
+ let GenesisConfigInfo {
+ genesis_config,
+ mint_keypair,
+ ..
+ } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let kp = Keypair::new();
+
+ let tx = VersionedTransaction::from(transfer(
+ &mint_keypair,
+ &kp.pubkey(),
+ 1,
+ genesis_config.hash(),
+ ));
+ let packet = Packet::from_data(None, &tx).unwrap();
+
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet]),
+ uuid: Uuid::new_v4(),
+ };
+
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ let sanitized_bundle = get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors,
+ )
+ .unwrap();
+ assert_eq!(sanitized_bundle.transactions.len(), 1);
+ assert_eq!(
+ sanitized_bundle.transactions[0].signature(),
+ &tx.signatures[0]
+ );
+ }
+
+ #[test]
+ fn test_fail_to_sanitize_consensus_account() {
+ solana_logger::setup();
+ let GenesisConfigInfo {
+ genesis_config,
+ mint_keypair,
+ ..
+ } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let kp = Keypair::new();
+
+ let tx = VersionedTransaction::from(transfer(
+ &mint_keypair,
+ &kp.pubkey(),
+ 1,
+ genesis_config.hash(),
+ ));
+ let packet = Packet::from_data(None, &tx).unwrap();
+
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet]),
+ uuid: Uuid::new_v4(),
+ };
+
+ let consensus_accounts_cache = HashSet::from([kp.pubkey()]);
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &consensus_accounts_cache,
+ &HashSet::default(),
+ &mut transaction_errors
+ )
+ .is_err());
+ }
+
+ #[test]
+ fn test_fail_to_sanitize_duplicate_transaction() {
+ solana_logger::setup();
+ let GenesisConfigInfo {
+ genesis_config,
+ mint_keypair,
+ ..
+ } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let kp = Keypair::new();
+
+ let tx = VersionedTransaction::from(transfer(
+ &mint_keypair,
+ &kp.pubkey(),
+ 1,
+ genesis_config.hash(),
+ ));
+ let packet = Packet::from_data(None, &tx).unwrap();
+
+ // bundle with a duplicate transaction
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet.clone(), packet]),
+ uuid: Uuid::new_v4(),
+ };
+
+ // fails to pop because bundle it locks the same transaction twice
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors
+ )
+ .is_err());
+ }
+
+ #[test]
+ fn test_fails_to_sanitize_bad_blockhash() {
+ solana_logger::setup();
+ let GenesisConfigInfo {
+ genesis_config,
+ mint_keypair,
+ ..
+ } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let kp = Keypair::new();
+
+ let tx =
+ VersionedTransaction::from(transfer(&mint_keypair, &kp.pubkey(), 1, Hash::default()));
+ let packet = Packet::from_data(None, &tx).unwrap();
+
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet.clone(), packet]),
+ uuid: Uuid::new_v4(),
+ };
+
+ // fails to pop because bundle has bad blockhash
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors
+ )
+ .is_err());
+ }
+
+ #[test]
+ fn test_fails_to_sanitize_already_processed() {
+ solana_logger::setup();
+ let GenesisConfigInfo {
+ genesis_config,
+ mint_keypair,
+ ..
+ } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let kp = Keypair::new();
+
+ let tx = VersionedTransaction::from(transfer(
+ &mint_keypair,
+ &kp.pubkey(),
+ 1,
+ genesis_config.hash(),
+ ));
+ let packet = Packet::from_data(None, &tx).unwrap();
+
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet.clone()]),
+ uuid: Uuid::new_v4(),
+ };
+
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ let sanitized_bundle = get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors,
+ )
+ .unwrap();
+
+ let results = bank.process_entry_transactions(
+ sanitized_bundle
+ .transactions
+ .into_iter()
+ .map(|tx| tx.to_versioned_transaction())
+ .collect(),
+ );
+ assert_eq!(results.len(), 1);
+ assert_eq!(results[0], Ok(()));
+
+ // try to process the same one again shall fail
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet]),
+ uuid: Uuid::new_v4(),
+ };
+
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors
+ )
+ .is_err());
+ }
+
+ #[test]
+ fn test_fails_to_sanitize_bundle_tip_program() {
+ solana_logger::setup();
+ let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let tip_manager = TipManager::new(TipManagerConfig {
+ tip_payment_program_id: Pubkey::new_unique(),
+ tip_distribution_program_id: Pubkey::new_unique(),
+ tip_distribution_account_config: TipDistributionAccountConfig {
+ payer: Arc::new(Keypair::new()),
+ merkle_root_upload_authority: Pubkey::new_unique(),
+ vote_account: Pubkey::new_unique(),
+ commission_bps: 0,
+ },
+ });
+
+ let kp = Keypair::new();
+ let tx =
+ SanitizedTransaction::try_from_legacy_transaction(Transaction::new_signed_with_payer(
+ &[Instruction::new_with_bytes(
+ tip_manager.tip_payment_program_id(),
+ &[0],
+ vec![],
+ )],
+ Some(&kp.pubkey()),
+ &[&kp],
+ genesis_config.hash(),
+ ))
+ .unwrap();
+
+ let packet = Packet::from_data(None, &tx.to_versioned_transaction()).unwrap();
+
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet]),
+ uuid: Uuid::new_v4(),
+ };
+
+ // fails to pop because bundle mentions tip program
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::from_iter([tip_manager.tip_payment_program_id()]),
+ &mut transaction_errors
+ )
+ .is_err());
+ }
+
+ #[test]
+ fn test_txv2_sanitized_bundle_ok() {
+ solana_logger::setup();
+ let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let kp = Keypair::new();
+ let tx =
+ SanitizedTransaction::try_from_legacy_transaction(Transaction::new_signed_with_payer(
+ &[create_lookup_table(kp.pubkey(), kp.pubkey(), bank.slot()).0],
+ Some(&kp.pubkey()),
+ &[&kp],
+ genesis_config.hash(),
+ ))
+ .unwrap();
+
+ let packet = Packet::from_data(None, &tx.to_versioned_transaction()).unwrap();
+
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet]),
+ uuid: Uuid::new_v4(),
+ };
+
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors
+ )
+ .is_ok());
+ }
+
+ #[test]
+ fn test_fails_to_sanitize_empty_bundle() {
+ solana_logger::setup();
+ let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![]),
+ uuid: Uuid::new_v4(),
+ };
+ // fails to pop because empty bundle
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors
+ )
+ .is_err());
+ }
+
+ #[test]
+ fn test_fails_to_sanitize_too_many_packets() {
+ solana_logger::setup();
+ let GenesisConfigInfo {
+ genesis_config,
+ mint_keypair,
+ ..
+ } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let kp = Keypair::new();
+
+ let packets = (0..MAX_PACKETS_PER_BUNDLE + 1).map(|i| {
+ let tx = VersionedTransaction::from(transfer(
+ &mint_keypair,
+ &kp.pubkey(),
+ i as u64,
+ genesis_config.hash(),
+ ));
+ Packet::from_data(None, &tx).unwrap()
+ });
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(packets.collect()),
+ uuid: Uuid::new_v4(),
+ };
+ // fails to pop because too many packets in a bundle
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors
+ )
+ .is_err());
+ }
+
+ #[test]
+ fn test_fails_to_sanitize_discarded() {
+ solana_logger::setup();
+ let GenesisConfigInfo {
+ genesis_config,
+ mint_keypair,
+ ..
+ } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let kp = Keypair::new();
+
+ let tx = VersionedTransaction::from(transfer(
+ &mint_keypair,
+ &kp.pubkey(),
+ 1,
+ genesis_config.hash(),
+ ));
+ let mut packet = Packet::from_data(None, &tx).unwrap();
+ packet.meta.set_discard(true);
+
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet]),
+ uuid: Uuid::new_v4(),
+ };
+
+ // fails to pop because one of the packets is marked as discard
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors
+ )
+ .is_err());
+ }
+
+ #[test]
+ fn test_fails_to_sanitize_bad_sigverify() {
+ solana_logger::setup();
+ let GenesisConfigInfo {
+ genesis_config,
+ mint_keypair,
+ ..
+ } = create_genesis_config(2);
+ let bank = Arc::new(Bank::new_no_wallclock_throttle_for_tests(&genesis_config));
+
+ let kp = Keypair::new();
+
+ let mut tx = VersionedTransaction::from(transfer(
+ &mint_keypair,
+ &kp.pubkey(),
+ 1,
+ genesis_config.hash(),
+ ));
+
+ let _ = tx.signatures.pop();
+
+ let bad_kp = Keypair::new();
+ let serialized = tx.message.serialize();
+ let bad_sig = bad_kp.sign_message(&serialized);
+ tx.signatures.push(bad_sig);
+
+ let packet = Packet::from_data(None, &tx).unwrap();
+
+ let packet_bundle = PacketBundle {
+ batch: PacketBatch::new(vec![packet]),
+ uuid: Uuid::new_v4(),
+ };
+ let mut transaction_errors = TransactionErrorMetrics::default();
+ assert!(get_sanitized_bundle(
+ &packet_bundle,
+ &bank,
+ &HashSet::default(),
+ &HashSet::default(),
+ &mut transaction_errors
+ )
+ .is_err());
+ }
+}
diff --git a/core/src/bundle_stage.rs b/core/src/bundle_stage.rs
new file mode 100644
index 0000000000..c82ddce6f4
--- /dev/null
+++ b/core/src/bundle_stage.rs
@@ -0,0 +1,1943 @@
+//! The `banking_stage` processes Transaction messages. It is intended to be used
+//! to contruct a software pipeline. The stage uses all available CPU cores and
+//! can do its processing in parallel with signature verification on the GPU.
+use {
+ crate::{
+ banking_stage::{BatchedTransactionDetails, CommitTransactionDetails},
+ bundle_account_locker::{BundleAccountLocker, BundleAccountLockerResult, LockedBundle},
+ bundle_sanitizer::{get_sanitized_bundle, BundleSanitizerError},
+ bundle_stage_leader_stats::{BundleStageLeaderSlotTrackingMetrics, BundleStageLeaderStats},
+ consensus_cache_updater::ConsensusCacheUpdater,
+ leader_slot_banking_stage_timing_metrics::RecordTransactionsTimings,
+ packet_bundle::PacketBundle,
+ qos_service::QosService,
+ tip_manager::TipManager,
+ },
+ crossbeam_channel::{Receiver, RecvTimeoutError},
+ solana_entry::entry::hash_transactions,
+ solana_gossip::cluster_info::ClusterInfo,
+ solana_ledger::{
+ blockstore_processor::TransactionStatusSender, token_balances::collect_token_balances,
+ },
+ solana_measure::measure,
+ solana_poh::poh_recorder::{
+ BankStart, PohRecorder,
+ PohRecorderError::{self},
+ TransactionRecorder,
+ },
+ solana_program_runtime::timings::ExecuteTimings,
+ solana_runtime::{
+ account_overrides::AccountOverrides,
+ accounts::TransactionLoadResult,
+ bank::{
+ Bank, CommitTransactionCounts, LoadAndExecuteTransactionsOutput, TransactionBalances,
+ TransactionBalancesSet, TransactionExecutionResult,
+ },
+ bank_utils,
+ cost_model::{CostModel, TransactionCost},
+ transaction_batch::TransactionBatch,
+ vote_sender_types::ReplayVoteSender,
+ },
+ solana_sdk::{
+ bundle::{
+ error::BundleExecutionError, sanitized::SanitizedBundle,
+ utils::check_bundle_lock_results,
+ },
+ clock::{Slot, DEFAULT_TICKS_PER_SLOT, MAX_PROCESSING_AGE},
+ hash::Hash,
+ pubkey::Pubkey,
+ saturating_add_assign,
+ transaction::{self, SanitizedTransaction, TransactionError, VersionedTransaction},
+ },
+ solana_transaction_status::token_balances::{
+ TransactionTokenBalances, TransactionTokenBalancesSet,
+ },
+ std::{
+ collections::{HashMap, HashSet, VecDeque},
+ sync::{
+ atomic::{AtomicBool, Ordering},
+ Arc, RwLock,
+ },
+ thread::{self, Builder, JoinHandle},
+ time::{Duration, Instant},
+ },
+};
+
+const MAX_BUNDLE_RETRY_DURATION: Duration = Duration::from_millis(10);
+const SLOT_BOUNDARY_CHECK_PERIOD: Duration = Duration::from_millis(10);
+
+type BundleStageResult = Result;
+
+// Stats emitted periodically
+struct BundleStageLoopStats {
+ last_report: Instant,
+
+ num_bundles_received: u64,
+ num_bundles_dropped: u64,
+ receive_and_buffer_bundles_elapsed_us: u64,
+ process_buffered_bundles_elapsed_us: u64,
+}
+
+impl Default for BundleStageLoopStats {
+ fn default() -> Self {
+ BundleStageLoopStats {
+ last_report: Instant::now(),
+ num_bundles_received: 0,
+ num_bundles_dropped: 0,
+ receive_and_buffer_bundles_elapsed_us: 0,
+ process_buffered_bundles_elapsed_us: 0,
+ }
+ }
+}
+
+impl BundleStageLoopStats {
+ fn maybe_report(&mut self, id: u32, period: Duration) {
+ if self.last_report.elapsed() > period {
+ datapoint_info!(
+ "bundle_stage-loop_stats",
+ ("id", id, i64),
+ ("num_bundles_received", self.num_bundles_received, i64),
+ ("num_bundles_dropped", self.num_bundles_dropped, i64),
+ (
+ "receive_and_buffer_bundles_elapsed_us",
+ self.receive_and_buffer_bundles_elapsed_us,
+ i64
+ ),
+ (
+ "process_buffered_bundles_elapsed_us",
+ self.process_buffered_bundles_elapsed_us,
+ i64
+ ),
+ );
+ *self = BundleStageLoopStats::default();
+ }
+ }
+}
+
+struct AllExecutionResults {
+ pub load_and_execute_tx_output: LoadAndExecuteTransactionsOutput,
+ pub sanitized_txs: Vec,
+ pub pre_balances: (TransactionBalances, TransactionTokenBalances),
+ pub post_balances: (TransactionBalances, TransactionTokenBalances),
+}
+
+pub struct BundleStage {
+ bundle_thread: JoinHandle<()>,
+}
+
+impl BundleStage {
+ #[allow(clippy::new_ret_no_self)]
+ pub fn new(
+ cluster_info: &Arc,
+ poh_recorder: &Arc>,
+ transaction_status_sender: Option,
+ gossip_vote_sender: ReplayVoteSender,
+ cost_model: Arc>,
+ bundle_receiver: Receiver>,
+ exit: Arc,
+ tip_manager: TipManager,
+ bundle_account_locker: BundleAccountLocker,
+ ) -> Self {
+ Self::start_bundle_thread(
+ cluster_info,
+ poh_recorder,
+ transaction_status_sender,
+ gossip_vote_sender,
+ cost_model,
+ bundle_receiver,
+ exit,
+ tip_manager,
+ bundle_account_locker,
+ MAX_BUNDLE_RETRY_DURATION,
+ )
+ }
+
+ #[allow(clippy::too_many_arguments)]
+ fn start_bundle_thread(
+ cluster_info: &Arc,
+ poh_recorder: &Arc>,
+ transaction_status_sender: Option,
+ gossip_vote_sender: ReplayVoteSender,
+ cost_model: Arc>,
+ bundle_receiver: Receiver>,
+ exit: Arc,
+ tip_manager: TipManager,
+ bundle_account_locker: BundleAccountLocker,
+ max_bundle_retry_duration: Duration,
+ ) -> Self {
+ const BUNDLE_STAGE_ID: u32 = 10_000;
+ let poh_recorder = poh_recorder.clone();
+ let cluster_info = cluster_info.clone();
+
+ let bundle_thread = Builder::new()
+ .name("solana-bundle-stage".to_string())
+ .spawn(move || {
+ let transaction_status_sender = transaction_status_sender.clone();
+ Self::process_loop(
+ cluster_info,
+ &poh_recorder,
+ transaction_status_sender,
+ bundle_receiver,
+ gossip_vote_sender,
+ BUNDLE_STAGE_ID,
+ cost_model,
+ exit,
+ tip_manager,
+ bundle_account_locker,
+ max_bundle_retry_duration,
+ );
+ })
+ .unwrap();
+
+ Self { bundle_thread }
+ }
+
+ // rollup transaction cost details, eg signature_cost, write_lock_cost, data_bytes_cost and
+ // execution_cost from the batch of transactions selected for block.
+ fn accumulate_batched_transaction_costs<'a>(
+ transactions_costs: impl Iterator- ,
+ transaction_results: impl Iterator
- >,
+ ) -> BatchedTransactionDetails {
+ let mut batched_transaction_details = BatchedTransactionDetails::default();
+ transactions_costs
+ .zip(transaction_results)
+ .for_each(|(cost, result)| match result {
+ Ok(_) => {
+ saturating_add_assign!(
+ batched_transaction_details.costs.batched_signature_cost,
+ cost.signature_cost
+ );
+ saturating_add_assign!(
+ batched_transaction_details.costs.batched_write_lock_cost,
+ cost.write_lock_cost
+ );
+ saturating_add_assign!(
+ batched_transaction_details.costs.batched_data_bytes_cost,
+ cost.data_bytes_cost
+ );
+ saturating_add_assign!(
+ batched_transaction_details
+ .costs
+ .batched_builtins_execute_cost,
+ cost.builtins_execution_cost
+ );
+ saturating_add_assign!(
+ batched_transaction_details.costs.batched_bpf_execute_cost,
+ cost.bpf_execution_cost
+ );
+ }
+ Err(transaction_error) => match transaction_error {
+ TransactionError::WouldExceedMaxBlockCostLimit => {
+ saturating_add_assign!(
+ batched_transaction_details
+ .errors
+ .batched_retried_txs_per_block_limit_count,
+ 1
+ );
+ }
+ TransactionError::WouldExceedMaxVoteCostLimit => {
+ saturating_add_assign!(
+ batched_transaction_details
+ .errors
+ .batched_retried_txs_per_vote_limit_count,
+ 1
+ );
+ }
+ TransactionError::WouldExceedMaxAccountCostLimit => {
+ saturating_add_assign!(
+ batched_transaction_details
+ .errors
+ .batched_retried_txs_per_account_limit_count,
+ 1
+ );
+ }
+ TransactionError::WouldExceedAccountDataBlockLimit => {
+ saturating_add_assign!(
+ batched_transaction_details
+ .errors
+ .batched_retried_txs_per_account_data_block_limit_count,
+ 1
+ );
+ }
+ TransactionError::WouldExceedAccountDataTotalLimit => {
+ saturating_add_assign!(
+ batched_transaction_details
+ .errors
+ .batched_dropped_txs_per_account_data_total_limit_count,
+ 1
+ );
+ }
+ _ => {}
+ },
+ });
+ batched_transaction_details
+ }
+
+ /// Calculates QoS and reserves compute space for the bundle. If the bundle succeeds, commits
+ /// the results to the cost tracker. If the bundle fails, rolls back any QoS changes made.
+ /// Ensure that SanitizedBundle was returned by BundleAccountLocker to avoid parallelism issues
+ /// with banking stage
+ fn update_qos_and_execute_record_commit_bundle(
+ sanitized_bundle: &SanitizedBundle,
+ recorder: &TransactionRecorder,
+ transaction_status_sender: &Option,
+ gossip_vote_sender: &ReplayVoteSender,
+ qos_service: &QosService,
+ bank_start: &BankStart,
+ bundle_stage_leader_stats: &mut BundleStageLeaderStats,
+ max_bundle_retry_duration: &Duration,
+ ) -> BundleStageResult<()> {
+ if sanitized_bundle.transactions.is_empty() {
+ return Ok(());
+ }
+
+ let tx_costs = qos_service.compute_transaction_costs(sanitized_bundle.transactions.iter());
+ let (transactions_qos_results, num_included) = qos_service.select_transactions_per_cost(
+ sanitized_bundle.transactions.iter(),
+ tx_costs.iter(),
+ &bank_start.working_bank,
+ );
+
+ // qos rate-limited a tx in here, drop the bundle
+ if sanitized_bundle.transactions.len() != num_included {
+ QosService::remove_transaction_costs(
+ tx_costs.iter(),
+ transactions_qos_results.iter(),
+ &bank_start.working_bank,
+ );
+ return Err(BundleExecutionError::ExceedsCostModel);
+ }
+
+ // accumulates QoS to metrics
+ qos_service.accumulate_estimated_transaction_costs(
+ &Self::accumulate_batched_transaction_costs(
+ tx_costs.iter(),
+ transactions_qos_results.iter(),
+ ),
+ );
+
+ match Self::execute_record_commit_bundle(
+ sanitized_bundle,
+ recorder,
+ transaction_status_sender,
+ gossip_vote_sender,
+ bank_start,
+ bundle_stage_leader_stats,
+ max_bundle_retry_duration,
+ ) {
+ Ok(commit_transaction_details) => {
+ // NOTE: Assumptions made on the QoS transaction costs:
+ // - commit_transaction_details are returned in the same ordering as the transactions
+ // in the sanitized_bundle, which is the same ordering as tx_costs.
+ // - all contents in the bundle are committed (it's executed all or nothing).
+ // When fancier execution algorithms are made that may execute transactions out of
+ // order (but resulting in same result as if they were executed sequentially), or
+ // allow failures in bundles, one should revisit this and the code that returns
+ // commit_transaction_details.
+ QosService::update_or_remove_transaction_costs(
+ tx_costs.iter(),
+ transactions_qos_results.iter(),
+ Some(&commit_transaction_details),
+ &bank_start.working_bank,
+ );
+ let (cu, us) = Self::accumulate_execute_units_and_time(
+ &bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .execute_timings,
+ );
+ qos_service.accumulate_actual_execute_cu(cu);
+ qos_service.accumulate_actual_execute_time(us);
+ qos_service.report_metrics(bank_start.working_bank.clone());
+ Ok(())
+ }
+ Err(e) => {
+ QosService::remove_transaction_costs(
+ tx_costs.iter(),
+ transactions_qos_results.iter(),
+ &bank_start.working_bank,
+ );
+ qos_service.report_metrics(bank_start.working_bank.clone());
+ Err(e)
+ }
+ }
+ }
+
+ fn execute_bundle(
+ sanitized_bundle: &SanitizedBundle,
+ transaction_status_sender: &Option,
+ bank_start: &BankStart,
+ bundle_stage_leader_stats: &mut BundleStageLeaderStats,
+ max_bundle_retry_duration: &Duration,
+ ) -> BundleStageResult> {
+ let mut account_overrides = AccountOverrides::default();
+
+ let mut execution_results = Vec::new();
+ let mut mint_decimals: HashMap = HashMap::new();
+
+ let BankStart {
+ working_bank: bank,
+ bank_creation_time,
+ } = bank_start;
+
+ let mut chunk_start = 0;
+ let start_time = Instant::now();
+ while chunk_start != sanitized_bundle.transactions.len() {
+ if !Bank::should_bank_still_be_processing_txs(bank_creation_time, bank.ns_per_slot) {
+ return Err(BundleExecutionError::PohMaxHeightError);
+ }
+
+ // ************************************************************************
+ // Build a TransactionBatch that ensures transactions in the bundle
+ // are executed sequentially.
+ // NOTE: The TransactionBatch is dropped before the results are committed, which
+ // would normally open up race conditions between this stage and BankingStage where
+ // a transaction here could read and execute state on a transaction and BankingStage
+ // could read-execute-store, invaliding the state produced by the bundle.
+ // Assuming the SanitizedBundle was locked with the BundleAccountLocker, that race
+ // condition shall be prevented as it holds an extra set of locks until the entire
+ // bundle is processed.
+ // ************************************************************************
+ let chunk_end = std::cmp::min(sanitized_bundle.transactions.len(), chunk_start + 128);
+ let chunk = &sanitized_bundle.transactions[chunk_start..chunk_end];
+ let batch = bank.prepare_sequential_sanitized_batch_with_results(chunk, None);
+
+ // Ensures that bundle lock results only return either:
+ // Ok(())
+ // Err(TransactionError::AccountInUse)
+ // Err(TransactionError::BundleNotContinuous)
+ // if unexpected failure case, the bundle can't be executed
+ // NOTE: previous logging around batch here caused issues with
+ // unit tests failing due to PoH hitting max height. Unknown why. Be advised.
+ if let Some((e, _)) = check_bundle_lock_results(batch.lock_results()) {
+ return Err(e.into());
+ }
+
+ let ((pre_balances, pre_token_balances), collect_balances_elapsed) = measure!(
+ Self::collect_balances(
+ bank,
+ &batch,
+ &account_overrides,
+ transaction_status_sender,
+ &mut mint_decimals,
+ ),
+ "collect_balances",
+ );
+ saturating_add_assign!(
+ bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .collect_balances_us,
+ collect_balances_elapsed.as_us()
+ );
+
+ let (mut load_and_execute_transactions_output, load_execute_time) = measure!(
+ bank.load_and_execute_transactions(
+ &batch,
+ MAX_PROCESSING_AGE,
+ transaction_status_sender.is_some(),
+ transaction_status_sender.is_some(),
+ transaction_status_sender.is_some(),
+ &mut bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .execute_timings,
+ Some(&account_overrides),
+ None,
+ ),
+ "load_execute",
+ );
+
+ saturating_add_assign!(
+ bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .load_execute_us,
+ load_execute_time.as_us()
+ );
+ bundle_stage_leader_stats
+ .transaction_errors()
+ .accumulate(&load_and_execute_transactions_output.error_counters);
+
+ debug!(
+ "execution results: {:?}",
+ load_and_execute_transactions_output.execution_results
+ );
+ // Return error if executed and failed or didn't execute because of an unexpected reason.
+ // The only acceptable reasons for not executing would be failure to lock errors from:
+ // Ok(())
+ // Err(TransactionError::AccountInUse)
+ // Err(TransactionError::BundleNotContinuous)
+ // If there's another error (AlreadyProcessed, InsufficientFundsForFee, etc.), bail out
+ if let Err((e, _)) = TransactionExecutionResult::check_bundle_execution_results(
+ load_and_execute_transactions_output
+ .execution_results
+ .as_slice(),
+ batch.sanitized_transactions(),
+ ) {
+ debug!("execution error");
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_num_execution_failures(1);
+
+ return Err(e);
+ }
+
+ // The errors have been checked above, now check to see if any were executed at all
+ // If none were executed, check to see if the bundle timed out and if so, return timeout
+ // error
+ if !load_and_execute_transactions_output
+ .execution_results
+ .iter()
+ .any(|r| r.was_executed())
+ {
+ debug!("retrying bundle");
+
+ let bundle_execution_elapsed = start_time.elapsed();
+ if bundle_execution_elapsed >= *max_bundle_retry_duration {
+ warn!("bundle timed out: {:?}", sanitized_bundle);
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_num_execution_timeouts(1);
+ return Err(BundleExecutionError::MaxRetriesExceeded(
+ bundle_execution_elapsed,
+ ));
+ }
+
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_num_execution_retries(1);
+ continue;
+ }
+
+ // *********************************************************************************
+ // Cache results so next iterations of bundle execution can load cached state
+ // instead of using AccountsDB which contains stale execution data.
+ // *********************************************************************************
+ Self::cache_accounts(
+ bank,
+ batch.sanitized_transactions(),
+ &load_and_execute_transactions_output.execution_results,
+ &mut load_and_execute_transactions_output.loaded_transactions,
+ &mut account_overrides,
+ );
+
+ let ((post_balances, post_token_balances), collect_balances_elapsed) = measure!(
+ Self::collect_balances(
+ bank,
+ &batch,
+ &account_overrides,
+ transaction_status_sender,
+ &mut mint_decimals,
+ ),
+ "collect_balances",
+ );
+
+ saturating_add_assign!(
+ bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .collect_balances_us,
+ collect_balances_elapsed.as_us()
+ );
+
+ execution_results.push(AllExecutionResults {
+ load_and_execute_tx_output: load_and_execute_transactions_output,
+ sanitized_txs: batch.sanitized_transactions().to_vec(),
+ pre_balances: (pre_balances, pre_token_balances),
+ post_balances: (post_balances, post_token_balances),
+ });
+
+ // start at the next available transaction in the batch that threw an error
+ let processing_end = batch.lock_results().iter().position(|lr| lr.is_err());
+ if let Some(end) = processing_end {
+ chunk_start += end;
+ } else {
+ chunk_start = chunk_end;
+ }
+
+ drop(batch);
+ }
+ Ok(execution_results)
+ }
+
+ /// Executes a bundle, where all transactions in the bundle are executed all-or-nothing.
+ /// Executes all transactions until the end or the first failure. The account state between
+ /// iterations is cached to a temporary HashMap to be used on successive runs
+ #[allow(clippy::too_many_arguments)]
+ fn execute_record_commit_bundle(
+ sanitized_bundle: &SanitizedBundle,
+ recorder: &TransactionRecorder,
+ transaction_status_sender: &Option,
+ gossip_vote_sender: &ReplayVoteSender,
+ bank_start: &BankStart,
+ bundle_stage_leader_stats: &mut BundleStageLeaderStats,
+ max_bundle_retry_duration: &Duration,
+ ) -> BundleStageResult> {
+ let execution_results = Self::execute_bundle(
+ sanitized_bundle,
+ transaction_status_sender,
+ bank_start,
+ bundle_stage_leader_stats,
+ max_bundle_retry_duration,
+ )?;
+ // in order for bundle to succeed, it most have something to record + commit
+ assert!(!execution_results.is_empty());
+
+ Self::record_commit_bundle(
+ execution_results,
+ &bank_start.working_bank,
+ recorder,
+ bundle_stage_leader_stats,
+ transaction_status_sender,
+ gossip_vote_sender,
+ )
+ }
+
+ /// Records the entire bundle to PoH and if successful, commits all transactions to the Bank
+ /// Note that the BundleAccountLocker still has a lock on these accounts in the bank
+ fn record_commit_bundle(
+ execution_results: Vec,
+ bank: &Arc,
+ recorder: &TransactionRecorder,
+ bundle_stage_leader_stats: &mut BundleStageLeaderStats,
+ transaction_status_sender: &Option,
+ gossip_vote_sender: &ReplayVoteSender,
+ ) -> BundleStageResult> {
+ // *********************************************************************************
+ // All transactions are executed in the bundle.
+ // Record to PoH and send the saved execution results to the Bank.
+ // Note: Ensure that bank.commit_transactions is called on a per-batch basis and
+ // not all together
+ // *********************************************************************************
+ debug!("grabbing freeze lock");
+ let (_freeze_lock, freeze_lock_time) = measure!(bank.freeze_lock(), "freeze_lock");
+ saturating_add_assign!(
+ bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .freeze_lock_us,
+ freeze_lock_time.as_us()
+ );
+
+ let (slot, mixins) = Self::prepare_poh_record_bundle(
+ &bank.slot(),
+ &execution_results,
+ &mut bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .record_transactions_timings,
+ );
+
+ debug!("recording bundle");
+ let (mut transaction_index, record_elapsed) = measure!(
+ Self::try_record(recorder, slot, mixins)
+ .map_err(|e| {
+ error!("error recording bundle: {:?}", e);
+ e
+ })?
+ .unwrap_or_default(),
+ "record_elapsed"
+ );
+ debug!("bundle recorded");
+
+ saturating_add_assign!(
+ bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .record_us,
+ record_elapsed.as_us()
+ );
+ bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .record_transactions_timings
+ .accumulate(&RecordTransactionsTimings {
+ execution_results_to_transactions_us: 0,
+ hash_us: 0,
+ poh_record_us: record_elapsed.as_us(),
+ });
+
+ let mut commit_transaction_details = Vec::new();
+ for r in execution_results {
+ let mut output = r.load_and_execute_tx_output;
+ let sanitized_txs = r.sanitized_txs;
+
+ let (last_blockhash, lamports_per_signature) =
+ bank.last_blockhash_and_lamports_per_signature();
+
+ let (transaction_results, commit_elapsed) = measure!(
+ bank.commit_transactions(
+ &sanitized_txs,
+ &mut output.loaded_transactions,
+ output.execution_results.clone(),
+ last_blockhash,
+ lamports_per_signature,
+ CommitTransactionCounts {
+ committed_transactions_count: output.executed_transactions_count as u64,
+ committed_with_failure_result_count: output
+ .executed_transactions_count
+ .saturating_sub(output.executed_with_successful_result_count)
+ as u64,
+ signature_count: output.signature_count,
+ },
+ &mut bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .execute_timings,
+ ),
+ "commit_elapsed"
+ );
+ saturating_add_assign!(
+ bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .commit_us,
+ commit_elapsed.as_us()
+ );
+
+ let (_, find_and_send_votes_elapsed) = measure!(
+ {
+ bank_utils::find_and_send_votes(
+ &sanitized_txs,
+ &transaction_results,
+ Some(gossip_vote_sender),
+ );
+ if let Some(transaction_status_sender) = transaction_status_sender {
+ let batch_transaction_indexes: Vec<_> = transaction_results
+ .execution_results
+ .iter()
+ .map(|result| {
+ if result.was_executed() {
+ let this_transaction_index = transaction_index;
+ saturating_add_assign!(transaction_index, 1);
+ this_transaction_index
+ } else {
+ 0
+ }
+ })
+ .collect();
+ transaction_status_sender.send_transaction_status_batch(
+ bank.clone(),
+ sanitized_txs,
+ output.execution_results,
+ TransactionBalancesSet::new(r.pre_balances.0, r.post_balances.0),
+ TransactionTokenBalancesSet::new(r.pre_balances.1, r.post_balances.1),
+ transaction_results.rent_debits.clone(),
+ batch_transaction_indexes,
+ );
+ }
+ },
+ "find_and_send_votes",
+ );
+
+ saturating_add_assign!(
+ bundle_stage_leader_stats
+ .execute_and_commit_timings()
+ .find_and_send_votes_us,
+ find_and_send_votes_elapsed.as_us()
+ );
+
+ for tx_results in transaction_results.execution_results {
+ if let Some(details) = tx_results.details() {
+ commit_transaction_details.push(CommitTransactionDetails::Committed {
+ compute_units: details.executed_units,
+ });
+ }
+ }
+ }
+ Ok(commit_transaction_details)
+ }
+
+ /// Returns true if any of the transactions in a bundle mention one of the tip PDAs
+ fn bundle_touches_tip_pdas(
+ transactions: &[SanitizedTransaction],
+ tip_pdas: &HashSet,
+ ) -> bool {
+ let mut bundle_touches_tip_pdas = false;
+ for tx in transactions {
+ if tx
+ .message()
+ .account_keys()
+ .iter()
+ .any(|a| tip_pdas.contains(a))
+ {
+ bundle_touches_tip_pdas = true;
+ break;
+ }
+ }
+ bundle_touches_tip_pdas
+ }
+
+ fn accumulate_execute_units_and_time(execute_timings: &ExecuteTimings) -> (u64, u64) {
+ let (units, times): (Vec<_>, Vec<_>) = execute_timings
+ .details
+ .per_program_timings
+ .iter()
+ .map(|(_program_id, program_timings)| {
+ (
+ program_timings.accumulated_units,
+ program_timings.accumulated_us,
+ )
+ })
+ .unzip();
+ (units.iter().sum(), times.iter().sum())
+ }
+
+ fn cache_accounts(
+ bank: &Arc,
+ txs: &[SanitizedTransaction],
+ res: &[TransactionExecutionResult],
+ loaded: &mut [TransactionLoadResult],
+ cached_accounts: &mut AccountOverrides,
+ ) {
+ let accounts = bank.collect_accounts_to_store(txs, res, loaded);
+ for (pubkey, data) in accounts {
+ cached_accounts.set_account(pubkey, Some(data.clone()));
+ }
+ }
+
+ fn collect_balances(
+ bank: &Arc,
+ batch: &TransactionBatch,
+ cached_accounts: &AccountOverrides,
+ transaction_status_sender: &Option,
+ mint_decimals: &mut HashMap,
+ ) -> (TransactionBalances, TransactionTokenBalances) {
+ if transaction_status_sender.is_some() {
+ let balances = bank.collect_balances_with_cache(batch, Some(cached_accounts));
+ let token_balances =
+ collect_token_balances(bank, batch, mint_decimals, Some(cached_accounts));
+ (balances, token_balances)
+ } else {
+ (vec![], vec![])
+ }
+ }
+
+ /// When executed the first time, there's some accounts that need to be initialized.
+ /// This is only helpful for local testing, on testnet and mainnet these will never be executed.
+ /// TODO (LB): consider removing this for mainnet/testnet and move to program deployment?
+ fn get_initialize_tip_accounts_transactions(
+ bank: &Bank,
+ tip_manager: &TipManager,
+ cluster_info: &Arc,
+ ) -> BundleStageResult> {
+ let maybe_init_tip_payment_config_tx =
+ if tip_manager.should_initialize_tip_payment_program(bank) {
+ info!("building initialize_tip_payment_program_tx");
+ Some(tip_manager.initialize_tip_payment_program_tx(
+ bank.last_blockhash(),
+ &cluster_info.keypair(),
+ ))
+ } else {
+ None
+ };
+
+ let maybe_init_tip_distro_config_tx =
+ if tip_manager.should_initialize_tip_distribution_config(bank) {
+ info!("building initialize_tip_distribution_config_tx");
+ Some(tip_manager.initialize_tip_distribution_config_tx(
+ bank.last_blockhash(),
+ &cluster_info.keypair(),
+ ))
+ } else {
+ None
+ };
+
+ let maybe_init_tip_distro_account_tx = if tip_manager
+ .should_init_tip_distribution_account(bank)
+ {
+ info!("building init_tip_distribution_account_tx");
+ Some(tip_manager.init_tip_distribution_account_tx(bank.last_blockhash(), bank.epoch()))
+ } else {
+ None
+ };
+
+ let transactions = [
+ maybe_init_tip_payment_config_tx,
+ maybe_init_tip_distro_config_tx,
+ maybe_init_tip_distro_account_tx,
+ ]
+ .into_iter()
+ .flatten()
+ .collect::>();
+
+ Ok(transactions)
+ }
+
+ /// Execute all unprocessed bundles until no more left or POH max tick height is reached.
+ /// For any bundles that didn't execute due to POH max tick height reached, add them
+ /// back onto the front of unprocessed_bundles in reverse order to preserve original ordering
+ #[allow(clippy::too_many_arguments)]
+ fn execute_bundles_until_empty_or_end_of_slot(
+ bundle_account_locker: &BundleAccountLocker,
+ unprocessed_bundles: &mut VecDeque,
+ blacklisted_accounts: &HashSet,
+ bank_start: &BankStart,
+ consensus_accounts_cache: &HashSet,
+ cluster_info: &Arc,
+ recorder: &TransactionRecorder,
+ transaction_status_sender: &Option,
+ gossip_vote_sender: &ReplayVoteSender,
+ qos_service: &QosService,
+ tip_manager: &TipManager,
+ max_bundle_retry_duration: &Duration,
+ last_tip_update_slot: &mut Slot,
+ bundle_stage_leader_stats: &mut BundleStageLeaderStats,
+ ) {
+ let (sanitized_bundles, sanitized_bundle_elapsed) = measure!(
+ unprocessed_bundles
+ .drain(..)
+ .into_iter()
+ .filter_map(|packet_bundle| {
+ match get_sanitized_bundle(
+ &packet_bundle,
+ &bank_start.working_bank,
+ consensus_accounts_cache,
+ blacklisted_accounts,
+ bundle_stage_leader_stats.transaction_errors(),
+ ) {
+ Ok(sanitized_bundle) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_sanitize_transaction_ok(1);
+ Some((packet_bundle, sanitized_bundle))
+ }
+ Err(BundleSanitizerError::VoteOnlyMode) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_sanitize_transaction_vote_only_mode(1);
+ None
+ }
+ Err(BundleSanitizerError::FailedPacketBatchPreCheck) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_sanitize_transaction_failed_precheck(1);
+ None
+ }
+ Err(BundleSanitizerError::BlacklistedAccount) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_sanitize_transaction_blacklisted_account(1);
+ None
+ }
+ Err(BundleSanitizerError::FailedToSerializeTransaction) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_sanitize_transaction_failed_to_serialize(1);
+ None
+ }
+ Err(BundleSanitizerError::DuplicateTransaction) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_sanitize_transaction_duplicate_transaction(1);
+ None
+ }
+ Err(BundleSanitizerError::FailedCheckTransactions) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_sanitize_transaction_failed_check(1);
+ None
+ }
+ }
+ })
+ .collect::>(),
+ "sanitized_bundle_elapsed"
+ );
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_sanitize_bundle_elapsed_us(sanitized_bundle_elapsed.as_us());
+
+ // Prepare locked bundles, which will RW lock accounts in sanitized_bundles so
+ // BankingStage can't lock them. This adds a layer of protection since a transaction in a bundle
+ // will not hold the AccountLocks through TransactionBatch across load-execute-commit cycle.
+ // We collect here to ensure that all of the bundles are locked ahead of time for priority over
+ // BankingStage
+ #[allow(clippy::needless_collect)]
+ let (locked_bundles, locked_bundles_elapsed) = measure!(
+ sanitized_bundles
+ .iter()
+ .map(|(_, sanitized_bundle)| {
+ bundle_account_locker
+ .prepare_locked_bundle(sanitized_bundle, &bank_start.working_bank)
+ })
+ .collect::>>(),
+ "locked_bundles_elapsed"
+ );
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_locked_bundle_elapsed_us(locked_bundles_elapsed.as_us());
+
+ let (execution_results, execute_locked_bundles_elapsed) = measure!(
+ Self::execute_locked_bundles(
+ bundle_account_locker,
+ locked_bundles,
+ bank_start,
+ cluster_info,
+ recorder,
+ transaction_status_sender,
+ gossip_vote_sender,
+ qos_service,
+ tip_manager,
+ max_bundle_retry_duration,
+ last_tip_update_slot,
+ bundle_stage_leader_stats,
+ ),
+ "execute_locked_bundles_elapsed"
+ );
+
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_execute_locked_bundles_elapsed_us(execute_locked_bundles_elapsed.as_us());
+
+ execution_results
+ .into_iter()
+ .zip(sanitized_bundles.into_iter())
+ .for_each(
+ |(bundle_execution_result, (packet_bundle, _))| match bundle_execution_result {
+ Ok(_) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_execution_results_ok(1);
+ }
+ Err(BundleExecutionError::PohMaxHeightError) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_execution_results_poh_max_height(1);
+ // retry the bundle
+ unprocessed_bundles.push_back(packet_bundle);
+ }
+ Err(BundleExecutionError::TransactionFailure(_)) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_execution_results_transaction_failures(1);
+ }
+ Err(BundleExecutionError::ExceedsCostModel) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_execution_results_exceeds_cost_model(1);
+ }
+ Err(BundleExecutionError::TipError(_)) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_execution_results_tip_errors(1);
+ }
+ Err(BundleExecutionError::Shutdown) => {}
+ Err(BundleExecutionError::MaxRetriesExceeded(_)) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_execution_results_max_retries(1);
+ }
+ Err(BundleExecutionError::LockError) => {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_execution_results_lock_errors(1);
+ }
+ },
+ );
+ }
+
+ /// This only needs to be done once on program initialization
+ /// TODO (LB): may make sense to remove this and move to program deployment instead, but helpful
+ /// during development
+ #[allow(clippy::too_many_arguments)]
+ fn maybe_initialize_tip_accounts(
+ bundle_account_locker: &BundleAccountLocker,
+ bank_start: &BankStart,
+ cluster_info: &Arc,
+ recorder: &TransactionRecorder,
+ transaction_status_sender: &Option,
+ gossip_vote_sender: &ReplayVoteSender,
+ qos_service: &QosService,
+ tip_manager: &TipManager,
+ max_bundle_retry_duration: &Duration,
+ bundle_stage_leader_stats: &mut BundleStageLeaderStats,
+ ) -> BundleStageResult<()> {
+ let initialize_tip_accounts_bundle = SanitizedBundle {
+ transactions: Self::get_initialize_tip_accounts_transactions(
+ &bank_start.working_bank,
+ tip_manager,
+ cluster_info,
+ )?,
+ };
+ if !initialize_tip_accounts_bundle.transactions.is_empty() {
+ debug!("initialize tip account");
+
+ let locked_init_tip_bundle = bundle_account_locker
+ .prepare_locked_bundle(&initialize_tip_accounts_bundle, &bank_start.working_bank)
+ .map_err(|_| BundleExecutionError::LockError)?;
+ let result = Self::update_qos_and_execute_record_commit_bundle(
+ locked_init_tip_bundle.sanitized_bundle(),
+ recorder,
+ transaction_status_sender,
+ gossip_vote_sender,
+ qos_service,
+ bank_start,
+ bundle_stage_leader_stats,
+ max_bundle_retry_duration,
+ );
+
+ match &result {
+ Ok(_) => {
+ debug!("initialize tip account: success");
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_num_init_tip_account_ok(1);
+ }
+ Err(e) => {
+ error!("initialize tip account error: {:?}", e);
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_num_init_tip_account_errors(1);
+ }
+ }
+ result
+ } else {
+ Ok(())
+ }
+ }
+
+ /// change tip receiver, draining tips to the previous tip_receiver in the process
+ /// note that this needs to happen after the above tip-related bundle initializes
+ /// config accounts because get_configured_tip_receiver relies on an account
+ /// existing in the bank
+ #[allow(clippy::too_many_arguments)]
+ fn maybe_change_tip_receiver(
+ bundle_account_locker: &BundleAccountLocker,
+ bank_start: &BankStart,
+ cluster_info: &Arc,
+ recorder: &TransactionRecorder,
+ transaction_status_sender: &Option,
+ gossip_vote_sender: &ReplayVoteSender,
+ qos_service: &QosService,
+ tip_manager: &TipManager,
+ max_bundle_retry_duration: &Duration,
+ bundle_stage_leader_stats: &mut BundleStageLeaderStats,
+ ) -> BundleStageResult<()> {
+ let start_handle_tips = Instant::now();
+
+ let configured_tip_receiver =
+ tip_manager.get_configured_tip_receiver(&bank_start.working_bank)?;
+ let my_tip_distribution_pda =
+ tip_manager.get_my_tip_distribution_pda(bank_start.working_bank.epoch());
+ if configured_tip_receiver != my_tip_distribution_pda {
+ info!(
+ "changing tip receiver from {} to {}",
+ configured_tip_receiver, my_tip_distribution_pda
+ );
+
+ let change_tip_receiver_tx = tip_manager.change_tip_receiver_tx(
+ &my_tip_distribution_pda,
+ &bank_start.working_bank,
+ &cluster_info.keypair(),
+ )?;
+
+ let change_tip_receiver_bundle = SanitizedBundle {
+ transactions: vec![change_tip_receiver_tx],
+ };
+ let locked_change_tip_receiver_bundle = bundle_account_locker
+ .prepare_locked_bundle(&change_tip_receiver_bundle, &bank_start.working_bank)
+ .map_err(|_| BundleExecutionError::LockError)?;
+ let result = Self::update_qos_and_execute_record_commit_bundle(
+ locked_change_tip_receiver_bundle.sanitized_bundle(),
+ recorder,
+ transaction_status_sender,
+ gossip_vote_sender,
+ qos_service,
+ bank_start,
+ bundle_stage_leader_stats,
+ max_bundle_retry_duration,
+ );
+
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_change_tip_receiver_elapsed_us(
+ start_handle_tips.elapsed().as_micros() as u64
+ );
+
+ match &result {
+ Ok(_) => {
+ debug!("change tip receiver: success");
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_num_change_tip_receiver_ok(1);
+ }
+ Err(e) => {
+ error!("change tip receiver: error {:?}", e);
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_num_change_tip_receiver_errors(1);
+ }
+ }
+ result
+ } else {
+ Ok(())
+ }
+ }
+
+ #[allow(clippy::too_many_arguments)]
+ fn execute_locked_bundles(
+ bundle_account_locker: &BundleAccountLocker,
+ locked_bundles: Vec>,
+ bank_start: &BankStart,
+ cluster_info: &Arc,
+ recorder: &TransactionRecorder,
+ transaction_status_sender: &Option,
+ gossip_vote_sender: &ReplayVoteSender,
+ qos_service: &QosService,
+ tip_manager: &TipManager,
+ max_bundle_retry_duration: &Duration,
+ last_tip_update_slot: &mut Slot,
+ bundle_stage_leader_stats: &mut BundleStageLeaderStats,
+ ) -> Vec> {
+ let tip_pdas = tip_manager.get_tip_accounts();
+
+ // make sure each locked_bundle is dropped after processing to unlock BankingStage
+ locked_bundles
+ .into_iter()
+ .map(|maybe_locked_bundle| {
+ let locked_bundle = maybe_locked_bundle.as_ref().map_err(|_| {
+ bundle_stage_leader_stats
+ .bundle_stage_stats()
+ .increment_num_lock_errors(1);
+
+ BundleExecutionError::LockError
+ })?;
+
+ if !Bank::should_bank_still_be_processing_txs(
+ &bank_start.bank_creation_time,
+ bank_start.working_bank.ns_per_slot,
+ ) {
+ Err(BundleExecutionError::PohMaxHeightError)
+ } else {
+ let sanitized_bundle = locked_bundle.sanitized_bundle();
+
+ if Self::bundle_touches_tip_pdas(&sanitized_bundle.transactions, &tip_pdas)
+ && bank_start.working_bank.slot() != *last_tip_update_slot
+ {
+ Self::maybe_initialize_tip_accounts(
+ bundle_account_locker,
+ bank_start,
+ cluster_info,
+ recorder,
+ transaction_status_sender,
+ gossip_vote_sender,
+ qos_service,
+ tip_manager,
+ max_bundle_retry_duration,
+ bundle_stage_leader_stats,
+ )?;
+
+ Self::maybe_change_tip_receiver(
+ bundle_account_locker,
+ bank_start,
+ cluster_info,
+ recorder,
+ transaction_status_sender,
+ gossip_vote_sender,
+ qos_service,
+ tip_manager,
+ max_bundle_retry_duration,
+ bundle_stage_leader_stats,
+ )?;
+
+ *last_tip_update_slot = bank_start.working_bank.slot();
+ }
+
+ Self::update_qos_and_execute_record_commit_bundle(
+ sanitized_bundle,
+ recorder,
+ transaction_status_sender,
+ gossip_vote_sender,
+ qos_service,
+ bank_start,
+ bundle_stage_leader_stats,
+ max_bundle_retry_duration,
+ )
+ }
+ })
+ .collect()
+ }
+
+ fn receive_and_buffer_bundles(
+ bundle_receiver: &Receiver>,
+ unprocessed_bundles: &mut VecDeque,
+ timeout: Duration,
+ ) -> Result {
+ let bundles = bundle_receiver.recv_timeout(timeout)?;
+ let num_bundles_before = unprocessed_bundles.len();
+ unprocessed_bundles.extend(bundles);
+ unprocessed_bundles.extend(bundle_receiver.try_iter().flatten());
+ let num_bundles_after = unprocessed_bundles.len();
+ Ok(num_bundles_after - num_bundles_before)
+ }
+
+ #[allow(clippy::too_many_arguments)]
+ fn process_buffered_bundles(
+ bundle_account_locker: &BundleAccountLocker,
+ unprocessed_bundles: &mut VecDeque,
+ blacklisted_accounts: &HashSet,
+ consensus_cache_updater: &mut ConsensusCacheUpdater,
+ cluster_info: &Arc,
+ recorder: &TransactionRecorder,
+ poh_recorder: &Arc>,
+ transaction_status_sender: &Option,
+ gossip_vote_sender: &ReplayVoteSender,
+ qos_service: &QosService,
+ tip_manager: &TipManager,
+ max_bundle_retry_duration: &Duration,
+ last_tip_update_slot: &mut u64,
+ bundle_stage_leader_stats: &mut BundleStageLeaderSlotTrackingMetrics,
+ bundle_stage_stats: &mut BundleStageLoopStats,
+ id: u32,
+ ) {
+ const DROP_BUNDLE_SLOT_OFFSET: u64 = 4;
+
+ let r_poh_recorder = poh_recorder.read().unwrap();
+ let poh_recorder_bank = r_poh_recorder.get_poh_recorder_bank();
+ let working_bank_start = poh_recorder_bank.working_bank_start();
+ let would_be_leader_soon =
+ r_poh_recorder.would_be_leader(DROP_BUNDLE_SLOT_OFFSET * DEFAULT_TICKS_PER_SLOT);
+ drop(r_poh_recorder);
+
+ bundle_stage_leader_stats.maybe_report(id, &working_bank_start);
+
+ match (working_bank_start, would_be_leader_soon) {
+ // leader now, insert new read bundles + as many as can read then return bank
+ (Some(bank_start), _) => {
+ consensus_cache_updater.maybe_update(&bank_start.working_bank);
+
+ Self::execute_bundles_until_empty_or_end_of_slot(
+ bundle_account_locker,
+ unprocessed_bundles,
+ blacklisted_accounts,
+ bank_start,
+ consensus_cache_updater.consensus_accounts_cache(),
+ cluster_info,
+ recorder,
+ transaction_status_sender,
+ gossip_vote_sender,
+ qos_service,
+ tip_manager,
+ max_bundle_retry_duration,
+ last_tip_update_slot,
+ bundle_stage_leader_stats.bundle_stage_leader_stats(),
+ );
+ }
+ // not leader now and not soon, clear bundles
+ (None, false) => {
+ saturating_add_assign!(
+ bundle_stage_stats.num_bundles_dropped,
+ unprocessed_bundles.len() as u64
+ );
+
+ unprocessed_bundles.clear();
+ }
+ _ => {}
+ }
+ }
+
+ #[allow(clippy::too_many_arguments)]
+ fn process_loop(
+ cluster_info: Arc,
+ poh_recorder: &Arc>,
+ transaction_status_sender: Option,
+ bundle_receiver: Receiver>,
+ gossip_vote_sender: ReplayVoteSender,
+ id: u32,
+ cost_model: Arc>,
+ exit: Arc,
+ tip_manager: TipManager,
+ bundle_account_locker: BundleAccountLocker,
+ max_bundle_retry_duration: Duration,
+ ) {
+ const LOOP_STATS_METRICS_PERIOD: Duration = Duration::from_secs(1);
+
+ let recorder = poh_recorder.read().unwrap().recorder();
+ let qos_service = QosService::new(cost_model, id);
+
+ // Bundles can't mention any accounts related to consensus
+ let mut consensus_cache_updater = ConsensusCacheUpdater::default();
+ let mut last_tip_update_slot = Slot::default();
+
+ let mut last_leader_slots_update_time = Instant::now();
+ let mut bundle_stage_leader_stats = BundleStageLeaderSlotTrackingMetrics::default();
+ let mut bundle_stage_stats = BundleStageLoopStats::default();
+
+ // Bundles can't mention the tip payment program to ensure that a malicious entity doesn't
+ // steal tips mid-slot
+ let blacklisted_accounts = HashSet::from_iter([tip_manager.tip_payment_program_id()]);
+
+ let mut unprocessed_bundles: VecDeque = VecDeque::with_capacity(1000);
+ while !exit.load(Ordering::Relaxed) {
+ if !unprocessed_bundles.is_empty()
+ || last_leader_slots_update_time.elapsed() >= SLOT_BOUNDARY_CHECK_PERIOD
+ {
+ let (_, process_buffered_bundles_elapsed) = measure!(
+ Self::process_buffered_bundles(
+ &bundle_account_locker,
+ &mut unprocessed_bundles,
+ &blacklisted_accounts,
+ &mut consensus_cache_updater,
+ &cluster_info,
+ &recorder,
+ poh_recorder,
+ &transaction_status_sender,
+ &gossip_vote_sender,
+ &qos_service,
+ &tip_manager,
+ &max_bundle_retry_duration,
+ &mut last_tip_update_slot,
+ &mut bundle_stage_leader_stats,
+ &mut bundle_stage_stats,
+ id,
+ ),
+ "process_buffered_bundles_elapsed"
+ );
+
+ saturating_add_assign!(
+ bundle_stage_stats.process_buffered_bundles_elapsed_us,
+ process_buffered_bundles_elapsed.as_us()
+ );
+ last_leader_slots_update_time = Instant::now();
+ }
+
+ bundle_stage_stats.maybe_report(id, LOOP_STATS_METRICS_PERIOD);
+
+ // ensure bundle stage can run immediately if bundles to process, otherwise okay
+ // chilling for a few
+ let sleep_time = if !unprocessed_bundles.is_empty() {
+ Duration::from_millis(0)
+ } else {
+ Duration::from_millis(10)
+ };
+
+ let (res, receive_and_buffer_elapsed) = measure!(
+ Self::receive_and_buffer_bundles(
+ &bundle_receiver,
+ &mut unprocessed_bundles,
+ sleep_time,
+ ),
+ "receive_and_buffer_elapsed"
+ );
+ saturating_add_assign!(
+ bundle_stage_stats.receive_and_buffer_bundles_elapsed_us,
+ receive_and_buffer_elapsed.as_us()
+ );
+
+ match res {
+ Ok(num_bundles_received) => {
+ saturating_add_assign!(
+ bundle_stage_stats.num_bundles_received,
+ num_bundles_received as u64
+ );
+ }
+ Err(RecvTimeoutError::Timeout) => {}
+ Err(RecvTimeoutError::Disconnected) => {
+ break;
+ }
+ }
+ }
+ }
+
+ fn prepare_poh_record_bundle(
+ bank_slot: &Slot,
+ execution_results_txs: &[AllExecutionResults],
+ record_transactions_timings: &mut RecordTransactionsTimings,
+ ) -> (Slot, Vec<(Hash, Vec)>) {
+ let mut new_record_transaction_timings = RecordTransactionsTimings::default();
+
+ let mixins_txs = execution_results_txs
+ .iter()
+ .map(|r| {
+ let (processed_transactions, results_to_transactions_elapsed) = measure!(
+ {
+ r.load_and_execute_tx_output
+ .execution_results
+ .iter()
+ .zip(r.sanitized_txs.iter())
+ .filter_map(|(execution_result, tx)| {
+ if execution_result.was_executed() {
+ Some(tx.to_versioned_transaction())
+ } else {
+ None
+ }
+ })
+ .collect::>()
+ },
+ "results_to_transactions_elapsed"
+ );
+
+ let (hash, hash_elapsed) = measure!(
+ hash_transactions(&processed_transactions[..]),
+ "hash_elapsed"
+ );
+
+ saturating_add_assign!(
+ new_record_transaction_timings.execution_results_to_transactions_us,
+ results_to_transactions_elapsed.as_us()
+ );
+ saturating_add_assign!(
+ new_record_transaction_timings.hash_us,
+ hash_elapsed.as_us()
+ );
+
+ (hash, processed_transactions)
+ })
+ .collect();
+
+ record_transactions_timings.accumulate(&new_record_transaction_timings);
+
+ (*bank_slot, mixins_txs)
+ }
+
+ pub fn join(self) -> thread::Result<()> {
+ self.bundle_thread.join()
+ }
+
+ fn try_record(
+ recorder: &TransactionRecorder,
+ bank_slot: Slot,
+ mixins_txs: Vec<(Hash, Vec)>,
+ ) -> BundleStageResult