Перед запуском приложения, в консоли перейдите в папку /src/Server
и вызовите команду dotnet user-secrets set "RpcEndpoint" "Адрес вашей конечной точки RPC"
Узнать подробнее про Microsoft.Extensions.Configuration.UserSecrets
База данных используется SQLite в связке с EF Core. Обработка ошибок вынесена в отдельный middleware ExceptionHandler (В обработчике учтены 2 случая, когда не указан RpcEndpoint в конфигурации и случай когда превышен лимит запросов к RPC узлу). Для запросов к блокчейну в серверной части приложения выделен отдельный DI сервис WalletService. Он имеет метод GetWalletsAsync где на вход принимает список объектов кошельков. Этот список объектов мы получаем из базы данных в контроллере, а затем передаем сервису.
- Устанавливается размер пакета batch size равным 1000 (максимальный размер batch запроса) и создается переменная index, которая будет использоваться для построения RPC-запросов.
- Создается список задач batchTasks, который будет содержать все задачи для каждого пакета.
- В цикле for итерируется через список кошельков, используя размер пакета как шаг. Для каждого пакета создается список кошельков batchWallets, который содержит кошельки для текущего пакета.
- Создается новый RpcRequestResponseBatch для текущего пакета.
- Для каждого кошелька в пакете batchWallets создается новый RpcRequestResponseBatchItem, который содержит RPC-запрос для получения баланса кошелька.
- RpcRequestResponseBatchItem добавляется в текущий RpcRequestResponseBatch.
- Создается новая задача, которая содержит асинхронный блок Task.Run, который выполняет отправку RPC-запроса и обработку ответа.
- Задача добавляется в список batchTasks.
- Выполняется метод Task.WhenAll, который ожидает завершения всех задач в списке batchTasks.
- Список кошельков wallets возвращается, отсортированный по балансу в порядке убывания.
Среднее время выполнения запроса занимает 3 секунды.