forked from axiom-team/gecko
perf(dubp): optimize changeDewifPin & genWalletFromMnemonic
This commit is contained in:
parent
b288b601ce
commit
63dd4ee59b
|
@ -38,8 +38,8 @@ pub(super) fn change_pin(
|
|||
currency: &str,
|
||||
dewif: &str,
|
||||
old_pin: &str,
|
||||
new_pin: &str,
|
||||
) -> Result<String, DubpError> {
|
||||
member_wallet: bool,
|
||||
) -> Result<Vec<String>, DubpError> {
|
||||
let currency = parse_currency(currency)?;
|
||||
let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
|
||||
ExpectedCurrency::Specific(currency),
|
||||
|
@ -48,9 +48,15 @@ pub(super) fn change_pin(
|
|||
)
|
||||
.map_err(DubpError::DewifReadError)?;
|
||||
if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() {
|
||||
Ok(dup_crypto::dewif::write_dewif_v1_content(
|
||||
currency, &keypair, new_pin,
|
||||
))
|
||||
let new_pin = if member_wallet {
|
||||
gen_pin10()?
|
||||
} else {
|
||||
gen_pin6()?
|
||||
};
|
||||
|
||||
let dewif = dup_crypto::dewif::write_dewif_v1_content(currency, &keypair, &new_pin);
|
||||
let pubkey = keypair.public_key().to_base58();
|
||||
Ok(vec![dewif, new_pin, pubkey])
|
||||
} else {
|
||||
Err(DubpError::DewifReadError(DewifReadError::CorruptedContent))
|
||||
}
|
||||
|
@ -60,20 +66,25 @@ pub(super) fn gen_dewif(
|
|||
currency: &str,
|
||||
language: u32,
|
||||
mnemonic: &str,
|
||||
pin: &str,
|
||||
) -> Result<String, DubpError> {
|
||||
member_wallet: bool,
|
||||
) -> Result<Vec<String>, DubpError> {
|
||||
let currency = parse_currency(currency)?;
|
||||
let mnemonic = Mnemonic::from_phrase(mnemonic, u32_to_language(language)?)
|
||||
.map_err(|_| DubpError::WrongLanguage)?;
|
||||
let seed = dup_crypto::mnemonic::mnemonic_to_seed(&mnemonic);
|
||||
let keypair = KeyPairFromSeed32Generator::generate(seed);
|
||||
Ok(dup_crypto::dewif::write_dewif_v1_content(
|
||||
currency, &keypair, pin,
|
||||
))
|
||||
|
||||
let pin = if member_wallet {
|
||||
gen_pin10()?
|
||||
} else {
|
||||
gen_pin6()?
|
||||
};
|
||||
let dewif = dup_crypto::dewif::write_dewif_v1_content(currency, &keypair, &pin);
|
||||
let pubkey = keypair.public_key().to_base58();
|
||||
Ok(vec![dewif, pin, pubkey])
|
||||
}
|
||||
|
||||
pub(super) fn get_pubkey(currency: &str, dewif: &str, pin: &str) -> Result<String, DubpError> {
|
||||
let currency = parse_currency(currency)?;
|
||||
pub(super) fn get_pubkey(currency: Currency, dewif: &str, pin: &str) -> Result<String, DubpError> {
|
||||
let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
|
||||
ExpectedCurrency::Specific(currency),
|
||||
dewif,
|
||||
|
@ -126,15 +137,6 @@ pub(super) fn sign_several(
|
|||
}
|
||||
}
|
||||
|
||||
fn parse_currency(currency: &str) -> Result<Currency, DubpError> {
|
||||
let currency_code = match currency {
|
||||
"g1" => G1_CURRENCY,
|
||||
"g1-test" | "gt" => G1_TEST_CURRENCY,
|
||||
_ => return Err(DubpError::UnknownCurrencyName),
|
||||
};
|
||||
Ok(Currency::from(currency_code))
|
||||
}
|
||||
|
||||
fn gen_pin2_inner(mut i: u32, pin: &mut String) {
|
||||
for _ in 0..2 {
|
||||
pin.push(to_char(i));
|
||||
|
|
|
@ -59,6 +59,15 @@ fn char_ptr_prt_to_vec_str<'a>(
|
|||
Ok(str_vec)
|
||||
}
|
||||
|
||||
pub(crate) fn parse_currency(currency: &str) -> Result<Currency, DubpError> {
|
||||
let currency_code = match currency {
|
||||
"g1" => G1_CURRENCY,
|
||||
"g1-test" | "gt" => G1_TEST_CURRENCY,
|
||||
_ => return Err(DubpError::UnknownCurrencyName),
|
||||
};
|
||||
Ok(Currency::from(currency_code))
|
||||
}
|
||||
|
||||
fn u32_to_language(i: u32) -> Result<Language, DubpError> {
|
||||
match i {
|
||||
0 => Ok(Language::English),
|
||||
|
@ -73,7 +82,7 @@ pub extern "C" fn change_dewif_pin(
|
|||
currency: *const raw::c_char,
|
||||
dewif: *const raw::c_char,
|
||||
old_pin: *const raw::c_char,
|
||||
new_pin: *const raw::c_char,
|
||||
member_wallet: u32,
|
||||
) {
|
||||
exec_async(
|
||||
port,
|
||||
|
@ -81,10 +90,12 @@ pub extern "C" fn change_dewif_pin(
|
|||
let currency = char_ptr_to_str(currency)?;
|
||||
let dewif = char_ptr_to_str(dewif)?;
|
||||
let old_pin = char_ptr_to_str(old_pin)?;
|
||||
let new_pin = char_ptr_to_str(new_pin)?;
|
||||
Ok((currency, dewif, old_pin, new_pin))
|
||||
let member_wallet = member_wallet != 0;
|
||||
Ok((currency, dewif, old_pin, member_wallet))
|
||||
},
|
||||
|(currency, dewif, old_pin, member_wallet)| {
|
||||
dewif::change_pin(currency, dewif, old_pin, member_wallet)
|
||||
},
|
||||
|(currency, dewif, old_pin, new_pin)| dewif::change_pin(currency, dewif, old_pin, new_pin),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -94,17 +105,19 @@ pub extern "C" fn gen_dewif(
|
|||
currency: *const raw::c_char,
|
||||
language: u32,
|
||||
mnemonic: *const raw::c_char,
|
||||
pin: *const raw::c_char,
|
||||
member_wallet: u32,
|
||||
) {
|
||||
exec_async(
|
||||
port,
|
||||
|| {
|
||||
let currency = char_ptr_to_str(currency)?;
|
||||
let mnemonic = char_ptr_to_str(mnemonic)?;
|
||||
let pin = char_ptr_to_str(pin)?;
|
||||
Ok((currency, language, mnemonic, pin))
|
||||
let member_wallet = member_wallet != 0;
|
||||
Ok((currency, language, mnemonic, member_wallet))
|
||||
},
|
||||
|(currency, language, mnemonic, member_wallet)| {
|
||||
dewif::gen_dewif(currency, language, mnemonic, member_wallet)
|
||||
},
|
||||
|(currency, language, mnemonic, pin)| dewif::gen_dewif(currency, language, mnemonic, pin),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -138,7 +151,7 @@ pub extern "C" fn get_dewif_pubkey(
|
|||
exec_async(
|
||||
port,
|
||||
|| {
|
||||
let currency = char_ptr_to_str(currency)?;
|
||||
let currency = parse_currency(char_ptr_to_str(currency)?)?;
|
||||
let dewif = char_ptr_to_str(dewif)?;
|
||||
let pin = char_ptr_to_str(pin)?;
|
||||
Ok((currency, dewif, pin))
|
||||
|
|
|
@ -63,70 +63,25 @@ class DubpRust {
|
|||
return completer.future;
|
||||
}
|
||||
|
||||
static Future<String> _genPin(PinLength pinLength) {
|
||||
final completer = Completer<String>();
|
||||
final sendPort =
|
||||
singleCompletePort<String, String>(completer, callback: _handleErr);
|
||||
switch (pinLength) {
|
||||
case PinLength.ten:
|
||||
native.gen_pin10(
|
||||
sendPort.nativePort,
|
||||
);
|
||||
break;
|
||||
case PinLength.eight:
|
||||
native.gen_pin8(
|
||||
sendPort.nativePort,
|
||||
);
|
||||
break;
|
||||
case PinLength.six:
|
||||
default:
|
||||
native.gen_pin6(
|
||||
sendPort.nativePort,
|
||||
);
|
||||
break;
|
||||
}
|
||||
return completer.future;
|
||||
}
|
||||
|
||||
/// Change the pin code that encrypts the `dewif` keypair.
|
||||
static Future<NewWallet> changeDewifPin(
|
||||
{String currency = "g1",
|
||||
String dewif,
|
||||
String oldPin,
|
||||
PinLength newPinLength = PinLength.six}) async {
|
||||
// pin
|
||||
String newPin = await _genPin(newPinLength);
|
||||
// dewif
|
||||
String newDewif;
|
||||
{
|
||||
final completer = Completer<String>();
|
||||
final sendPort =
|
||||
singleCompletePort<String, String>(completer, callback: _handleErr);
|
||||
native.change_dewif_pin(
|
||||
sendPort.nativePort,
|
||||
Utf8.toUtf8(currency),
|
||||
Utf8.toUtf8(dewif),
|
||||
Utf8.toUtf8(oldPin),
|
||||
Utf8.toUtf8(newPin),
|
||||
);
|
||||
newDewif = await completer.future;
|
||||
}
|
||||
// publicKey
|
||||
String publicKey;
|
||||
{
|
||||
final completer = Completer<String>();
|
||||
final sendPort =
|
||||
singleCompletePort<String, String>(completer, callback: _handleErr);
|
||||
native.get_dewif_pubkey(
|
||||
sendPort.nativePort,
|
||||
Utf8.toUtf8(currency),
|
||||
Utf8.toUtf8(newDewif),
|
||||
Utf8.toUtf8(newPin),
|
||||
);
|
||||
publicKey = await completer.future;
|
||||
}
|
||||
final completer = Completer<List<String>>();
|
||||
final sendPort = singleCompletePort<List<String>, List>(completer,
|
||||
callback: _handleErrList);
|
||||
native.change_dewif_pin(
|
||||
sendPort.nativePort,
|
||||
Utf8.toUtf8(currency),
|
||||
Utf8.toUtf8(dewif),
|
||||
Utf8.toUtf8(oldPin),
|
||||
0,
|
||||
);
|
||||
List<String> newWallet = await completer.future;
|
||||
|
||||
return Future.value(NewWallet._(newDewif, newPin, publicKey));
|
||||
return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
|
||||
}
|
||||
|
||||
/// Generate a wallet from a mnemonic phrase.
|
||||
|
@ -141,37 +96,19 @@ class DubpRust {
|
|||
Language language = Language.english,
|
||||
String mnemonic,
|
||||
PinLength pinLength = PinLength.six}) async {
|
||||
// pin
|
||||
String pin = await _genPin(pinLength);
|
||||
// publicKey
|
||||
String publicKey;
|
||||
{
|
||||
final completer = Completer<String>();
|
||||
final sendPort =
|
||||
singleCompletePort<String, String>(completer, callback: _handleErr);
|
||||
native.mnemonic_to_pubkey(
|
||||
sendPort.nativePort,
|
||||
language.index,
|
||||
Utf8.toUtf8(mnemonic),
|
||||
);
|
||||
publicKey = await completer.future;
|
||||
}
|
||||
// dewif
|
||||
String dewif;
|
||||
{
|
||||
final completer = Completer<String>();
|
||||
final sendPort =
|
||||
singleCompletePort<String, String>(completer, callback: _handleErr);
|
||||
native.gen_dewif(
|
||||
sendPort.nativePort,
|
||||
Utf8.toUtf8(currency),
|
||||
language.index,
|
||||
Utf8.toUtf8(mnemonic),
|
||||
Utf8.toUtf8(pin),
|
||||
);
|
||||
dewif = await completer.future;
|
||||
}
|
||||
return Future.value(NewWallet._(dewif, pin, publicKey));
|
||||
final completer = Completer<List<String>>();
|
||||
final sendPort = singleCompletePort<List<String>, List>(completer,
|
||||
callback: _handleErrList);
|
||||
native.gen_dewif(
|
||||
sendPort.nativePort,
|
||||
Utf8.toUtf8(currency),
|
||||
language.index,
|
||||
Utf8.toUtf8(mnemonic),
|
||||
0,
|
||||
);
|
||||
List<String> newWallet = await completer.future;
|
||||
|
||||
return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
|
||||
}
|
||||
|
||||
/// Get pulblic key (in base 58) of `dewif` keypair.
|
||||
|
|
Loading…
Reference in New Issue