From 94c8a18be7a161318b1b817c4be8a0aa6e8031d1 Mon Sep 17 00:00:00 2001 From: Kevin Gorham Date: Fri, 11 Sep 2020 03:23:08 -0400 Subject: [PATCH] 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. --- .../cash/z/ecc/android/sdk/jni/RustBackend.kt | 12 +++++----- .../ecc/android/sdk/jni/RustBackendWelding.kt | 2 +- src/main/rust/lib.rs | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/main/java/cash/z/ecc/android/sdk/jni/RustBackend.kt b/src/main/java/cash/z/ecc/android/sdk/jni/RustBackend.kt index 17d1af96..1160286a 100644 --- a/src/main/java/cash/z/ecc/android/sdk/jni/RustBackend.kt +++ b/src/main/java/cash/z/ecc/android/sdk/jni/RustBackend.kt @@ -61,8 +61,8 @@ class RustBackend : RustBackendWelding { override fun initDataDb() = initDataDb(pathDataDb) -// override fun initAccountsTable(extfvks: Array) = -// 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 -// @JvmStatic private external fun initAccountsTableWithKeys( -// dbDataPath: String, -// extfvk: Array -// ) + @JvmStatic private external fun initAccountsTableWithKeys( + dbDataPath: String, + extfvk: Array + ): Boolean @JvmStatic private external fun initBlocksTable( dbDataPath: String, diff --git a/src/main/java/cash/z/ecc/android/sdk/jni/RustBackendWelding.kt b/src/main/java/cash/z/ecc/android/sdk/jni/RustBackendWelding.kt index c715cceb..2bfc7f8e 100644 --- a/src/main/java/cash/z/ecc/android/sdk/jni/RustBackendWelding.kt +++ b/src/main/java/cash/z/ecc/android/sdk/jni/RustBackendWelding.kt @@ -35,7 +35,7 @@ interface RustBackendWelding { fun initAccountsTable(seed: ByteArray, numberOfAccounts: Int): Array -// fun initAccountsTable(extfvks: Array, numberOfAccounts: Int) + fun initAccountsTable(vararg extfvks: String): Boolean fun initBlocksTable(height: Int, hash: String, time: Long, saplingTree: String): Boolean diff --git a/src/main/rust/lib.rs b/src/main/rust/lib.rs index e780767a..08eae78d 100644 --- a/src/main/rust/lib.rs +++ b/src/main/rust/lib.rs @@ -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::>(); + + 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,