From 234b3e083eee8feeb73ec9eecd020ba42c7a3e3e Mon Sep 17 00:00:00 2001 From: Godmode Galactus Date: Wed, 8 Nov 2023 14:46:32 +0100 Subject: [PATCH] Implementing quic server and client side --- Cargo.lock | 791 +++++++++++++++++++++---- client/Cargo.toml | 15 +- client/src/cli.rs | 11 + client/src/main.rs | 92 ++- client/src/quic_connection.rs | 183 ------ migration.sql | 13 +- plugin/src/lib.rs | 109 +++- plugin/src/skip_client_verification.rs | 2 +- 8 files changed, 865 insertions(+), 351 deletions(-) create mode 100644 client/src/cli.rs delete mode 100644 client/src/quic_connection.rs diff --git a/Cargo.lock b/Cargo.lock index ff599c1..329ecac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -872,16 +872,17 @@ dependencies = [ "pkcs8", "postgres-native-tls", "prometheus", - "quinn", + "quinn 0.10.2", "rcgen", - "rustls 0.20.8", + "rustls 0.21.8", "serde", "serde_json", - "solana-geyser-plugin-interface", + "solana-connection-cache", + "solana-geyser-plugin-interface 1.17.4", "solana-net-utils", "solana-quic-client", - "solana-sdk 1.16.15", - "solana-streamer", + "solana-sdk 1.17.4", + "solana-streamer 1.17.4", "thiserror", "tokio", "tracing", @@ -1240,6 +1241,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.38", +] + [[package]] name = "dlopen_derive" version = "0.1.4" @@ -1603,14 +1627,14 @@ dependencies = [ "pkcs8", "postgres-native-tls", "prometheus", - "quinn", + "quinn 0.9.4", "rcgen", "rustls 0.20.8", "serde", "serde_json", - "solana-geyser-plugin-interface", + "solana-geyser-plugin-interface 1.16.15", "solana-sdk 1.16.15", - "solana-streamer", + "solana-streamer 1.16.15", "thiserror", "tokio", "tracing", @@ -1881,7 +1905,7 @@ dependencies = [ "http", "hyper", "log", - "rustls 0.21.7", + "rustls 0.21.8", "rustls-native-certs", "tokio", "tokio-rustls", @@ -2469,6 +2493,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.38", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -2539,6 +2574,15 @@ dependencies = [ "num_enum_derive 0.6.1", ] +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive 0.7.1", +] + [[package]] name = "num_enum_derive" version = "0.5.11" @@ -2563,6 +2607,18 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.38", +] + [[package]] name = "object" version = "0.32.1" @@ -2945,8 +3001,8 @@ checksum = "2e8b432585672228923edbbf64b8b12c14e1112f62e88737655b4a083dbcd78e" dependencies = [ "bytes", "pin-project-lite", - "quinn-proto", - "quinn-udp", + "quinn-proto 0.9.6", + "quinn-udp 0.3.2", "rustc-hash", "rustls 0.20.8", "thiserror", @@ -2955,6 +3011,23 @@ dependencies = [ "webpki", ] +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto 0.10.6", + "quinn-udp 0.4.1", + "rustc-hash", + "rustls 0.21.8", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "quinn-proto" version = "0.9.6" @@ -2974,6 +3047,24 @@ dependencies = [ "webpki", ] +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring 0.16.20", + "rustc-hash", + "rustls 0.21.8", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + [[package]] name = "quinn-udp" version = "0.3.2" @@ -2981,12 +3072,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" dependencies = [ "libc", - "quinn-proto", + "quinn-proto 0.9.6", "socket2 0.4.9", "tracing", "windows-sys 0.42.0", ] +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2 0.5.4", + "tracing", + "windows-sys 0.48.0", +] + [[package]] name = "quote" version = "0.6.13" @@ -3179,7 +3283,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.7", + "rustls 0.21.8", "rustls-pemfile", "serde", "serde_json", @@ -3282,13 +3386,13 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" dependencies = [ "log", - "ring 0.16.20", - "rustls-webpki 0.101.6", + "ring 0.17.4", + "rustls-webpki 0.101.7", "sct", ] @@ -3325,12 +3429,12 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", + "ring 0.17.4", + "untrusted 0.9.0", ] [[package]] @@ -3664,10 +3768,34 @@ dependencies = [ "serde_derive", "serde_json", "solana-address-lookup-table-program", - "solana-config-program", + "solana-config-program 1.16.15", "solana-sdk 1.16.15", - "spl-token", - "spl-token-2022", + "spl-token 3.5.0", + "spl-token-2022 0.6.1", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-account-decoder" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5010de925850388b045a6d88e88f62944906f4f436ff48436b110f543f254ad6" +dependencies = [ + "Inflector", + "base64 0.21.4", + "bincode", + "bs58", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-config-program 1.17.4", + "solana-sdk 1.17.4", + "spl-token 4.0.0", + "spl-token-2022 0.9.0", + "spl-token-metadata-interface", "thiserror", "zstd", ] @@ -3680,14 +3808,14 @@ dependencies = [ "bincode", "bytemuck", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", "rustc_version", "serde", "solana-frozen-abi 1.16.15", "solana-frozen-abi-macro 1.16.15", "solana-program 1.16.15", - "solana-program-runtime", + "solana-program-runtime 1.16.15", "solana-sdk 1.16.15", "thiserror", ] @@ -3701,26 +3829,42 @@ dependencies = [ "chrono", "serde", "serde_derive", - "solana-program-runtime", + "solana-program-runtime 1.16.15", "solana-sdk 1.16.15", ] +[[package]] +name = "solana-config-program" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fa1a537ec5fc4ba3c3951d2a010809721c240a2cfaab6d6da95a5f0b2f4797c" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-program-runtime 1.17.4", + "solana-sdk 1.17.4", +] + [[package]] name = "solana-connection-cache" -version = "1.16.15" -source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_send_transaction_result_plugin#4641300ad4ecb89340f1c7954be04a74dd2575f2" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "158fe99dc9e1ee82f35aae0da416fa6b23f7e17dbbb469427d532056f713a02a" dependencies = [ "async-trait", "bincode", + "crossbeam-channel", "futures-util", - "indexmap 1.9.3", + "indexmap 2.0.2", "log", - "rand 0.7.3", + "rand 0.8.5", "rayon", "rcgen", - "solana-measure", - "solana-metrics", - "solana-sdk 1.16.15", + "solana-measure 1.17.4", + "solana-metrics 1.17.4", + "solana-sdk 1.17.4", "thiserror", "tokio", ] @@ -3759,9 +3903,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.1" +version = "1.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9c2657cb455b25192ad08f8536cacc8276d10a135ba81fb4fb3059f5c3c49a9" +checksum = "80447a64ba88aff4ab1fe70c646b9a0ee65f190aa2977b1e7360066445f8ed34" dependencies = [ "ahash 0.8.3", "blake3", @@ -3782,7 +3926,7 @@ dependencies = [ "serde_derive", "serde_json", "sha2 0.10.8", - "solana-frozen-abi-macro 1.17.1", + "solana-frozen-abi-macro 1.17.4", "subtle", "thiserror", ] @@ -3800,9 +3944,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.1" +version = "1.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db74b08897ff67d5e3d0d9592fabb304f891736d280ac1eecb4baa198cabaa0" +checksum = "c28b7325d40b3b3fef0db6917972e8121bec05fa2b59904212b25478c85924cd" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", @@ -3817,7 +3961,19 @@ source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_ dependencies = [ "log", "solana-sdk 1.16.15", - "solana-transaction-status", + "solana-transaction-status 1.16.15", + "thiserror", +] + +[[package]] +name = "solana-geyser-plugin-interface" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621cb833793d8b276be8247099bbdad5453cde36b557f7613467b0ed7f14944" +dependencies = [ + "log", + "solana-sdk 1.17.4", + "solana-transaction-status 1.17.4", "thiserror", ] @@ -3833,9 +3989,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.1" +version = "1.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d880d87752d95ce8d1b2f141535e60054455954a651db65b52c64978f9b637" +checksum = "5a224a0a87196c940472515838630e0ed6a49f97ea0d01d9dbeed0bb57390447" dependencies = [ "env_logger", "lazy_static", @@ -3851,6 +4007,16 @@ dependencies = [ "solana-sdk 1.16.15", ] +[[package]] +name = "solana-measure" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf3d86eec20d13830a3c692e1428570d1e02dca750812ef58532dbda062e79b" +dependencies = [ + "log", + "solana-sdk 1.17.4", +] + [[package]] name = "solana-metrics" version = "1.16.15" @@ -3864,22 +4030,38 @@ dependencies = [ "solana-sdk 1.16.15", ] +[[package]] +name = "solana-metrics" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80b9e646b0d429c661500f3acc1a52adb292157a2f57fc855b298b437f07c9de" +dependencies = [ + "crossbeam-channel", + "gethostname", + "lazy_static", + "log", + "reqwest", + "solana-sdk 1.17.4", + "thiserror", +] + [[package]] name = "solana-net-utils" -version = "1.16.15" -source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_send_transaction_result_plugin#4641300ad4ecb89340f1c7954be04a74dd2575f2" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca9b8bfb1876bc5386873f129dcd27fe08da8cd2f2d94c40351c5411cece365f" dependencies = [ "bincode", "clap 3.2.25", "crossbeam-channel", "log", "nix", - "rand 0.7.3", + "rand 0.8.5", "serde", "serde_derive", - "socket2 0.4.9", - "solana-logger 1.16.15", - "solana-sdk 1.16.15", + "socket2 0.5.4", + "solana-logger 1.17.4", + "solana-sdk 1.17.4", "solana-version", "tokio", "url", @@ -3905,10 +4087,39 @@ dependencies = [ "rand 0.7.3", "rayon", "serde", - "solana-metrics", - "solana-rayon-threadlimit", + "solana-metrics 1.16.15", + "solana-rayon-threadlimit 1.16.15", "solana-sdk 1.16.15", - "solana-vote-program", + "solana-vote-program 1.16.15", +] + +[[package]] +name = "solana-perf" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e3f15738555e4262181bcbcc6d2b7ac60693b6514556d5d44b791ee7b517a2e" +dependencies = [ + "ahash 0.8.3", + "bincode", + "bv", + "caps", + "curve25519-dalek", + "dlopen2", + "fnv", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "rayon", + "rustc_version", + "serde", + "solana-frozen-abi 1.17.4", + "solana-frozen-abi-macro 1.17.4", + "solana-metrics 1.17.4", + "solana-rayon-threadlimit 1.17.4", + "solana-sdk 1.17.4", + "solana-vote-program 1.17.4", ] [[package]] @@ -3943,7 +4154,7 @@ dependencies = [ "log", "memoffset 0.9.0", "num-bigint 0.4.4", - "num-derive", + "num-derive 0.3.3", "num-traits", "parking_lot", "rand 0.7.3", @@ -3967,9 +4178,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.1" +version = "1.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c491670a24d87af75a7b7771fc5961126dd838c5fb7f7657ec2662b1597c0cb" +checksum = "a1fe4a811ec2c4b0c3773e5661ecfaff81f822c9e18866097caeba6be9338dab" dependencies = [ "ark-bn254", "ark-ec", @@ -3998,7 +4209,7 @@ dependencies = [ "log", "memoffset 0.9.0", "num-bigint 0.4.4", - "num-derive", + "num-derive 0.3.3", "num-traits", "parking_lot", "rand 0.8.5", @@ -4010,9 +4221,9 @@ dependencies = [ "serde_json", "sha2 0.10.8", "sha3 0.10.8", - "solana-frozen-abi 1.17.1", - "solana-frozen-abi-macro 1.17.1", - "solana-sdk-macro 1.17.1", + "solana-frozen-abi 1.17.4", + "solana-frozen-abi-macro 1.17.4", + "solana-sdk-macro 1.17.4", "thiserror", "tiny-bip39", "wasm-bindgen", @@ -4031,7 +4242,7 @@ dependencies = [ "itertools", "libc", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", "percentage", "rand 0.7.3", @@ -4039,17 +4250,46 @@ dependencies = [ "serde", "solana-frozen-abi 1.16.15", "solana-frozen-abi-macro 1.16.15", - "solana-measure", - "solana-metrics", + "solana-measure 1.16.15", + "solana-metrics 1.16.15", "solana-sdk 1.16.15", - "solana_rbpf", + "solana_rbpf 0.6.1", + "thiserror", +] + +[[package]] +name = "solana-program-runtime" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41841bee09d81bed82ffebe1fb7fdebe3003d0fca5f3a6d03e3cb01ac5aed979" +dependencies = [ + "base64 0.21.4", + "bincode", + "eager", + "enum-iterator", + "itertools", + "libc", + "log", + "num-derive 0.3.3", + "num-traits", + "percentage", + "rand 0.8.5", + "rustc_version", + "serde", + "solana-frozen-abi 1.17.4", + "solana-frozen-abi-macro 1.17.4", + "solana-measure 1.17.4", + "solana-metrics 1.17.4", + "solana-sdk 1.17.4", + "solana_rbpf 0.8.0", "thiserror", ] [[package]] name = "solana-quic-client" -version = "1.16.15" -source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_send_transaction_result_plugin#4641300ad4ecb89340f1c7954be04a74dd2575f2" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec167e0a89e276beb3537cb1f8062eeee1c8c7450fcdd97bb146b9ca452028" dependencies = [ "async-mutex", "async-trait", @@ -4057,18 +4297,17 @@ dependencies = [ "itertools", "lazy_static", "log", - "quinn", - "quinn-proto", - "quinn-udp", + "quinn 0.10.2", + "quinn-proto 0.10.6", "rcgen", - "rustls 0.20.8", + "rustls 0.21.8", "solana-connection-cache", - "solana-measure", - "solana-metrics", + "solana-measure 1.17.4", + "solana-metrics 1.17.4", "solana-net-utils", "solana-rpc-client-api", - "solana-sdk 1.16.15", - "solana-streamer", + "solana-sdk 1.17.4", + "solana-streamer 1.17.4", "thiserror", "tokio", ] @@ -4082,10 +4321,21 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "solana-rayon-threadlimit" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1bfe12ceef4ba1c66c01528d3a420dc71bfebc2822ff7176e5e02229704efdd" +dependencies = [ + "lazy_static", + "num_cpus", +] + [[package]] name = "solana-rpc-client-api" -version = "1.16.15" -source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_send_transaction_result_plugin#4641300ad4ecb89340f1c7954be04a74dd2575f2" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e281e7ce2d2f7775973de6f8901baf7688ed3b38b93215fc417efeade0a858" dependencies = [ "base64 0.21.4", "bs58", @@ -4095,11 +4345,11 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-account-decoder", - "solana-sdk 1.16.15", - "solana-transaction-status", + "solana-account-decoder 1.17.4", + "solana-sdk 1.17.4", + "solana-transaction-status 1.17.4", "solana-version", - "spl-token-2022", + "spl-token-2022 0.9.0", "thiserror", ] @@ -4129,7 +4379,7 @@ dependencies = [ "libsecp256k1", "log", "memmap2", - "num-derive", + "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", "pbkdf2 0.11.0", @@ -4157,9 +4407,9 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.1" +version = "1.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7d1f01c53520b2eaa59360e068ea3bdd52c59151b334e6f1e26638751e5986" +checksum = "9c79894240bad61135a9ec86cd7709dcbc9e69eec8ebcc0b4066bccde6615600" dependencies = [ "assert_matches", "base64 0.21.4", @@ -4182,7 +4432,7 @@ dependencies = [ "libsecp256k1", "log", "memmap2", - "num-derive", + "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", "pbkdf2 0.11.0", @@ -4199,11 +4449,11 @@ dependencies = [ "serde_with", "sha2 0.10.8", "sha3 0.10.8", - "solana-frozen-abi 1.17.1", - "solana-frozen-abi-macro 1.17.1", - "solana-logger 1.17.1", - "solana-program 1.17.1", - "solana-sdk-macro 1.17.1", + "solana-frozen-abi 1.17.4", + "solana-frozen-abi-macro 1.17.4", + "solana-logger 1.17.4", + "solana-program 1.17.4", + "solana-sdk-macro 1.17.4", "thiserror", "uriparse", "wasm-bindgen", @@ -4223,9 +4473,9 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.1" +version = "1.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd1223f92124c255c9db21672fb050c64ae351d6c6baf168f14da632b41c195" +checksum = "97dce8e347d73bcd9a6fe0b37bf830a20d0a4913ac58046c79959d5e15bbbed3" dependencies = [ "bs58", "proc-macro2 1.0.69", @@ -4252,20 +4502,52 @@ dependencies = [ "pem", "percentage", "pkcs8", - "quinn", - "quinn-proto", - "quinn-udp", + "quinn 0.9.4", + "quinn-proto 0.9.6", + "quinn-udp 0.3.2", "rand 0.7.3", "rcgen", "rustls 0.20.8", - "solana-metrics", - "solana-perf", + "solana-metrics 1.16.15", + "solana-perf 1.16.15", "solana-sdk 1.16.15", "thiserror", "tokio", "x509-parser", ] +[[package]] +name = "solana-streamer" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef6ad3550bfa2b19a34ded8e0bc48afa6329f4b035bbbb47e9cd4eea2f43b77" +dependencies = [ + "async-channel", + "bytes", + "crossbeam-channel", + "futures-util", + "histogram", + "indexmap 2.0.2", + "itertools", + "libc", + "log", + "nix", + "pem", + "percentage", + "pkcs8", + "quinn 0.10.2", + "quinn-proto 0.10.6", + "rand 0.8.5", + "rcgen", + "rustls 0.21.8", + "solana-metrics 1.17.4", + "solana-perf 1.17.4", + "solana-sdk 1.17.4", + "thiserror", + "tokio", + "x509-parser", +] + [[package]] name = "solana-transaction-status" version = "1.16.15" @@ -4281,29 +4563,55 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-account-decoder", + "solana-account-decoder 1.16.15", "solana-address-lookup-table-program", "solana-sdk 1.16.15", - "spl-associated-token-account", - "spl-memo", - "spl-token", - "spl-token-2022", + "spl-associated-token-account 1.1.3", + "spl-memo 3.0.1", + "spl-token 3.5.0", + "spl-token-2022 0.6.1", + "thiserror", +] + +[[package]] +name = "solana-transaction-status" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e143ce053b0fe641f320c463c822c199d5b6849b0d844be009b8e7d6ecebf8e" +dependencies = [ + "Inflector", + "base64 0.21.4", + "bincode", + "borsh 0.10.3", + "bs58", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder 1.17.4", + "solana-sdk 1.17.4", + "spl-associated-token-account 2.2.0", + "spl-memo 4.0.0", + "spl-token 4.0.0", + "spl-token-2022 0.9.0", "thiserror", ] [[package]] name = "solana-version" -version = "1.16.15" -source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_send_transaction_result_plugin#4641300ad4ecb89340f1c7954be04a74dd2575f2" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d49400028b385d830fde8ec073c372394197bb493236442670117516db4b4a1" dependencies = [ "log", "rustc_version", "semver", "serde", "serde_derive", - "solana-frozen-abi 1.16.15", - "solana-frozen-abi-macro 1.16.15", - "solana-sdk 1.16.15", + "solana-frozen-abi 1.17.4", + "solana-frozen-abi-macro 1.17.4", + "solana-sdk 1.17.4", ] [[package]] @@ -4313,25 +4621,47 @@ source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_ dependencies = [ "bincode", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", "rustc_version", "serde", "serde_derive", "solana-frozen-abi 1.16.15", "solana-frozen-abi-macro 1.16.15", - "solana-metrics", + "solana-metrics 1.16.15", "solana-program 1.16.15", - "solana-program-runtime", + "solana-program-runtime 1.16.15", "solana-sdk 1.16.15", "thiserror", ] [[package]] -name = "solana-zk-token-sdk" -version = "1.17.1" +name = "solana-vote-program" +version = "1.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb5d7d29b4566242b0bf5bb7d2ba941ddb18558a121555ec682bf6eae88e041" +checksum = "af002db2bc89bfdc199d641929449d932248c38d2b39cb875f307aa4c4ff60bc" +dependencies = [ + "bincode", + "log", + "num-derive 0.3.3", + "num-traits", + "rustc_version", + "serde", + "serde_derive", + "solana-frozen-abi 1.17.4", + "solana-frozen-abi-macro 1.17.4", + "solana-metrics 1.17.4", + "solana-program 1.17.4", + "solana-program-runtime 1.17.4", + "solana-sdk 1.17.4", + "thiserror", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "1.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48f33d2ce508c9e70aa7d2f1948f3a9df56ee66423252785c608b4023e0c01a" dependencies = [ "aes-gcm-siv", "base64 0.21.4", @@ -4343,14 +4673,14 @@ dependencies = [ "itertools", "lazy_static", "merlin", - "num-derive", + "num-derive 0.3.3", "num-traits", "rand 0.7.3", "serde", "serde_json", "sha3 0.9.1", - "solana-program 1.17.1", - "solana-sdk 1.17.1", + "solana-program 1.17.4", + "solana-sdk 1.17.4", "subtle", "thiserror", "zeroize", @@ -4375,6 +4705,25 @@ dependencies = [ "winapi", ] +[[package]] +name = "solana_rbpf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d457cc2ba742c120492a64b7fa60e22c575e891f6b55039f4d736568fb112a3" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + [[package]] name = "spin" version = "0.5.2" @@ -4405,11 +4754,62 @@ checksum = "978dba3bcbe88d0c2c58366c254d9ea41c5f73357e72fc0bdee4d6b5fc99c8f4" dependencies = [ "assert_matches", "borsh 0.9.3", - "num-derive", + "num-derive 0.3.3", "num-traits", - "solana-program 1.17.1", - "spl-token", - "spl-token-2022", + "solana-program 1.17.4", + "spl-token 3.5.0", + "spl-token-2022 0.6.1", + "thiserror", +] + +[[package]] +name = "spl-associated-token-account" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3" +dependencies = [ + "assert_matches", + "borsh 0.10.3", + "num-derive 0.4.1", + "num-traits", + "solana-program 1.17.4", + "spl-token 4.0.0", + "spl-token-2022 0.9.0", + "thiserror", +] + +[[package]] +name = "spl-discriminator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program 1.17.4", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadbefec4f3c678215ca72bd71862697bb06b41fd77c0088902dd3203354387b" +dependencies = [ + "quote 1.0.33", + "spl-discriminator-syn", + "syn 2.0.38", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e5f2044ca42c8938d54d1255ce599c79a1ffd86b677dfab695caa20f9ffc3f2" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "sha2 0.10.8", + "syn 2.0.38", "thiserror", ] @@ -4419,7 +4819,68 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" dependencies = [ - "solana-program 1.17.1", + "solana-program 1.17.4", +] + +[[package]] +name = "spl-memo" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program 1.17.4", +] + +[[package]] +name = "spl-pod" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +dependencies = [ + "borsh 0.10.3", + "bytemuck", + "solana-program 1.17.4", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" +dependencies = [ + "num-derive 0.4.1", + "num-traits", + "solana-program 1.17.4", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5269c8e868da17b6552ef35a51355a017bd8e0eae269c201fef830d35fa52c" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "sha2 0.10.8", + "syn 2.0.38", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +dependencies = [ + "bytemuck", + "solana-program 1.17.4", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] @@ -4430,10 +4891,25 @@ checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.3.3", "num-traits", "num_enum 0.5.11", - "solana-program 1.17.1", + "solana-program 1.17.4", + "thiserror", +] + +[[package]] +name = "spl-token" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "solana-program 1.17.4", "thiserror", ] @@ -4445,16 +4921,81 @@ checksum = "0043b590232c400bad5ee9eb983ced003d15163c4c5d56b090ac6d9a57457b47" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.3.3", "num-traits", "num_enum 0.5.11", - "solana-program 1.17.1", + "solana-program 1.17.4", "solana-zk-token-sdk", - "spl-memo", - "spl-token", + "spl-memo 3.0.1", + "spl-token 3.5.0", "thiserror", ] +[[package]] +name = "spl-token-2022" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.1", + "num-traits", + "num_enum 0.7.1", + "solana-program 1.17.4", + "solana-zk-token-sdk", + "spl-memo 4.0.0", + "spl-pod", + "spl-token 4.0.0", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.3", + "solana-program 1.17.4", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program 1.17.4", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +dependencies = [ + "bytemuck", + "solana-program 1.17.4", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + [[package]] name = "stringprep" version = "0.1.4" @@ -4737,7 +5278,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.7", + "rustls 0.21.8", "tokio", ] diff --git a/client/Cargo.toml b/client/Cargo.toml index 5c0c4e7..eca345b 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -7,11 +7,12 @@ edition = "2021" [dependencies] tokio = { version = "1.21.2", features = ["rt-multi-thread", "macros", "time", "fs"] } -solana-sdk = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_result_plugin" } -solana-geyser-plugin-interface = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_result_plugin" } -solana-streamer = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_result_plugin" } -solana-quic-client = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_result_plugin" } -solana-net-utils = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_result_plugin" } +solana-sdk = "1.16.18" +solana-geyser-plugin-interface = "1.16.18" +solana-streamer = "1.16.18" +solana-quic-client = "1.16.18" +solana-net-utils = "1.16.18" +solana-connection-cache = "1.16.18" geyser-quic-plugin = { path = "../plugin" } @@ -39,8 +40,8 @@ prometheus = "0.13.3" lazy_static = "1.4.0" dotenv = "0.15.0" async-channel = "1.8.0" -quinn = "0.9.3" -rustls = { version = "=0.20.8", default-features = false } +quinn = "0.10.2" +rustls = { version = "0.21.8", default-features = false, features = ["quic"] } rcgen = "0.10.0" pkcs8 = "0.8.0" pem = "1.1.1" \ No newline at end of file diff --git a/client/src/cli.rs b/client/src/cli.rs new file mode 100644 index 0000000..a31f3be --- /dev/null +++ b/client/src/cli.rs @@ -0,0 +1,11 @@ +use clap::Parser; + +#[derive(Parser, Debug, Clone)] +#[command(author, version, about, long_about = None)] +pub struct Args { + #[arg(short, long, default_value_t = String::from("http://127.0.0.1:10000"))] + pub geyser_quic_address: String, + + #[arg(short, long, default_value_t = String::from("connection_identity.json"))] + pub identity: String, +} diff --git a/client/src/main.rs b/client/src/main.rs index 453870c..2569a75 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -1,30 +1,88 @@ -use std::time::{Instant, Duration}; +use std::{time::Duration, net::{IpAddr, Ipv4Addr, SocketAddr}, sync::Arc}; -use geyser_quic_plugin::TransactionResults; +use cli::Args; +use geyser_quic_plugin::{TransactionResults, ALPN_GEYSER_PROTOCOL_ID}; +use quinn::{TokioRuntime, EndpointConfig, Endpoint, ClientConfig, TransportConfig, IdleTimeout}; +use solana_quic_client::nonblocking::quic_client:: SkipServerVerification; +use solana_sdk::signature::Keypair; +use clap::Parser; +use solana_streamer::tls_certificates::new_self_signed_tls_certificate; -mod quic_connection; +mod cli; pub const PACKET_DATA_SIZE: usize = 1280 - 40 - 8; +pub async fn load_identity_keypair(identity_file: &String) -> Option { + let identity_file = tokio::fs::read_to_string(identity_file.as_str()) + .await + .expect("Cannot find the identity file provided"); + let identity_bytes: Vec = serde_json::from_str(&identity_file).unwrap(); + Some(Keypair::from_bytes(identity_bytes.as_slice()).unwrap()) +} + +pub fn create_endpoint(certificate: rustls::Certificate, key: rustls::PrivateKey) -> Endpoint { + let mut endpoint = { + let client_socket = + solana_net_utils::bind_in_range(IpAddr::V4(Ipv4Addr::UNSPECIFIED), (8000, 10000)) + .expect("create_endpoint bind_in_range") + .1; + let config = EndpointConfig::default(); + quinn::Endpoint::new(config, None, client_socket, Arc::new(TokioRuntime)) + .expect("create_endpoint quinn::Endpoint::new") + }; + + let mut crypto = rustls::ClientConfig::builder() + .with_safe_defaults() + .with_custom_certificate_verifier(Arc::new(SkipServerVerification {})) + .with_client_auth_cert(vec![certificate], key) + .expect("Failed to set QUIC client certificates"); + + crypto.enable_early_data = true; + crypto.alpn_protocols = vec![ALPN_GEYSER_PROTOCOL_ID.to_vec()]; + + let mut config = ClientConfig::new(Arc::new(crypto)); + let mut transport_config = TransportConfig::default(); + + let timeout = IdleTimeout::try_from(Duration::from_secs(3600 * 48)).unwrap(); + transport_config.max_idle_timeout(Some(timeout)); + transport_config.keep_alive_interval(Some(Duration::from_millis(500))); + config.transport_config(Arc::new(transport_config)); + + endpoint.set_default_client_config(config); + + endpoint +} + #[tokio::main()] -pub async fn main() { +pub async fn main() -> anyhow::Result<()> { + let args = Args::parse(); + let address: SocketAddr = args.geyser_quic_address.parse().expect("should be valid socket address"); + + let keypair = load_identity_keypair(&args.identity).await.expect("Identity file should be valid"); + + let (certificate, key) = new_self_signed_tls_certificate( + &keypair, + IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), + ) + .expect("Failed to initialize QUIC client certificates"); + + let endpoint = create_endpoint(certificate, key); + let connection = endpoint.connect(address, "quic_geyser_plugin").expect("Should be connecting").await.expect("Should be able to connect to the plugin"); + let (_send_stream, recv_stream) = connection.open_bi().await.expect("Should be able to create a bi directional connection"); + tokio::spawn(async move { // wait for 10 s max - let mut timeout: u64 = 10_000; - let mut start = Instant::now(); - - const LAST_BUFFER_SIZE: usize = QUIC_MESSAGE_SIZE + 1; - let mut last_buffer: [u8; LAST_BUFFER_SIZE] = [0; LAST_BUFFER_SIZE]; - let mut buffer_written = 0; + let mut buffer: [u8; PACKET_DATA_SIZE] = [0; PACKET_DATA_SIZE]; let mut recv_stream = recv_stream; loop { - if let Ok(chunk) = tokio::time::timeout( - Duration::from_millis(timeout), - recv_stream.read_chunk(PACKET_DATA_SIZE, false), - ) - .await { - + if let Ok(Some(size)) = recv_stream.read(&mut buffer ).await + { + let data = &buffer[0..size]; + if let Ok(result) = bincode::deserialize::(&data) { + println!("Transaction Result \n s:{} e:{} slt:{}", result.signature, result.error.map(|x| x.to_string()).unwrap_or_default(), result.slot); + } } } }); -} \ No newline at end of file + Ok(()) +} diff --git a/client/src/quic_connection.rs b/client/src/quic_connection.rs deleted file mode 100644 index c5a8094..0000000 --- a/client/src/quic_connection.rs +++ /dev/null @@ -1,183 +0,0 @@ -use std::{sync::Arc, net::{SocketAddr, UdpSocket, IpAddr, Ipv4Addr}, time::Duration}; - -use quinn::{Connection, Endpoint, ConnectionError, EndpointConfig, TokioRuntime, ClientConfig, TransportConfig, IdleTimeout}; -use solana_net_utils::PortRange; -use solana_quic_client::nonblocking::quic_client::QuicClientCertificate; -use solana_sdk::{signature::Keypair, quic::{QUIC_MAX_TIMEOUT, QUIC_KEEP_ALIVE}}; -use solana_streamer::tls_certificates::new_self_signed_tls_certificate; -use tokio::{time::timeout, sync::OnceCell}; -use geyser_quic_plugin::ALPN_GEYSER_PROTOCOL_ID; - -pub const QUIC_CONNECTION_HANDSHAKE_TIMEOUT: Duration = Duration::from_secs(60); -pub const PORT_RANGE: PortRange = (8000, 20_000); - -// This code is copied from solana - -/// A lazy-initialized Quic Endpoint -pub struct QuicLazyInitializedEndpoint { - endpoint: OnceCell>, - client_certificate: Arc, - client_endpoint: Option, -} - - -impl QuicLazyInitializedEndpoint { - pub fn new( - client_certificate: Arc, - client_endpoint: Option, - ) -> Self { - Self { - endpoint: OnceCell::>::new(), - client_certificate, - client_endpoint, - } - } - - fn create_endpoint(&self) -> Endpoint { - let mut endpoint = if let Some(endpoint) = &self.client_endpoint { - endpoint.clone() - } else { - let client_socket = solana_net_utils::bind_in_range( - IpAddr::V4(Ipv4Addr::UNSPECIFIED), - PORT_RANGE, - ) - .expect("QuicLazyInitializedEndpoint::create_endpoint bind_in_range") - .1; - - QuicNewConnection::create_endpoint(EndpointConfig::default(), client_socket) - }; - - let mut crypto = rustls::ClientConfig::builder() - .with_safe_defaults() - .with_custom_certificate_verifier(SkipServerVerification::new()) - .with_single_cert( - vec![self.client_certificate.certificate.clone()], - self.client_certificate.key.clone(), - ) - .expect("Failed to set QUIC client certificates"); - - crypto.enable_early_data = true; - crypto.alpn_protocols = vec![ALPN_GEYSER_PROTOCOL_ID.to_vec()]; - - let mut config = ClientConfig::new(Arc::new(crypto)); - let mut transport_config = TransportConfig::default(); - - let timeout = IdleTimeout::try_from(QUIC_MAX_TIMEOUT).unwrap(); - transport_config.max_idle_timeout(Some(timeout)); - transport_config.keep_alive_interval(Some(QUIC_KEEP_ALIVE)); - config.transport_config(Arc::new(transport_config)); - - endpoint.set_default_client_config(config); - - endpoint - } - - async fn get_endpoint(&self) -> Arc { - self.endpoint - .get_or_init(|| async { Arc::new(self.create_endpoint()) }) - .await - .clone() - } -} - -impl Default for QuicLazyInitializedEndpoint { - fn default() -> Self { - let (cert, priv_key) = - new_self_signed_tls_certificate(&Keypair::new(), IpAddr::V4(Ipv4Addr::UNSPECIFIED)) - .expect("Failed to create QUIC client certificate"); - Self::new( - Arc::new(QuicClientCertificate { - certificate: cert, - key: priv_key, - }), - None, - ) - } -} - - -#[derive(Clone)] -struct QuicNewConnection { - endpoint: Arc, - connection: Arc, -} - -impl QuicNewConnection { - /// Create a QuicNewConnection given the remote address 'addr'. - async fn make_connection( - endpoint: Arc, - addr: SocketAddr, - ) -> anyhow::Result { - let endpoint = endpoint.get_endpoint().await; - - let connecting = endpoint.connect(addr, "connect")?; - if let Ok(connecting_result) = timeout(QUIC_CONNECTION_HANDSHAKE_TIMEOUT, connecting).await - { - let connection = connecting_result?; - - Ok(Self { - endpoint, - connection: Arc::new(connection), - }) - } else { - Err(ConnectionError::TimedOut.into()) - } - } - - fn create_endpoint(config: EndpointConfig, client_socket: UdpSocket) -> Endpoint { - quinn::Endpoint::new(config, None, client_socket, TokioRuntime) - .expect("QuicNewConnection::create_endpoint quinn::Endpoint::new") - } - - // Attempts to make a faster connection by taking advantage of pre-existing key material. - // Only works if connection to this endpoint was previously established. - async fn make_connection_0rtt( - &mut self, - addr: SocketAddr, - ) -> anyhow::Result> { - let connecting = self.endpoint.connect(addr, "connect")?; - let connection = match connecting.into_0rtt() { - Ok((connection, zero_rtt)) => { - if let Ok(zero_rtt) = timeout(QUIC_CONNECTION_HANDSHAKE_TIMEOUT, zero_rtt).await { - connection - } else { - return Err(ConnectionError::TimedOut.into()); - } - } - Err(connecting) => { - - if let Ok(connecting_result) = - timeout(QUIC_CONNECTION_HANDSHAKE_TIMEOUT, connecting).await - { - connecting_result? - } else { - return Err(ConnectionError::TimedOut.into()); - } - } - }; - self.connection = Arc::new(connection); - Ok(self.connection.clone()) - } -} - -pub struct SkipServerVerification; - -impl SkipServerVerification { - pub fn new() -> Arc { - Arc::new(Self) - } -} - -impl rustls::client::ServerCertVerifier for SkipServerVerification { - fn verify_server_cert( - &self, - _end_entity: &rustls::Certificate, - _intermediates: &[rustls::Certificate], - _server_name: &rustls::ServerName, - _scts: &mut dyn Iterator, - _ocsp_response: &[u8], - _now: std::time::SystemTime, - ) -> Result { - Ok(rustls::client::ServerCertVerified::assertion()) - } -} \ No newline at end of file diff --git a/migration.sql b/migration.sql index ee15d0b..23080d9 100644 --- a/migration.sql +++ b/migration.sql @@ -8,5 +8,16 @@ CREATE TABLE banking_stage_results.transaction_infos ( is_confirmed BOOL, first_notification_slot BIGINT NOT NULL, cu_requested BIGINT, - prioritization_fees BIGINT + prioritization_fees BIGINT, + time_of_first_notification BIGINT, ); + +CREATE TABLE banking_stage_results.blocks ( + block_hash text not null, + notification_timestamp BIGINT, + confirmed_timestamp BIGINT, + number_of_transactions BIGINT, + number_of_transactions BIGINT, + total_cu BIGINT, + cu_by_accounts text, +) diff --git a/plugin/src/lib.rs b/plugin/src/lib.rs index ba2ce24..9840d59 100644 --- a/plugin/src/lib.rs +++ b/plugin/src/lib.rs @@ -1,12 +1,29 @@ -use std::{net::{IpAddr, Ipv4Addr, UdpSocket}, sync::Arc, str::FromStr}; +use std::{ + net::{IpAddr, Ipv4Addr, UdpSocket}, + str::FromStr, + sync::Arc, +}; +use itertools::Itertools; use pem::Pem; -use quinn::{ServerConfig, IdleTimeout, Endpoint, TokioRuntime, EndpointConfig}; -use serde::{Serialize, Deserialize}; -use solana_geyser_plugin_interface::geyser_plugin_interface::{GeyserPlugin, Result as PluginResult, GeyserPluginError}; -use solana_sdk::{signature::{Signature, Keypair}, transaction::{TransactionError, SanitizedTransaction}, slot_history::Slot, quic::QUIC_MAX_TIMEOUT, packet::PACKET_DATA_SIZE, pubkey::Pubkey}; -use solana_streamer::{tls_certificates::{new_self_signed_tls_certificate, get_pubkey_from_tls_certificate}, quic::QuicServerError}; -use tokio::{runtime::Runtime, task::JoinHandle, sync::mpsc::UnboundedSender}; +use quinn::{Endpoint, EndpointConfig, IdleTimeout, ServerConfig, TokioRuntime}; +use serde::{Deserialize, Serialize}; +use solana_geyser_plugin_interface::geyser_plugin_interface::{ + GeyserPlugin, GeyserPluginError, Result as PluginResult, +}; +use solana_sdk::{ + packet::PACKET_DATA_SIZE, + pubkey::Pubkey, + quic::QUIC_MAX_TIMEOUT, + signature::{Keypair, Signature}, + slot_history::Slot, + transaction::{SanitizedTransaction, TransactionError}, compute_budget::{self, ComputeBudgetInstruction}, borsh0_10::try_from_slice_unchecked, +}; +use solana_streamer::{ + quic::QuicServerError, + tls_certificates::{get_pubkey_from_tls_certificate, new_self_signed_tls_certificate}, +}; +use tokio::{runtime::Runtime, sync::mpsc::UnboundedSender, task::JoinHandle}; use crate::skip_client_verification::SkipClientVerification; @@ -16,9 +33,42 @@ pub const ALPN_GEYSER_PROTOCOL_ID: &[u8] = b"solana-geyser"; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct TransactionResults { - signature: Signature, - error: Option, - slot: Slot, + pub signature: Signature, + pub error: Option, + pub slot: Slot, + pub writable_accounts: Vec, + pub readable_accounts: Vec, + pub cu_requested: u64, + pub prioritization_fees : u64, +} + +fn decode_cu_requested_and_prioritization_fees(transaction: &SanitizedTransaction,) -> (u64, u64) { + let mut cu_requested:u64 = 200_000; + let mut prioritization_fees: u64 = 0; + let accounts = transaction.message().account_keys().iter().map(|x| *x).collect_vec(); + for ix in transaction.message().instructions() { + if ix.program_id(accounts.as_slice()) + .eq(&compute_budget::id()) + { + let cb_ix = try_from_slice_unchecked::(ix.data.as_slice()); + if let Ok(ComputeBudgetInstruction::RequestUnitsDeprecated { + units, + additional_fee, + }) = cb_ix + { + if additional_fee > 0 { + return (units as u64, ((units * 1000) / additional_fee) as u64); + } else { + return (units as u64, 0); + } + } else if let Ok(ComputeBudgetInstruction::SetComputeUnitLimit(units)) = cb_ix { + cu_requested = units as u64; + } else if let Ok(ComputeBudgetInstruction::SetComputeUnitPrice(price)) = cb_ix { + prioritization_fees = price; + } + } + } + (cu_requested, prioritization_fees) } #[derive(Debug)] @@ -50,7 +100,28 @@ impl GeyserPlugin for Plugin { slot: Slot, ) -> PluginResult<()> { if let Some(inner) = &self.inner { - if let Err(e) = inner.sender.send(TransactionResults { signature: transaction.signature().clone(), error, slot }) { + let message = transaction.message(); + + let accounts = message.account_keys(); + let is_writable = accounts.iter().enumerate().map(|(index, _)| { + transaction.message().is_writable(index) + }).collect_vec(); + let mut writable_accounts = is_writable.iter().enumerate().filter(|(_, v)| **v).map(|(index, get_mut)| accounts[index]).collect_vec(); + let mut readable_accounts = is_writable.iter().enumerate().filter(|(_, v)| !**v).map(|(index, get_mut)| accounts[index]).collect_vec(); + writable_accounts.truncate(32); + readable_accounts.truncate(32); + + let (cu_requested, prioritization_fees) = decode_cu_requested_and_prioritization_fees(transaction); + + if let Err(e) = inner.sender.send(TransactionResults { + signature: transaction.signature().clone(), + error, + slot, + writable_accounts, + readable_accounts, + cu_requested, + prioritization_fees, + }) { log::error!("error sending on the channel {}", e); } Ok(()) @@ -59,17 +130,21 @@ impl GeyserPlugin for Plugin { } } - fn on_load(&mut self, _config_file: &str) -> solana_geyser_plugin_interface::geyser_plugin_interface::Result<()> { + fn on_load( + &mut self, + _config_file: &str, + ) -> solana_geyser_plugin_interface::geyser_plugin_interface::Result<()> { let runtime = Runtime::new().map_err(|error| GeyserPluginError::Custom(Box::new(error)))?; - let res = configure_server(&Keypair::new(), IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))); - + let res = configure_server(&Keypair::new(), IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))); + let (config, _) = res.map_err(|error| GeyserPluginError::Custom(Box::new(error)))?; let sock = UdpSocket::bind("127.0.0.1:18990").expect("couldn't bind to address"); let endpoint = Endpoint::new(EndpointConfig::default(), Some(config), sock, TokioRuntime) - .map_err(|error| GeyserPluginError::Custom(Box::new(error)))?; + .map_err(|error| GeyserPluginError::Custom(Box::new(error)))?; let (sender, reciever) = tokio::sync::mpsc::unbounded_channel::(); - let allowed_connection = Pubkey::from_str("G8pLuvzarejjLuuPNVNR1gk9xiFKmAcs9J5LL3GZGM6F").unwrap(); + let allowed_connection = + Pubkey::from_str("G8pLuvzarejjLuuPNVNR1gk9xiFKmAcs9J5LL3GZGM6F").unwrap(); let handle = tokio::spawn(async move { let mut reciever = reciever; @@ -169,4 +244,4 @@ pub fn get_remote_pubkey(connection: &quinn::Connection) -> Option { .filter(|certs| certs.len() == 1)? .first() .and_then(get_pubkey_from_tls_certificate) -} \ No newline at end of file +} diff --git a/plugin/src/skip_client_verification.rs b/plugin/src/skip_client_verification.rs index d3f4c1f..878c0b9 100644 --- a/plugin/src/skip_client_verification.rs +++ b/plugin/src/skip_client_verification.rs @@ -1,6 +1,6 @@ use std::{sync::Arc, time::SystemTime}; -use rustls::{DistinguishedNames, server::ClientCertVerified, Certificate}; +use rustls::{server::ClientCertVerified, Certificate, DistinguishedNames}; pub struct SkipClientVerification;