[wip] update to lastest librustzcash code

This commit is contained in:
Francisco Gindre 2021-01-21 13:11:42 -03:00
parent a0766f1ffa
commit 548d2ec4a8
1 changed files with 31 additions and 42 deletions

View File

@ -23,13 +23,17 @@ use zcash_client_backend::{
wallet::OvkPolicy, wallet::OvkPolicy,
}; };
use zcash_client_sqlite::{ use zcash_client_sqlite::{
wallet::init::{init_accounts_table, init_blocks_table, init_data_database}, wallet::{
init::{init_accounts_table, init_blocks_table, init_wallet_db},
get_balance,
get_balance_at,
},
BlockDB, NoteId, WalletDB, BlockDB, NoteId, WalletDB,
wallet::{UnspentTransactionOutput, get_utxos}, chain::{UnspentTransactionOutput, get_all_utxos, get_confirmed_utxos_for_address}
}; };
use zcash_primitives::{ use zcash_primitives::{
block::BlockHash, block::BlockHash,
consensus::{BlockHeight, BranchId, Parameters}, consensus::{self,BlockHeight, BranchId, Parameters},
note_encryption::Memo, note_encryption::Memo,
transaction::components::{ transaction::components::{
amount::DEFAULT_FEE, amount::DEFAULT_FEE,
@ -92,13 +96,13 @@ pub const NETWORK: MainNetwork = MAIN_NETWORK;
pub const NETWORK: TestNetwork = TEST_NETWORK; pub const NETWORK: TestNetwork = TEST_NETWORK;
fn wallet_db(db_data: *const u8, fn wallet_db<P: consensus::Parameters>(params: &P,db_data: *const u8,
db_data_len: usize) -> Result<WalletDB, failure::Error> { db_data_len: usize) -> Result<WalletDB<P>, failure::Error> {
let db_data = Path::new(OsStr::from_bytes(unsafe { let db_data = Path::new(OsStr::from_bytes(unsafe {
slice::from_raw_parts(db_data, db_data_len) slice::from_raw_parts(db_data, db_data_len)
})); }));
WalletDB::for_path(db_data) WalletDB::for_path(db_data, *params)
.map_err(|e| format_err!("Error opening wallet database connection: {}", e)) .map_err(|e| format_err!("Error opening wallet database connection: {}", e))
} }
@ -139,8 +143,8 @@ pub extern "C" fn zcashlc_init_data_database(db_data: *const u8, db_data_len: us
slice::from_raw_parts(db_data, db_data_len) slice::from_raw_parts(db_data, db_data_len)
})); }));
WalletDB::for_path(db_data) WalletDB::for_path(db_data, NETWORK)
.map(|db| init_data_database(&db)) .map(|db| init_wallet_db(&db))
.map(|_| 1) .map(|_| 1)
.map_err(|e| format_err!("Error while initializing data DB: {}", e)) .map_err(|e| format_err!("Error while initializing data DB: {}", e))
}); });
@ -163,7 +167,7 @@ pub extern "C" fn zcashlc_init_accounts_table(
capacity_ret: *mut usize, capacity_ret: *mut usize,
) -> *mut *mut c_char { ) -> *mut *mut c_char {
let res = catch_panic(|| { let res = catch_panic(|| {
let db_data = wallet_db(db_data, db_data_len)?; let db_data = wallet_db(&NETWORK, db_data, db_data_len)?;
let seed = unsafe { slice::from_raw_parts(seed, seed_len) }; let seed = unsafe { slice::from_raw_parts(seed, seed_len) };
let accounts = if accounts >= 0 { let accounts = if accounts >= 0 {
accounts as u32 accounts as u32
@ -176,7 +180,7 @@ pub extern "C" fn zcashlc_init_accounts_table(
.collect(); .collect();
let extfvks: Vec<_> = extsks.iter().map(ExtendedFullViewingKey::from).collect(); let extfvks: Vec<_> = extsks.iter().map(ExtendedFullViewingKey::from).collect();
init_accounts_table(&db_data, &NETWORK, &extfvks) init_accounts_table(&db_data, &extfvks)
.map(|_| { .map(|_| {
// Return the ExtendedSpendingKeys for the created accounts. // Return the ExtendedSpendingKeys for the created accounts.
let mut v: Vec<_> = extsks let mut v: Vec<_> = extsks
@ -209,7 +213,7 @@ pub extern "C" fn zcashlc_init_accounts_table_with_keys(
extfvks_len: usize, extfvks_len: usize,
) -> bool { ) -> bool {
let res = catch_panic(|| { let res = catch_panic(|| {
let db_data = wallet_db(db_data, db_data_len)?; let db_data = wallet_db(&NETWORK, db_data, db_data_len)?;
let extfvks = unsafe { std::slice::from_raw_parts(extfvks, extfvks_len) let extfvks = unsafe { std::slice::from_raw_parts(extfvks, extfvks_len)
.into_iter() .into_iter()
@ -220,7 +224,7 @@ pub extern "C" fn zcashlc_init_accounts_table_with_keys(
.unwrap() .unwrap()
).collect::<Vec<_>>() }; ).collect::<Vec<_>>() };
match init_accounts_table(&db_data, &NETWORK, &extfvks) { match init_accounts_table(&db_data, &extfvks) {
Ok(()) => Ok(true), Ok(()) => Ok(true),
Err(e) => Err(format_err!("Error while initializing accounts: {}", e)), Err(e) => Err(format_err!("Error while initializing accounts: {}", e)),
} }
@ -418,7 +422,7 @@ pub extern "C" fn zcashlc_init_blocks_table(
sapling_tree_hex: *const c_char, sapling_tree_hex: *const c_char,
) -> i32 { ) -> i32 {
let res = catch_panic(|| { let res = catch_panic(|| {
let db_data = wallet_db(db_data, db_data_len)?; let db_data = wallet_db(&NETWORK, db_data, db_data_len)?;
let hash = { let hash = {
let mut hash = hex::decode(unsafe { CStr::from_ptr(hash_hex) }.to_str()?).unwrap(); let mut hash = hex::decode(unsafe { CStr::from_ptr(hash_hex) }.to_str()?).unwrap();
hash.reverse(); hash.reverse();
@ -445,7 +449,7 @@ pub extern "C" fn zcashlc_get_address(
account: i32, account: i32,
) -> *mut c_char { ) -> *mut c_char {
let res = catch_panic(|| { let res = catch_panic(|| {
let db_data = wallet_db(db_data, db_data_len)?; let db_data = wallet_db(&NETWORK, db_data, db_data_len)?;
let account = if account >= 0 { let account = if account >= 0 {
account as u32 account as u32
} else { } else {
@ -454,7 +458,7 @@ pub extern "C" fn zcashlc_get_address(
let account = AccountId(account); let account = AccountId(account);
match (&db_data).get_address(&NETWORK, account) { match (&db_data).get_address(account) {
Ok(Some(addr)) => { Ok(Some(addr)) => {
let addr_str = encode_payment_address(NETWORK.hrp_sapling_payment_address(), &addr); let addr_str = encode_payment_address(NETWORK.hrp_sapling_payment_address(), &addr);
let c_str_addr = CString::new(addr_str).unwrap(); let c_str_addr = CString::new(addr_str).unwrap();
@ -532,7 +536,7 @@ fn is_valid_transparent_address(address: &str) -> bool {
#[no_mangle] #[no_mangle]
pub extern "C" fn zcashlc_get_balance(db_data: *const u8, db_data_len: usize, account: i32) -> i64 { pub extern "C" fn zcashlc_get_balance(db_data: *const u8, db_data_len: usize, account: i32) -> i64 {
let res = catch_panic(|| { let res = catch_panic(|| {
let db_data = wallet_db(db_data, db_data_len)?; let db_data = wallet_db(&NETWORK, db_data, db_data_len)?;
let account = if account >= 0 { let account = if account >= 0 {
account as u32 account as u32
@ -557,7 +561,7 @@ pub extern "C" fn zcashlc_get_verified_balance(
account: i32, account: i32,
) -> i64 { ) -> i64 {
let res = catch_panic(|| { let res = catch_panic(|| {
let db_data = wallet_db(db_data, db_data_len)?; let db_data = wallet_db(&NETWORK, db_data, db_data_len)?;
let account = if account >= 0 { let account = if account >= 0 {
account as u32 account as u32
} else { } else {
@ -574,7 +578,7 @@ pub extern "C" fn zcashlc_get_verified_balance(
}) })
.and_then(|anchor| { .and_then(|anchor| {
(&db_data) (&db_data)
.get_verified_balance(account, anchor) .get_balance_at(account, anchor)
.map_err(|e| format_err!("Error while fetching verified balance: {}", e)) .map_err(|e| format_err!("Error while fetching verified balance: {}", e))
}) })
.map(|amount| amount.into()) .map(|amount| amount.into())
@ -1046,9 +1050,9 @@ pub fn double_sha256(payload: &[u8]) -> Vec<u8> {
/// ///
/// ///
fn shield_funds( fn shield_funds<P: consensus::Parameters>(
db_cache: &BlockDB, db_cache: &BlockDB,
db_data: &WalletDB, db_data: &WalletDB<P>,
account: u32, account: u32,
tsk: &str, tsk: &str,
extsk: &str, extsk: &str,
@ -1066,7 +1070,6 @@ fn shield_funds(
}, },
}; };
// grab secret private key for t-funds // grab secret private key for t-funds
let sk = match secp256k1::key::SecretKey::from_str(&tsk) { let sk = match secp256k1::key::SecretKey::from_str(&tsk) {
Ok(sk) => sk, Ok(sk) => sk,
@ -1085,7 +1088,6 @@ fn shield_funds(
}, },
}; };
let extsk = let extsk =
match decode_extended_spending_key(NETWORK.hrp_sapling_extended_spending_key(), &extsk) match decode_extended_spending_key(NETWORK.hrp_sapling_extended_spending_key(), &extsk)
{ {
@ -1112,30 +1114,18 @@ fn shield_funds(
} }
}; };
// get latest height and anchor
let latest_scanned_height = anchor_and_height.1;
let latest_anchor = anchor_and_height.0;
// get UTXOs from DB // get UTXOs from DB
let utxos = match get_utxos(&NETWORK, &db_cache) { let utxos = match get_confirmed_utxos_for_address(&NETWORK, &db_cache, latest_anchor, &t_addr_str) {
Ok(u) => u, Ok(u) => u,
Err(e) => { Err(e) => {
return Err(format_err!("Error getting UTXOs {}",e)); return Err(format_err!("Error getting UTXOs {}",e));
}, },
}; };
// verify that the addresses of the UTXOs are correspond to the given t-address
let distinct_addresses: Vec<&UnspentTransactionOutput> = utxos.iter().filter(|utxo| utxo.address != t_addr).collect::<Vec<_>>();
if distinct_addresses.len() > 0 {
return Err(format_err!("one or more UTXOs correspond to other addresses that don't match the provided SecretKey"));
}
// check that the utxos are confirmed
let latest_scanned_height = anchor_and_height.1;
let latest_anchor = anchor_and_height.0;
let unconfirmed_funds: Vec<BlockHeight> = utxos.iter().map(|u| u.height).filter(|h| h > &latest_anchor).collect();
if unconfirmed_funds.len() > 0 {
return Err(format_err!("one or more UTXOs are unconfirmed "));
}
let total_amount = match Amount::from_i64(utxos.iter().map(|u| i64::from(u.value)).sum::<i64>()) { let total_amount = match Amount::from_i64(utxos.iter().map(|u| i64::from(u.value)).sum::<i64>()) {
Ok(a) => a, Ok(a) => a,
@ -1229,7 +1219,6 @@ fn shield_funds(
} }
up.insert_sent_note( up.insert_sent_note(
&NETWORK,
tx_ref, tx_ref,
output_index as usize, output_index as usize,
AccountId(account), AccountId(account),
@ -1260,7 +1249,7 @@ pub extern "C" fn zcashlc_shield_funds(
) -> i64 { ) -> i64 {
let res = catch_panic(|| { let res = catch_panic(|| {
let db_data = wallet_db(db_data, db_data_len)?; let db_data = wallet_db::<NETWORK>(db_data, db_data_len)?;
let db_cache = block_db(db_cache, db_cache_len)?; let db_cache = block_db(db_cache, db_cache_len)?;
let account = if account >= 0 { let account = if account >= 0 {
account as u32 account as u32