merged manually

This commit is contained in:
DenioD
2019-10-23 14:56:33 +02:00
9 changed files with 522 additions and 38 deletions

View File

@@ -3,7 +3,7 @@ use crate::lightwallet::LightWallet;
use log::{info, warn, error};
use rand::{rngs::OsRng, seq::SliceRandom};
use std::sync::{Arc, RwLock};
use std::sync::{Arc, RwLock, Mutex};
use std::sync::atomic::{AtomicU64, AtomicI32, AtomicUsize, Ordering};
use std::path::{Path, PathBuf};
use std::fs::File;
@@ -25,6 +25,8 @@ use crate::grpcconnector::{self, *};
use crate::SaplingParams;
use crate::ANCHOR_OFFSET;
mod checkpoints;
pub const DEFAULT_SERVER: &str = "https://";
pub const WALLET_NAME: &str = "silentdragonlite-cli-wallet.dat";
pub const LOGFILE_NAME: &str = "silentdragonlite-cli-wallet.debug.log";
@@ -117,18 +119,8 @@ impl LightClientConfig {
log_path.into_boxed_path()
}
pub fn get_initial_state(&self) -> Option<(u64, &str, &str)> {
match &self.chain_name[..] {
"test" => Some((105942,
"00000001c0199f329ee03379bf1387856dbab23765da508bf9b9d8d544f212c0",
""
)),
"main" => Some((105944,
"0000000313b0ec7c5a1e9b997ce44a7763b56c5505526c36634a004ed52d7787",
""
)),
_ => None
}
pub fn get_initial_state(&self, height: u64) -> Option<(u64, &str, &str)> {
checkpoints::get_closest_checkpoint(&self.chain_name, height)
}
pub fn get_server_or_default(server: Option<String>) -> http::Uri {
@@ -209,14 +201,16 @@ pub struct LightClient {
// zcash-params
pub sapling_output : Vec<u8>,
pub sapling_spend : Vec<u8>,
sync_lock : Mutex<()>,
}
impl LightClient {
pub fn set_wallet_initial_state(&self) {
pub fn set_wallet_initial_state(&self, height: u64) {
use std::convert::TryInto;
let state = self.config.get_initial_state();
let state = self.config.get_initial_state(height);
match state {
Some((height, hash, tree)) => self.wallet.read().unwrap().set_initial_block(height.try_into().unwrap(), hash, tree),
@@ -239,10 +233,11 @@ impl LightClient {
wallet : Arc::new(RwLock::new(LightWallet::new(Some(seed_phrase), &config, 0)?)),
config : config.clone(),
sapling_output : vec![],
sapling_spend : vec![]
sapling_spend : vec![],
sync_lock : Mutex::new(()),
};
l.set_wallet_initial_state();
l.set_wallet_initial_state(0);
l.read_sapling_params();
info!("Created new wallet!");
@@ -263,10 +258,11 @@ impl LightClient {
wallet : Arc::new(RwLock::new(LightWallet::new(None, config, latest_block)?)),
config : config.clone(),
sapling_output : vec![],
sapling_spend : vec![]
sapling_spend : vec![],
sync_lock : Mutex::new(()),
};
l.set_wallet_initial_state();
l.set_wallet_initial_state(latest_block);
l.read_sapling_params();
info!("Created new wallet with a new seed!");
@@ -275,20 +271,22 @@ impl LightClient {
Ok(l)
}
pub fn new_from_phrase(seed_phrase: String, config: &LightClientConfig, latest_block: u64) -> io::Result<Self> {
pub fn new_from_phrase(seed_phrase: String, config: &LightClientConfig, birthday: u64) -> io::Result<Self> {
if config.wallet_exists() {
return Err(Error::new(ErrorKind::AlreadyExists,
"Cannot create a new wallet from seed, because a wallet already exists"));
}
let mut l = LightClient {
wallet : Arc::new(RwLock::new(LightWallet::new(Some(seed_phrase), config, latest_block)?)),
wallet : Arc::new(RwLock::new(LightWallet::new(Some(seed_phrase), config, birthday)?)),
config : config.clone(),
sapling_output : vec![],
sapling_spend : vec![]
sapling_spend : vec![],
sync_lock : Mutex::new(()),
};
l.set_wallet_initial_state();
println!("Setting birthday to {}", birthday);
l.set_wallet_initial_state(birthday);
l.read_sapling_params();
info!("Created new wallet!");
@@ -310,7 +308,8 @@ impl LightClient {
wallet : Arc::new(RwLock::new(wallet)),
config : config.clone(),
sapling_output : vec![],
sapling_spend : vec![]
sapling_spend : vec![],
sync_lock : Mutex::new(()),
};
lc.read_sapling_params();
@@ -727,7 +726,7 @@ impl LightClient {
self.wallet.read().unwrap().clear_blocks();
// Then set the initial block
self.set_wallet_initial_state();
self.set_wallet_initial_state(self.wallet.read().unwrap().get_birthday());
// Then, do a sync, which will force a full rescan from the initial state
let response = self.do_sync(true);
@@ -737,6 +736,10 @@ impl LightClient {
}
pub fn do_sync(&self, print_updates: bool) -> String {
// We can only do one sync at a time because we sync blocks in serial order
// If we allow multiple syncs, they'll all get jumbled up.
let _lock = self.sync_lock.lock().unwrap();
// Sync is 3 parts
// 1. Get the latest block
// 2. Get all the blocks that we don't have