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]]
name = "anstream"
version = "0.6.4"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"is-terminal",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.4"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d"
[[package]]
name = "anstyle-parse"
version = "0.2.2"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140"
checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee"
dependencies = [
"utf8parse",
]
@ -166,9 +167,9 @@ dependencies = [
[[package]]
name = "anstyle-wincon"
version = "3.0.1"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628"
checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c"
dependencies = [
"anstyle",
"windows-sys 0.48.0",
@ -676,9 +677,9 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3"
[[package]]
name = "bstr"
version = "1.7.0"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c79ad7fb2dd38f3dabd76b09c6a5a20c038fc0213ef1e9afd30eb777f120f019"
checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c"
dependencies = [
"memchr",
"serde",
@ -812,31 +813,33 @@ dependencies = [
[[package]]
name = "clap"
version = "4.4.7"
version = "4.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b"
checksum = "fb690e81c7840c0d7aade59f242ea3b41b9bc27bcd5997890e7702ae4b32e487"
dependencies = [
"clap_builder",
"clap_derive",
"once_cell",
]
[[package]]
name = "clap_builder"
version = "4.4.7"
version = "4.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663"
checksum = "5ed2e96bc16d8d740f6f48d663eddf4b8a0983e79210fd55479b7bcd0a69860e"
dependencies = [
"anstream",
"anstyle",
"clap_lex 0.6.0",
"clap_lex 0.5.0",
"once_cell",
"strsim",
]
[[package]]
name = "clap_derive"
version = "4.4.7"
version = "4.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050"
dependencies = [
"heck",
"proc-macro2 1.0.69",
@ -855,14 +858,16 @@ dependencies = [
[[package]]
name = "clap_lex"
version = "0.6.0"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b"
[[package]]
name = "client"
version = "0.1.0"
dependencies = [
"anstyle",
"anstyle-parse",
"anyhow",
"async-channel",
"base64 0.21.5",
@ -870,7 +875,8 @@ dependencies = [
"bs58",
"bytes",
"chrono",
"clap 4.4.7",
"clap 4.3.24",
"clap_lex 0.5.0",
"const_env",
"dashmap",
"dotenv",
@ -1596,6 +1602,8 @@ dependencies = [
name = "geyser-quic-plugin"
version = "0.1.0"
dependencies = [
"anstyle",
"anstyle-parse",
"anyhow",
"async-channel",
"base64 0.21.5",
@ -1604,7 +1612,8 @@ dependencies = [
"bytes",
"cargo-lock",
"chrono",
"clap 4.4.7",
"clap 4.3.24",
"clap_lex 0.5.0",
"const_env",
"dashmap",
"dotenv",
@ -1619,19 +1628,19 @@ dependencies = [
"pkcs8",
"postgres-native-tls",
"prometheus",
"quinn 0.9.4",
"quinn 0.10.2",
"rcgen",
"rustls 0.20.8",
"rustls 0.21.8",
"serde",
"serde_json",
"solana-geyser-plugin-interface",
"solana-sdk 1.16.18",
"solana-streamer",
"thiserror",
"tokio",
"tracing",
"tracing-subscriber",
"vergen",
"x509-parser",
]
[[package]]
@ -1848,9 +1857,9 @@ dependencies = [
[[package]]
name = "http"
version = "0.2.9"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
dependencies = [
"bytes",
"fnv",
@ -2007,6 +2016,17 @@ version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "itertools"
version = "0.10.5"
@ -3022,7 +3042,7 @@ dependencies = [
"quinn-proto 0.9.6",
"quinn-udp 0.3.2",
"rustc-hash",
"rustls 0.20.8",
"rustls 0.20.9",
"thiserror",
"tokio",
"tracing",
@ -3056,7 +3076,7 @@ dependencies = [
"rand 0.8.5",
"ring 0.16.20",
"rustc-hash",
"rustls 0.20.8",
"rustls 0.20.9",
"rustls-native-certs",
"slab",
"thiserror",
@ -3380,9 +3400,9 @@ dependencies = [
[[package]]
name = "rustix"
version = "0.38.21"
version = "0.38.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
checksum = "80109a168d9bc0c7f483083244543a6eb0dba02295d33ca268145e6190d6df0c"
dependencies = [
"bitflags 2.4.1",
"errno",
@ -3393,9 +3413,9 @@ dependencies = [
[[package]]
name = "rustls"
version = "0.20.8"
version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f"
checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99"
dependencies = [
"ring 0.16.20",
"sct",
@ -3428,9 +3448,9 @@ dependencies = [
[[package]]
name = "rustls-pemfile"
version = "1.0.3"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
dependencies = [
"base64 0.21.5",
]
@ -3743,9 +3763,9 @@ dependencies = [
[[package]]
name = "smallvec"
version = "1.11.1"
version = "1.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
[[package]]
name = "socket2"
@ -3894,9 +3914,9 @@ dependencies = [
[[package]]
name = "solana-frozen-abi"
version = "1.17.4"
version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80447a64ba88aff4ab1fe70c646b9a0ee65f190aa2977b1e7360066445f8ed34"
checksum = "358b2e42869ebb34c6cafc89ca7cda381817b5bd781fa33302d335c6feaa04b6"
dependencies = [
"ahash 0.8.6",
"blake3",
@ -3917,7 +3937,7 @@ dependencies = [
"serde_derive",
"serde_json",
"sha2 0.10.8",
"solana-frozen-abi-macro 1.17.4",
"solana-frozen-abi-macro 1.17.5",
"subtle",
"thiserror",
]
@ -3935,9 +3955,9 @@ dependencies = [
[[package]]
name = "solana-frozen-abi-macro"
version = "1.17.4"
version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c28b7325d40b3b3fef0db6917972e8121bec05fa2b59904212b25478c85924cd"
checksum = "ea690497947bc9cc8bcf7985b3c4c539b199e56c28f250746026797b681ea291"
dependencies = [
"proc-macro2 1.0.69",
"quote 1.0.33",
@ -3968,9 +3988,9 @@ dependencies = [
[[package]]
name = "solana-logger"
version = "1.17.4"
version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a224a0a87196c940472515838630e0ed6a49f97ea0d01d9dbeed0bb57390447"
checksum = "e679b49d07fa6a140e194cb453322b265fb48993e4ae6225a9524a7a6e28f27b"
dependencies = [
"env_logger",
"lazy_static",
@ -4102,9 +4122,9 @@ dependencies = [
[[package]]
name = "solana-program"
version = "1.17.4"
version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1fe4a811ec2c4b0c3773e5661ecfaff81f822c9e18866097caeba6be9338dab"
checksum = "926ca88c8b0d0815ce4336092379eb0b61aebaab8ba984784c029a559200527f"
dependencies = [
"ark-bn254",
"ark-ec",
@ -4145,9 +4165,9 @@ dependencies = [
"serde_json",
"sha2 0.10.8",
"sha3 0.10.8",
"solana-frozen-abi 1.17.4",
"solana-frozen-abi-macro 1.17.4",
"solana-sdk-macro 1.17.4",
"solana-frozen-abi 1.17.5",
"solana-frozen-abi-macro 1.17.5",
"solana-sdk-macro 1.17.5",
"thiserror",
"tiny-bip39",
"wasm-bindgen",
@ -4196,7 +4216,7 @@ dependencies = [
"quinn-proto 0.9.6",
"quinn-udp 0.3.2",
"rcgen",
"rustls 0.20.8",
"rustls 0.20.9",
"solana-connection-cache",
"solana-measure",
"solana-metrics",
@ -4292,9 +4312,9 @@ dependencies = [
[[package]]
name = "solana-sdk"
version = "1.17.4"
version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c79894240bad61135a9ec86cd7709dcbc9e69eec8ebcc0b4066bccde6615600"
checksum = "d55719c5a4fdcf7651120ba6650cf4eba5f2b1eb30b06d2d53aec7237146d1f9"
dependencies = [
"assert_matches",
"base64 0.21.5",
@ -4334,11 +4354,11 @@ dependencies = [
"serde_with",
"sha2 0.10.8",
"sha3 0.10.8",
"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",
"solana-frozen-abi 1.17.5",
"solana-frozen-abi-macro 1.17.5",
"solana-logger 1.17.5",
"solana-program 1.17.5",
"solana-sdk-macro 1.17.5",
"thiserror",
"uriparse",
"wasm-bindgen",
@ -4358,9 +4378,9 @@ dependencies = [
[[package]]
name = "solana-sdk-macro"
version = "1.17.4"
version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97dce8e347d73bcd9a6fe0b37bf830a20d0a4913ac58046c79959d5e15bbbed3"
checksum = "b7985176f781b66c625070b413f48740fab2ec2dd330f7afd04563799dffec44"
dependencies = [
"bs58",
"proc-macro2 1.0.69",
@ -4392,7 +4412,7 @@ dependencies = [
"quinn-udp 0.3.2",
"rand 0.7.3",
"rcgen",
"rustls 0.20.8",
"rustls 0.20.9",
"solana-metrics",
"solana-perf",
"solana-sdk 1.16.18",
@ -4464,9 +4484,9 @@ dependencies = [
[[package]]
name = "solana-zk-token-sdk"
version = "1.17.4"
version = "1.17.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e48f33d2ce508c9e70aa7d2f1948f3a9df56ee66423252785c608b4023e0c01a"
checksum = "a1d5f912154350af6318043ff857198914fbaaa88338f57bfff5f0ba5cf0da62"
dependencies = [
"aes-gcm-siv",
"base64 0.21.5",
@ -4484,8 +4504,8 @@ dependencies = [
"serde",
"serde_json",
"sha3 0.9.1",
"solana-program 1.17.4",
"solana-sdk 1.17.4",
"solana-program 1.17.5",
"solana-sdk 1.17.5",
"subtle",
"thiserror",
"zeroize",
@ -4542,7 +4562,7 @@ dependencies = [
"borsh 0.10.3",
"num-derive 0.4.1",
"num-traits",
"solana-program 1.17.4",
"solana-program 1.17.5",
"spl-token",
"spl-token-2022",
"thiserror",
@ -4555,7 +4575,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f"
dependencies = [
"bytemuck",
"solana-program 1.17.4",
"solana-program 1.17.5",
"spl-discriminator-derive",
]
@ -4589,7 +4609,7 @@ version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a"
dependencies = [
"solana-program 1.17.4",
"solana-program 1.17.5",
]
[[package]]
@ -4600,7 +4620,7 @@ checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079"
dependencies = [
"borsh 0.10.3",
"bytemuck",
"solana-program 1.17.4",
"solana-program 1.17.5",
"solana-zk-token-sdk",
"spl-program-error",
]
@ -4613,7 +4633,7 @@ checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c"
dependencies = [
"num-derive 0.4.1",
"num-traits",
"solana-program 1.17.4",
"solana-program 1.17.5",
"spl-program-error-derive",
"thiserror",
]
@ -4637,7 +4657,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9"
dependencies = [
"bytemuck",
"solana-program 1.17.4",
"solana-program 1.17.5",
"spl-discriminator",
"spl-pod",
"spl-program-error",
@ -4655,7 +4675,7 @@ dependencies = [
"num-derive 0.3.3",
"num-traits",
"num_enum 0.6.1",
"solana-program 1.17.4",
"solana-program 1.17.5",
"thiserror",
]
@ -4670,7 +4690,7 @@ dependencies = [
"num-derive 0.4.1",
"num-traits",
"num_enum 0.7.1",
"solana-program 1.17.4",
"solana-program 1.17.5",
"solana-zk-token-sdk",
"spl-memo",
"spl-pod",
@ -4688,7 +4708,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f"
dependencies = [
"borsh 0.10.3",
"solana-program 1.17.4",
"solana-program 1.17.5",
"spl-discriminator",
"spl-pod",
"spl-program-error",
@ -4703,7 +4723,7 @@ checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b"
dependencies = [
"arrayref",
"bytemuck",
"solana-program 1.17.4",
"solana-program 1.17.5",
"spl-discriminator",
"spl-pod",
"spl-program-error",
@ -4718,7 +4738,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac"
dependencies = [
"bytemuck",
"solana-program 1.17.4",
"solana-program 1.17.5",
"spl-discriminator",
"spl-pod",
"spl-program-error",
@ -4828,9 +4848,9 @@ dependencies = [
[[package]]
name = "termcolor"
version = "1.3.0"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64"
checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449"
dependencies = [
"winapi-util",
]
@ -4938,9 +4958,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.33.0"
version = "1.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653"
checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9"
dependencies = [
"backtrace",
"bytes",
@ -4957,9 +4977,9 @@ dependencies = [
[[package]]
name = "tokio-macros"
version = "2.1.0"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2 1.0.69",
"quote 1.0.33",
@ -5154,9 +5174,9 @@ dependencies = [
[[package]]
name = "tracing-log"
version = "0.1.4"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2"
checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
dependencies = [
"log",
"once_cell",
@ -5165,9 +5185,9 @@ dependencies = [
[[package]]
name = "tracing-subscriber"
version = "0.3.17"
version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
dependencies = [
"nu-ansi-term",
"sharded-slab",
@ -5725,18 +5745,3 @@ dependencies = [
"cc",
"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
[patch.crates-io]
solana-geyser-plugin-interface = { 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.17" }
solana-streamer = { 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.18" }
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.
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.
## 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"
anyhow = "1.0.70"
log = "0.4.17"
clap = { version = "4.2.4", features = ["derive", "env"] }
dashmap = "5.4.0"
const_env = "0.1.2"
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"
pkcs8 = "0.8.0"
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)]
#[command(author, version, about, long_about = None)]
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,
#[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 cli::Args;
use geyser_quic_plugin::{TransactionResults, ALPN_GEYSER_PROTOCOL_ID};
use pkcs8::{AlgorithmIdentifier, ObjectIdentifier, der::Document};
use geyser_quic_plugin::{TransactionResults, ALPN_GEYSER_PROTOCOL_ID, tls_certificate::new_self_signed_tls_certificate};
use quinn::{TokioRuntime, EndpointConfig, Endpoint, ClientConfig, TransportConfig, IdleTimeout};
use rcgen::{RcgenError, CertificateParams, SanType, DistinguishedName, DnType};
use skip_server_verification::SkipServerVerification;
use solana_sdk::signature::Keypair;
use clap::Parser;
@ -14,45 +12,6 @@ mod skip_server_verification;
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> {
let identity_file = tokio::fs::read_to_string(identity_file.as_str())
.await
@ -109,21 +68,32 @@ pub async fn main() -> anyhow::Result<()> {
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 {
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();
// let jh = tokio::spawn(async move {
// wait for 10 s max
let mut buffer: [u8; PACKET_DATA_SIZE] = [0; PACKET_DATA_SIZE];
let mut recv_stream = recv_stream;
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];
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);
}
},
Ok(None) => {
log::warn!("got ok none");
},
Err(e) => {
log::error!("got error {e:?}");
break;
}
}
});
}
// });
// jh.await.unwrap();
Ok(())
}

View File

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

View File

@ -1,5 +1,5 @@
{
"libpath": "../target/debug/libgeyser_quic_plugin.so",
"libpath": "target/debug/libgeyser_quic_plugin.so",
"quic_plugin": {
"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"] }
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-streamer = { git = "https://github.com/blockworks-foundation/solana.git", branch = "geyser_send_transaction_results_v1.16.18" }
itertools = "0.10.5"
serde = { version = "1.0.160", features = ["derive"] }
serde_json = "1.0.96"
@ -28,7 +27,6 @@ futures = "0.3.28"
bytes = "1.4.0"
anyhow = "1.0.70"
log = "0.4.17"
clap = { version = "4.2.4", features = ["derive", "env"] }
dashmap = "5.4.0"
const_env = "0.1.2"
jsonrpsee = { version = "0.17.0", features = ["macros", "full"] }
@ -41,11 +39,16 @@ 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", "dangerous_configuration"] }
rcgen = "0.10.0"
pkcs8 = "0.8.0"
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]
anyhow = "1.0.62"

View File

@ -1,10 +1,10 @@
use std::{
net::{IpAddr, Ipv4Addr, UdpSocket},
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 pem::Pem;
use quinn::{Endpoint, EndpointConfig, IdleTimeout, ServerConfig, TokioRuntime};
@ -20,16 +20,14 @@ use solana_sdk::{
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 tls_certificate::get_pubkey_from_tls_certificate;
use tokio::{runtime::Runtime, sync::mpsc::UnboundedSender, task::JoinHandle};
use crate::skip_client_verification::SkipClientVerification;
pub mod skip_client_verification;
pub mod config;
pub mod tls_certificate;
pub const ALPN_GEYSER_PROTOCOL_ID: &[u8] = b"solana-geyser";
@ -78,9 +76,10 @@ pub struct PluginInner {
pub runtime: Runtime,
pub handle: JoinHandle<()>,
pub sender: Arc<UnboundedSender<TransactionResults>>,
pub start_sending: Arc<AtomicBool>,
}
#[derive(Debug)]
#[derive(Debug, Default)]
pub struct Plugin {
inner: Option<PluginInner>,
}
@ -102,6 +101,12 @@ impl GeyserPlugin for Plugin {
slot: Slot,
) -> PluginResult<()> {
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 accounts = message.account_keys();
@ -124,7 +129,7 @@ impl GeyserPlugin for Plugin {
cu_requested,
prioritization_fees,
}) {
log::error!("error sending on the channel {}", e);
log::error!("error sending on the channel {e:?}");
}
Ok(())
} else {
@ -140,17 +145,20 @@ impl GeyserPlugin for Plugin {
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 (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 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 allowed_connection =
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 endpoint = Endpoint::new(EndpointConfig::default(), Some(config), sock, Arc::new(TokioRuntime)).expect("Should be able to create endpoint");
tokio::spawn(async move {
loop {
let connecting = endpoint.accept().await;
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 {
let bytes = bincode::serialize(&msg).unwrap_or(vec![]);
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 {
runtime,
handle,
sender: Arc::new(sender),
start_sending,
});
Ok(())
}
@ -205,7 +217,7 @@ impl GeyserPlugin for Plugin {
pub(crate) fn configure_server(
identity_keypair: &Keypair,
host: IpAddr,
) -> Result<(ServerConfig, String), QuicServerError> {
) -> anyhow::Result<(ServerConfig, String)> {
let (cert, priv_key) = new_self_signed_tls_certificate(identity_keypair, host)?;
let cert_chain_pem_parts = vec![Pem {
tag: "CERTIFICATE".to_string(),
@ -223,15 +235,15 @@ pub(crate) fn configure_server(
server_config.use_retry(true);
let config = Arc::get_mut(&mut server_config.transport).unwrap();
config.max_concurrent_uni_streams((0 as u32).into());
let recv_size = (PACKET_DATA_SIZE as u32).into();
config.max_concurrent_uni_streams((1 as u32).into());
let recv_size = (PACKET_DATA_SIZE as u32 * 100).into();
config.stream_receive_window(recv_size);
config.receive_window(recv_size);
let timeout = IdleTimeout::try_from(QUIC_MAX_TIMEOUT).unwrap();
config.max_idle_timeout(Some(timeout));
// 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.datagram_receive_buffer_size(None);
@ -248,3 +260,11 @@ pub fn get_remote_pubkey(connection: &quinn::Connection) -> Option<Pubkey> {
.first()
.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 rustls::{server::ClientCertVerified, Certificate, DistinguishedNames};
use rustls::{server::ClientCertVerified, Certificate, DistinguishedName};
pub struct SkipClientVerification;
@ -11,8 +11,8 @@ impl SkipClientVerification {
}
impl rustls::server::ClientCertVerifier for SkipClientVerification {
fn client_auth_root_subjects(&self) -> Option<DistinguishedNames> {
Some(DistinguishedNames::new())
fn client_auth_root_subjects(&self) -> &[DistinguishedName] {
&[]
}
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]
channel = "1.73.0"
channel = "1.69.0"
components = ["clippy", "rustfmt"]
targets = []
profile = "minimal"