wip: use multiqueries for idtystatus and idtyindex

This commit is contained in:
poka 2023-11-24 16:48:05 +01:00
parent 5ccacea46d
commit 28a66a3dd8
4 changed files with 82 additions and 98 deletions

View File

@ -40,79 +40,31 @@ class MyWalletsProvider with ChangeNotifier {
chest = chest ?? configBox.get('currentChest') ?? 0; chest = chest ?? configBox.get('currentChest') ?? 0;
listWallets.clear(); listWallets.clear();
final wallets = walletBox.toMap().values.toList(); final wallets = walletBox.toMap().values.toList();
Map<String, WalletData> walletsToScan = {};
for (var walletFromBox in wallets) { for (var walletFromBox in wallets) {
if (walletFromBox.chest == chest) { if (walletFromBox.chest == chest) {
if (walletFromBox.identityStatus == IdtyStatus.unknown) { if (walletFromBox.identityStatus == IdtyStatus.unknown) {
walletFromBox.identityStatus = walletsToScan.putIfAbsent(
await sub.idtyStatus(walletFromBox.address); walletFromBox.address, (() => walletFromBox));
walletBox.put(walletFromBox.address, walletFromBox); } else {
}
listWallets.add(walletFromBox); listWallets.add(walletFromBox);
} }
} }
}
// update all idty status in lists
int n = 0;
final idtyStatusList = await sub.idtyStatus(walletsToScan.keys.toList());
for (final wallet in walletsToScan.values) {
wallet.identityStatus = idtyStatusList[n];
walletBox.put(wallet.address, wallet);
listWallets.add(wallet);
n++;
}
return listWallets; return listWallets;
} }
// List<WalletData> readAllWallets([int? chest]) {
// final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
// bool hasFetchStatus = false;
// List<Future> futures = [];
// chest = chest ?? configBox.get('currentChest') ?? 0;
// listWallets.clear();
// walletBox.toMap().forEach((key, walletFromBox) {
// if (walletFromBox.chest == chest) {
// if (walletFromBox.identityStatus == IdtyStatus.unknown) {
// hasFetchStatus = true;
// futures.add(sub.idtyStatus(walletFromBox.address).then((valueStatus) {
// walletFromBox.identityStatus = valueStatus;
// listWallets.add(walletFromBox);
// // walletBox.put(key, walletFromBox);
// }));
// } else {
// listWallets.add(walletFromBox);
// }
// }
// });
// // if (hasFetchStatus) {
// // sleep(const Duration(milliseconds: 300));
// // log.d('yoooooooooo');
// // readAllWallets(chest);
// // }
// if (hasFetchStatus) {
// Future.wait(futures).then((_) {
// return listWallets;
// // while (listWallets.any((element) =>
// // element.chest == chest &&
// // element.identityStatus == IdtyStatus.unknown)) {
// // List tata = listWallets.toList();
// // log.d(listWallets);
// // while (tata.length < walletBox.length) {
// // tata = listWallets.toList();
// // sleep(const Duration(milliseconds: 500));
// // Map status = {};
// // for (var walletInList in tata) {
// // status.putIfAbsent(
// // walletInList.name, () => walletInList.identityStatus);
// // }
// // log.d(status);
// // log.d('yoooooo');
// // status.clear();
// // }
// });
// }
// // if (hasFetchStatus) {
// // walletBox.putAll(
// // Map.fromEntries(listWallets.map((e) => MapEntry(e.address, e))));
// // }
// return listWallets;
// }
WalletData? getWalletDataById(List<int?> id) { WalletData? getWalletDataById(List<int?> id) {
if (id.isEmpty) return WalletData(address: '', isOwned: true); if (id.isEmpty) return WalletData(address: '', isOwned: true);
int? chest = id[0]; int? chest = id[0];
@ -260,15 +212,14 @@ class MyWalletsProvider with ChangeNotifier {
chestNumber ??= getCurrentChest(); chestNumber ??= getCurrentChest();
List<WalletData> walletConfig = await readAllWallets(chestNumber); listWallets.sort((p1, p2) {
walletConfig.sort((p1, p2) {
return Comparable.compare(p1.number!, p2.number!); return Comparable.compare(p1.number!, p2.number!);
}); });
if (walletConfig.isEmpty) { if (listWallets.isEmpty) {
newDerivationNbr = 2; newDerivationNbr = 2;
} else { } else {
WalletData lastWallet = walletConfig.reduce( WalletData lastWallet = listWallets.reduce(
(curr, next) => curr.derivation! > next.derivation! ? curr : next); (curr, next) => curr.derivation! > next.derivation! ? curr : next);
if (lastWallet.derivation == -1) { if (lastWallet.derivation == -1) {
@ -277,7 +228,7 @@ class MyWalletsProvider with ChangeNotifier {
newDerivationNbr = lastWallet.derivation! + (isOneshoot ? 1 : 2); newDerivationNbr = lastWallet.derivation! + (isOneshoot ? 1 : 2);
} }
newWalletNbr = walletConfig.last.number! + 1; newWalletNbr = listWallets.last.number! + 1;
} }
return [newWalletNbr, newDerivationNbr]; return [newWalletNbr, newDerivationNbr];

View File

@ -1,5 +1,7 @@
// ignore_for_file: use_build_context_synchronously, body_might_complete_normally_catch_error // ignore_for_file: use_build_context_synchronously, body_might_complete_normally_catch_error
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:fast_base58/fast_base58.dart'; import 'package:fast_base58/fast_base58.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -90,10 +92,11 @@ class SubstrateSdk with ChangeNotifier {
Future _getStorage(String call) async { Future _getStorage(String call) async {
try { try {
log.d(call);
return await sdk.webView!.evalJavascript('api.query.$call'); return await sdk.webView!.evalJavascript('api.query.$call');
} catch (e) { } catch (e) {
log.e("_getStorage error: $e"); log.e("_getStorage error: $e");
return Future(() {}); throw Exception("_getStorage error: $e");
} }
} }
@ -141,6 +144,14 @@ class SubstrateSdk with ChangeNotifier {
return await _getStorage('identity.identityIndexOf("$address")'); return await _getStorage('identity.identityIndexOf("$address")');
} }
Future<List<int?>> _getIdentityIndexOfMulti(List<String> addresses) async {
String jsonString = jsonEncode(addresses);
return List<int?>.from(
await _getStorage('identity.identityIndexOf.multi($jsonString)'));
// .map((e) => e as int?)
// .toList() as List<int?>;
}
Future<List<int>?> getCertsCounter(String address) async { Future<List<int>?> getCertsCounter(String address) async {
final idtyIndex = await _getIdentityIndexOf(address); final idtyIndex = await _getIdentityIndexOf(address);
if (idtyIndex == null) { if (idtyIndex == null) {
@ -318,7 +329,7 @@ class SubstrateSdk with ChangeNotifier {
Future<Map<String, int>> certState(String from, String to) async { Future<Map<String, int>> certState(String from, String to) async {
Map<String, int> result = {}; Map<String, int> result = {};
final toStatus = await idtyStatus(to); final toStatus = (await idtyStatus([to])).first;
final myWallets = MyWalletsProvider(); final myWallets = MyWalletsProvider();
@ -380,35 +391,52 @@ class SubstrateSdk with ChangeNotifier {
return startBlockchainTime.add(Duration(seconds: blocNumber * 6)); return startBlockchainTime.add(Duration(seconds: blocNumber * 6));
} }
Future<IdtyStatus> idtyStatus(String address) async { Future<List<IdtyStatus>> idtyStatus(List<String> addresses) async {
// final walletOptions = // final walletOptions =
// Provider.of<WalletOptionsProvider>(homeContext, listen: false); // Provider.of<WalletOptionsProvider>(homeContext, listen: false);
var idtyIndex = await _getIdentityIndexOf(address); log.d(addresses);
final idtyIndexes = (await _getIdentityIndexOfMulti(addresses));
// .map((dynamic e) => e as String)
// .toList();
log.d(idtyIndexes);
final jsonString = jsonEncode(idtyIndexes);
final List idtyStatusList =
await _getStorage('identity.identities.multi($jsonString)');
if (idtyIndex == null) { log.d(idtyStatusList);
return IdtyStatus.none;
List<IdtyStatus> resultStatus = [];
for (final idtyStatus in idtyStatusList) {
if (idtyStatus == null) {
resultStatus.add(IdtyStatus.none);
continue;
} }
final idtyStatus = await _getStorage('identity.identities($idtyIndex)');
if (idtyStatus != null) {
switch (idtyStatus['status']) { switch (idtyStatus['status']) {
case 'Created': case 'Created':
return IdtyStatus.created; resultStatus.add(IdtyStatus.created);
break;
case 'ConfirmedByOwner': case 'ConfirmedByOwner':
return IdtyStatus.confirmed; resultStatus.add(IdtyStatus.confirmed);
break;
case 'Validated': case 'Validated':
return IdtyStatus.validated; resultStatus.add(IdtyStatus.validated);
break;
case 'Expired':
resultStatus.add(IdtyStatus.expired);
break;
default: default:
return IdtyStatus.unknown; resultStatus.add(IdtyStatus.unknown);
break;
} }
} else {
return IdtyStatus.expired;
} }
return resultStatus;
} }
Future<bool> isSmith(String address) async { Future<bool> isSmith(String address) async {
@ -872,11 +900,12 @@ class SubstrateSdk with ChangeNotifier {
final fromBalance = fromAddress == '' final fromBalance = fromAddress == ''
? {'transferableBalance': 0} ? {'transferableBalance': 0}
: await getBalance(fromAddress); : await getBalance(fromAddress);
final fromIdtyStatus =
fromAddress == '' ? IdtyStatus.none : await idtyStatus(fromAddress); final statusList = await idtyStatus([fromAddress, toAddress]);
final fromIdtyStatus = statusList[0];
final fromHasConsumer = final fromHasConsumer =
fromAddress == '' ? false : await hasAccountConsumers(fromAddress); fromAddress == '' ? false : await hasAccountConsumers(fromAddress);
final toIdtyStatus = await idtyStatus(toAddress); final toIdtyStatus = statusList[1];
final isSmithData = await isSmith(fromAddress); final isSmithData = await isSmith(fromAddress);
return [ return [
@ -951,11 +980,14 @@ class SubstrateSdk with ChangeNotifier {
String fromAddress, String destAddress, String password) async { String fromAddress, String destAddress, String password) async {
transactionStatus = ''; transactionStatus = '';
final myIdtyStatus = await idtyStatus(fromAddress); final statusList = await idtyStatus([fromAddress, destAddress]);
final toIdtyStatus = await idtyStatus(destAddress); final myIdtyStatus = statusList[0];
final toIdtyStatus = statusList[1];
final fromIndex = await _getIdentityIndexOf(fromAddress); final idtyIndexList =
final toIndex = await _getIdentityIndexOf(destAddress); await _getIdentityIndexOfMulti([fromAddress, destAddress]);
final fromIndex = idtyIndexList[0];
final toIndex = idtyIndexList[1];
if (myIdtyStatus != IdtyStatus.validated) { if (myIdtyStatus != IdtyStatus.validated) {
transactionStatus = 'notMember'; transactionStatus = 'notMember';

View File

@ -340,10 +340,11 @@ class WalletOptions extends StatelessWidget {
Widget confirmIdentityButton(WalletOptionsProvider walletProvider) { Widget confirmIdentityButton(WalletOptionsProvider walletProvider) {
return Consumer<SubstrateSdk>(builder: (context, sub, _) { return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return FutureBuilder( return FutureBuilder(
future: sub.idtyStatus(walletProvider.address.text), future: sub.idtyStatus([walletProvider.address.text]),
initialData: '', initialData: const [IdtyStatus.unknown],
builder: (context, snapshot) { builder:
if (snapshot.data == IdtyStatus.created) { (BuildContext context, AsyncSnapshot<List<IdtyStatus>> snapshot) {
if (snapshot.data!.first == IdtyStatus.created) {
return Column(children: [ return Column(children: [
SizedBox( SizedBox(
width: 320, width: 320,

View File

@ -24,10 +24,10 @@ class IdentityStatus extends StatelessWidget {
return Consumer<SubstrateSdk>(builder: (context, sub, _) { return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return FutureBuilder( return FutureBuilder(
future: sub.idtyStatus(address), future: sub.idtyStatus([address]),
initialData: walletData.identityStatus, initialData: [walletData.identityStatus],
builder: (context, AsyncSnapshot<IdtyStatus> snapshot) { builder: (context, AsyncSnapshot<List<IdtyStatus>> snapshot) {
final resStatus = snapshot.data!; final resStatus = snapshot.data!.first;
walletData.identityStatus = resStatus; walletData.identityStatus = resStatus;
walletBox.put(address, walletData); walletBox.put(address, walletData);