Making the geyser plugin work
This commit is contained in:
parent
5e0fdc62d3
commit
0698406657
|
@ -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"
|
|
||||||
|
|
|
@ -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" }
|
||||||
|
|
|
@ -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
|
||||||
|
```
|
||||||
|
|
||||||
|
|
|
@ -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"
|
|
@ -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"))]
|
||||||
|
|
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"
|
Loading…
Reference in New Issue