Making the geyser plugin work

This commit is contained in:
godmodegalactus 2023-11-14 17:21:05 +01:00
parent 5e0fdc62d3
commit 0698406657
No known key found for this signature in database
GPG Key ID: 22DA4A30887FDA3C
13 changed files with 274 additions and 221 deletions

203
Cargo.lock generated
View File

@ -128,29 +128,30 @@ dependencies = [
[[package]] [[package]]
name = "anstream" name = "anstream"
version = "0.6.4" version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"anstyle-parse", "anstyle-parse",
"anstyle-query", "anstyle-query",
"anstyle-wincon", "anstyle-wincon",
"colorchoice", "colorchoice",
"is-terminal",
"utf8parse", "utf8parse",
] ]
[[package]] [[package]]
name = "anstyle" name = "anstyle"
version = "1.0.4" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d"
[[package]] [[package]]
name = "anstyle-parse" name = "anstyle-parse"
version = "0.2.2" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee"
dependencies = [ dependencies = [
"utf8parse", "utf8parse",
] ]
@ -166,9 +167,9 @@ dependencies = [
[[package]] [[package]]
name = "anstyle-wincon" name = "anstyle-wincon"
version = "3.0.1" version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"windows-sys 0.48.0", "windows-sys 0.48.0",
@ -676,9 +677,9 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3"
[[package]] [[package]]
name = "bstr" name = "bstr"
version = "1.7.0" version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c79ad7fb2dd38f3dabd76b09c6a5a20c038fc0213ef1e9afd30eb777f120f019" checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c"
dependencies = [ dependencies = [
"memchr", "memchr",
"serde", "serde",
@ -812,31 +813,33 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.4.7" version = "4.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" checksum = "fb690e81c7840c0d7aade59f242ea3b41b9bc27bcd5997890e7702ae4b32e487"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
"once_cell",
] ]
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.4.7" version = "4.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" checksum = "5ed2e96bc16d8d740f6f48d663eddf4b8a0983e79210fd55479b7bcd0a69860e"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
"clap_lex 0.6.0", "clap_lex 0.5.0",
"once_cell",
"strsim", "strsim",
] ]
[[package]] [[package]]
name = "clap_derive" name = "clap_derive"
version = "4.4.7" version = "4.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050"
dependencies = [ dependencies = [
"heck", "heck",
"proc-macro2 1.0.69", "proc-macro2 1.0.69",
@ -855,14 +858,16 @@ dependencies = [
[[package]] [[package]]
name = "clap_lex" name = "clap_lex"
version = "0.6.0" version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b"
[[package]] [[package]]
name = "client" name = "client"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anstyle",
"anstyle-parse",
"anyhow", "anyhow",
"async-channel", "async-channel",
"base64 0.21.5", "base64 0.21.5",
@ -870,7 +875,8 @@ dependencies = [
"bs58", "bs58",
"bytes", "bytes",
"chrono", "chrono",
"clap 4.4.7", "clap 4.3.24",
"clap_lex 0.5.0",
"const_env", "const_env",
"dashmap", "dashmap",
"dotenv", "dotenv",
@ -1596,6 +1602,8 @@ dependencies = [
name = "geyser-quic-plugin" name = "geyser-quic-plugin"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anstyle",
"anstyle-parse",
"anyhow", "anyhow",
"async-channel", "async-channel",
"base64 0.21.5", "base64 0.21.5",
@ -1604,7 +1612,8 @@ dependencies = [
"bytes", "bytes",
"cargo-lock", "cargo-lock",
"chrono", "chrono",
"clap 4.4.7", "clap 4.3.24",
"clap_lex 0.5.0",
"const_env", "const_env",
"dashmap", "dashmap",
"dotenv", "dotenv",
@ -1619,19 +1628,19 @@ dependencies = [
"pkcs8", "pkcs8",
"postgres-native-tls", "postgres-native-tls",
"prometheus", "prometheus",
"quinn 0.9.4", "quinn 0.10.2",
"rcgen", "rcgen",
"rustls 0.20.8", "rustls 0.21.8",
"serde", "serde",
"serde_json", "serde_json",
"solana-geyser-plugin-interface", "solana-geyser-plugin-interface",
"solana-sdk 1.16.18", "solana-sdk 1.16.18",
"solana-streamer",
"thiserror", "thiserror",
"tokio", "tokio",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
"vergen", "vergen",
"x509-parser",
] ]
[[package]] [[package]]
@ -1848,9 +1857,9 @@ dependencies = [
[[package]] [[package]]
name = "http" name = "http"
version = "0.2.9" version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
dependencies = [ dependencies = [
"bytes", "bytes",
"fnv", "fnv",
@ -2007,6 +2016,17 @@ version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
[[package]]
name = "is-terminal"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
dependencies = [
"hermit-abi 0.3.3",
"rustix",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.10.5" version = "0.10.5"
@ -3022,7 +3042,7 @@ dependencies = [
"quinn-proto 0.9.6", "quinn-proto 0.9.6",
"quinn-udp 0.3.2", "quinn-udp 0.3.2",
"rustc-hash", "rustc-hash",
"rustls 0.20.8", "rustls 0.20.9",
"thiserror", "thiserror",
"tokio", "tokio",
"tracing", "tracing",
@ -3056,7 +3076,7 @@ dependencies = [
"rand 0.8.5", "rand 0.8.5",
"ring 0.16.20", "ring 0.16.20",
"rustc-hash", "rustc-hash",
"rustls 0.20.8", "rustls 0.20.9",
"rustls-native-certs", "rustls-native-certs",
"slab", "slab",
"thiserror", "thiserror",
@ -3380,9 +3400,9 @@ dependencies = [
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.38.21" version = "0.38.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" checksum = "80109a168d9bc0c7f483083244543a6eb0dba02295d33ca268145e6190d6df0c"
dependencies = [ dependencies = [
"bitflags 2.4.1", "bitflags 2.4.1",
"errno", "errno",
@ -3393,9 +3413,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.20.8" version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99"
dependencies = [ dependencies = [
"ring 0.16.20", "ring 0.16.20",
"sct", "sct",
@ -3428,9 +3448,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls-pemfile" name = "rustls-pemfile"
version = "1.0.3" version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
dependencies = [ dependencies = [
"base64 0.21.5", "base64 0.21.5",
] ]
@ -3743,9 +3763,9 @@ dependencies = [
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.11.1" version = "1.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
[[package]] [[package]]
name = "socket2" name = "socket2"
@ -3894,9 +3914,9 @@ dependencies = [
[[package]] [[package]]
name = "solana-frozen-abi" name = "solana-frozen-abi"
version = "1.17.4" version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80447a64ba88aff4ab1fe70c646b9a0ee65f190aa2977b1e7360066445f8ed34" checksum = "358b2e42869ebb34c6cafc89ca7cda381817b5bd781fa33302d335c6feaa04b6"
dependencies = [ dependencies = [
"ahash 0.8.6", "ahash 0.8.6",
"blake3", "blake3",
@ -3917,7 +3937,7 @@ dependencies = [
"serde_derive", "serde_derive",
"serde_json", "serde_json",
"sha2 0.10.8", "sha2 0.10.8",
"solana-frozen-abi-macro 1.17.4", "solana-frozen-abi-macro 1.17.5",
"subtle", "subtle",
"thiserror", "thiserror",
] ]
@ -3935,9 +3955,9 @@ dependencies = [
[[package]] [[package]]
name = "solana-frozen-abi-macro" name = "solana-frozen-abi-macro"
version = "1.17.4" version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c28b7325d40b3b3fef0db6917972e8121bec05fa2b59904212b25478c85924cd" checksum = "ea690497947bc9cc8bcf7985b3c4c539b199e56c28f250746026797b681ea291"
dependencies = [ dependencies = [
"proc-macro2 1.0.69", "proc-macro2 1.0.69",
"quote 1.0.33", "quote 1.0.33",
@ -3968,9 +3988,9 @@ dependencies = [
[[package]] [[package]]
name = "solana-logger" name = "solana-logger"
version = "1.17.4" version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a224a0a87196c940472515838630e0ed6a49f97ea0d01d9dbeed0bb57390447" checksum = "e679b49d07fa6a140e194cb453322b265fb48993e4ae6225a9524a7a6e28f27b"
dependencies = [ dependencies = [
"env_logger", "env_logger",
"lazy_static", "lazy_static",
@ -4102,9 +4122,9 @@ dependencies = [
[[package]] [[package]]
name = "solana-program" name = "solana-program"
version = "1.17.4" version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1fe4a811ec2c4b0c3773e5661ecfaff81f822c9e18866097caeba6be9338dab" checksum = "926ca88c8b0d0815ce4336092379eb0b61aebaab8ba984784c029a559200527f"
dependencies = [ dependencies = [
"ark-bn254", "ark-bn254",
"ark-ec", "ark-ec",
@ -4145,9 +4165,9 @@ dependencies = [
"serde_json", "serde_json",
"sha2 0.10.8", "sha2 0.10.8",
"sha3 0.10.8", "sha3 0.10.8",
"solana-frozen-abi 1.17.4", "solana-frozen-abi 1.17.5",
"solana-frozen-abi-macro 1.17.4", "solana-frozen-abi-macro 1.17.5",
"solana-sdk-macro 1.17.4", "solana-sdk-macro 1.17.5",
"thiserror", "thiserror",
"tiny-bip39", "tiny-bip39",
"wasm-bindgen", "wasm-bindgen",
@ -4196,7 +4216,7 @@ dependencies = [
"quinn-proto 0.9.6", "quinn-proto 0.9.6",
"quinn-udp 0.3.2", "quinn-udp 0.3.2",
"rcgen", "rcgen",
"rustls 0.20.8", "rustls 0.20.9",
"solana-connection-cache", "solana-connection-cache",
"solana-measure", "solana-measure",
"solana-metrics", "solana-metrics",
@ -4292,9 +4312,9 @@ dependencies = [
[[package]] [[package]]
name = "solana-sdk" name = "solana-sdk"
version = "1.17.4" version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c79894240bad61135a9ec86cd7709dcbc9e69eec8ebcc0b4066bccde6615600" checksum = "d55719c5a4fdcf7651120ba6650cf4eba5f2b1eb30b06d2d53aec7237146d1f9"
dependencies = [ dependencies = [
"assert_matches", "assert_matches",
"base64 0.21.5", "base64 0.21.5",
@ -4334,11 +4354,11 @@ dependencies = [
"serde_with", "serde_with",
"sha2 0.10.8", "sha2 0.10.8",
"sha3 0.10.8", "sha3 0.10.8",
"solana-frozen-abi 1.17.4", "solana-frozen-abi 1.17.5",
"solana-frozen-abi-macro 1.17.4", "solana-frozen-abi-macro 1.17.5",
"solana-logger 1.17.4", "solana-logger 1.17.5",
"solana-program 1.17.4", "solana-program 1.17.5",
"solana-sdk-macro 1.17.4", "solana-sdk-macro 1.17.5",
"thiserror", "thiserror",
"uriparse", "uriparse",
"wasm-bindgen", "wasm-bindgen",
@ -4358,9 +4378,9 @@ dependencies = [
[[package]] [[package]]
name = "solana-sdk-macro" name = "solana-sdk-macro"
version = "1.17.4" version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97dce8e347d73bcd9a6fe0b37bf830a20d0a4913ac58046c79959d5e15bbbed3" checksum = "b7985176f781b66c625070b413f48740fab2ec2dd330f7afd04563799dffec44"
dependencies = [ dependencies = [
"bs58", "bs58",
"proc-macro2 1.0.69", "proc-macro2 1.0.69",
@ -4392,7 +4412,7 @@ dependencies = [
"quinn-udp 0.3.2", "quinn-udp 0.3.2",
"rand 0.7.3", "rand 0.7.3",
"rcgen", "rcgen",
"rustls 0.20.8", "rustls 0.20.9",
"solana-metrics", "solana-metrics",
"solana-perf", "solana-perf",
"solana-sdk 1.16.18", "solana-sdk 1.16.18",
@ -4464,9 +4484,9 @@ dependencies = [
[[package]] [[package]]
name = "solana-zk-token-sdk" name = "solana-zk-token-sdk"
version = "1.17.4" version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e48f33d2ce508c9e70aa7d2f1948f3a9df56ee66423252785c608b4023e0c01a" checksum = "a1d5f912154350af6318043ff857198914fbaaa88338f57bfff5f0ba5cf0da62"
dependencies = [ dependencies = [
"aes-gcm-siv", "aes-gcm-siv",
"base64 0.21.5", "base64 0.21.5",
@ -4484,8 +4504,8 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"sha3 0.9.1", "sha3 0.9.1",
"solana-program 1.17.4", "solana-program 1.17.5",
"solana-sdk 1.17.4", "solana-sdk 1.17.5",
"subtle", "subtle",
"thiserror", "thiserror",
"zeroize", "zeroize",
@ -4542,7 +4562,7 @@ dependencies = [
"borsh 0.10.3", "borsh 0.10.3",
"num-derive 0.4.1", "num-derive 0.4.1",
"num-traits", "num-traits",
"solana-program 1.17.4", "solana-program 1.17.5",
"spl-token", "spl-token",
"spl-token-2022", "spl-token-2022",
"thiserror", "thiserror",
@ -4555,7 +4575,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"solana-program 1.17.4", "solana-program 1.17.5",
"spl-discriminator-derive", "spl-discriminator-derive",
] ]
@ -4589,7 +4609,7 @@ version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a"
dependencies = [ dependencies = [
"solana-program 1.17.4", "solana-program 1.17.5",
] ]
[[package]] [[package]]
@ -4600,7 +4620,7 @@ checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079"
dependencies = [ dependencies = [
"borsh 0.10.3", "borsh 0.10.3",
"bytemuck", "bytemuck",
"solana-program 1.17.4", "solana-program 1.17.5",
"solana-zk-token-sdk", "solana-zk-token-sdk",
"spl-program-error", "spl-program-error",
] ]
@ -4613,7 +4633,7 @@ checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c"
dependencies = [ dependencies = [
"num-derive 0.4.1", "num-derive 0.4.1",
"num-traits", "num-traits",
"solana-program 1.17.4", "solana-program 1.17.5",
"spl-program-error-derive", "spl-program-error-derive",
"thiserror", "thiserror",
] ]
@ -4637,7 +4657,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"solana-program 1.17.4", "solana-program 1.17.5",
"spl-discriminator", "spl-discriminator",
"spl-pod", "spl-pod",
"spl-program-error", "spl-program-error",
@ -4655,7 +4675,7 @@ dependencies = [
"num-derive 0.3.3", "num-derive 0.3.3",
"num-traits", "num-traits",
"num_enum 0.6.1", "num_enum 0.6.1",
"solana-program 1.17.4", "solana-program 1.17.5",
"thiserror", "thiserror",
] ]
@ -4670,7 +4690,7 @@ dependencies = [
"num-derive 0.4.1", "num-derive 0.4.1",
"num-traits", "num-traits",
"num_enum 0.7.1", "num_enum 0.7.1",
"solana-program 1.17.4", "solana-program 1.17.5",
"solana-zk-token-sdk", "solana-zk-token-sdk",
"spl-memo", "spl-memo",
"spl-pod", "spl-pod",
@ -4688,7 +4708,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f"
dependencies = [ dependencies = [
"borsh 0.10.3", "borsh 0.10.3",
"solana-program 1.17.4", "solana-program 1.17.5",
"spl-discriminator", "spl-discriminator",
"spl-pod", "spl-pod",
"spl-program-error", "spl-program-error",
@ -4703,7 +4723,7 @@ checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b"
dependencies = [ dependencies = [
"arrayref", "arrayref",
"bytemuck", "bytemuck",
"solana-program 1.17.4", "solana-program 1.17.5",
"spl-discriminator", "spl-discriminator",
"spl-pod", "spl-pod",
"spl-program-error", "spl-program-error",
@ -4718,7 +4738,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"solana-program 1.17.4", "solana-program 1.17.5",
"spl-discriminator", "spl-discriminator",
"spl-pod", "spl-pod",
"spl-program-error", "spl-program-error",
@ -4828,9 +4848,9 @@ dependencies = [
[[package]] [[package]]
name = "termcolor" name = "termcolor"
version = "1.3.0" version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449"
dependencies = [ dependencies = [
"winapi-util", "winapi-util",
] ]
@ -4938,9 +4958,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.33.0" version = "1.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"bytes", "bytes",
@ -4957,9 +4977,9 @@ dependencies = [
[[package]] [[package]]
name = "tokio-macros" name = "tokio-macros"
version = "2.1.0" version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [ dependencies = [
"proc-macro2 1.0.69", "proc-macro2 1.0.69",
"quote 1.0.33", "quote 1.0.33",
@ -5154,9 +5174,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-log" name = "tracing-log"
version = "0.1.4" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
dependencies = [ dependencies = [
"log", "log",
"once_cell", "once_cell",
@ -5165,9 +5185,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-subscriber" name = "tracing-subscriber"
version = "0.3.17" version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
dependencies = [ dependencies = [
"nu-ansi-term", "nu-ansi-term",
"sharded-slab", "sharded-slab",
@ -5725,18 +5745,3 @@ dependencies = [
"cc", "cc",
"pkg-config", "pkg-config",
] ]
[[patch.unused]]
name = "solana-geyser-plugin-interface"
version = "1.16.17"
source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_send_transaction_results_v1.16.17#445f8e7c5185e1c610a98267604a19679d0bade0"
[[patch.unused]]
name = "solana-sdk"
version = "1.16.17"
source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_send_transaction_results_v1.16.17#445f8e7c5185e1c610a98267604a19679d0bade0"
[[patch.unused]]
name = "solana-streamer"
version = "1.16.17"
source = "git+https://github.com/blockworks-foundation/solana.git?branch=geyser_send_transaction_results_v1.16.17#445f8e7c5185e1c610a98267604a19679d0bade0"

View File

@ -10,6 +10,6 @@ lto = true
codegen-units = 1 codegen-units = 1
[patch.crates-io] [patch.crates-io]
solana-geyser-plugin-interface = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.17" } solana-geyser-plugin-interface = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.18" }
solana-sdk = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.17" } solana-sdk = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.18" }
solana-streamer = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.17" } solana-streamer = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.18" }

View File

@ -3,3 +3,10 @@
This project aims to get banking stage transaction data over geyser from the leader. This project aims to get banking stage transaction data over geyser from the leader.
There is a plugin which needs to be installed on leader. It will create a QUIC port and only accept connections from a known identity. There is a plugin which needs to be installed on leader. It will create a QUIC port and only accept connections from a known identity.
Once connection is accepted it will start sending the banking stage data over geyser to its suibscriber. Once connection is accepted it will start sending the banking stage data over geyser to its suibscriber.
## Run solana validator with plugin
```bash
$ solana-validator --geyser-plugin-config config.json
```

View File

@ -27,7 +27,6 @@ futures = "0.3.28"
bytes = "1.4.0" bytes = "1.4.0"
anyhow = "1.0.70" anyhow = "1.0.70"
log = "0.4.17" log = "0.4.17"
clap = { version = "4.2.4", features = ["derive", "env"] }
dashmap = "5.4.0" dashmap = "5.4.0"
const_env = "0.1.2" const_env = "0.1.2"
jsonrpsee = { version = "0.17.0", features = ["macros", "full"] } jsonrpsee = { version = "0.17.0", features = ["macros", "full"] }
@ -45,3 +44,8 @@ rustls = { version = "0.21.8", default-features = false, features = ["quic"] }
rcgen = "0.10.0" rcgen = "0.10.0"
pkcs8 = "0.8.0" pkcs8 = "0.8.0"
pem = "1.1.1" pem = "1.1.1"
clap = { version = "=4.3.24", features = ["cargo", "derive"] }
anstyle = "=1.0.0"
anstyle-parse = "=0.2.0"
clap_lex = "=0.5.0"

View File

@ -3,7 +3,7 @@ use clap::Parser;
#[derive(Parser, Debug, Clone)] #[derive(Parser, Debug, Clone)]
#[command(author, version, about, long_about = None)] #[command(author, version, about, long_about = None)]
pub struct Args { pub struct Args {
#[arg(short, long, default_value_t = String::from("http://127.0.0.1:11000"))] #[arg(short, long, default_value_t = String::from("127.0.0.1:11000"))]
pub geyser_quic_address: String, pub geyser_quic_address: String,
#[arg(short, long, default_value_t = String::from("connection_identity.json"))] #[arg(short, long, default_value_t = String::from("connection_identity.json"))]

View File

@ -1,10 +1,8 @@
use std::{time::Duration, net::{IpAddr, Ipv4Addr, SocketAddr}, sync::Arc}; use std::{time::Duration, net::{IpAddr, Ipv4Addr, SocketAddr}, sync::Arc};
use cli::Args; use cli::Args;
use geyser_quic_plugin::{TransactionResults, ALPN_GEYSER_PROTOCOL_ID}; use geyser_quic_plugin::{TransactionResults, ALPN_GEYSER_PROTOCOL_ID, tls_certificate::new_self_signed_tls_certificate};
use pkcs8::{AlgorithmIdentifier, ObjectIdentifier, der::Document};
use quinn::{TokioRuntime, EndpointConfig, Endpoint, ClientConfig, TransportConfig, IdleTimeout}; use quinn::{TokioRuntime, EndpointConfig, Endpoint, ClientConfig, TransportConfig, IdleTimeout};
use rcgen::{RcgenError, CertificateParams, SanType, DistinguishedName, DnType};
use skip_server_verification::SkipServerVerification; use skip_server_verification::SkipServerVerification;
use solana_sdk::signature::Keypair; use solana_sdk::signature::Keypair;
use clap::Parser; use clap::Parser;
@ -14,45 +12,6 @@ mod skip_server_verification;
pub const PACKET_DATA_SIZE: usize = 1280 - 40 - 8; pub const PACKET_DATA_SIZE: usize = 1280 - 40 - 8;
pub fn new_self_signed_tls_certificate(
keypair: &Keypair,
san: IpAddr,
) -> Result<(rustls::Certificate, rustls::PrivateKey), RcgenError> {
const ED25519_IDENTIFIER: [u32; 4] = [1, 3, 101, 112];
let mut private_key = Vec::<u8>::with_capacity(34);
private_key.extend_from_slice(&[0x04, 0x20]); // ASN.1 OCTET STRING
private_key.extend_from_slice(keypair.secret().as_bytes());
let key_pkcs8 = pkcs8::PrivateKeyInfo {
algorithm: AlgorithmIdentifier {
oid: ObjectIdentifier::from_arcs(&ED25519_IDENTIFIER).expect("Failed to convert OID"),
parameters: None,
},
private_key: &private_key,
public_key: None,
};
let key_pkcs8_der = key_pkcs8
.to_der()
.expect("Failed to convert keypair to DER")
.to_der();
let rcgen_keypair = rcgen::KeyPair::from_der(&key_pkcs8_der)?;
let mut cert_params = CertificateParams::default();
cert_params.subject_alt_names = vec![SanType::IpAddress(san)];
cert_params.alg = &rcgen::PKCS_ED25519;
cert_params.key_pair = Some(rcgen_keypair);
cert_params.distinguished_name = DistinguishedName::new();
cert_params
.distinguished_name
.push(DnType::CommonName, "Solana node");
let cert = rcgen::Certificate::from_params(cert_params)?;
let cert_der = cert.serialize_der().unwrap();
let priv_key = cert.serialize_private_key_der();
let priv_key = rustls::PrivateKey(priv_key);
Ok((rustls::Certificate(cert_der), priv_key))
}
pub async fn load_identity_keypair(identity_file: &String) -> Option<Keypair> { pub async fn load_identity_keypair(identity_file: &String) -> Option<Keypair> {
let identity_file = tokio::fs::read_to_string(identity_file.as_str()) let identity_file = tokio::fs::read_to_string(identity_file.as_str())
.await .await
@ -109,21 +68,32 @@ pub async fn main() -> anyhow::Result<()> {
let endpoint = create_endpoint(certificate, key); 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 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"); let (mut send_stream, recv_stream) = connection.open_bi().await.expect("Should be able to create a bi directional connection");
send_stream.write_all(b"connect").await.unwrap();
tokio::spawn(async move { // let jh = tokio::spawn(async move {
// wait for 10 s max // wait for 10 s max
let mut buffer: [u8; PACKET_DATA_SIZE] = [0; PACKET_DATA_SIZE]; let mut buffer: [u8; PACKET_DATA_SIZE] = [0; PACKET_DATA_SIZE];
let mut recv_stream = recv_stream; let mut recv_stream = recv_stream;
loop { loop {
if let Ok(Some(size)) = recv_stream.read(&mut buffer ).await let res = recv_stream.read(&mut buffer ).await;
match res
{ {
Ok(Some(size)) => {
let data = &buffer[0..size]; let data = &buffer[0..size];
if let Ok(result) = bincode::deserialize::<TransactionResults>(&data) { if let Ok(result) = bincode::deserialize::<TransactionResults>(&data) {
println!("Transaction Result \n s:{} e:{} slt:{}", result.signature, result.error.map(|x| x.to_string()).unwrap_or_default(), result.slot); println!("Transaction Result \n s:{} e:{} slt:{}", result.signature, result.error.map(|x| x.to_string()).unwrap_or_default(), result.slot);
} }
},
Ok(None) => {
log::warn!("got ok none");
},
Err(e) => {
log::error!("got error {e:?}");
break;
} }
} }
}); }
// });
// jh.await.unwrap();
Ok(()) Ok(())
} }

View File

@ -1,14 +1,5 @@
use std::sync::Arc;
pub struct SkipServerVerification; pub struct SkipServerVerification;
impl SkipServerVerification {
pub fn new() -> Arc<Self> {
Arc::new(Self)
}
}
impl rustls::client::ServerCertVerifier for SkipServerVerification { impl rustls::client::ServerCertVerifier for SkipServerVerification {
fn verify_server_cert( fn verify_server_cert(
&self, &self,

View File

@ -1,5 +1,5 @@
{ {
"libpath": "../target/debug/libgeyser_quic_plugin.so", "libpath": "target/debug/libgeyser_quic_plugin.so",
"quic_plugin": { "quic_plugin": {
"address": "0.0.0.0:11000" "address": "0.0.0.0:11000"
} }

View File

@ -16,7 +16,6 @@ name = "config-check"
tokio = { version = "1.21.2", features = ["rt-multi-thread", "macros", "time", "fs"] } 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_results_v1.16.18" } solana-sdk = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.18" }
solana-geyser-plugin-interface = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.18" } solana-geyser-plugin-interface = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.18" }
solana-streamer = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.18" }
itertools = "0.10.5" itertools = "0.10.5"
serde = { version = "1.0.160", features = ["derive"] } serde = { version = "1.0.160", features = ["derive"] }
serde_json = "1.0.96" serde_json = "1.0.96"
@ -28,7 +27,6 @@ futures = "0.3.28"
bytes = "1.4.0" bytes = "1.4.0"
anyhow = "1.0.70" anyhow = "1.0.70"
log = "0.4.17" log = "0.4.17"
clap = { version = "4.2.4", features = ["derive", "env"] }
dashmap = "5.4.0" dashmap = "5.4.0"
const_env = "0.1.2" const_env = "0.1.2"
jsonrpsee = { version = "0.17.0", features = ["macros", "full"] } jsonrpsee = { version = "0.17.0", features = ["macros", "full"] }
@ -41,11 +39,16 @@ prometheus = "0.13.3"
lazy_static = "1.4.0" lazy_static = "1.4.0"
dotenv = "0.15.0" dotenv = "0.15.0"
async-channel = "1.8.0" async-channel = "1.8.0"
quinn = "0.9.3" quinn = "0.10.2"
rustls = { version = "=0.20.8", default-features = false } rustls = { version = "0.21.8", default-features = false, features = ["quic", "dangerous_configuration"] }
rcgen = "0.10.0" rcgen = "0.10.0"
pkcs8 = "0.8.0" pkcs8 = "0.8.0"
pem = "1.1.1" pem = "1.1.1"
x509-parser = "0.14.0"
clap = { version = "=4.3.24", features = ["cargo", "derive"] }
anstyle = "=1.0.0"
anstyle-parse = "=0.2.0"
clap_lex = "=0.5.0"
[build-dependencies] [build-dependencies]
anyhow = "1.0.62" anyhow = "1.0.62"

View File

@ -1,10 +1,10 @@
use std::{ use std::{
net::{IpAddr, Ipv4Addr, UdpSocket}, net::{IpAddr, Ipv4Addr, UdpSocket},
str::FromStr, str::FromStr,
sync::Arc, sync::{Arc, atomic::AtomicBool},
}; };
use crate::config::Config; use crate::{config::Config, tls_certificate::new_self_signed_tls_certificate};
use itertools::Itertools; use itertools::Itertools;
use pem::Pem; use pem::Pem;
use quinn::{Endpoint, EndpointConfig, IdleTimeout, ServerConfig, TokioRuntime}; use quinn::{Endpoint, EndpointConfig, IdleTimeout, ServerConfig, TokioRuntime};
@ -20,16 +20,14 @@ use solana_sdk::{
slot_history::Slot, slot_history::Slot,
transaction::{SanitizedTransaction, TransactionError}, compute_budget::{self, ComputeBudgetInstruction}, borsh0_10::try_from_slice_unchecked, transaction::{SanitizedTransaction, TransactionError}, compute_budget::{self, ComputeBudgetInstruction}, borsh0_10::try_from_slice_unchecked,
}; };
use solana_streamer::{ use tls_certificate::get_pubkey_from_tls_certificate;
quic::QuicServerError,
tls_certificates::{get_pubkey_from_tls_certificate, new_self_signed_tls_certificate},
};
use tokio::{runtime::Runtime, sync::mpsc::UnboundedSender, task::JoinHandle}; use tokio::{runtime::Runtime, sync::mpsc::UnboundedSender, task::JoinHandle};
use crate::skip_client_verification::SkipClientVerification; use crate::skip_client_verification::SkipClientVerification;
pub mod skip_client_verification; pub mod skip_client_verification;
pub mod config; pub mod config;
pub mod tls_certificate;
pub const ALPN_GEYSER_PROTOCOL_ID: &[u8] = b"solana-geyser"; pub const ALPN_GEYSER_PROTOCOL_ID: &[u8] = b"solana-geyser";
@ -78,9 +76,10 @@ pub struct PluginInner {
pub runtime: Runtime, pub runtime: Runtime,
pub handle: JoinHandle<()>, pub handle: JoinHandle<()>,
pub sender: Arc<UnboundedSender<TransactionResults>>, pub sender: Arc<UnboundedSender<TransactionResults>>,
pub start_sending: Arc<AtomicBool>,
} }
#[derive(Debug)] #[derive(Debug, Default)]
pub struct Plugin { pub struct Plugin {
inner: Option<PluginInner>, inner: Option<PluginInner>,
} }
@ -102,6 +101,12 @@ impl GeyserPlugin for Plugin {
slot: Slot, slot: Slot,
) -> PluginResult<()> { ) -> PluginResult<()> {
if let Some(inner) = &self.inner { if let Some(inner) = &self.inner {
if !inner.start_sending.load(std::sync::atomic::Ordering::Relaxed) {
return Ok(())
}
if transaction.is_simple_vote_transaction() {
return Ok(())
}
let message = transaction.message(); let message = transaction.message();
let accounts = message.account_keys(); let accounts = message.account_keys();
@ -124,7 +129,7 @@ impl GeyserPlugin for Plugin {
cu_requested, cu_requested,
prioritization_fees, prioritization_fees,
}) { }) {
log::error!("error sending on the channel {}", e); log::error!("error sending on the channel {e:?}");
} }
Ok(()) Ok(())
} else { } else {
@ -140,17 +145,20 @@ impl GeyserPlugin for Plugin {
let runtime = Runtime::new().map_err(|error| GeyserPluginError::Custom(Box::new(error)))?; 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 (config, _) = res.map_err(|_| GeyserPluginError::TransactionUpdateError { msg: "error configuring server".to_string() })?;
let sock = UdpSocket::bind(plugin_config.quic_plugin.address).expect("couldn't bind to address"); let sock = UdpSocket::bind(plugin_config.quic_plugin.address).expect("couldn't bind to address");
let endpoint = Endpoint::new(EndpointConfig::default(), Some(config), sock, TokioRuntime)
.map_err(|error| GeyserPluginError::Custom(Box::new(error)))?;
let (sender, reciever) = tokio::sync::mpsc::unbounded_channel::<TransactionResults>(); let (sender, reciever) = tokio::sync::mpsc::unbounded_channel::<TransactionResults>();
let allowed_connection = let allowed_connection =
Pubkey::from_str("G8pLuvzarejjLuuPNVNR1gk9xiFKmAcs9J5LL3GZGM6F").unwrap(); Pubkey::from_str("G8pLuvzarejjLuuPNVNR1gk9xiFKmAcs9J5LL3GZGM6F").unwrap();
let start_sending = Arc::new(AtomicBool::new(false));
let start_sending_cp = start_sending.clone();
let handle = tokio::spawn(async move { let handle = runtime.block_on(async move {
let mut reciever = reciever; let mut reciever = reciever;
let endpoint = Endpoint::new(EndpointConfig::default(), Some(config), sock, Arc::new(TokioRuntime)).expect("Should be able to create endpoint");
tokio::spawn(async move {
loop { loop {
let connecting = endpoint.accept().await; let connecting = endpoint.accept().await;
if let Some(connecting) = connecting { if let Some(connecting) = connecting {
@ -179,6 +187,7 @@ impl GeyserPlugin for Plugin {
} }
}; };
start_sending_cp.store(true, std::sync::atomic::Ordering::Relaxed);
while let Some(msg) = reciever.recv().await { while let Some(msg) = reciever.recv().await {
let bytes = bincode::serialize(&msg).unwrap_or(vec![]); let bytes = bincode::serialize(&msg).unwrap_or(vec![]);
if !bytes.is_empty() { if !bytes.is_empty() {
@ -187,14 +196,17 @@ impl GeyserPlugin for Plugin {
} }
} }
} }
start_sending_cp.store(false, std::sync::atomic::Ordering::Relaxed);
} }
} }
})
}); });
self.inner = Some(PluginInner { self.inner = Some(PluginInner {
runtime, runtime,
handle, handle,
sender: Arc::new(sender), sender: Arc::new(sender),
start_sending,
}); });
Ok(()) Ok(())
} }
@ -205,7 +217,7 @@ impl GeyserPlugin for Plugin {
pub(crate) fn configure_server( pub(crate) fn configure_server(
identity_keypair: &Keypair, identity_keypair: &Keypair,
host: IpAddr, host: IpAddr,
) -> Result<(ServerConfig, String), QuicServerError> { ) -> anyhow::Result<(ServerConfig, String)> {
let (cert, priv_key) = new_self_signed_tls_certificate(identity_keypair, host)?; let (cert, priv_key) = new_self_signed_tls_certificate(identity_keypair, host)?;
let cert_chain_pem_parts = vec![Pem { let cert_chain_pem_parts = vec![Pem {
tag: "CERTIFICATE".to_string(), tag: "CERTIFICATE".to_string(),
@ -223,15 +235,15 @@ pub(crate) fn configure_server(
server_config.use_retry(true); server_config.use_retry(true);
let config = Arc::get_mut(&mut server_config.transport).unwrap(); let config = Arc::get_mut(&mut server_config.transport).unwrap();
config.max_concurrent_uni_streams((0 as u32).into()); config.max_concurrent_uni_streams((1 as u32).into());
let recv_size = (PACKET_DATA_SIZE as u32).into(); let recv_size = (PACKET_DATA_SIZE as u32 * 100).into();
config.stream_receive_window(recv_size); config.stream_receive_window(recv_size);
config.receive_window(recv_size); config.receive_window(recv_size);
let timeout = IdleTimeout::try_from(QUIC_MAX_TIMEOUT).unwrap(); let timeout = IdleTimeout::try_from(QUIC_MAX_TIMEOUT).unwrap();
config.max_idle_timeout(Some(timeout)); config.max_idle_timeout(Some(timeout));
// disable bidi & datagrams // disable bidi & datagrams
const MAX_CONCURRENT_BIDI_STREAMS: u32 = 1; const MAX_CONCURRENT_BIDI_STREAMS: u32 = 10;
config.max_concurrent_bidi_streams(MAX_CONCURRENT_BIDI_STREAMS.into()); config.max_concurrent_bidi_streams(MAX_CONCURRENT_BIDI_STREAMS.into());
config.datagram_receive_buffer_size(None); config.datagram_receive_buffer_size(None);
@ -248,3 +260,11 @@ pub fn get_remote_pubkey(connection: &quinn::Connection) -> Option<Pubkey> {
.first() .first()
.and_then(get_pubkey_from_tls_certificate) .and_then(get_pubkey_from_tls_certificate)
} }
#[no_mangle]
#[allow(improper_ctypes_definitions)]
pub unsafe extern "C" fn _create_plugin() -> *mut dyn GeyserPlugin {
let plugin = Plugin::default();
let plugin: Box<dyn GeyserPlugin> = Box::new(plugin);
Box::into_raw(plugin)
}

View File

@ -1,6 +1,6 @@
use std::{sync::Arc, time::SystemTime}; use std::{sync::Arc, time::SystemTime};
use rustls::{server::ClientCertVerified, Certificate, DistinguishedNames}; use rustls::{server::ClientCertVerified, Certificate, DistinguishedName};
pub struct SkipClientVerification; pub struct SkipClientVerification;
@ -11,8 +11,8 @@ impl SkipClientVerification {
} }
impl rustls::server::ClientCertVerifier for SkipClientVerification { impl rustls::server::ClientCertVerifier for SkipClientVerification {
fn client_auth_root_subjects(&self) -> Option<DistinguishedNames> { fn client_auth_root_subjects(&self) -> &[DistinguishedName] {
Some(DistinguishedNames::new()) &[]
} }
fn verify_client_cert( fn verify_client_cert(

View File

@ -0,0 +1,53 @@
use std::net::IpAddr;
use pkcs8::{AlgorithmIdentifier, ObjectIdentifier, der::Document};
use rcgen::{RcgenError, CertificateParams, SanType, DistinguishedName, DnType};
use solana_sdk::{signature::Keypair, pubkey::Pubkey};
use x509_parser::{prelude::{X509Certificate, FromDer}, public_key::PublicKey};
pub fn new_self_signed_tls_certificate(
keypair: &Keypair,
san: IpAddr,
) -> Result<(rustls::Certificate, rustls::PrivateKey), RcgenError> {
const ED25519_IDENTIFIER: [u32; 4] = [1, 3, 101, 112];
let mut private_key = Vec::<u8>::with_capacity(34);
private_key.extend_from_slice(&[0x04, 0x20]); // ASN.1 OCTET STRING
private_key.extend_from_slice(keypair.secret().as_bytes());
let key_pkcs8 = pkcs8::PrivateKeyInfo {
algorithm: AlgorithmIdentifier {
oid: ObjectIdentifier::from_arcs(&ED25519_IDENTIFIER).expect("Failed to convert OID"),
parameters: None,
},
private_key: &private_key,
public_key: None,
};
let key_pkcs8_der = key_pkcs8
.to_der()
.expect("Failed to convert keypair to DER")
.to_der();
let rcgen_keypair = rcgen::KeyPair::from_der(&key_pkcs8_der)?;
let mut cert_params = CertificateParams::default();
cert_params.subject_alt_names = vec![SanType::IpAddress(san)];
cert_params.alg = &rcgen::PKCS_ED25519;
cert_params.key_pair = Some(rcgen_keypair);
cert_params.distinguished_name = DistinguishedName::new();
cert_params
.distinguished_name
.push(DnType::CommonName, "Solana node");
let cert = rcgen::Certificate::from_params(cert_params)?;
let cert_der = cert.serialize_der().unwrap();
let priv_key = cert.serialize_private_key_der();
let priv_key = rustls::PrivateKey(priv_key);
Ok((rustls::Certificate(cert_der), priv_key))
}
pub fn get_pubkey_from_tls_certificate(der_cert: &rustls::Certificate) -> Option<Pubkey> {
let (_, cert) = X509Certificate::from_der(der_cert.as_ref()).ok()?;
match cert.public_key().parsed().ok()? {
PublicKey::Unknown(key) => Pubkey::try_from(key).ok(),
_ => None,
}
}

View File

@ -1,5 +1,5 @@
[toolchain] [toolchain]
channel = "1.73.0" channel = "1.69.0"
components = ["clippy", "rustfmt"] components = ["clippy", "rustfmt"]
targets = [] targets = []
profile = "minimal" profile = "minimal"