Cleanup some flatbuffer usage

This commit is contained in:
Hanh 2023-03-01 23:09:45 +10:00
parent 12aa5328ab
commit 078af89cae
3 changed files with 38 additions and 56 deletions

View File

@ -5,7 +5,7 @@
use crate::coinconfig::CoinConfig; use crate::coinconfig::CoinConfig;
use crate::db::data_generated::fb::{ use crate::db::data_generated::fb::{
AddressBalance, AddressBalanceArgs, AddressBalanceVec, AddressBalanceVecArgs, Backup, AddressBalance, AddressBalanceArgs, AddressBalanceVec, AddressBalanceVecArgs, Backup,
BackupArgs, BackupArgs, BackupT,
}; };
use crate::db::AccountData; use crate::db::AccountData;
use crate::key2::decode_key; use crate::key2::decode_key;
@ -120,8 +120,7 @@ pub fn convert_to_watchonly(coin: u8, id_account: u32) -> anyhow::Result<()> {
Ok(()) Ok(())
} }
pub fn get_backup_package(coin: u8, id_account: u32) -> anyhow::Result<Vec<u8>> { pub fn get_backup_package(coin: u8, id_account: u32) -> anyhow::Result<BackupT> {
let mut builder = flatbuffers::FlatBufferBuilder::new();
let c = CoinConfig::get(coin); let c = CoinConfig::get(coin);
let network = c.chain.network(); let network = c.chain.network();
let db = c.db()?; let db = c.db()?;
@ -133,9 +132,6 @@ pub fn get_backup_package(coin: u8, id_account: u32) -> anyhow::Result<Vec<u8>>
aindex, aindex,
.. ..
} = db.get_account_info(id_account)?; } = db.get_account_info(id_account)?;
let name = builder.create_string(&name);
let seed = seed.map(|seed| builder.create_string(&seed));
let sk = sk.map(|sk| builder.create_string(&sk));
let orchard_keys = db.get_orchard(id_account)?; let orchard_keys = db.get_orchard(id_account)?;
let uvk = orchard_keys.map(|OrchardKeyBytes { fvk: ofvk, .. }| { let uvk = orchard_keys.map(|OrchardKeyBytes { fvk: ofvk, .. }| {
// orchard sk is not serializable and must derived from seed // orchard sk is not serializable and must derived from seed
@ -145,24 +141,17 @@ pub fn get_backup_package(coin: u8, id_account: u32) -> anyhow::Result<Vec<u8>>
let sapling_dfvk = sapling_efvk.to_diversifiable_full_viewing_key(); let sapling_dfvk = sapling_efvk.to_diversifiable_full_viewing_key();
let orchard_fvk = orchard::keys::FullViewingKey::from_bytes(&ofvk); let orchard_fvk = orchard::keys::FullViewingKey::from_bytes(&ofvk);
let ufvk = UnifiedFullViewingKey::new(Some(sapling_dfvk), orchard_fvk).unwrap(); let ufvk = UnifiedFullViewingKey::new(Some(sapling_dfvk), orchard_fvk).unwrap();
let ufvk = ufvk.encode(network); ufvk.encode(network)
builder.create_string(&ufvk)
}); });
let fvk = builder.create_string(&fvk); let backup = BackupT {
let backup = Backup::create( name: Some(name),
&mut builder, seed,
&BackupArgs { index: aindex,
name: Some(name), sk,
seed, fvk: Some(fvk),
index: aindex, uvk,
sk, };
fvk: Some(fvk), Ok(backup)
uvk,
},
);
builder.finish(backup, None);
let data = builder.finished_data().to_vec();
Ok(data)
} }
/// Update the transparent secret key for the given account from a derivation path /// Update the transparent secret key for the given account from a derivation path

View File

@ -5,6 +5,7 @@ use crate::note_selection::TransactionReport;
use crate::{ChainError, TransactionPlan, Tx}; use crate::{ChainError, TransactionPlan, Tx};
use allo_isolate::{ffi, IntoDart}; use allo_isolate::{ffi, IntoDart};
use android_logger::Config; use android_logger::Config;
use flatbuffers::FlatBufferBuilder;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use log::Level; use log::Level;
use rusqlite::Connection; use rusqlite::Connection;
@ -238,8 +239,11 @@ pub unsafe extern "C" fn convert_to_watchonly(coin: u8, id_account: u32) -> CRes
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn get_backup(coin: u8, id_account: u32) -> CResult<*const u8> { pub unsafe extern "C" fn get_backup(coin: u8, id_account: u32) -> CResult<*const u8> {
let res = || { let res = || {
let backup_bytes = crate::api::account::get_backup_package(coin, id_account)?; let mut builder = FlatBufferBuilder::new();
Ok::<_, anyhow::Error>(backup_bytes) let backup = crate::api::account::get_backup_package(coin, id_account)?;
let backup_bytes = backup.pack(&mut builder);
builder.finish(backup_bytes, None);
Ok::<_, anyhow::Error>(builder.finished_data().to_vec())
}; };
to_cresult_bytes(res()) to_cresult_bytes(res())
@ -925,8 +929,11 @@ pub unsafe extern "C" fn get_notes(coin: u8, id: u32) -> CResult<*const u8> {
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn get_txs(coin: u8, id: u32) -> CResult<*const u8> { pub unsafe extern "C" fn get_txs(coin: u8, id: u32) -> CResult<*const u8> {
let res = |connection: &Connection| { let res = |connection: &Connection| {
let data = crate::db::read::get_txs(connection, id)?; let shielded_txs = crate::db::read::get_txs(connection, id)?;
Ok(data) let mut builder = FlatBufferBuilder::new();
let shielded_txs = shielded_txs.pack(&mut builder);
builder.finish(shielded_txs, None);
Ok(builder.finished_data().to_vec())
}; };
to_cresult_bytes(with_account(coin, res)) to_cresult_bytes(with_account(coin, res))
} }

View File

@ -243,8 +243,7 @@ pub fn get_notes(connection: &Connection, id: u32) -> Result<Vec<u8>> {
Ok(data) Ok(data)
} }
pub fn get_txs(connection: &Connection, id: u32) -> Result<Vec<u8>> { pub fn get_txs(connection: &Connection, id: u32) -> Result<ShieldedTxVecT> {
let mut builder = flatbuffers::FlatBufferBuilder::new();
let mut stmt = connection.prepare( let mut stmt = connection.prepare(
"SELECT id_tx, txid, height, timestamp, t.address, c.name AS cname, a.name AS aname, value, memo FROM transactions t \ "SELECT id_tx, txid, height, timestamp, t.address, c.name AS cname, a.name AS aname, value, memo FROM transactions t \
LEFT JOIN contacts c ON t.address = c.address \ LEFT JOIN contacts c ON t.address = c.address \
@ -260,42 +259,29 @@ pub fn get_txs(connection: &Connection, id: u32) -> Result<Vec<u8>> {
let timestamp: u32 = row.get("timestamp")?; let timestamp: u32 = row.get("timestamp")?;
let contact_name: Option<String> = row.get("cname")?; let contact_name: Option<String> = row.get("cname")?;
let account_name: Option<String> = row.get("aname")?; let account_name: Option<String> = row.get("aname")?;
let name = contact_name.or(account_name).unwrap_or(String::new()); let name = contact_name.or(account_name);
let value: i64 = row.get("value")?; let value: i64 = row.get("value")?;
let address: Option<String> = row.get("address")?; let address: Option<String> = row.get("address")?;
let memo: Option<String> = row.get("memo")?; let memo: Option<String> = row.get("memo")?;
let address = address.unwrap_or(String::new()); let tx = ShieldedTxT {
let memo = memo.unwrap_or(String::new()); id: id_tx,
let tx_id = builder.create_string(&tx_id); height,
let short_tx_id = builder.create_string(&short_tx_id); tx_id: Some(tx_id),
let name = builder.create_string(&name); short_tx_id: Some(short_tx_id),
let address = builder.create_string(&address); timestamp,
let memo = builder.create_string(&memo); name,
let tx = ShieldedTx::create( value: value as u64,
&mut builder, address,
&ShieldedTxArgs { memo,
id: id_tx, };
height,
tx_id: Some(tx_id),
short_tx_id: Some(short_tx_id),
timestamp,
name: Some(name),
value: value as u64,
address: Some(address),
memo: Some(memo),
},
);
Ok(tx) Ok(tx)
})?; })?;
let mut txs = vec![]; let mut txs = vec![];
for r in rows { for r in rows {
txs.push(r?); txs.push(r?);
} }
let txs = builder.create_vector(&txs); let txs = ShieldedTxVecT { txs: Some(txs) };
let txs = ShieldedTxVec::create(&mut builder, &ShieldedTxVecArgs { txs: Some(txs) }); Ok(txs)
builder.finish(txs, None);
let data = builder.finished_data().to_vec();
Ok(data)
} }
pub fn get_messages(connection: &Connection, id: u32) -> Result<Vec<u8>> { pub fn get_messages(connection: &Connection, id: u32) -> Result<Vec<u8>> {