Find best server
This commit is contained in:
parent
7dfd64502c
commit
074c1bad60
|
@ -36,7 +36,7 @@ flexi_logger = {version="0.22.3", features = ["compress"]}
|
||||||
serde = {version = "1.0.126", features = ["derive"]}
|
serde = {version = "1.0.126", features = ["derive"]}
|
||||||
serde_json = "1.0.64"
|
serde_json = "1.0.64"
|
||||||
bincode = "1.3.3"
|
bincode = "1.3.3"
|
||||||
tokio = { version = "^1.6", features = ["macros", "rt-multi-thread"] }
|
tokio = { version = "^1.6", features = ["macros", "rt-multi-thread", "time"] }
|
||||||
tokio-stream = "0.1.7"
|
tokio-stream = "0.1.7"
|
||||||
protobuf = "3.0.2"
|
protobuf = "3.0.2"
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
|
|
12
binding.h
12
binding.h
|
@ -11,12 +11,16 @@ typedef char bool;
|
||||||
#endif
|
#endif
|
||||||
typedef void *DartPostCObjectFnType;
|
typedef void *DartPostCObjectFnType;
|
||||||
|
|
||||||
|
#define QR_DATA_SIZE 256
|
||||||
|
|
||||||
|
#define MAX_OUTPUTS_PER_CHUNK 200000
|
||||||
|
|
||||||
void dummy_export(void);
|
void dummy_export(void);
|
||||||
|
|
||||||
void deallocate_str(char *s);
|
|
||||||
|
|
||||||
void dart_post_cobject(DartPostCObjectFnType ptr);
|
void dart_post_cobject(DartPostCObjectFnType ptr);
|
||||||
|
|
||||||
|
void deallocate_str(char *s);
|
||||||
|
|
||||||
bool get_error(void);
|
bool get_error(void);
|
||||||
|
|
||||||
char *get_error_msg(void);
|
char *get_error_msg(void);
|
||||||
|
@ -104,4 +108,6 @@ char *split_data(uint32_t id, char *data);
|
||||||
|
|
||||||
char *merge_data(char *drop);
|
char *merge_data(char *drop);
|
||||||
|
|
||||||
char *get_tx_summary(char *drop);
|
char *get_tx_summary(char *tx);
|
||||||
|
|
||||||
|
char *get_best_server(char **servers, uint32_t count);
|
||||||
|
|
|
@ -553,3 +553,21 @@ pub unsafe extern "C" fn get_tx_summary(tx: *mut c_char) -> *mut c_char {
|
||||||
};
|
};
|
||||||
to_c_str(log_string(res()))
|
to_c_str(log_string(res()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
#[no_mangle]
|
||||||
|
pub async unsafe extern "C" fn get_best_server(
|
||||||
|
servers: *mut *mut c_char,
|
||||||
|
count: u32,
|
||||||
|
) -> *mut c_char {
|
||||||
|
let mut cservers = vec![];
|
||||||
|
for i in 0..count {
|
||||||
|
let ptr = *servers.offset(i as isize);
|
||||||
|
let s = CStr::from_ptr(ptr).to_string_lossy();
|
||||||
|
cservers.push(s.to_string());
|
||||||
|
}
|
||||||
|
let best_server = crate::get_best_server(&cservers)
|
||||||
|
.await
|
||||||
|
.unwrap_or(String::new());
|
||||||
|
to_c_str(best_server)
|
||||||
|
}
|
||||||
|
|
27
src/chain.rs
27
src/chain.rs
|
@ -5,13 +5,17 @@ use crate::lw_rpc::compact_tx_streamer_client::CompactTxStreamerClient;
|
||||||
use crate::lw_rpc::*;
|
use crate::lw_rpc::*;
|
||||||
use crate::scan::{Blocks, MAX_OUTPUTS_PER_CHUNK};
|
use crate::scan::{Blocks, MAX_OUTPUTS_PER_CHUNK};
|
||||||
use ff::PrimeField;
|
use ff::PrimeField;
|
||||||
|
use futures::{future, FutureExt};
|
||||||
use log::info;
|
use log::info;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
use std::time::Duration;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use tokio::sync::mpsc::Sender;
|
use tokio::sync::mpsc::Sender;
|
||||||
|
use tokio::time::timeout;
|
||||||
|
use tokio_stream::StreamExt;
|
||||||
use tonic::transport::{Certificate, Channel, ClientTlsConfig};
|
use tonic::transport::{Certificate, Channel, ClientTlsConfig};
|
||||||
use tonic::Request;
|
use tonic::Request;
|
||||||
use zcash_note_encryption::batch::try_compact_note_decryption;
|
use zcash_note_encryption::batch::try_compact_note_decryption;
|
||||||
|
@ -477,6 +481,29 @@ pub async fn connect_lightwalletd(url: &str) -> anyhow::Result<CompactTxStreamer
|
||||||
Ok(client)
|
Ok(client)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn get_height(server: String) -> Option<(String, u32)> {
|
||||||
|
let mut client = connect_lightwalletd(&server).await.ok()?;
|
||||||
|
let height = get_latest_height(&mut client).await.ok()?;
|
||||||
|
log::info!("{} {}", server, height);
|
||||||
|
Some((server, height))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn get_best_server(servers: &[String]) -> Option<String> {
|
||||||
|
let mut server_heights = vec![];
|
||||||
|
for s in servers.iter() {
|
||||||
|
let server_height =
|
||||||
|
tokio::spawn(timeout(Duration::from_secs(1), get_height(s.to_string()))).boxed();
|
||||||
|
server_heights.push(server_height);
|
||||||
|
}
|
||||||
|
let server_heights = future::try_join_all(server_heights).await.ok()?;
|
||||||
|
let best_server = server_heights
|
||||||
|
.into_iter()
|
||||||
|
.filter_map(|h| h.unwrap_or(None))
|
||||||
|
.max_by_key(|(_, h)| *h)
|
||||||
|
.map(|x| x.0);
|
||||||
|
best_server
|
||||||
|
}
|
||||||
|
|
||||||
// pub async fn sync(
|
// pub async fn sync(
|
||||||
// network: &Network,
|
// network: &Network,
|
||||||
// vks: HashMap<u32, AccountViewKey>,
|
// vks: HashMap<u32, AccountViewKey>,
|
||||||
|
|
|
@ -62,8 +62,8 @@ pub fn hex_to_hash(hex: &str) -> anyhow::Result<[u8; 32]> {
|
||||||
|
|
||||||
pub use crate::builder::advance_tree;
|
pub use crate::builder::advance_tree;
|
||||||
pub use crate::chain::{
|
pub use crate::chain::{
|
||||||
calculate_tree_state_v2, connect_lightwalletd, download_chain, get_latest_height, ChainError,
|
calculate_tree_state_v2, connect_lightwalletd, download_chain, get_best_server,
|
||||||
DecryptNode,
|
get_latest_height, ChainError, DecryptNode,
|
||||||
};
|
};
|
||||||
pub use crate::coinconfig::{
|
pub use crate::coinconfig::{
|
||||||
init_coin, set_active, set_active_account, set_coin_lwd_url, CoinConfig,
|
init_coin, set_active, set_active_account, set_coin_lwd_url, CoinConfig,
|
||||||
|
|
|
@ -11,7 +11,7 @@ use std::collections::HashMap;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use warp_api_ffi::api::payment::{Recipient, RecipientMemo};
|
use warp_api_ffi::api::payment::{Recipient, RecipientMemo};
|
||||||
use warp_api_ffi::api::payment_uri::PaymentURI;
|
use warp_api_ffi::api::payment_uri::PaymentURI;
|
||||||
use warp_api_ffi::{AccountRec, CoinConfig, RaptorQDrops, Tx, TxRec};
|
use warp_api_ffi::{get_best_server, AccountRec, CoinConfig, RaptorQDrops, Tx, TxRec};
|
||||||
|
|
||||||
#[derive(Debug, Error)]
|
#[derive(Debug, Error)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
|
@ -49,6 +49,15 @@ async fn main() -> anyhow::Result<()> {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
let _ = dotenv::dotenv();
|
let _ = dotenv::dotenv();
|
||||||
|
|
||||||
|
let server = get_best_server(&[
|
||||||
|
"https://lwdv3.zecwallet.co:443".to_string(),
|
||||||
|
"https://zuul.free2z.cash:9067".to_string(),
|
||||||
|
"https://mainnet.lightwalletd.com:9067".to_string(),
|
||||||
|
])
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
log::info!("Best server = {}", server);
|
||||||
|
|
||||||
let rocket = rocket::build();
|
let rocket = rocket::build();
|
||||||
let figment = rocket.figment();
|
let figment = rocket.figment();
|
||||||
let zec: HashMap<String, String> = figment.extract_inner("zec")?;
|
let zec: HashMap<String, String> = figment.extract_inner("zec")?;
|
||||||
|
|
17
src/scan.rs
17
src/scan.rs
|
@ -59,14 +59,7 @@ pub async fn scan_all(network: &Network, fvks: &[ExtendedFullViewingKey]) -> any
|
||||||
});
|
});
|
||||||
|
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
download_chain(
|
download_chain(&mut client, start_height, end_height, None, blocks_tx).await?;
|
||||||
&mut client,
|
|
||||||
start_height,
|
|
||||||
end_height,
|
|
||||||
None,
|
|
||||||
blocks_tx,
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
info!("Download chain: {} ms", start.elapsed().as_millis());
|
info!("Download chain: {} ms", start.elapsed().as_millis());
|
||||||
|
|
||||||
info!("Total: {} ms", total_start.elapsed().as_millis());
|
info!("Total: {} ms", total_start.elapsed().as_millis());
|
||||||
|
@ -326,7 +319,13 @@ pub async fn sync_async(
|
||||||
for w in witnesses.iter() {
|
for w in witnesses.iter() {
|
||||||
DbAdapter::store_witnesses(&db_transaction, w, height, w.id_note)?;
|
DbAdapter::store_witnesses(&db_transaction, w, height, w.id_note)?;
|
||||||
}
|
}
|
||||||
DbAdapter::store_block(&mut db_transaction, height, &block.hash, block.time, &tree)?;
|
DbAdapter::store_block(
|
||||||
|
&mut db_transaction,
|
||||||
|
height,
|
||||||
|
&block.hash,
|
||||||
|
block.time,
|
||||||
|
&tree,
|
||||||
|
)?;
|
||||||
db_transaction.commit()?;
|
db_transaction.commit()?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue