This commit is contained in:
Bryan Stitt 2022-04-29 01:57:16 +00:00
parent 2fef0e6acb
commit 7510db4989
3 changed files with 55 additions and 46 deletions

50
Cargo.lock generated

@ -927,7 +927,7 @@ dependencies = [
[[package]]
name = "ethers"
version = "0.6.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"ethers-addressbook",
"ethers-contract",
@ -942,7 +942,7 @@ dependencies = [
[[package]]
name = "ethers-addressbook"
version = "0.1.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"ethers-core",
"once_cell",
@ -953,7 +953,7 @@ dependencies = [
[[package]]
name = "ethers-contract"
version = "0.6.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"ethers-contract-abigen",
"ethers-contract-derive",
@ -971,7 +971,7 @@ dependencies = [
[[package]]
name = "ethers-contract-abigen"
version = "0.6.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"Inflector",
"cfg-if",
@ -993,7 +993,7 @@ dependencies = [
[[package]]
name = "ethers-contract-derive"
version = "0.6.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"ethers-contract-abigen",
"ethers-core",
@ -1007,7 +1007,7 @@ dependencies = [
[[package]]
name = "ethers-core"
version = "0.6.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"arrayvec",
"bytes",
@ -1033,7 +1033,7 @@ dependencies = [
[[package]]
name = "ethers-etherscan"
version = "0.2.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"ethers-core",
"ethers-solc",
@ -1048,7 +1048,7 @@ dependencies = [
[[package]]
name = "ethers-middleware"
version = "0.6.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"async-trait",
"ethers-contract",
@ -1071,7 +1071,7 @@ dependencies = [
[[package]]
name = "ethers-providers"
version = "0.6.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"async-trait",
"auto_impl",
@ -1106,7 +1106,7 @@ dependencies = [
[[package]]
name = "ethers-signers"
version = "0.6.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"async-trait",
"coins-bip32",
@ -1123,7 +1123,7 @@ dependencies = [
[[package]]
name = "ethers-solc"
version = "0.3.0"
source = "git+https://github.com/gakonst/ethers-rs#a866cd57260b37fd9be5aa3ba33083b9daa5405d"
source = "git+https://github.com/gakonst/ethers-rs#c81254a8b61bed1e20f29a72cc2e23454930348f"
dependencies = [
"colored",
"dunce",
@ -1539,9 +1539,9 @@ dependencies = [
[[package]]
name = "http"
version = "0.2.6"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03"
checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb"
dependencies = [
"bytes",
"fnv",
@ -1561,9 +1561,9 @@ dependencies = [
[[package]]
name = "httparse"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba"
checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c"
[[package]]
name = "httpdate"
@ -2304,9 +2304,9 @@ dependencies = [
[[package]]
name = "pin-project-lite"
version = "0.2.8"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c"
checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
[[package]]
name = "pin-utils"
@ -3213,9 +3213,9 @@ dependencies = [
[[package]]
name = "tinyvec"
version = "1.5.1"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2"
checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
dependencies = [
"tinyvec_macros",
]
@ -3228,9 +3228,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
[[package]]
name = "tokio"
version = "1.17.0"
version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee"
checksum = "0f48b6d60512a392e34dbf7fd456249fd2de3c83669ab642e021903f4015185b"
dependencies = [
"bytes",
"libc",
@ -3376,9 +3376,9 @@ dependencies = [
[[package]]
name = "tracing-attributes"
version = "0.1.20"
version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b"
checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c"
dependencies = [
"proc-macro2",
"quote",
@ -3514,9 +3514,9 @@ dependencies = [
[[package]]
name = "unicode-bidi"
version = "0.3.7"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
[[package]]
name = "unicode-normalization"

@ -10,17 +10,17 @@ arc-swap = "1.5.0"
argh = "0.1.7"
anyhow = "1.0.57"
atomic-counter = "1.0.1"
derive_more = "0.99"
derive_more = "0.99.17"
ethers = { git = "https://github.com/gakonst/ethers-rs", features = ["rustls", "ws"] }
futures = { version = "0.3.21", features = ["thread-pool"] }
governor = { version = "0.4.2", features = ["dashmap", "std"] }
tokio = { version = "1.17.0", features = ["full"] }
parking_lot = "0.12"
tokio = { version = "1.18.0", features = ["full"] }
parking_lot = "0.12.0"
regex = "1.5.5"
reqwest = { version = "0.11.10", features = ["json"] }
serde = {version = "1.0"}
reqwest = { version = "0.11.10", features = ["json", "rustls"] }
serde = "1.0.136"
serde_json = { version = "1.0.79", default-features = false, features = ["alloc"] }
tracing = "0.1"
tracing-subscriber = "0.3"
tracing = "0.1.34"
tracing-subscriber = "0.3.11"
url = "2.2.2"
warp = "0.3.2"

@ -3,6 +3,8 @@ mod provider;
mod provider_tiers;
use futures::future;
use futures::stream::FuturesUnordered;
use futures::StreamExt;
use governor::clock::{Clock, QuantaClock};
use serde_json::json;
use std::collections::HashMap;
@ -77,6 +79,7 @@ impl Web3ProxyApp {
// TODO: how should we configure the connection pool?
// TODO: 5 minutes is probably long enough. unlimited is a bad idea if something is wrong with the remote server
let http_client = reqwest::ClientBuilder::new()
.connect_timeout(Duration::from_secs(5))
.timeout(Duration::from_secs(300))
.user_agent(APP_USER_AGENT)
.build()?;
@ -97,6 +100,7 @@ impl Web3ProxyApp {
let private_rpcs = if private_rpcs.is_empty() {
warn!("No private relays configured. Any transactions will be broadcast to the public mempool!");
// TODO: instead of None, set it to a list of all the rpcs from balanced_rpc_tiers. that way we broadcast very loudly
None
} else {
Some(Arc::new(
@ -369,14 +373,18 @@ impl Web3ProxyApp {
.ok_or_else(|| anyhow::anyhow!("no params"))?
.to_owned();
// send the query to all the servers
let bodies = future::join_all(rpc_servers.into_iter().map(|rpc| {
// TODO: lets just use a usize index or something
let method = Arc::new(method);
let mut unordered_futures = FuturesUnordered::new();
for rpc in rpc_servers {
let connections = connections.clone();
let method = method.clone();
let params = params.clone();
let tx = tx.clone();
async move {
let handle = tokio::spawn(async move {
// get the client for this rpc server
let provider = connections.get(&rpc).unwrap().clone_provider();
@ -393,14 +401,15 @@ impl Web3ProxyApp {
let _ = tx.send(Ok(response));
Ok::<(), anyhow::Error>(())
}
}))
.await;
});
unordered_futures.push(handle);
}
// TODO: use iterators instead of pushing into a vec
let mut errs = vec![];
for x in bodies {
match x {
if let Some(x) = unordered_futures.next().await {
match x.unwrap() {
Ok(_) => {}
Err(e) => {
// TODO: better errors
@ -437,9 +446,11 @@ async fn main() {
// TODO: support multiple chains in one process? then we could just point "chain.stytt.com" at this and caddy wouldn't need anything else
// TODO: be smart about about using archive nodes? have a set that doesn't use archive nodes since queries to them are more valuable
let listen_port = 8445;
// TODO: what should this be? 0 will cause a thundering herd
let allowed_lag = 0;
let state = Web3ProxyApp::try_new(
1,
allowed_lag,
vec![
// local nodes
vec![("ws://10.11.12.16:8545", 0), ("ws://10.11.12.16:8946", 0)],
@ -471,15 +482,13 @@ async fn main() {
let proxy_rpc_filter = warp::any()
.and(warp::post())
.and(warp::body::json())
.then(move |json_body| state.clone().proxy_web3_rpc(json_body))
.map(handle_anyhow_errors);
.then(move |json_body| state.clone().proxy_web3_rpc(json_body));
// TODO: filter for displaying connections
// TODO: filter for displaying
// TODO: filter for displaying connections and their block heights
// TODO: warp trace is super verbose. how do we make this more readable?
// let routes = proxy_rpc_filter.with(warp::trace::request());
let routes = proxy_rpc_filter;
let routes = proxy_rpc_filter.map(handle_anyhow_errors);
warp::serve(routes).run(([0, 0, 0, 0], listen_port)).await;
}