Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: optimize wallets.wit db file #503

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/screens/login/view/init_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class InitScreenState extends State<InitScreen> with TickerProviderStateMixin {

Future<Widget> loadInitialScreen() async {
ApiDatabase database = Locator.instance<ApiDatabase>();
await database.loadOptimizeDbFile();
WalletStorage storage = await database.loadWalletsDatabase();
if (storage.wallets.isNotEmpty) {
// There are wallets stored
Expand Down
67 changes: 67 additions & 0 deletions lib/shared/api_database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -406,4 +406,71 @@ class ApiDatabase {
return walletStorage;
}
}

Future<bool> loadOptimizeDbFile() async {
await openDatabase();
await loadWalletsDatabase();
WalletStorage _walletStorage = walletStorage;
Map<String, ValueTransferInfo> allVTTs = {};
List<MintEntry> allMints = [];
List<Wallet> allWallets = [];
List<Account> allAccounts = [];
List<AccountStats> allStats = [];
String? _encodedKeychain = await _processIsolate(method: 'getKeychain');
// Wallets
for (int wIdx = 0; wIdx < _walletStorage.wallets.length; wIdx++) {
var _wallet = _walletStorage.wallets.values.elementAt(wIdx);
if (_wallet.masterAccountStats != null) {
allStats.add(_wallet.masterAccountStats!);
}
// Accounts
var _accounts = _wallet.allAccounts();
allWallets.add(_wallet);
for (int aIdx = 0; aIdx < _accounts.length; aIdx++) {
Account _account = _accounts.values.elementAt(aIdx);
allAccounts.add(_account);
// VTTs
for (int vIdx = 0; vIdx < _account.vtts.length; vIdx++) {
if (allVTTs.containsKey(_account.vtts[vIdx].txnHash) == false) {
allVTTs[_account.vtts[vIdx].txnHash] = _account.vtts[vIdx];
}
}
// Mints
for (int mIdx = 0; mIdx < _account.mints.length; mIdx++) {
allMints.add(_account.mints[mIdx]);
}
}
}

await deleteAllWallets();
await openDatabase();
await loadWalletsDatabase();

if (_encodedKeychain != null) {
await _processIsolate(
method: 'add',
params: {'type': 'keychain', 'value': _encodedKeychain},
);
}

for (int wIdx = 0; wIdx < allWallets.length; wIdx++) {
await addWallet(allWallets[wIdx]);
}
for (int sIdx = 0; sIdx < allStats.length; sIdx++) {
await addStats(allStats[sIdx]);
}
for (int aIdx = 0; aIdx < allAccounts.length; aIdx++) {
await addAccount(allAccounts[aIdx]);
}
for (int vIdx = 0; vIdx < allVTTs.values.length; vIdx++) {
ValueTransferInfo _vtt = allVTTs.values.elementAt(vIdx);
await addVtt(_vtt);
}
for (int mIdx = 0; mIdx < allMints.length; mIdx++) {
await addMint(allMints[mIdx]);
}

await loadWalletsDatabase();
return true;
}
}
7 changes: 5 additions & 2 deletions lib/util/storage/database/database_isolate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ Future<void> _addRecord(
) async {
bool value;
switch (params['type']) {
case 'keychain':
value = await dbService.setEncodedKeychain(params['value']);
break;
case 'wallet':
value = await dbService.add(Wallet.fromJson(params['value']));
break;
Expand Down Expand Up @@ -247,8 +250,8 @@ Future<void> _getKeychain(
SendPort port,
Map<String, dynamic> params,
) async {
await dbService.getKey();
port.send(dbService.keyChain.keyHash);
String? value = await dbService.getKey();
port.send(value);
}

Future<void> _getVtt(
Expand Down
13 changes: 9 additions & 4 deletions lib/util/storage/database/database_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -324,10 +324,15 @@ class DatabaseService {
}

Future<String?> getKey() async {
if (unlocked) {
return keyChain.getKey(_database);
} else {
return null;
return keyChain.getKey(_database);
}

Future<bool> setEncodedKeychain(String encodedKeychain) async {
try {
bool success = await keyChain.setEncodedKey(encodedKeychain, _database);
return success;
} catch (e) {
return false;
}
}

Expand Down
17 changes: 17 additions & 0 deletions lib/util/storage/database/encrypt/keychain.dart
Original file line number Diff line number Diff line change
Expand Up @@ -109,4 +109,21 @@ class KeyChain {
}
return true;
}

factory KeyChain.fromEncodedRecord(String encodedKey) {
KeyChain _keychain = KeyChain();
_keychain.keyHash = encodedKey;
return _keychain;
}

Future<bool> setEncodedKey(
String encodedKey, DatabaseClient databaseClient) async {
try {
this.keyHash = encodedKey;
await _store.record('keychain').add(databaseClient, encodedKey);
} catch (e) {
return false;
}
return true;
}
}
Loading