Added ability to start a Synchronizer with just a viewing key.

This was a long awaited request from wallet partners who already have keys available when the wallet launches.
This commit is contained in:
Kevin Gorham 2020-09-11 03:23:08 -04:00
parent 3e6355b0c7
commit 94c8a18be7
No known key found for this signature in database
GPG Key ID: CCA55602DF49FC38
3 changed files with 30 additions and 7 deletions

View File

@ -61,8 +61,8 @@ class RustBackend : RustBackendWelding {
override fun initDataDb() = initDataDb(pathDataDb)
// override fun initAccountsTable(extfvks: Array<String>) =
// initAccountsTableWithKeys(dbDataPath, extfvks)
override fun initAccountsTable(vararg extfvks: String) =
initAccountsTableWithKeys(pathDataDb, extfvks)
override fun initAccountsTable(
seed: ByteArray,
@ -207,10 +207,10 @@ class RustBackend : RustBackendWelding {
accounts: Int
): Array<String>
// @JvmStatic private external fun initAccountsTableWithKeys(
// dbDataPath: String,
// extfvk: Array<String>
// )
@JvmStatic private external fun initAccountsTableWithKeys(
dbDataPath: String,
extfvk: Array<out String>
): Boolean
@JvmStatic private external fun initBlocksTable(
dbDataPath: String,

View File

@ -35,7 +35,7 @@ interface RustBackendWelding {
fun initAccountsTable(seed: ByteArray, numberOfAccounts: Int): Array<String>
// fun initAccountsTable(extfvks: Array<ByteArray>, numberOfAccounts: Int)
fun initAccountsTable(vararg extfvks: String): Boolean
fun initBlocksTable(height: Int, hash: String, time: Long, saplingTree: String): Boolean

View File

@ -172,6 +172,29 @@ pub unsafe extern "C" fn Java_cash_z_ecc_android_sdk_jni_RustBackend_initAccount
#[no_mangle]
pub unsafe extern "C" fn Java_cash_z_ecc_android_sdk_jni_RustBackend_deriveExtendedSpendingKeys(
pub unsafe extern "C" fn Java_cash_z_ecc_android_sdk_jni_RustBackend_initAccountsTableWithKeys(
env: JNIEnv<'_>,
_: JClass<'_>,
db_data: JString<'_>,
extfvks_arr: jobjectArray,
) -> jboolean {
let res = panic::catch_unwind(|| {
let db_data = utils::java_string_to_rust(&env, db_data);
// TODO: avoid all this unwrapping and also surface erros, better
let count = env.get_array_length(extfvks_arr).unwrap();
let extfvks = (0..count)
.map(|i| env.get_object_array_element(extfvks_arr, i))
.map(|jstr| utils::java_string_to_rust(&env, jstr.unwrap().into()))
.map(|vkstr| decode_extended_full_viewing_key(HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, &vkstr).unwrap().unwrap())
.collect::<Vec<_>>();
match init_accounts_table(&db_data, &extfvks) {
Ok(()) => Ok(JNI_TRUE),
Err(e) => Err(format_err!("Error while initializing accounts: {}", e)),
}
});
unwrap_exc_or(&env, res, JNI_FALSE)
}
env: JNIEnv<'_>,
_: JClass<'_>,
seed: jbyteArray,