ZcashLightClientKit/Sources/ZcashLightClientKit/Block/CompactBlockProcessor.swift

907 lines
35 KiB
Swift
Raw Normal View History

//
// CompactBlockProcessor.swift
// ZcashLightClientKit
//
// Created by Francisco Gindre on 18/09/2019.
// Copyright © 2019 Electric Coin Company. All rights reserved.
//
import Foundation
import Combine
public typealias RefreshedUTXOs = (inserted: [UnspentTransactionOutputEntity], skipped: [UnspentTransactionOutputEntity])
2021-09-17 06:49:58 -07:00
/// The compact block processor is in charge of orchestrating the download and caching of compact blocks from a LightWalletEndpoint
/// when started the processor downloads does a download - validate - scan cycle until it reaches latest height on the blockchain.
actor CompactBlockProcessor {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// It would be better to use Combine here but Combine doesn't work great with async. When this runs regularly only one closure is stored here
// and that is one provided by `SDKSynchronizer`. But while running tests more "subscribers" is required here. Therefore it's required to handle
// more closures here.
private var eventClosures: [String: EventClosure] = [:]
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private var syncTask: Task<Void, Error>?
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private let actions: [CBPState: Action]
var context: ActionContext
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private(set) var config: Configuration
private let configProvider: ConfigProvider
private var afterSyncHooksManager = AfterSyncHooksManager()
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private let accountRepository: AccountRepository
var blockDownloaderService: BlockDownloaderService
private var latestBlocksDataProvider: LatestBlocksDataProvider
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private let logger: Logger
private let metrics: SDKMetrics
private let rustBackend: ZcashRustBackendWelding
var service: LightWalletService
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
let storage: CompactBlockRepository
private let transactionRepository: TransactionRepository
private let fileManager: ZcashFileManager
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private var retryAttempts: Int = 0
private var serviceFailureRetryAttempts: Int = 0
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private var backoffTimer: Timer?
private var consecutiveChainValidationErrors: Int = 0
private var compactBlockProgress: CompactBlockProgress = .zero
/// Compact Block Processor configuration
///
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
/// - parameter fsBlockCacheRoot: absolute root path where the filesystem block cache will be stored.
/// - parameter dataDb: absolute file path of the DB where all information derived from the cache DB is stored.
/// - parameter spendParamsURL: absolute file path of the sapling-spend.params file
/// - parameter outputParamsURL: absolute file path of the sapling-output.params file
struct Configuration {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
let alias: ZcashSynchronizerAlias
let saplingParamsSourceURL: SaplingParamsSourceURL
[#361] Introduce ZcashError (#1005) This PR introduces `ZcashError` enum. This enum represents any error that can be thrown inside of the SDK and outside of the SDK. Also `ZcashError` is used in `LightWalletGRPCService` and handled in `CompactBlockProcessor` as example. Why enum? First I tried this with some structure which contained code, message and underlyingError. Problem was when some specific place in the SDK would like to attach some additional data to error. I didn't want to add some generic dictionary to store anything with the error. So I used enum to identify error. Each member can have specified amount of associated values. So specific error can bring some context data. And it's type safe. Each error has also a code. Relationship between errors and codes is 1:1. It may looks bit redundant but it's important. The client app now can choose how to process errors. Either identify those by the error itself or by code. Definition or errors and codes is in `ZcashErrorDefinition`. And then `ZcashError` and `ZcashErrorCode` are generated by Sourcery. Thanks to this it is easier to maintain the final code. And it gives us ability to generate any kind of documentation for the errors and codes. I created simple example of this in this PR. And it doesn't make the SDK completely dependent on the Sourcery. Final structures aren't super complicated and can be written manually if needed. [#923] Update error handling in DatabaseStorageManager.swift - cleanup of DatabaseStorageManager, not used anymore - ZcashError for SimpleConnectionProvider Revert "[#923] Update error handling in DatabaseStorageManager.swift" This reverts commit 94e028d31a0f6635800c297eb741db74c6a6ff45. Fix script which generates ZcashError [#922] Update error handling in DatabaseMigrationManager.swift Closes #922 [#923] Update error handling in DatabaseStorageManager.swift - The DatabaseStorageManager is not used so I deleted it - SimpleConnectionProvider's errors updated Fix tests [#955] Update error handling in SaplingParameterDownloader Closes #955 [#936] Update error handling in NotesDao Closes #936 [#935] Update error handling in BlockDao Closes #935 [#931] InternalSyncProgress.computeNextState doesn't need to throw Closes #931 [#950] Update error handling in rust backend Closes #949 Closes #950 [#941] Update error handling in AccountEntity Closes #941 [#928] Update error handling in FSCompactBlockRepository Closes #928 [#925] Update error handling in BlockDownloaderService (#974) - BlockDownloaderService errors updated [#924] Update error handling in BlockDownloader (#973) - BlockDownloaderStream nextBlock updated [#942] Update error handling in TransactionEntity (#977) - ZcashTransaction init errors converted to the ZcashError [#939] Update error handling in TransactionDao (#976) - TransactionRepositoryError removed and replaced with ZcashError - all TransactionDAO errors converted to ZcashError [#943] Update error handling in ZcashCompactBlock Closes #943 [#945] Update error handling in Memo Closes #945 [#934] Update error handling in Checkpoint Closes #944 Closes #934 [#938] Update error handling in PendingTransactionDao Closes #938 [#926] Update error handling in BlockEnhancer - WIP, switching to transaction repository to unblock this ticket [#926] Update error handling in BlockEnhancer - enhancer's errors done [#926] Update error handling in BlockEnhancer (#994) - cleanup [#952] Update error handling in DerivationTool Closes #952 [#932] Update error handling in BlockValidator Closes #932 [#940] Update error handling in UnspentTransactionOutputDao Closes #940 [#946] Update error handling in WalletTypes Closes #946 [#954] Update error handling in WalletTransactionEncoder Closes #954 [#953] Update error handling in PersistentTransactionManager Closes #953 [#956] Update error handling in Initializer Closes #956 [#947] Update error handling in Zatoshi (#996) - Zatoshi's errors converted to ZcashError [#927] Update error handling in UTXOFetcher (#997) - UTXOFetcher resolved Use let instead of var where applicable In the SDK `var` was used on places where `let` would be sufficient. And default strategy in Swift should use use `let` until mutability is required. So all these places are changed. No logic is changed. [#933] Update error handling in CompactBlockProcessor - CompactBlockProcessor's errors refactored to ZcashError [#933] Update error handling in CompactBlockProcessor #999 - comments addressed [#951] Update error handling in SDKSynchronizer - SDKSynchronizer's errors refactored to ZcashError [#951] Update error handling in SDKSynchronizer (#1002) - comments resolved Make DerivationTool constructor public DerivationTool.init should be public. This was removed by accident when adopting async. [#361] Add changelog
2023-04-24 14:15:20 -07:00
let fsBlockCacheRoot: URL
let dataDb: URL
let spendParamsURL: URL
let outputParamsURL: URL
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
let enhanceBatchSize: Int
let batchSize: Int
[#361] Introduce ZcashError (#1005) This PR introduces `ZcashError` enum. This enum represents any error that can be thrown inside of the SDK and outside of the SDK. Also `ZcashError` is used in `LightWalletGRPCService` and handled in `CompactBlockProcessor` as example. Why enum? First I tried this with some structure which contained code, message and underlyingError. Problem was when some specific place in the SDK would like to attach some additional data to error. I didn't want to add some generic dictionary to store anything with the error. So I used enum to identify error. Each member can have specified amount of associated values. So specific error can bring some context data. And it's type safe. Each error has also a code. Relationship between errors and codes is 1:1. It may looks bit redundant but it's important. The client app now can choose how to process errors. Either identify those by the error itself or by code. Definition or errors and codes is in `ZcashErrorDefinition`. And then `ZcashError` and `ZcashErrorCode` are generated by Sourcery. Thanks to this it is easier to maintain the final code. And it gives us ability to generate any kind of documentation for the errors and codes. I created simple example of this in this PR. And it doesn't make the SDK completely dependent on the Sourcery. Final structures aren't super complicated and can be written manually if needed. [#923] Update error handling in DatabaseStorageManager.swift - cleanup of DatabaseStorageManager, not used anymore - ZcashError for SimpleConnectionProvider Revert "[#923] Update error handling in DatabaseStorageManager.swift" This reverts commit 94e028d31a0f6635800c297eb741db74c6a6ff45. Fix script which generates ZcashError [#922] Update error handling in DatabaseMigrationManager.swift Closes #922 [#923] Update error handling in DatabaseStorageManager.swift - The DatabaseStorageManager is not used so I deleted it - SimpleConnectionProvider's errors updated Fix tests [#955] Update error handling in SaplingParameterDownloader Closes #955 [#936] Update error handling in NotesDao Closes #936 [#935] Update error handling in BlockDao Closes #935 [#931] InternalSyncProgress.computeNextState doesn't need to throw Closes #931 [#950] Update error handling in rust backend Closes #949 Closes #950 [#941] Update error handling in AccountEntity Closes #941 [#928] Update error handling in FSCompactBlockRepository Closes #928 [#925] Update error handling in BlockDownloaderService (#974) - BlockDownloaderService errors updated [#924] Update error handling in BlockDownloader (#973) - BlockDownloaderStream nextBlock updated [#942] Update error handling in TransactionEntity (#977) - ZcashTransaction init errors converted to the ZcashError [#939] Update error handling in TransactionDao (#976) - TransactionRepositoryError removed and replaced with ZcashError - all TransactionDAO errors converted to ZcashError [#943] Update error handling in ZcashCompactBlock Closes #943 [#945] Update error handling in Memo Closes #945 [#934] Update error handling in Checkpoint Closes #944 Closes #934 [#938] Update error handling in PendingTransactionDao Closes #938 [#926] Update error handling in BlockEnhancer - WIP, switching to transaction repository to unblock this ticket [#926] Update error handling in BlockEnhancer - enhancer's errors done [#926] Update error handling in BlockEnhancer (#994) - cleanup [#952] Update error handling in DerivationTool Closes #952 [#932] Update error handling in BlockValidator Closes #932 [#940] Update error handling in UnspentTransactionOutputDao Closes #940 [#946] Update error handling in WalletTypes Closes #946 [#954] Update error handling in WalletTransactionEncoder Closes #954 [#953] Update error handling in PersistentTransactionManager Closes #953 [#956] Update error handling in Initializer Closes #956 [#947] Update error handling in Zatoshi (#996) - Zatoshi's errors converted to ZcashError [#927] Update error handling in UTXOFetcher (#997) - UTXOFetcher resolved Use let instead of var where applicable In the SDK `var` was used on places where `let` would be sufficient. And default strategy in Swift should use use `let` until mutability is required. So all these places are changed. No logic is changed. [#933] Update error handling in CompactBlockProcessor - CompactBlockProcessor's errors refactored to ZcashError [#933] Update error handling in CompactBlockProcessor #999 - comments addressed [#951] Update error handling in SDKSynchronizer - SDKSynchronizer's errors refactored to ZcashError [#951] Update error handling in SDKSynchronizer (#1002) - comments resolved Make DerivationTool constructor public DerivationTool.init should be public. This was removed by accident when adopting async. [#361] Add changelog
2023-04-24 14:15:20 -07:00
let retries: Int
let maxBackoffInterval: TimeInterval
let maxReorgSize = ZcashSDK.maxReorgSize
let rewindDistance: Int
let walletBirthdayProvider: () -> BlockHeight
[#361] Introduce ZcashError (#1005) This PR introduces `ZcashError` enum. This enum represents any error that can be thrown inside of the SDK and outside of the SDK. Also `ZcashError` is used in `LightWalletGRPCService` and handled in `CompactBlockProcessor` as example. Why enum? First I tried this with some structure which contained code, message and underlyingError. Problem was when some specific place in the SDK would like to attach some additional data to error. I didn't want to add some generic dictionary to store anything with the error. So I used enum to identify error. Each member can have specified amount of associated values. So specific error can bring some context data. And it's type safe. Each error has also a code. Relationship between errors and codes is 1:1. It may looks bit redundant but it's important. The client app now can choose how to process errors. Either identify those by the error itself or by code. Definition or errors and codes is in `ZcashErrorDefinition`. And then `ZcashError` and `ZcashErrorCode` are generated by Sourcery. Thanks to this it is easier to maintain the final code. And it gives us ability to generate any kind of documentation for the errors and codes. I created simple example of this in this PR. And it doesn't make the SDK completely dependent on the Sourcery. Final structures aren't super complicated and can be written manually if needed. [#923] Update error handling in DatabaseStorageManager.swift - cleanup of DatabaseStorageManager, not used anymore - ZcashError for SimpleConnectionProvider Revert "[#923] Update error handling in DatabaseStorageManager.swift" This reverts commit 94e028d31a0f6635800c297eb741db74c6a6ff45. Fix script which generates ZcashError [#922] Update error handling in DatabaseMigrationManager.swift Closes #922 [#923] Update error handling in DatabaseStorageManager.swift - The DatabaseStorageManager is not used so I deleted it - SimpleConnectionProvider's errors updated Fix tests [#955] Update error handling in SaplingParameterDownloader Closes #955 [#936] Update error handling in NotesDao Closes #936 [#935] Update error handling in BlockDao Closes #935 [#931] InternalSyncProgress.computeNextState doesn't need to throw Closes #931 [#950] Update error handling in rust backend Closes #949 Closes #950 [#941] Update error handling in AccountEntity Closes #941 [#928] Update error handling in FSCompactBlockRepository Closes #928 [#925] Update error handling in BlockDownloaderService (#974) - BlockDownloaderService errors updated [#924] Update error handling in BlockDownloader (#973) - BlockDownloaderStream nextBlock updated [#942] Update error handling in TransactionEntity (#977) - ZcashTransaction init errors converted to the ZcashError [#939] Update error handling in TransactionDao (#976) - TransactionRepositoryError removed and replaced with ZcashError - all TransactionDAO errors converted to ZcashError [#943] Update error handling in ZcashCompactBlock Closes #943 [#945] Update error handling in Memo Closes #945 [#934] Update error handling in Checkpoint Closes #944 Closes #934 [#938] Update error handling in PendingTransactionDao Closes #938 [#926] Update error handling in BlockEnhancer - WIP, switching to transaction repository to unblock this ticket [#926] Update error handling in BlockEnhancer - enhancer's errors done [#926] Update error handling in BlockEnhancer (#994) - cleanup [#952] Update error handling in DerivationTool Closes #952 [#932] Update error handling in BlockValidator Closes #932 [#940] Update error handling in UnspentTransactionOutputDao Closes #940 [#946] Update error handling in WalletTypes Closes #946 [#954] Update error handling in WalletTransactionEncoder Closes #954 [#953] Update error handling in PersistentTransactionManager Closes #953 [#956] Update error handling in Initializer Closes #956 [#947] Update error handling in Zatoshi (#996) - Zatoshi's errors converted to ZcashError [#927] Update error handling in UTXOFetcher (#997) - UTXOFetcher resolved Use let instead of var where applicable In the SDK `var` was used on places where `let` would be sufficient. And default strategy in Swift should use use `let` until mutability is required. So all these places are changed. No logic is changed. [#933] Update error handling in CompactBlockProcessor - CompactBlockProcessor's errors refactored to ZcashError [#933] Update error handling in CompactBlockProcessor #999 - comments addressed [#951] Update error handling in SDKSynchronizer - SDKSynchronizer's errors refactored to ZcashError [#951] Update error handling in SDKSynchronizer (#1002) - comments resolved Make DerivationTool constructor public DerivationTool.init should be public. This was removed by accident when adopting async. [#361] Add changelog
2023-04-24 14:15:20 -07:00
var walletBirthday: BlockHeight { walletBirthdayProvider() }
let downloadBufferSize: Int = 10
let network: ZcashNetwork
let saplingActivation: BlockHeight
let cacheDbURL: URL?
var blockPollInterval: TimeInterval {
2021-09-17 06:49:58 -07:00
TimeInterval.random(in: ZcashSDK.defaultPollInterval / 2 ... ZcashSDK.defaultPollInterval * 1.5)
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
[#361] Introduce ZcashError (#1005) This PR introduces `ZcashError` enum. This enum represents any error that can be thrown inside of the SDK and outside of the SDK. Also `ZcashError` is used in `LightWalletGRPCService` and handled in `CompactBlockProcessor` as example. Why enum? First I tried this with some structure which contained code, message and underlyingError. Problem was when some specific place in the SDK would like to attach some additional data to error. I didn't want to add some generic dictionary to store anything with the error. So I used enum to identify error. Each member can have specified amount of associated values. So specific error can bring some context data. And it's type safe. Each error has also a code. Relationship between errors and codes is 1:1. It may looks bit redundant but it's important. The client app now can choose how to process errors. Either identify those by the error itself or by code. Definition or errors and codes is in `ZcashErrorDefinition`. And then `ZcashError` and `ZcashErrorCode` are generated by Sourcery. Thanks to this it is easier to maintain the final code. And it gives us ability to generate any kind of documentation for the errors and codes. I created simple example of this in this PR. And it doesn't make the SDK completely dependent on the Sourcery. Final structures aren't super complicated and can be written manually if needed. [#923] Update error handling in DatabaseStorageManager.swift - cleanup of DatabaseStorageManager, not used anymore - ZcashError for SimpleConnectionProvider Revert "[#923] Update error handling in DatabaseStorageManager.swift" This reverts commit 94e028d31a0f6635800c297eb741db74c6a6ff45. Fix script which generates ZcashError [#922] Update error handling in DatabaseMigrationManager.swift Closes #922 [#923] Update error handling in DatabaseStorageManager.swift - The DatabaseStorageManager is not used so I deleted it - SimpleConnectionProvider's errors updated Fix tests [#955] Update error handling in SaplingParameterDownloader Closes #955 [#936] Update error handling in NotesDao Closes #936 [#935] Update error handling in BlockDao Closes #935 [#931] InternalSyncProgress.computeNextState doesn't need to throw Closes #931 [#950] Update error handling in rust backend Closes #949 Closes #950 [#941] Update error handling in AccountEntity Closes #941 [#928] Update error handling in FSCompactBlockRepository Closes #928 [#925] Update error handling in BlockDownloaderService (#974) - BlockDownloaderService errors updated [#924] Update error handling in BlockDownloader (#973) - BlockDownloaderStream nextBlock updated [#942] Update error handling in TransactionEntity (#977) - ZcashTransaction init errors converted to the ZcashError [#939] Update error handling in TransactionDao (#976) - TransactionRepositoryError removed and replaced with ZcashError - all TransactionDAO errors converted to ZcashError [#943] Update error handling in ZcashCompactBlock Closes #943 [#945] Update error handling in Memo Closes #945 [#934] Update error handling in Checkpoint Closes #944 Closes #934 [#938] Update error handling in PendingTransactionDao Closes #938 [#926] Update error handling in BlockEnhancer - WIP, switching to transaction repository to unblock this ticket [#926] Update error handling in BlockEnhancer - enhancer's errors done [#926] Update error handling in BlockEnhancer (#994) - cleanup [#952] Update error handling in DerivationTool Closes #952 [#932] Update error handling in BlockValidator Closes #932 [#940] Update error handling in UnspentTransactionOutputDao Closes #940 [#946] Update error handling in WalletTypes Closes #946 [#954] Update error handling in WalletTransactionEncoder Closes #954 [#953] Update error handling in PersistentTransactionManager Closes #953 [#956] Update error handling in Initializer Closes #956 [#947] Update error handling in Zatoshi (#996) - Zatoshi's errors converted to ZcashError [#927] Update error handling in UTXOFetcher (#997) - UTXOFetcher resolved Use let instead of var where applicable In the SDK `var` was used on places where `let` would be sufficient. And default strategy in Swift should use use `let` until mutability is required. So all these places are changed. No logic is changed. [#933] Update error handling in CompactBlockProcessor - CompactBlockProcessor's errors refactored to ZcashError [#933] Update error handling in CompactBlockProcessor #999 - comments addressed [#951] Update error handling in SDKSynchronizer - SDKSynchronizer's errors refactored to ZcashError [#951] Update error handling in SDKSynchronizer (#1002) - comments resolved Make DerivationTool constructor public DerivationTool.init should be public. This was removed by accident when adopting async. [#361] Add changelog
2023-04-24 14:15:20 -07:00
init(
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
alias: ZcashSynchronizerAlias,
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
cacheDbURL: URL? = nil,
fsBlockCacheRoot: URL,
2021-07-26 16:22:30 -07:00
dataDb: URL,
spendParamsURL: URL,
outputParamsURL: URL,
saplingParamsSourceURL: SaplingParamsSourceURL,
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
enhanceBatchSize: Int = ZcashSDK.DefaultEnhanceBatch,
batchSize: Int = ZcashSDK.DefaultBatchSize,
[#361] Introduce ZcashError (#1005) This PR introduces `ZcashError` enum. This enum represents any error that can be thrown inside of the SDK and outside of the SDK. Also `ZcashError` is used in `LightWalletGRPCService` and handled in `CompactBlockProcessor` as example. Why enum? First I tried this with some structure which contained code, message and underlyingError. Problem was when some specific place in the SDK would like to attach some additional data to error. I didn't want to add some generic dictionary to store anything with the error. So I used enum to identify error. Each member can have specified amount of associated values. So specific error can bring some context data. And it's type safe. Each error has also a code. Relationship between errors and codes is 1:1. It may looks bit redundant but it's important. The client app now can choose how to process errors. Either identify those by the error itself or by code. Definition or errors and codes is in `ZcashErrorDefinition`. And then `ZcashError` and `ZcashErrorCode` are generated by Sourcery. Thanks to this it is easier to maintain the final code. And it gives us ability to generate any kind of documentation for the errors and codes. I created simple example of this in this PR. And it doesn't make the SDK completely dependent on the Sourcery. Final structures aren't super complicated and can be written manually if needed. [#923] Update error handling in DatabaseStorageManager.swift - cleanup of DatabaseStorageManager, not used anymore - ZcashError for SimpleConnectionProvider Revert "[#923] Update error handling in DatabaseStorageManager.swift" This reverts commit 94e028d31a0f6635800c297eb741db74c6a6ff45. Fix script which generates ZcashError [#922] Update error handling in DatabaseMigrationManager.swift Closes #922 [#923] Update error handling in DatabaseStorageManager.swift - The DatabaseStorageManager is not used so I deleted it - SimpleConnectionProvider's errors updated Fix tests [#955] Update error handling in SaplingParameterDownloader Closes #955 [#936] Update error handling in NotesDao Closes #936 [#935] Update error handling in BlockDao Closes #935 [#931] InternalSyncProgress.computeNextState doesn't need to throw Closes #931 [#950] Update error handling in rust backend Closes #949 Closes #950 [#941] Update error handling in AccountEntity Closes #941 [#928] Update error handling in FSCompactBlockRepository Closes #928 [#925] Update error handling in BlockDownloaderService (#974) - BlockDownloaderService errors updated [#924] Update error handling in BlockDownloader (#973) - BlockDownloaderStream nextBlock updated [#942] Update error handling in TransactionEntity (#977) - ZcashTransaction init errors converted to the ZcashError [#939] Update error handling in TransactionDao (#976) - TransactionRepositoryError removed and replaced with ZcashError - all TransactionDAO errors converted to ZcashError [#943] Update error handling in ZcashCompactBlock Closes #943 [#945] Update error handling in Memo Closes #945 [#934] Update error handling in Checkpoint Closes #944 Closes #934 [#938] Update error handling in PendingTransactionDao Closes #938 [#926] Update error handling in BlockEnhancer - WIP, switching to transaction repository to unblock this ticket [#926] Update error handling in BlockEnhancer - enhancer's errors done [#926] Update error handling in BlockEnhancer (#994) - cleanup [#952] Update error handling in DerivationTool Closes #952 [#932] Update error handling in BlockValidator Closes #932 [#940] Update error handling in UnspentTransactionOutputDao Closes #940 [#946] Update error handling in WalletTypes Closes #946 [#954] Update error handling in WalletTransactionEncoder Closes #954 [#953] Update error handling in PersistentTransactionManager Closes #953 [#956] Update error handling in Initializer Closes #956 [#947] Update error handling in Zatoshi (#996) - Zatoshi's errors converted to ZcashError [#927] Update error handling in UTXOFetcher (#997) - UTXOFetcher resolved Use let instead of var where applicable In the SDK `var` was used on places where `let` would be sufficient. And default strategy in Swift should use use `let` until mutability is required. So all these places are changed. No logic is changed. [#933] Update error handling in CompactBlockProcessor - CompactBlockProcessor's errors refactored to ZcashError [#933] Update error handling in CompactBlockProcessor #999 - comments addressed [#951] Update error handling in SDKSynchronizer - SDKSynchronizer's errors refactored to ZcashError [#951] Update error handling in SDKSynchronizer (#1002) - comments resolved Make DerivationTool constructor public DerivationTool.init should be public. This was removed by accident when adopting async. [#361] Add changelog
2023-04-24 14:15:20 -07:00
retries: Int = ZcashSDK.defaultRetries,
maxBackoffInterval: TimeInterval = ZcashSDK.defaultMaxBackOffInterval,
rewindDistance: Int = ZcashSDK.defaultRewindDistance,
walletBirthdayProvider: @escaping () -> BlockHeight,
2021-07-26 16:22:30 -07:00
saplingActivation: BlockHeight,
2021-07-28 09:59:10 -07:00
network: ZcashNetwork
2021-09-17 06:49:58 -07:00
) {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
self.alias = alias
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
self.fsBlockCacheRoot = fsBlockCacheRoot
self.dataDb = dataDb
self.spendParamsURL = spendParamsURL
self.outputParamsURL = outputParamsURL
self.saplingParamsSourceURL = saplingParamsSourceURL
2021-07-26 16:22:30 -07:00
self.network = network
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
self.enhanceBatchSize = enhanceBatchSize
self.batchSize = batchSize
self.retries = retries
self.maxBackoffInterval = maxBackoffInterval
self.rewindDistance = rewindDistance
self.walletBirthdayProvider = walletBirthdayProvider
self.saplingActivation = saplingActivation
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
self.cacheDbURL = cacheDbURL
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
init(
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
alias: ZcashSynchronizerAlias,
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
fsBlockCacheRoot: URL,
dataDb: URL,
spendParamsURL: URL,
outputParamsURL: URL,
saplingParamsSourceURL: SaplingParamsSourceURL,
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
enhanceBatchSize: Int = ZcashSDK.DefaultEnhanceBatch,
batchSize: Int = ZcashSDK.DefaultBatchSize,
[#361] Introduce ZcashError (#1005) This PR introduces `ZcashError` enum. This enum represents any error that can be thrown inside of the SDK and outside of the SDK. Also `ZcashError` is used in `LightWalletGRPCService` and handled in `CompactBlockProcessor` as example. Why enum? First I tried this with some structure which contained code, message and underlyingError. Problem was when some specific place in the SDK would like to attach some additional data to error. I didn't want to add some generic dictionary to store anything with the error. So I used enum to identify error. Each member can have specified amount of associated values. So specific error can bring some context data. And it's type safe. Each error has also a code. Relationship between errors and codes is 1:1. It may looks bit redundant but it's important. The client app now can choose how to process errors. Either identify those by the error itself or by code. Definition or errors and codes is in `ZcashErrorDefinition`. And then `ZcashError` and `ZcashErrorCode` are generated by Sourcery. Thanks to this it is easier to maintain the final code. And it gives us ability to generate any kind of documentation for the errors and codes. I created simple example of this in this PR. And it doesn't make the SDK completely dependent on the Sourcery. Final structures aren't super complicated and can be written manually if needed. [#923] Update error handling in DatabaseStorageManager.swift - cleanup of DatabaseStorageManager, not used anymore - ZcashError for SimpleConnectionProvider Revert "[#923] Update error handling in DatabaseStorageManager.swift" This reverts commit 94e028d31a0f6635800c297eb741db74c6a6ff45. Fix script which generates ZcashError [#922] Update error handling in DatabaseMigrationManager.swift Closes #922 [#923] Update error handling in DatabaseStorageManager.swift - The DatabaseStorageManager is not used so I deleted it - SimpleConnectionProvider's errors updated Fix tests [#955] Update error handling in SaplingParameterDownloader Closes #955 [#936] Update error handling in NotesDao Closes #936 [#935] Update error handling in BlockDao Closes #935 [#931] InternalSyncProgress.computeNextState doesn't need to throw Closes #931 [#950] Update error handling in rust backend Closes #949 Closes #950 [#941] Update error handling in AccountEntity Closes #941 [#928] Update error handling in FSCompactBlockRepository Closes #928 [#925] Update error handling in BlockDownloaderService (#974) - BlockDownloaderService errors updated [#924] Update error handling in BlockDownloader (#973) - BlockDownloaderStream nextBlock updated [#942] Update error handling in TransactionEntity (#977) - ZcashTransaction init errors converted to the ZcashError [#939] Update error handling in TransactionDao (#976) - TransactionRepositoryError removed and replaced with ZcashError - all TransactionDAO errors converted to ZcashError [#943] Update error handling in ZcashCompactBlock Closes #943 [#945] Update error handling in Memo Closes #945 [#934] Update error handling in Checkpoint Closes #944 Closes #934 [#938] Update error handling in PendingTransactionDao Closes #938 [#926] Update error handling in BlockEnhancer - WIP, switching to transaction repository to unblock this ticket [#926] Update error handling in BlockEnhancer - enhancer's errors done [#926] Update error handling in BlockEnhancer (#994) - cleanup [#952] Update error handling in DerivationTool Closes #952 [#932] Update error handling in BlockValidator Closes #932 [#940] Update error handling in UnspentTransactionOutputDao Closes #940 [#946] Update error handling in WalletTypes Closes #946 [#954] Update error handling in WalletTransactionEncoder Closes #954 [#953] Update error handling in PersistentTransactionManager Closes #953 [#956] Update error handling in Initializer Closes #956 [#947] Update error handling in Zatoshi (#996) - Zatoshi's errors converted to ZcashError [#927] Update error handling in UTXOFetcher (#997) - UTXOFetcher resolved Use let instead of var where applicable In the SDK `var` was used on places where `let` would be sufficient. And default strategy in Swift should use use `let` until mutability is required. So all these places are changed. No logic is changed. [#933] Update error handling in CompactBlockProcessor - CompactBlockProcessor's errors refactored to ZcashError [#933] Update error handling in CompactBlockProcessor #999 - comments addressed [#951] Update error handling in SDKSynchronizer - SDKSynchronizer's errors refactored to ZcashError [#951] Update error handling in SDKSynchronizer (#1002) - comments resolved Make DerivationTool constructor public DerivationTool.init should be public. This was removed by accident when adopting async. [#361] Add changelog
2023-04-24 14:15:20 -07:00
retries: Int = ZcashSDK.defaultRetries,
maxBackoffInterval: TimeInterval = ZcashSDK.defaultMaxBackOffInterval,
rewindDistance: Int = ZcashSDK.defaultRewindDistance,
walletBirthdayProvider: @escaping () -> BlockHeight,
network: ZcashNetwork
) {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
self.alias = alias
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
self.fsBlockCacheRoot = fsBlockCacheRoot
self.dataDb = dataDb
self.spendParamsURL = spendParamsURL
self.outputParamsURL = outputParamsURL
self.saplingParamsSourceURL = saplingParamsSourceURL
self.walletBirthdayProvider = walletBirthdayProvider
2021-09-15 05:21:29 -07:00
self.saplingActivation = network.constants.saplingActivationHeight
2021-07-28 09:59:10 -07:00
self.network = network
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
self.cacheDbURL = nil
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
self.enhanceBatchSize = enhanceBatchSize
self.batchSize = batchSize
[#361] Introduce ZcashError (#1005) This PR introduces `ZcashError` enum. This enum represents any error that can be thrown inside of the SDK and outside of the SDK. Also `ZcashError` is used in `LightWalletGRPCService` and handled in `CompactBlockProcessor` as example. Why enum? First I tried this with some structure which contained code, message and underlyingError. Problem was when some specific place in the SDK would like to attach some additional data to error. I didn't want to add some generic dictionary to store anything with the error. So I used enum to identify error. Each member can have specified amount of associated values. So specific error can bring some context data. And it's type safe. Each error has also a code. Relationship between errors and codes is 1:1. It may looks bit redundant but it's important. The client app now can choose how to process errors. Either identify those by the error itself or by code. Definition or errors and codes is in `ZcashErrorDefinition`. And then `ZcashError` and `ZcashErrorCode` are generated by Sourcery. Thanks to this it is easier to maintain the final code. And it gives us ability to generate any kind of documentation for the errors and codes. I created simple example of this in this PR. And it doesn't make the SDK completely dependent on the Sourcery. Final structures aren't super complicated and can be written manually if needed. [#923] Update error handling in DatabaseStorageManager.swift - cleanup of DatabaseStorageManager, not used anymore - ZcashError for SimpleConnectionProvider Revert "[#923] Update error handling in DatabaseStorageManager.swift" This reverts commit 94e028d31a0f6635800c297eb741db74c6a6ff45. Fix script which generates ZcashError [#922] Update error handling in DatabaseMigrationManager.swift Closes #922 [#923] Update error handling in DatabaseStorageManager.swift - The DatabaseStorageManager is not used so I deleted it - SimpleConnectionProvider's errors updated Fix tests [#955] Update error handling in SaplingParameterDownloader Closes #955 [#936] Update error handling in NotesDao Closes #936 [#935] Update error handling in BlockDao Closes #935 [#931] InternalSyncProgress.computeNextState doesn't need to throw Closes #931 [#950] Update error handling in rust backend Closes #949 Closes #950 [#941] Update error handling in AccountEntity Closes #941 [#928] Update error handling in FSCompactBlockRepository Closes #928 [#925] Update error handling in BlockDownloaderService (#974) - BlockDownloaderService errors updated [#924] Update error handling in BlockDownloader (#973) - BlockDownloaderStream nextBlock updated [#942] Update error handling in TransactionEntity (#977) - ZcashTransaction init errors converted to the ZcashError [#939] Update error handling in TransactionDao (#976) - TransactionRepositoryError removed and replaced with ZcashError - all TransactionDAO errors converted to ZcashError [#943] Update error handling in ZcashCompactBlock Closes #943 [#945] Update error handling in Memo Closes #945 [#934] Update error handling in Checkpoint Closes #944 Closes #934 [#938] Update error handling in PendingTransactionDao Closes #938 [#926] Update error handling in BlockEnhancer - WIP, switching to transaction repository to unblock this ticket [#926] Update error handling in BlockEnhancer - enhancer's errors done [#926] Update error handling in BlockEnhancer (#994) - cleanup [#952] Update error handling in DerivationTool Closes #952 [#932] Update error handling in BlockValidator Closes #932 [#940] Update error handling in UnspentTransactionOutputDao Closes #940 [#946] Update error handling in WalletTypes Closes #946 [#954] Update error handling in WalletTransactionEncoder Closes #954 [#953] Update error handling in PersistentTransactionManager Closes #953 [#956] Update error handling in Initializer Closes #956 [#947] Update error handling in Zatoshi (#996) - Zatoshi's errors converted to ZcashError [#927] Update error handling in UTXOFetcher (#997) - UTXOFetcher resolved Use let instead of var where applicable In the SDK `var` was used on places where `let` would be sufficient. And default strategy in Swift should use use `let` until mutability is required. So all these places are changed. No logic is changed. [#933] Update error handling in CompactBlockProcessor - CompactBlockProcessor's errors refactored to ZcashError [#933] Update error handling in CompactBlockProcessor #999 - comments addressed [#951] Update error handling in SDKSynchronizer - SDKSynchronizer's errors refactored to ZcashError [#951] Update error handling in SDKSynchronizer (#1002) - comments resolved Make DerivationTool constructor public DerivationTool.init should be public. This was removed by accident when adopting async. [#361] Add changelog
2023-04-24 14:15:20 -07:00
self.retries = retries
self.maxBackoffInterval = maxBackoffInterval
self.rewindDistance = rewindDistance
2021-09-17 06:49:58 -07:00
}
}
/// Initializes a CompactBlockProcessor instance
/// - Parameters:
/// - service: concrete implementation of `LightWalletService` protocol
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
/// - storage: concrete implementation of `CompactBlockRepository` protocol
/// - backend: a class that complies to `ZcashRustBackendWelding`
/// - config: `Configuration` struct for this processor
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
init(container: DIContainer, config: Configuration) {
2021-09-15 05:21:29 -07:00
self.init(
container: container,
2021-09-15 05:21:29 -07:00
config: config,
accountRepository: AccountRepositoryBuilder.build(dataDbURL: config.dataDb, readOnly: true, logger: container.resolve(Logger.self))
2021-09-17 06:49:58 -07:00
)
}
/// Initializes a CompactBlockProcessor instance from an Initialized object
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
/// - Parameters:
/// - initializer: an instance that complies to CompactBlockDownloading protocol
init(initializer: Initializer, walletBirthdayProvider: @escaping () -> BlockHeight) {
2021-09-15 05:21:29 -07:00
self.init(
container: initializer.container,
2021-09-15 05:21:29 -07:00
config: Configuration(
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
alias: initializer.alias,
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
fsBlockCacheRoot: initializer.fsBlockDbRoot,
2021-09-15 05:21:29 -07:00
dataDb: initializer.dataDbURL,
spendParamsURL: initializer.spendParamsURL,
outputParamsURL: initializer.outputParamsURL,
saplingParamsSourceURL: initializer.saplingParamsSourceURL,
walletBirthdayProvider: walletBirthdayProvider,
2021-09-15 05:21:29 -07:00
network: initializer.network
),
accountRepository: initializer.accountRepository
2021-09-17 06:49:58 -07:00
)
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
init(
container: DIContainer,
config: Configuration,
accountRepository: AccountRepository
) {
Dependencies.setupCompactBlockProcessor(
in: container,
config: config,
accountRepository: accountRepository
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
)
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
let configProvider = ConfigProvider(config: config)
context = ActionContextImpl(state: .idle)
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
actions = Self.makeActions(container: container, configProvider: configProvider)
self.metrics = container.resolve(SDKMetrics.self)
self.logger = container.resolve(Logger.self)
self.latestBlocksDataProvider = container.resolve(LatestBlocksDataProvider.self)
self.blockDownloaderService = container.resolve(BlockDownloaderService.self)
self.service = container.resolve(LightWalletService.self)
self.rustBackend = container.resolve(ZcashRustBackendWelding.self)
self.storage = container.resolve(CompactBlockRepository.self)
self.config = config
self.transactionRepository = container.resolve(TransactionRepository.self)
2021-04-08 10:18:16 -07:00
self.accountRepository = accountRepository
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
self.fileManager = container.resolve(ZcashFileManager.self)
self.configProvider = configProvider
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
deinit {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
syncTask?.cancel()
syncTask = nil
[476] CompactBlockProcessor to async/await - getting rid of the Operation Queue - the cleanup is needed - the update of tests is needed - tested and it successfully finishes the sync process [476] CompactBlockProcessor to async/await - old processNewBlocks() removed [476] CompactBlockProcessor to async/await - unused operations removed [476] CompactBlockProcessor to async/await - unit tests update [476] CompactBlockProcessor to async/await - unit tests refactored [476] CompactBlockProcessor to async/await - cleanup of deprecated method [476] CompactBlockProcessor to async/await - fail(error) was called even for canceled tasks but that must be excluded [476] CompactBlockProcessor to async/await - removal of all ZcashOperations from the code (unit test will follow) [476] CompactBlockProcessor to async/await - network tests in building and success order again [476] CompactBlockProcessor to async/await - offline tests in building and success order [476] CompactBlockProcessor to async/await (519) - cleanup of suspending the task [476] CompactBlockProcessor to async/await (519) - most comments resolved [476] CompactBlockProcessor to async/await (519) - thread safe state for both sync and async context [476] CompactBlockProcessor to async/await (519) - fixed build for a sample project [476] CompactBlockProcessor to async/await (519) - func testStartNotifiesSuscriptors() reverted [476] CompactBlockProcessor to async/await (519) - TODO added to track why we used NSLock instead of an Actor - Task priority enhanced [476] CompactBlockProcessor to async/await (519) - cleanup in Tasks and priorities
2022-09-01 05:58:41 -07:00
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// swiftlint:disable:next cyclomatic_complexity
private static func makeActions(container: DIContainer, configProvider: ConfigProvider) -> [CBPState: Action] {
let actionsDefinition = CBPState.allCases.compactMap { state -> (CBPState, Action)? in
let action: Action
switch state {
case .migrateLegacyCacheDB:
action = MigrateLegacyCacheDBAction(container: container, configProvider: configProvider)
case .validateServer:
action = ValidateServerAction(container: container, configProvider: configProvider)
case .updateSubtreeRoots:
action = UpdateSubtreeRootsAction(container: container, configProvider: configProvider)
case .updateChainTip:
action = UpdateChainTipAction(container: container)
case .processSuggestedScanRanges:
action = ProcessSuggestedScanRangesAction(container: container)
case .rewind:
action = RewindAction(container: container)
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
case .download:
action = DownloadAction(container: container, configProvider: configProvider)
case .scan:
action = ScanAction(container: container, configProvider: configProvider)
case .clearAlreadyScannedBlocks:
action = ClearAlreadyScannedBlocksAction(container: container)
case .enhance:
action = EnhanceAction(container: container, configProvider: configProvider)
case .fetchUTXO:
action = FetchUTXOsAction(container: container)
case .handleSaplingParams:
action = SaplingParamsAction(container: container)
case .clearCache:
action = ClearCacheAction(container: container)
case .finished, .failed, .stopped, .idle:
return nil
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
return (state, action)
}
[#831] Add SDKSynchronizer wrappers for non-async API This change introduces two new protocols: `ClosureSynchronizer` and `CombineSynchronizer`. These two protocols define API that doesn't use `async`. So the client can choose exactly which API it wants to use. This change also introduces two new objects: `ClosureSDKSynchronizer` and `CombineSDKSynchronizer`. These two implement the respective protocols mentioned above. Both are structures. Neither of these two keeps any state. Thanks to this each is very cheap to create. And usage of these two isn't mutually exclusive. So devs can really choose the best SDK API for each part of the client app. [#831] Use async inside of the SDKSynchronizer - In general lot of methods inside the `SDKSynchronizer` and `CompactBlockProcessoer` which weren't async are now async. And other changes are made because of this change. - `CompactBlockProcessor` no longer uses Combine to communicate with `SDKSynchronizer`. Reason for this is that Combine doesn't play great with async. Closure passed to `sink` isn't async. - Because of this and because of how our tests work (receiving signals from CBP directly) `CompactBlockProcessor` must be able to handle more event closures. Not just one. So it now has `eventClosures` dictionary. It's little bit strange but it works fine. - `SyncStatus` inside the `SDKSynchronizer` was previously protected by lock. Now it's protected by simple actor wrapper. - Changes in tests are minimal. Changes were mady only because `CompactBlockProcessor` changes from Combine to closures. [#831] Add tests for ClosureSDKSynchronizer - Added tests are testing in general if the `ClosuresSDKSynchronizer` is correctly calling `Synchronizer` and if the values are correctly returned. - `ClosuresSDKSynchronizer` doesn't contain any logic but it is public API and we should be sure that it works correctly. [#831] Add tests for CombineSDKSynchronizer [#831] Add changelog
2023-03-16 02:11:18 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
return Dictionary(uniqueKeysWithValues: actionsDefinition)
[#831] Add SDKSynchronizer wrappers for non-async API This change introduces two new protocols: `ClosureSynchronizer` and `CombineSynchronizer`. These two protocols define API that doesn't use `async`. So the client can choose exactly which API it wants to use. This change also introduces two new objects: `ClosureSDKSynchronizer` and `CombineSDKSynchronizer`. These two implement the respective protocols mentioned above. Both are structures. Neither of these two keeps any state. Thanks to this each is very cheap to create. And usage of these two isn't mutually exclusive. So devs can really choose the best SDK API for each part of the client app. [#831] Use async inside of the SDKSynchronizer - In general lot of methods inside the `SDKSynchronizer` and `CompactBlockProcessoer` which weren't async are now async. And other changes are made because of this change. - `CompactBlockProcessor` no longer uses Combine to communicate with `SDKSynchronizer`. Reason for this is that Combine doesn't play great with async. Closure passed to `sink` isn't async. - Because of this and because of how our tests work (receiving signals from CBP directly) `CompactBlockProcessor` must be able to handle more event closures. Not just one. So it now has `eventClosures` dictionary. It's little bit strange but it works fine. - `SyncStatus` inside the `SDKSynchronizer` was previously protected by lock. Now it's protected by simple actor wrapper. - Changes in tests are minimal. Changes were mady only because `CompactBlockProcessor` changes from Combine to closures. [#831] Add tests for ClosureSDKSynchronizer - Added tests are testing in general if the `ClosuresSDKSynchronizer` is correctly calling `Synchronizer` and if the values are correctly returned. - `ClosuresSDKSynchronizer` doesn't contain any logic but it is public API and we should be sure that it works correctly. [#831] Add tests for CombineSDKSynchronizer [#831] Add changelog
2023-03-16 02:11:18 -07:00
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// This is currently used only in tests. And it should be used only in tests.
func update(config: Configuration) async {
self.config = config
await configProvider.update(config: config)
[#831] Add SDKSynchronizer wrappers for non-async API This change introduces two new protocols: `ClosureSynchronizer` and `CombineSynchronizer`. These two protocols define API that doesn't use `async`. So the client can choose exactly which API it wants to use. This change also introduces two new objects: `ClosureSDKSynchronizer` and `CombineSDKSynchronizer`. These two implement the respective protocols mentioned above. Both are structures. Neither of these two keeps any state. Thanks to this each is very cheap to create. And usage of these two isn't mutually exclusive. So devs can really choose the best SDK API for each part of the client app. [#831] Use async inside of the SDKSynchronizer - In general lot of methods inside the `SDKSynchronizer` and `CompactBlockProcessoer` which weren't async are now async. And other changes are made because of this change. - `CompactBlockProcessor` no longer uses Combine to communicate with `SDKSynchronizer`. Reason for this is that Combine doesn't play great with async. Closure passed to `sink` isn't async. - Because of this and because of how our tests work (receiving signals from CBP directly) `CompactBlockProcessor` must be able to handle more event closures. Not just one. So it now has `eventClosures` dictionary. It's little bit strange but it works fine. - `SyncStatus` inside the `SDKSynchronizer` was previously protected by lock. Now it's protected by simple actor wrapper. - Changes in tests are minimal. Changes were mady only because `CompactBlockProcessor` changes from Combine to closures. [#831] Add tests for ClosureSDKSynchronizer - Added tests are testing in general if the `ClosuresSDKSynchronizer` is correctly calling `Synchronizer` and if the values are correctly returned. - `ClosuresSDKSynchronizer` doesn't contain any logic but it is public API and we should be sure that it works correctly. [#831] Add tests for CombineSDKSynchronizer [#831] Add changelog
2023-03-16 02:11:18 -07:00
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
}
[#831] Add SDKSynchronizer wrappers for non-async API This change introduces two new protocols: `ClosureSynchronizer` and `CombineSynchronizer`. These two protocols define API that doesn't use `async`. So the client can choose exactly which API it wants to use. This change also introduces two new objects: `ClosureSDKSynchronizer` and `CombineSDKSynchronizer`. These two implement the respective protocols mentioned above. Both are structures. Neither of these two keeps any state. Thanks to this each is very cheap to create. And usage of these two isn't mutually exclusive. So devs can really choose the best SDK API for each part of the client app. [#831] Use async inside of the SDKSynchronizer - In general lot of methods inside the `SDKSynchronizer` and `CompactBlockProcessoer` which weren't async are now async. And other changes are made because of this change. - `CompactBlockProcessor` no longer uses Combine to communicate with `SDKSynchronizer`. Reason for this is that Combine doesn't play great with async. Closure passed to `sink` isn't async. - Because of this and because of how our tests work (receiving signals from CBP directly) `CompactBlockProcessor` must be able to handle more event closures. Not just one. So it now has `eventClosures` dictionary. It's little bit strange but it works fine. - `SyncStatus` inside the `SDKSynchronizer` was previously protected by lock. Now it's protected by simple actor wrapper. - Changes in tests are minimal. Changes were mady only because `CompactBlockProcessor` changes from Combine to closures. [#831] Add tests for ClosureSDKSynchronizer - Added tests are testing in general if the `ClosuresSDKSynchronizer` is correctly calling `Synchronizer` and if the values are correctly returned. - `ClosuresSDKSynchronizer` doesn't contain any logic but it is public API and we should be sure that it works correctly. [#831] Add tests for CombineSDKSynchronizer [#831] Add changelog
2023-03-16 02:11:18 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// MARK: - "Public" API
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
extension CompactBlockProcessor {
func start(retry: Bool = false) async {
if retry {
self.retryAttempts = 0
self.serviceFailureRetryAttempts = 0
self.backoffTimer?.invalidate()
self.backoffTimer = nil
}
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
guard await canStartSync() else {
if await isIdle() {
logger.warn("max retry attempts reached on \(await context.state) state")
await send(event: .failed(ZcashError.compactBlockProcessorMaxAttemptsReached(config.retries)))
} else {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.debug("Warning: compact block processor was started while busy!!!!")
afterSyncHooksManager.insert(hook: .anotherSync)
}
return
}
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
syncTask = Task(priority: .userInitiated) {
await run()
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
}
}
2021-09-17 06:49:58 -07:00
func stop() async {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
syncTask?.cancel()
self.backoffTimer?.invalidate()
self.backoffTimer = nil
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
await stopAllActions()
retryAttempts = 0
serviceFailureRetryAttempts = 0
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
}
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
func latestHeight() async throws -> BlockHeight {
try await blockDownloaderService.latestBlockHeight()
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
}
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// MARK: - Rewind
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
extension CompactBlockProcessor {
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
/// Rewinds to provided height.
/// - Parameter height: height to rewind to. If nil is provided, it will rescan to nearest height (quick rescan)
///
/// - Note: If this is called while sync is in progress then the sync process is stopped first and then rewind is executed.
func rewind(context: AfterSyncHooksManager.RewindContext) async throws {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.debug("Starting rewind")
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
if await isIdle() {
logger.debug("Sync doesn't run. Executing rewind.")
try await doRewind(context: context)
} else {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.debug("Stopping sync because of rewind")
afterSyncHooksManager.insert(hook: .rewind(context))
await stop()
}
}
private func doRewind(context: AfterSyncHooksManager.RewindContext) async throws {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.debug("Executing rewind.")
let lastDownloaded = await latestBlocksDataProvider.maxScannedHeight
let height = Int32(context.height ?? lastDownloaded)
2021-09-17 06:49:58 -07:00
[#888] Make actor from ZcashRustBackendWelding Closes #888. - `ZcashRustBackend` is actor now. So majority of methods in this actor are now async. - Some methods stayed `static` in `ZcashRustBackend`. It would be hard to pass instance of the `ZcashRustBackend` to the places where these methods are used in static manner. And it would change lot of APIs. But it isn't problem from technical perspective because these methods would be `nonisolated` otherwise. - Methods `lastError()` and `getLastError()` in `ZcashRustBackend` are now private. This makes sure that ther won't be aby race condition between other methods and these two error methods. - All the methods for which was `lastError()` used in code now throw error. So `lastError()` is no longer needed outside of the `ZcashRustBackend`. - There are in the public API related to `DerivationTool`. - `DerivationTool` now requires instance of the `ZcashRustBackend`. And `ZcashRustBackend` isn't public type. So `DerivationTool` doesn't have any public constructor now. It can be created only via `Initializer.makeDerivationTool()` instance method. - `deriveUnifiedSpendingKey()` and `deriveUnifiedFullViewingKey()` in `DerivationTool` are now async. It is because these are using `ZcashRustBackend` inside. `DerivationTool` offers alternative (closure and combine) APIs. But downside is that there is no sync API to dervie spending key or viewing key. - Some methods of the `DerivationTool` are now static. These methods don't use anything that requires instance of the `DerivationTool` inside. [#888] Use Sourcery to generate mocks - I wrote mock for `Synchronizer` manually. And it's tedious and long and boring work. - Now `ZcashRustBackendWelding` is changed a lot so it means `MockRustBackend` must be changed a lot. So I decided to introduce `sourcery` to generate mocks from protocols so we don't have to do it manually ever. - To generate mocks go to `ZcashLightClientKit/Tests/TestUtils/Sourcery` directory and run `generateMocks.sh` script. - Your protocol must be mentioned in `AutoMockable.swift` file. Generated mocks are in `AutoMockable.generated.swift` file. [#888] Fix Offline tests - Offline tests target now runs and tests are green. - There is log of changes in tests. But logic is not changed. - Updated `AutoMockable.stencil` so sourcery is able to generate mock as actor when protocol is marked with: `// sourcery: mockActor`. - Last few updates in `ZcashRustBackendWelding`. In previous PR `rewindCacheToHeight` methods was overlooked and it didn't throw error. - Removed `MockRustBackend` and using generated `ZCashRustBackendWeldingMock` instead. - Using generated `SynchronizerMock`. [#888] Fix NetworkTests - Changed a bit how rust backend mock is used in the tests. Introduced `RustBackendMockHelper`. There are some state variables that must be preserved within one instance of the mock. This helper does exactly this. It keeps this state variables in the memory and helping mock to work as expected. [#888] Fix Darkside tests Create ZcashKeyDeriving internal protocol Use New DerivationTool that does not require RustBackend Remove duplicated methods that had been copied over [#888] Fix potentially broken tests I broke the tests because I moved `testTempDirectory` from each `TestCase` to the `Environment`. By this I caused that each tests uses exactly same URL. Which is directly against purpose of `testTempDirectory`. So now each test calls this one and store it to local variable. So each test has unique URL. [#888] Add ability to mock nonisolated methods to AutoMockable.stencil [#888] Add changelog and fix the documentation in ZcashRustBackendWelding [#888] Rename derivation rust backend protocol and remove static methods - Renamed `ZcashKeyDeriving` to `ZcashKeyDerivationBackendWelding`. So the naming scheme is same as for `ZcashRustBackendWelding`. - `ZcashKeyDerivationBackend` is now struct instead of enum. - Methods in `ZcashKeyDerivationBackendWelding` (except one) are no longer static. Because of this the respective methods in `DerivationTool` aren't also static anymore.
2023-03-31 10:10:35 -07:00
let nearestHeight: Int32
do {
nearestHeight = try await rustBackend.getNearestRewindHeight(height: height)
} catch {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
await failure(error)
return await context.completion(.failure(error))
2021-04-19 10:07:50 -07:00
}
2021-09-17 06:49:58 -07:00
// FIXME: [#719] this should be done on the rust layer, https://github.com/zcash/ZcashLightClientKit/issues/719
2021-09-17 06:49:58 -07:00
let rewindHeight = max(Int32(nearestHeight - 1), Int32(config.walletBirthday))
[#888] Make actor from ZcashRustBackendWelding Closes #888. - `ZcashRustBackend` is actor now. So majority of methods in this actor are now async. - Some methods stayed `static` in `ZcashRustBackend`. It would be hard to pass instance of the `ZcashRustBackend` to the places where these methods are used in static manner. And it would change lot of APIs. But it isn't problem from technical perspective because these methods would be `nonisolated` otherwise. - Methods `lastError()` and `getLastError()` in `ZcashRustBackend` are now private. This makes sure that ther won't be aby race condition between other methods and these two error methods. - All the methods for which was `lastError()` used in code now throw error. So `lastError()` is no longer needed outside of the `ZcashRustBackend`. - There are in the public API related to `DerivationTool`. - `DerivationTool` now requires instance of the `ZcashRustBackend`. And `ZcashRustBackend` isn't public type. So `DerivationTool` doesn't have any public constructor now. It can be created only via `Initializer.makeDerivationTool()` instance method. - `deriveUnifiedSpendingKey()` and `deriveUnifiedFullViewingKey()` in `DerivationTool` are now async. It is because these are using `ZcashRustBackend` inside. `DerivationTool` offers alternative (closure and combine) APIs. But downside is that there is no sync API to dervie spending key or viewing key. - Some methods of the `DerivationTool` are now static. These methods don't use anything that requires instance of the `DerivationTool` inside. [#888] Use Sourcery to generate mocks - I wrote mock for `Synchronizer` manually. And it's tedious and long and boring work. - Now `ZcashRustBackendWelding` is changed a lot so it means `MockRustBackend` must be changed a lot. So I decided to introduce `sourcery` to generate mocks from protocols so we don't have to do it manually ever. - To generate mocks go to `ZcashLightClientKit/Tests/TestUtils/Sourcery` directory and run `generateMocks.sh` script. - Your protocol must be mentioned in `AutoMockable.swift` file. Generated mocks are in `AutoMockable.generated.swift` file. [#888] Fix Offline tests - Offline tests target now runs and tests are green. - There is log of changes in tests. But logic is not changed. - Updated `AutoMockable.stencil` so sourcery is able to generate mock as actor when protocol is marked with: `// sourcery: mockActor`. - Last few updates in `ZcashRustBackendWelding`. In previous PR `rewindCacheToHeight` methods was overlooked and it didn't throw error. - Removed `MockRustBackend` and using generated `ZCashRustBackendWeldingMock` instead. - Using generated `SynchronizerMock`. [#888] Fix NetworkTests - Changed a bit how rust backend mock is used in the tests. Introduced `RustBackendMockHelper`. There are some state variables that must be preserved within one instance of the mock. This helper does exactly this. It keeps this state variables in the memory and helping mock to work as expected. [#888] Fix Darkside tests Create ZcashKeyDeriving internal protocol Use New DerivationTool that does not require RustBackend Remove duplicated methods that had been copied over [#888] Fix potentially broken tests I broke the tests because I moved `testTempDirectory` from each `TestCase` to the `Environment`. By this I caused that each tests uses exactly same URL. Which is directly against purpose of `testTempDirectory`. So now each test calls this one and store it to local variable. So each test has unique URL. [#888] Add ability to mock nonisolated methods to AutoMockable.stencil [#888] Add changelog and fix the documentation in ZcashRustBackendWelding [#888] Rename derivation rust backend protocol and remove static methods - Renamed `ZcashKeyDeriving` to `ZcashKeyDerivationBackendWelding`. So the naming scheme is same as for `ZcashRustBackendWelding`. - `ZcashKeyDerivationBackend` is now struct instead of enum. - Methods in `ZcashKeyDerivationBackendWelding` (except one) are no longer static. Because of this the respective methods in `DerivationTool` aren't also static anymore.
2023-03-31 10:10:35 -07:00
do {
[#1140] ClearCache action before anything starts - draft [#1140] ClearCache action before anything starts - ClearCache action right after the idle action, clearing out metadata so the sync process can be fully restored from the DB and live blockchain values only. - InternalSyncProgress removed - InternalSyncProgressStorage removed - Sync process control logic updated, controlled by latestScannedHeight and firstUnenhancedHeight only - cleaned up unused code [#1140] ClearCache action before anything starts - ChecksBeforeSyncAction removed - Offline tests fixed [#1140] ClearCache action before anything starts - fixed injection of a wallet birthday, the sync range must start with wallet BD instead of lower bound [#1140] ClearCache action before anything starts - Network tests fixed - DarkSideTests partially fixed [#1140] ClearCache action before anything starts - rewind actions extension in compact block processor added [#1140] ClearCache action before anything starts - draft [#1140] ClearCache action before anything starts - DarkSideTests fixed [#1140] ClearCache action before anything starts - SyncRanges modified to be even less dependent on ranges, now it holds just 3 values (latest block height, latest scanned height if any, first unenhanced height if any), the rest is computed on the fly [#1140] ClearCache action before anything starts - SyncRanges struct not anymore, refactored to SyncControlData, holding just 3 mentioned values [#1140] ClearCache action before anything starts - cleanup [#1140] ClearCache action before anything starts (#1148) - TODO solved, the UTXOs fetcher doesn't work with range anymore, therefore reporting 100%
2023-06-20 02:59:56 -07:00
try await rewindDownloadBlockAction(to: BlockHeight(rewindHeight))
[#888] Make actor from ZcashRustBackendWelding Closes #888. - `ZcashRustBackend` is actor now. So majority of methods in this actor are now async. - Some methods stayed `static` in `ZcashRustBackend`. It would be hard to pass instance of the `ZcashRustBackend` to the places where these methods are used in static manner. And it would change lot of APIs. But it isn't problem from technical perspective because these methods would be `nonisolated` otherwise. - Methods `lastError()` and `getLastError()` in `ZcashRustBackend` are now private. This makes sure that ther won't be aby race condition between other methods and these two error methods. - All the methods for which was `lastError()` used in code now throw error. So `lastError()` is no longer needed outside of the `ZcashRustBackend`. - There are in the public API related to `DerivationTool`. - `DerivationTool` now requires instance of the `ZcashRustBackend`. And `ZcashRustBackend` isn't public type. So `DerivationTool` doesn't have any public constructor now. It can be created only via `Initializer.makeDerivationTool()` instance method. - `deriveUnifiedSpendingKey()` and `deriveUnifiedFullViewingKey()` in `DerivationTool` are now async. It is because these are using `ZcashRustBackend` inside. `DerivationTool` offers alternative (closure and combine) APIs. But downside is that there is no sync API to dervie spending key or viewing key. - Some methods of the `DerivationTool` are now static. These methods don't use anything that requires instance of the `DerivationTool` inside. [#888] Use Sourcery to generate mocks - I wrote mock for `Synchronizer` manually. And it's tedious and long and boring work. - Now `ZcashRustBackendWelding` is changed a lot so it means `MockRustBackend` must be changed a lot. So I decided to introduce `sourcery` to generate mocks from protocols so we don't have to do it manually ever. - To generate mocks go to `ZcashLightClientKit/Tests/TestUtils/Sourcery` directory and run `generateMocks.sh` script. - Your protocol must be mentioned in `AutoMockable.swift` file. Generated mocks are in `AutoMockable.generated.swift` file. [#888] Fix Offline tests - Offline tests target now runs and tests are green. - There is log of changes in tests. But logic is not changed. - Updated `AutoMockable.stencil` so sourcery is able to generate mock as actor when protocol is marked with: `// sourcery: mockActor`. - Last few updates in `ZcashRustBackendWelding`. In previous PR `rewindCacheToHeight` methods was overlooked and it didn't throw error. - Removed `MockRustBackend` and using generated `ZCashRustBackendWeldingMock` instead. - Using generated `SynchronizerMock`. [#888] Fix NetworkTests - Changed a bit how rust backend mock is used in the tests. Introduced `RustBackendMockHelper`. There are some state variables that must be preserved within one instance of the mock. This helper does exactly this. It keeps this state variables in the memory and helping mock to work as expected. [#888] Fix Darkside tests Create ZcashKeyDeriving internal protocol Use New DerivationTool that does not require RustBackend Remove duplicated methods that had been copied over [#888] Fix potentially broken tests I broke the tests because I moved `testTempDirectory` from each `TestCase` to the `Environment`. By this I caused that each tests uses exactly same URL. Which is directly against purpose of `testTempDirectory`. So now each test calls this one and store it to local variable. So each test has unique URL. [#888] Add ability to mock nonisolated methods to AutoMockable.stencil [#888] Add changelog and fix the documentation in ZcashRustBackendWelding [#888] Rename derivation rust backend protocol and remove static methods - Renamed `ZcashKeyDeriving` to `ZcashKeyDerivationBackendWelding`. So the naming scheme is same as for `ZcashRustBackendWelding`. - `ZcashKeyDerivationBackend` is now struct instead of enum. - Methods in `ZcashKeyDerivationBackendWelding` (except one) are no longer static. Because of this the respective methods in `DerivationTool` aren't also static anymore.
2023-03-31 10:10:35 -07:00
try await rustBackend.rewindToHeight(height: rewindHeight)
} catch {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
await failure(error)
return await context.completion(.failure(error))
}
2021-09-17 06:49:58 -07:00
// clear cache
let rewindBlockHeight = BlockHeight(rewindHeight)
do {
try await blockDownloaderService.rewind(to: rewindBlockHeight)
} catch {
return await context.completion(.failure(error))
}
await resetContext(restoreLastEnhancedHeight: false)
await context.completion(.success(rewindBlockHeight))
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
}
2021-09-17 06:49:58 -07:00
[#1140] ClearCache action before anything starts - draft [#1140] ClearCache action before anything starts - ClearCache action right after the idle action, clearing out metadata so the sync process can be fully restored from the DB and live blockchain values only. - InternalSyncProgress removed - InternalSyncProgressStorage removed - Sync process control logic updated, controlled by latestScannedHeight and firstUnenhancedHeight only - cleaned up unused code [#1140] ClearCache action before anything starts - ChecksBeforeSyncAction removed - Offline tests fixed [#1140] ClearCache action before anything starts - fixed injection of a wallet birthday, the sync range must start with wallet BD instead of lower bound [#1140] ClearCache action before anything starts - Network tests fixed - DarkSideTests partially fixed [#1140] ClearCache action before anything starts - rewind actions extension in compact block processor added [#1140] ClearCache action before anything starts - draft [#1140] ClearCache action before anything starts - DarkSideTests fixed [#1140] ClearCache action before anything starts - SyncRanges modified to be even less dependent on ranges, now it holds just 3 values (latest block height, latest scanned height if any, first unenhanced height if any), the rest is computed on the fly [#1140] ClearCache action before anything starts - SyncRanges struct not anymore, refactored to SyncControlData, holding just 3 mentioned values [#1140] ClearCache action before anything starts - cleanup [#1140] ClearCache action before anything starts (#1148) - TODO solved, the UTXOs fetcher doesn't work with range anymore, therefore reporting 100%
2023-06-20 02:59:56 -07:00
// MARK: - Actions
private extension CompactBlockProcessor {
func rewindDownloadBlockAction(to rewindHeight: BlockHeight?) async throws {
if let downloadAction = actions[.download] as? DownloadAction {
await downloadAction.downloader.rewind(latestDownloadedBlockHeight: rewindHeight)
} else {
throw ZcashError.compactBlockProcessorDownloadBlockActionRewind
}
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// MARK: - Wipe
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
extension CompactBlockProcessor {
func wipe(context: AfterSyncHooksManager.WipeContext) async throws {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.debug("Starting wipe")
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
if await isIdle() {
logger.debug("Sync doesn't run. Executing wipe.")
try await doWipe(context: context)
} else {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.debug("Stopping sync because of wipe")
afterSyncHooksManager.insert(hook: .wipe(context))
await stop()
}
}
private func doWipe(context: AfterSyncHooksManager.WipeContext) async throws {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.debug("Executing wipe.")
context.prewipe()
do {
try await self.storage.clear()
wipeLegacyCacheDbIfNeeded()
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
let fileManager = FileManager.default
if fileManager.fileExists(atPath: config.dataDb.path) {
try fileManager.removeItem(at: config.dataDb)
}
[#1140] ClearCache action before anything starts - draft [#1140] ClearCache action before anything starts - ClearCache action right after the idle action, clearing out metadata so the sync process can be fully restored from the DB and live blockchain values only. - InternalSyncProgress removed - InternalSyncProgressStorage removed - Sync process control logic updated, controlled by latestScannedHeight and firstUnenhancedHeight only - cleaned up unused code [#1140] ClearCache action before anything starts - ChecksBeforeSyncAction removed - Offline tests fixed [#1140] ClearCache action before anything starts - fixed injection of a wallet birthday, the sync range must start with wallet BD instead of lower bound [#1140] ClearCache action before anything starts - Network tests fixed - DarkSideTests partially fixed [#1140] ClearCache action before anything starts - rewind actions extension in compact block processor added [#1140] ClearCache action before anything starts - draft [#1140] ClearCache action before anything starts - DarkSideTests fixed [#1140] ClearCache action before anything starts - SyncRanges modified to be even less dependent on ranges, now it holds just 3 values (latest block height, latest scanned height if any, first unenhanced height if any), the rest is computed on the fly [#1140] ClearCache action before anything starts - SyncRanges struct not anymore, refactored to SyncControlData, holding just 3 mentioned values [#1140] ClearCache action before anything starts - cleanup [#1140] ClearCache action before anything starts (#1148) - TODO solved, the UTXOs fetcher doesn't work with range anymore, therefore reporting 100%
2023-06-20 02:59:56 -07:00
try await rewindDownloadBlockAction(to: nil)
[#831] Add SDKSynchronizer wrappers for non-async API This change introduces two new protocols: `ClosureSynchronizer` and `CombineSynchronizer`. These two protocols define API that doesn't use `async`. So the client can choose exactly which API it wants to use. This change also introduces two new objects: `ClosureSDKSynchronizer` and `CombineSDKSynchronizer`. These two implement the respective protocols mentioned above. Both are structures. Neither of these two keeps any state. Thanks to this each is very cheap to create. And usage of these two isn't mutually exclusive. So devs can really choose the best SDK API for each part of the client app. [#831] Use async inside of the SDKSynchronizer - In general lot of methods inside the `SDKSynchronizer` and `CompactBlockProcessoer` which weren't async are now async. And other changes are made because of this change. - `CompactBlockProcessor` no longer uses Combine to communicate with `SDKSynchronizer`. Reason for this is that Combine doesn't play great with async. Closure passed to `sink` isn't async. - Because of this and because of how our tests work (receiving signals from CBP directly) `CompactBlockProcessor` must be able to handle more event closures. Not just one. So it now has `eventClosures` dictionary. It's little bit strange but it works fine. - `SyncStatus` inside the `SDKSynchronizer` was previously protected by lock. Now it's protected by simple actor wrapper. - Changes in tests are minimal. Changes were mady only because `CompactBlockProcessor` changes from Combine to closures. [#831] Add tests for ClosureSDKSynchronizer - Added tests are testing in general if the `ClosuresSDKSynchronizer` is correctly calling `Synchronizer` and if the values are correctly returned. - `ClosuresSDKSynchronizer` doesn't contain any logic but it is public API and we should be sure that it works correctly. [#831] Add tests for CombineSDKSynchronizer [#831] Add changelog
2023-03-16 02:11:18 -07:00
await context.completion(nil)
} catch {
[#831] Add SDKSynchronizer wrappers for non-async API This change introduces two new protocols: `ClosureSynchronizer` and `CombineSynchronizer`. These two protocols define API that doesn't use `async`. So the client can choose exactly which API it wants to use. This change also introduces two new objects: `ClosureSDKSynchronizer` and `CombineSDKSynchronizer`. These two implement the respective protocols mentioned above. Both are structures. Neither of these two keeps any state. Thanks to this each is very cheap to create. And usage of these two isn't mutually exclusive. So devs can really choose the best SDK API for each part of the client app. [#831] Use async inside of the SDKSynchronizer - In general lot of methods inside the `SDKSynchronizer` and `CompactBlockProcessoer` which weren't async are now async. And other changes are made because of this change. - `CompactBlockProcessor` no longer uses Combine to communicate with `SDKSynchronizer`. Reason for this is that Combine doesn't play great with async. Closure passed to `sink` isn't async. - Because of this and because of how our tests work (receiving signals from CBP directly) `CompactBlockProcessor` must be able to handle more event closures. Not just one. So it now has `eventClosures` dictionary. It's little bit strange but it works fine. - `SyncStatus` inside the `SDKSynchronizer` was previously protected by lock. Now it's protected by simple actor wrapper. - Changes in tests are minimal. Changes were mady only because `CompactBlockProcessor` changes from Combine to closures. [#831] Add tests for ClosureSDKSynchronizer - Added tests are testing in general if the `ClosuresSDKSynchronizer` is correctly calling `Synchronizer` and if the values are correctly returned. - `ClosuresSDKSynchronizer` doesn't contain any logic but it is public API and we should be sure that it works correctly. [#831] Add tests for CombineSDKSynchronizer [#831] Add changelog
2023-03-16 02:11:18 -07:00
await context.completion(error)
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func wipeLegacyCacheDbIfNeeded() {
guard let cacheDbURL = config.cacheDbURL else { return }
guard fileManager.isDeletableFile(atPath: cacheDbURL.pathExtension) else { return }
try? fileManager.removeItem(at: cacheDbURL)
}
}
// MARK: - Switch server
extension CompactBlockProcessor {
func updateService(_ container: DIContainer) {
// LightWalletGRPCService
let updatedLWDService = container.resolve(LightWalletService.self)
(actions[.processSuggestedScanRanges] as? ProcessSuggestedScanRangesAction)?.service = updatedLWDService
(actions[.updateChainTip] as? UpdateChainTipAction)?.service = updatedLWDService
(actions[.updateSubtreeRoots] as? UpdateSubtreeRootsAction)?.service = updatedLWDService
(actions[.validateServer] as? ValidateServerAction)?.service = updatedLWDService
self.service = updatedLWDService
// BlockDownloaderService
let updatedDownloaderService = container.resolve(BlockDownloaderService.self)
(actions[.rewind] as? RewindAction)?.downloaderService = updatedDownloaderService
self.blockDownloaderService = updatedDownloaderService
// LatestBlocksDataProvider
let updatedLBDProvider = container.resolve(LatestBlocksDataProvider.self)
(actions[.scan] as? ScanAction)?.latestBlocksDataProvider = updatedLBDProvider
(actions[.updateChainTip] as? UpdateChainTipAction)?.latestBlocksDataProvider = updatedLBDProvider
self.latestBlocksDataProvider = updatedLBDProvider
// BlockDownloader
let updatedBlockDownloader = container.resolve(BlockDownloader.self)
(actions[.download] as? DownloadAction)?.downloader = updatedBlockDownloader
(actions[.updateChainTip] as? UpdateChainTipAction)?.downloader = updatedBlockDownloader
(actions[.rewind] as? RewindAction)?.downloader = updatedBlockDownloader
self.blockDownloaderService = updatedDownloaderService
// BlockEnhancer
let updatedEnhancer = container.resolve(BlockEnhancer.self)
(actions[.enhance] as? EnhanceAction)?.blockEnhancer = updatedEnhancer
// UTXOFetcher
let updatedUTXOFetcher = container.resolve(UTXOFetcher.self)
(actions[.fetchUTXO] as? FetchUTXOsAction)?.utxoFetcher = updatedUTXOFetcher
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// MARK: - Events
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
extension CompactBlockProcessor {
typealias EventClosure = (Event) async -> Void
enum Event {
/// Event sent when the CompactBlockProcessor presented an error.
case failed(Error)
/// Event sent when the CompactBlockProcessor has finished syncing the blockchain to latest height
case finished(_ lastScannedHeight: BlockHeight)
/// Event sent when the CompactBlockProcessor found a newly mined transaction
case minedTransaction(ZcashTransaction.Overview)
/// Event sent when the CompactBlockProcessor enhanced a bunch of transactions in some range.
case foundTransactions([ZcashTransaction.Overview], CompactBlockRange)
/// Event sent when the CompactBlockProcessor handled a ReOrg.
/// `reorgHeight` is the height on which the reorg was detected.
/// `rewindHeight` is the height that the processor backed to in order to solve the Reorg.
case handledReorg(_ reorgHeight: BlockHeight, _ rewindHeight: BlockHeight)
/// Event sent when progress of some specific action happened.
case syncProgress(Float)
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
/// Event sent when progress of the sync process changes.
case progressUpdated(Float)
/// Event sent when the CompactBlockProcessor fetched utxos from lightwalletd attempted to store them.
case storedUTXOs((inserted: [UnspentTransactionOutputEntity], skipped: [UnspentTransactionOutputEntity]))
/// Event sent when the CompactBlockProcessor starts enhancing of the transactions.
case startedEnhancing
/// Event sent when the CompactBlockProcessor starts fetching of the UTXOs.
case startedFetching
/// Event sent when the CompactBlockProcessor starts syncing.
case startedSyncing
/// Event sent when the CompactBlockProcessor stops syncing.
case stopped
}
func updateEventClosure(identifier: String, closure: @escaping (Event) async -> Void) async {
eventClosures[identifier] = closure
}
private func send(event: Event) async {
for item in eventClosures {
await item.value(event)
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
}
// MARK: - Main loop
extension CompactBlockProcessor {
// This is main loop of the sync process. It simply takes state and try to find action which handles it. If action is found it executes the
// action. If action is not found then loop finishes. Thanks to this it's super easy to identify start point of sync process and end points
// of sync process without any side effects.
//
// Check `docs/cbp_state_machine.puml` file and `docs/images/cbp_state_machine.png` file to see all the state tree. Also when you update state
// tree in the code update this documentation. Image is generated by plantuml tool.
//
// swiftlint:disable:next cyclomatic_complexity
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func run() async {
logger.debug("Starting run")
metrics.cbpStart()
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
await resetContext()
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
while true {
// Sync is starting when the state is `idle`.
if await context.state == .idle {
// Side effect of calling stop is to delete last used download stream. To be sure that it doesn't keep any data in memory.
await stopAllActions()
// Update state to the first state in state machine that can be handled by action.
await context.update(state: .migrateLegacyCacheDB)
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
await syncStarted()
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
if backoffTimer == nil {
await setTimer()
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
let state = await context.state
logger.debug("Handling state: \(state)")
// Try to find action for state.
guard let action = actions[state] else {
// Side effect of calling stop is to delete last used download stream. To be sure that it doesn't keep any data in memory.
await stopAllActions()
if await syncFinished() {
await resetContext()
continue
} else {
break
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
do {
try Task.checkCancellation()
// Execute action.
metrics.actionStart(state)
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
context = try await action.run(with: context) { [weak self] event in
await self?.send(event: event)
if let progressChanged = await self?.compactBlockProgress.hasProgressUpdated(event), progressChanged {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
if let progress = await self?.compactBlockProgress.progress {
await self?.send(event: .progressUpdated(progress))
}
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
await didFinishAction()
[476] CompactBlockProcessor to async/await - getting rid of the Operation Queue - the cleanup is needed - the update of tests is needed - tested and it successfully finishes the sync process [476] CompactBlockProcessor to async/await - old processNewBlocks() removed [476] CompactBlockProcessor to async/await - unused operations removed [476] CompactBlockProcessor to async/await - unit tests update [476] CompactBlockProcessor to async/await - unit tests refactored [476] CompactBlockProcessor to async/await - cleanup of deprecated method [476] CompactBlockProcessor to async/await - fail(error) was called even for canceled tasks but that must be excluded [476] CompactBlockProcessor to async/await - removal of all ZcashOperations from the code (unit test will follow) [476] CompactBlockProcessor to async/await - network tests in building and success order again [476] CompactBlockProcessor to async/await - offline tests in building and success order [476] CompactBlockProcessor to async/await (519) - cleanup of suspending the task [476] CompactBlockProcessor to async/await (519) - most comments resolved [476] CompactBlockProcessor to async/await (519) - thread safe state for both sync and async context [476] CompactBlockProcessor to async/await (519) - fixed build for a sample project [476] CompactBlockProcessor to async/await (519) - func testStartNotifiesSuscriptors() reverted [476] CompactBlockProcessor to async/await (519) - TODO added to track why we used NSLock instead of an Actor - Task priority enhanced [476] CompactBlockProcessor to async/await (519) - cleanup in Tasks and priorities
2022-09-01 05:58:41 -07:00
} catch {
// Side effect of calling stop is to delete last used download stream. To be sure that it doesn't keep any data in memory.
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
await stopAllActions()
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.error("Sync failed with error: \(error)")
// catching the service errors
let serviceError: Bool
switch error {
case ZcashError.serviceGetInfoFailed, ZcashError.serviceLatestBlockFailed,
ZcashError.serviceLatestBlockHeightFailed, ZcashError.serviceBlockRangeFailed,
ZcashError.serviceSubmitFailed, ZcashError.serviceFetchTransactionFailed,
ZcashError.serviceFetchUTXOsFailed, ZcashError.serviceBlockStreamFailed,
ZcashError.serviceSubtreeRootsStreamFailed: serviceError = true
default: serviceError = false
}
if serviceError && self.serviceFailureRetryAttempts < ZcashSDK.serviceFailureRetries {
// This may be false positive communication error that is usually resolved by retry.
// We will try to reset the sync and continue but this will we done at most `ZcashSDK.serviceFailureRetries` times.
logger.error("ServiceError: \(error), retry is available, starting the sync all over again.")
self.serviceFailureRetryAttempts += 1
// Start sync all over again
await resetContext()
} else if Task.isCancelled {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.info("Processing cancelled.")
do {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
if try await syncTaskWasCancelled() {
// Start sync all over again
await resetContext()
} else {
// end the sync loop
break
}
} catch {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
await failure(error)
break
}
} else {
await handleSyncFailure(action: action, error: error)
break
[476] CompactBlockProcessor to async/await - getting rid of the Operation Queue - the cleanup is needed - the update of tests is needed - tested and it successfully finishes the sync process [476] CompactBlockProcessor to async/await - old processNewBlocks() removed [476] CompactBlockProcessor to async/await - unused operations removed [476] CompactBlockProcessor to async/await - unit tests update [476] CompactBlockProcessor to async/await - unit tests refactored [476] CompactBlockProcessor to async/await - cleanup of deprecated method [476] CompactBlockProcessor to async/await - fail(error) was called even for canceled tasks but that must be excluded [476] CompactBlockProcessor to async/await - removal of all ZcashOperations from the code (unit test will follow) [476] CompactBlockProcessor to async/await - network tests in building and success order again [476] CompactBlockProcessor to async/await - offline tests in building and success order [476] CompactBlockProcessor to async/await (519) - cleanup of suspending the task [476] CompactBlockProcessor to async/await (519) - most comments resolved [476] CompactBlockProcessor to async/await (519) - thread safe state for both sync and async context [476] CompactBlockProcessor to async/await (519) - fixed build for a sample project [476] CompactBlockProcessor to async/await (519) - func testStartNotifiesSuscriptors() reverted [476] CompactBlockProcessor to async/await (519) - TODO added to track why we used NSLock instead of an Actor - Task priority enhanced [476] CompactBlockProcessor to async/await (519) - cleanup in Tasks and priorities
2022-09-01 05:58:41 -07:00
}
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
logger.debug("Run ended")
syncTask = nil
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func syncTaskWasCancelled() async throws -> Bool {
logger.info("Sync cancelled.")
await context.update(state: .stopped)
await send(event: .stopped)
return try await handleAfterSyncHooks()
}
private func handleSyncFailure(action: Action, error: Error) async {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
if action.removeBlocksCacheWhenFailed {
await ifTaskIsNotCanceledClearCompactBlockCache()
}
logger.error("Sync failed with error: \(error)")
await failure(error)
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// swiftlint:disable:next cyclomatic_complexity
private func didFinishAction() async {
// This is evalution of the state setup by previous action.
switch await context.state {
case .idle:
break
case .migrateLegacyCacheDB:
break
case .validateServer:
break
case .updateSubtreeRoots:
break
case .updateChainTip:
break
case .processSuggestedScanRanges:
break
case .rewind:
break
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
case .download:
break
case .scan:
break
case .clearAlreadyScannedBlocks:
break
case .enhance:
await send(event: .startedEnhancing)
case .fetchUTXO:
await send(event: .startedFetching)
case .handleSaplingParams:
break
case .clearCache:
break
case .finished:
break
case .failed:
break
case .stopped:
break
}
}
func resetContext(restoreLastEnhancedHeight: Bool = true) async {
let lastEnhancedHeight = await context.lastEnhancedHeight
context = ActionContextImpl(state: .idle)
if restoreLastEnhancedHeight {
await context.update(lastEnhancedHeight: lastEnhancedHeight)
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func syncStarted() async {
logger.debug("Sync started")
// handle start of the sync process
await send(event: .startedSyncing)
}
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func syncFinished() async -> Bool {
logger.debug("Sync finished")
[#1140] ClearCache action before anything starts - draft [#1140] ClearCache action before anything starts - ClearCache action right after the idle action, clearing out metadata so the sync process can be fully restored from the DB and live blockchain values only. - InternalSyncProgress removed - InternalSyncProgressStorage removed - Sync process control logic updated, controlled by latestScannedHeight and firstUnenhancedHeight only - cleaned up unused code [#1140] ClearCache action before anything starts - ChecksBeforeSyncAction removed - Offline tests fixed [#1140] ClearCache action before anything starts - fixed injection of a wallet birthday, the sync range must start with wallet BD instead of lower bound [#1140] ClearCache action before anything starts - Network tests fixed - DarkSideTests partially fixed [#1140] ClearCache action before anything starts - rewind actions extension in compact block processor added [#1140] ClearCache action before anything starts - draft [#1140] ClearCache action before anything starts - DarkSideTests fixed [#1140] ClearCache action before anything starts - SyncRanges modified to be even less dependent on ranges, now it holds just 3 values (latest block height, latest scanned height if any, first unenhanced height if any), the rest is computed on the fly [#1140] ClearCache action before anything starts - SyncRanges struct not anymore, refactored to SyncControlData, holding just 3 mentioned values [#1140] ClearCache action before anything starts - cleanup [#1140] ClearCache action before anything starts (#1148) - TODO solved, the UTXOs fetcher doesn't work with range anymore, therefore reporting 100%
2023-06-20 02:59:56 -07:00
let latestBlockHeightWhenSyncing = await context.syncControlData.latestBlockHeight
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
let latestBlockHeight = await latestBlocksDataProvider.latestBlockHeight
// If `latestBlockHeightWhenSyncing` is 0 then it means that there was nothing to sync in last sync process.
let newerBlocksWereMinedDuringSync =
latestBlockHeightWhenSyncing > 0 && latestBlockHeightWhenSyncing < latestBlockHeight
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
retryAttempts = 0
serviceFailureRetryAttempts = 0
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
consecutiveChainValidationErrors = 0
2021-09-17 06:49:58 -07:00
let lastScannedHeight = await latestBlocksDataProvider.maxScannedHeight
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// Some actions may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in
// cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
await send(event: .progressUpdated(1))
await send(event: .finished(lastScannedHeight))
await context.update(state: .finished)
2021-09-17 06:49:58 -07:00
let walletSummary = try? await rustBackend.getWalletSummary()
await metrics.logCBPOverviewReport(logger, walletSummary: walletSummary)
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// If new blocks were mined during previous sync run the sync process again
if newerBlocksWereMinedDuringSync {
return true
} else {
await setTimer()
return false
}
}
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func failure(_ error: Error) async {
await context.update(state: .failed)
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
logger.error("Fail with error: \(error)")
self.retryAttempts += 1
await send(event: .failed(error))
// don't set a new timer if there are no more attempts.
if hasRetryAttempt() {
await self.setTimer()
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func handleAfterSyncHooks() async throws -> Bool {
let afterSyncHooksManager = self.afterSyncHooksManager
self.afterSyncHooksManager = AfterSyncHooksManager()
if let wipeContext = afterSyncHooksManager.shouldExecuteWipeHook() {
try await doWipe(context: wipeContext)
return false
} else if let rewindContext = afterSyncHooksManager.shouldExecuteRewindHook() {
try await doRewind(context: rewindContext)
return false
} else if afterSyncHooksManager.shouldExecuteAnotherSyncHook() {
logger.debug("Starting new sync.")
return true
} else {
return false
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// MARK: - Utils
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
extension CompactBlockProcessor {
private func setTimer() async {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
let interval = config.blockPollInterval
self.backoffTimer?.invalidate()
2021-09-17 06:49:58 -07:00
let timer = Timer(
timeInterval: interval,
repeats: true,
block: { [weak self] _ in
[#895] Add Sync Session ID Synchronizer State (#906) Closes #895 Add Sync Session ID to `SynchronizerState`. A SyncSession is an attempt to sync the blockchain within the lifetime of a Synchronizer. A Synchronizer can sync many times, when synced it will refresh every ~20 seconds +- random padding. each sync attempt will have a different UUID even if it's from the same instance of SDKSynchronizer. **How are SyncSessions are delimited? With `SyncStatus` changes.** changes from [`.unprepared`|`.error`|`.disconnected`|`.stopped`] to `.syncing` assign a new sessionID to the synchronizer. Any other transitions won't. `areTwoStatusesDifferent ` was refactored to a helper function of `SyncStatus` **How are IDs generated?** ID generation is not mandated but delegated to a protocol `SyncSessionIDGenerator`. Tests inject their own deterministic generator to avoid test flakiness. Default implementation of SyncSessionIDGenerator is ````Swift struct UniqueSyncSessionIDGenerator {} extension UniqueSyncSessionIDGenerator: SyncSessionIDGenerator { func nextID() -> UUID { UUID() } } ```` **SyncSession Pseudo-Atomicity and thread safety** SyncSession is a type alias of a GenericActor holding a UUID ```` typealias SyncSession = GenericActor<UUID> extension SyncSession { /// updates the current sync session to a new value with the given generator /// - Parameters generator: a `SyncSessionIDGenerator` /// - returns: the `UUID` of the newly updated value. @discardableResult func newSession(with generator: SyncSessionIDGenerator) async -> UUID { return await self.update(generator.nextID()) } } ```` Closes #895 SessionTicker struct to control session transitions. switching to `.unprepared` now makes syncID to be `.nullID`
2023-04-07 05:02:05 -07:00
Task { [weak self] in
guard let self else { return }
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
if await self.isIdle() {
if await self.canStartSync() {
self.logger.debug(
"""
Timer triggered: Starting compact Block processor!.
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
Processor State: \(await self.context.state)
attempts: \(await self.retryAttempts)
"""
)
await self.start()
} else if await self.hasRetryAttempt() {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
await self.failure(ZcashError.compactBlockProcessorMaxAttemptsReached(self.config.retries))
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
} else {
await self.latestBlocksDataProvider.updateBlockData()
}
}
2021-09-17 06:49:58 -07:00
}
)
RunLoop.main.add(timer, forMode: .default)
self.backoffTimer = timer
}
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func isIdle() async -> Bool {
return syncTask == nil
}
2021-09-17 06:49:58 -07:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func canStartSync() async -> Bool {
return await isIdle() && hasRetryAttempt()
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func hasRetryAttempt() -> Bool {
retryAttempts < config.retries
}
func determineLowerBound(errorHeight: Int, consecutiveErrors: Int, walletBirthday: BlockHeight) -> BlockHeight {
let offset = min(ZcashSDK.maxReorgSize, ZcashSDK.defaultRewindDistance * (consecutiveErrors + 1))
return max(errorHeight - offset, walletBirthday - ZcashSDK.maxReorgSize)
}
private func stopAllActions() async {
for action in actions.values {
await action.stop()
}
}
private func ifTaskIsNotCanceledClearCompactBlockCache() async {
guard !Task.isCancelled else { return }
do {
try await clearCompactBlockCache()
} catch {
logger.error("`clearCompactBlockCache` failed after error: \(error)")
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
private func clearCompactBlockCache() async throws {
await stopAllActions()
try await storage.clear()
logger.info("Cache removed")
}
}
2021-04-08 10:18:16 -07:00
extension CompactBlockProcessor {
func getUnifiedAddress(accountIndex: Int) async throws -> UnifiedAddress {
[#888] Make actor from ZcashRustBackendWelding Closes #888. - `ZcashRustBackend` is actor now. So majority of methods in this actor are now async. - Some methods stayed `static` in `ZcashRustBackend`. It would be hard to pass instance of the `ZcashRustBackend` to the places where these methods are used in static manner. And it would change lot of APIs. But it isn't problem from technical perspective because these methods would be `nonisolated` otherwise. - Methods `lastError()` and `getLastError()` in `ZcashRustBackend` are now private. This makes sure that ther won't be aby race condition between other methods and these two error methods. - All the methods for which was `lastError()` used in code now throw error. So `lastError()` is no longer needed outside of the `ZcashRustBackend`. - There are in the public API related to `DerivationTool`. - `DerivationTool` now requires instance of the `ZcashRustBackend`. And `ZcashRustBackend` isn't public type. So `DerivationTool` doesn't have any public constructor now. It can be created only via `Initializer.makeDerivationTool()` instance method. - `deriveUnifiedSpendingKey()` and `deriveUnifiedFullViewingKey()` in `DerivationTool` are now async. It is because these are using `ZcashRustBackend` inside. `DerivationTool` offers alternative (closure and combine) APIs. But downside is that there is no sync API to dervie spending key or viewing key. - Some methods of the `DerivationTool` are now static. These methods don't use anything that requires instance of the `DerivationTool` inside. [#888] Use Sourcery to generate mocks - I wrote mock for `Synchronizer` manually. And it's tedious and long and boring work. - Now `ZcashRustBackendWelding` is changed a lot so it means `MockRustBackend` must be changed a lot. So I decided to introduce `sourcery` to generate mocks from protocols so we don't have to do it manually ever. - To generate mocks go to `ZcashLightClientKit/Tests/TestUtils/Sourcery` directory and run `generateMocks.sh` script. - Your protocol must be mentioned in `AutoMockable.swift` file. Generated mocks are in `AutoMockable.generated.swift` file. [#888] Fix Offline tests - Offline tests target now runs and tests are green. - There is log of changes in tests. But logic is not changed. - Updated `AutoMockable.stencil` so sourcery is able to generate mock as actor when protocol is marked with: `// sourcery: mockActor`. - Last few updates in `ZcashRustBackendWelding`. In previous PR `rewindCacheToHeight` methods was overlooked and it didn't throw error. - Removed `MockRustBackend` and using generated `ZCashRustBackendWeldingMock` instead. - Using generated `SynchronizerMock`. [#888] Fix NetworkTests - Changed a bit how rust backend mock is used in the tests. Introduced `RustBackendMockHelper`. There are some state variables that must be preserved within one instance of the mock. This helper does exactly this. It keeps this state variables in the memory and helping mock to work as expected. [#888] Fix Darkside tests Create ZcashKeyDeriving internal protocol Use New DerivationTool that does not require RustBackend Remove duplicated methods that had been copied over [#888] Fix potentially broken tests I broke the tests because I moved `testTempDirectory` from each `TestCase` to the `Environment`. By this I caused that each tests uses exactly same URL. Which is directly against purpose of `testTempDirectory`. So now each test calls this one and store it to local variable. So each test has unique URL. [#888] Add ability to mock nonisolated methods to AutoMockable.stencil [#888] Add changelog and fix the documentation in ZcashRustBackendWelding [#888] Rename derivation rust backend protocol and remove static methods - Renamed `ZcashKeyDeriving` to `ZcashKeyDerivationBackendWelding`. So the naming scheme is same as for `ZcashRustBackendWelding`. - `ZcashKeyDerivationBackend` is now struct instead of enum. - Methods in `ZcashKeyDerivationBackendWelding` (except one) are no longer static. Because of this the respective methods in `DerivationTool` aren't also static anymore.
2023-03-31 10:10:35 -07:00
try await rustBackend.getCurrentAddress(account: Int32(accountIndex))
2021-04-08 10:18:16 -07:00
}
func getSaplingAddress(accountIndex: Int) async throws -> SaplingAddress {
try await getUnifiedAddress(accountIndex: accountIndex).saplingReceiver()
2021-04-08 10:18:16 -07:00
}
func getTransparentAddress(accountIndex: Int) async throws -> TransparentAddress {
try await getUnifiedAddress(accountIndex: accountIndex).transparentReceiver()
2021-04-08 10:18:16 -07:00
}
}
extension CompactBlockProcessor {
func refreshUTXOs(tAddress: TransparentAddress, startHeight: BlockHeight) async throws -> RefreshedUTXOs {
2021-04-08 10:18:16 -07:00
let dataDb = self.config.dataDb
[476] CompactBlockProcessor to async/await - getting rid of the Operation Queue - the cleanup is needed - the update of tests is needed - tested and it successfully finishes the sync process [476] CompactBlockProcessor to async/await - old processNewBlocks() removed [476] CompactBlockProcessor to async/await - unused operations removed [476] CompactBlockProcessor to async/await - unit tests update [476] CompactBlockProcessor to async/await - unit tests refactored [476] CompactBlockProcessor to async/await - cleanup of deprecated method [476] CompactBlockProcessor to async/await - fail(error) was called even for canceled tasks but that must be excluded [476] CompactBlockProcessor to async/await - removal of all ZcashOperations from the code (unit test will follow) [476] CompactBlockProcessor to async/await - network tests in building and success order again [476] CompactBlockProcessor to async/await - offline tests in building and success order [476] CompactBlockProcessor to async/await (519) - cleanup of suspending the task [476] CompactBlockProcessor to async/await (519) - most comments resolved [476] CompactBlockProcessor to async/await (519) - thread safe state for both sync and async context [476] CompactBlockProcessor to async/await (519) - fixed build for a sample project [476] CompactBlockProcessor to async/await (519) - func testStartNotifiesSuscriptors() reverted [476] CompactBlockProcessor to async/await (519) - TODO added to track why we used NSLock instead of an Actor - Task priority enhanced [476] CompactBlockProcessor to async/await (519) - cleanup in Tasks and priorities
2022-09-01 05:58:41 -07:00
let stream: AsyncThrowingStream<UnspentTransactionOutputEntity, Error> = blockDownloaderService.fetchUnspentTransactionOutputs(
tAddress: tAddress.stringEncoded,
startHeight: startHeight
)
[476] CompactBlockProcessor to async/await - getting rid of the Operation Queue - the cleanup is needed - the update of tests is needed - tested and it successfully finishes the sync process [476] CompactBlockProcessor to async/await - old processNewBlocks() removed [476] CompactBlockProcessor to async/await - unused operations removed [476] CompactBlockProcessor to async/await - unit tests update [476] CompactBlockProcessor to async/await - unit tests refactored [476] CompactBlockProcessor to async/await - cleanup of deprecated method [476] CompactBlockProcessor to async/await - fail(error) was called even for canceled tasks but that must be excluded [476] CompactBlockProcessor to async/await - removal of all ZcashOperations from the code (unit test will follow) [476] CompactBlockProcessor to async/await - network tests in building and success order again [476] CompactBlockProcessor to async/await - offline tests in building and success order [476] CompactBlockProcessor to async/await (519) - cleanup of suspending the task [476] CompactBlockProcessor to async/await (519) - most comments resolved [476] CompactBlockProcessor to async/await (519) - thread safe state for both sync and async context [476] CompactBlockProcessor to async/await (519) - fixed build for a sample project [476] CompactBlockProcessor to async/await (519) - func testStartNotifiesSuscriptors() reverted [476] CompactBlockProcessor to async/await (519) - TODO added to track why we used NSLock instead of an Actor - Task priority enhanced [476] CompactBlockProcessor to async/await (519) - cleanup in Tasks and priorities
2022-09-01 05:58:41 -07:00
var utxos: [UnspentTransactionOutputEntity] = []
do {
for try await utxo in stream {
utxos.append(utxo)
2021-04-08 10:18:16 -07:00
}
return await storeUTXOs(utxos, in: dataDb)
[476] CompactBlockProcessor to async/await - getting rid of the Operation Queue - the cleanup is needed - the update of tests is needed - tested and it successfully finishes the sync process [476] CompactBlockProcessor to async/await - old processNewBlocks() removed [476] CompactBlockProcessor to async/await - unused operations removed [476] CompactBlockProcessor to async/await - unit tests update [476] CompactBlockProcessor to async/await - unit tests refactored [476] CompactBlockProcessor to async/await - cleanup of deprecated method [476] CompactBlockProcessor to async/await - fail(error) was called even for canceled tasks but that must be excluded [476] CompactBlockProcessor to async/await - removal of all ZcashOperations from the code (unit test will follow) [476] CompactBlockProcessor to async/await - network tests in building and success order again [476] CompactBlockProcessor to async/await - offline tests in building and success order [476] CompactBlockProcessor to async/await (519) - cleanup of suspending the task [476] CompactBlockProcessor to async/await (519) - most comments resolved [476] CompactBlockProcessor to async/await (519) - thread safe state for both sync and async context [476] CompactBlockProcessor to async/await (519) - fixed build for a sample project [476] CompactBlockProcessor to async/await (519) - func testStartNotifiesSuscriptors() reverted [476] CompactBlockProcessor to async/await (519) - TODO added to track why we used NSLock instead of an Actor - Task priority enhanced [476] CompactBlockProcessor to async/await (519) - cleanup in Tasks and priorities
2022-09-01 05:58:41 -07:00
} catch {
[#361] Introduce ZcashError (#1005) This PR introduces `ZcashError` enum. This enum represents any error that can be thrown inside of the SDK and outside of the SDK. Also `ZcashError` is used in `LightWalletGRPCService` and handled in `CompactBlockProcessor` as example. Why enum? First I tried this with some structure which contained code, message and underlyingError. Problem was when some specific place in the SDK would like to attach some additional data to error. I didn't want to add some generic dictionary to store anything with the error. So I used enum to identify error. Each member can have specified amount of associated values. So specific error can bring some context data. And it's type safe. Each error has also a code. Relationship between errors and codes is 1:1. It may looks bit redundant but it's important. The client app now can choose how to process errors. Either identify those by the error itself or by code. Definition or errors and codes is in `ZcashErrorDefinition`. And then `ZcashError` and `ZcashErrorCode` are generated by Sourcery. Thanks to this it is easier to maintain the final code. And it gives us ability to generate any kind of documentation for the errors and codes. I created simple example of this in this PR. And it doesn't make the SDK completely dependent on the Sourcery. Final structures aren't super complicated and can be written manually if needed. [#923] Update error handling in DatabaseStorageManager.swift - cleanup of DatabaseStorageManager, not used anymore - ZcashError for SimpleConnectionProvider Revert "[#923] Update error handling in DatabaseStorageManager.swift" This reverts commit 94e028d31a0f6635800c297eb741db74c6a6ff45. Fix script which generates ZcashError [#922] Update error handling in DatabaseMigrationManager.swift Closes #922 [#923] Update error handling in DatabaseStorageManager.swift - The DatabaseStorageManager is not used so I deleted it - SimpleConnectionProvider's errors updated Fix tests [#955] Update error handling in SaplingParameterDownloader Closes #955 [#936] Update error handling in NotesDao Closes #936 [#935] Update error handling in BlockDao Closes #935 [#931] InternalSyncProgress.computeNextState doesn't need to throw Closes #931 [#950] Update error handling in rust backend Closes #949 Closes #950 [#941] Update error handling in AccountEntity Closes #941 [#928] Update error handling in FSCompactBlockRepository Closes #928 [#925] Update error handling in BlockDownloaderService (#974) - BlockDownloaderService errors updated [#924] Update error handling in BlockDownloader (#973) - BlockDownloaderStream nextBlock updated [#942] Update error handling in TransactionEntity (#977) - ZcashTransaction init errors converted to the ZcashError [#939] Update error handling in TransactionDao (#976) - TransactionRepositoryError removed and replaced with ZcashError - all TransactionDAO errors converted to ZcashError [#943] Update error handling in ZcashCompactBlock Closes #943 [#945] Update error handling in Memo Closes #945 [#934] Update error handling in Checkpoint Closes #944 Closes #934 [#938] Update error handling in PendingTransactionDao Closes #938 [#926] Update error handling in BlockEnhancer - WIP, switching to transaction repository to unblock this ticket [#926] Update error handling in BlockEnhancer - enhancer's errors done [#926] Update error handling in BlockEnhancer (#994) - cleanup [#952] Update error handling in DerivationTool Closes #952 [#932] Update error handling in BlockValidator Closes #932 [#940] Update error handling in UnspentTransactionOutputDao Closes #940 [#946] Update error handling in WalletTypes Closes #946 [#954] Update error handling in WalletTransactionEncoder Closes #954 [#953] Update error handling in PersistentTransactionManager Closes #953 [#956] Update error handling in Initializer Closes #956 [#947] Update error handling in Zatoshi (#996) - Zatoshi's errors converted to ZcashError [#927] Update error handling in UTXOFetcher (#997) - UTXOFetcher resolved Use let instead of var where applicable In the SDK `var` was used on places where `let` would be sufficient. And default strategy in Swift should use use `let` until mutability is required. So all these places are changed. No logic is changed. [#933] Update error handling in CompactBlockProcessor - CompactBlockProcessor's errors refactored to ZcashError [#933] Update error handling in CompactBlockProcessor #999 - comments addressed [#951] Update error handling in SDKSynchronizer - SDKSynchronizer's errors refactored to ZcashError [#951] Update error handling in SDKSynchronizer (#1002) - comments resolved Make DerivationTool constructor public DerivationTool.init should be public. This was removed by accident when adopting async. [#361] Add changelog
2023-04-24 14:15:20 -07:00
throw error
2021-04-08 10:18:16 -07:00
}
}
private func storeUTXOs(_ utxos: [UnspentTransactionOutputEntity], in dataDb: URL) async -> RefreshedUTXOs {
2021-09-17 06:49:58 -07:00
var refreshed: [UnspentTransactionOutputEntity] = []
var skipped: [UnspentTransactionOutputEntity] = []
2021-04-08 10:18:16 -07:00
for utxo in utxos {
do {
[#888] Make actor from ZcashRustBackendWelding Closes #888. - `ZcashRustBackend` is actor now. So majority of methods in this actor are now async. - Some methods stayed `static` in `ZcashRustBackend`. It would be hard to pass instance of the `ZcashRustBackend` to the places where these methods are used in static manner. And it would change lot of APIs. But it isn't problem from technical perspective because these methods would be `nonisolated` otherwise. - Methods `lastError()` and `getLastError()` in `ZcashRustBackend` are now private. This makes sure that ther won't be aby race condition between other methods and these two error methods. - All the methods for which was `lastError()` used in code now throw error. So `lastError()` is no longer needed outside of the `ZcashRustBackend`. - There are in the public API related to `DerivationTool`. - `DerivationTool` now requires instance of the `ZcashRustBackend`. And `ZcashRustBackend` isn't public type. So `DerivationTool` doesn't have any public constructor now. It can be created only via `Initializer.makeDerivationTool()` instance method. - `deriveUnifiedSpendingKey()` and `deriveUnifiedFullViewingKey()` in `DerivationTool` are now async. It is because these are using `ZcashRustBackend` inside. `DerivationTool` offers alternative (closure and combine) APIs. But downside is that there is no sync API to dervie spending key or viewing key. - Some methods of the `DerivationTool` are now static. These methods don't use anything that requires instance of the `DerivationTool` inside. [#888] Use Sourcery to generate mocks - I wrote mock for `Synchronizer` manually. And it's tedious and long and boring work. - Now `ZcashRustBackendWelding` is changed a lot so it means `MockRustBackend` must be changed a lot. So I decided to introduce `sourcery` to generate mocks from protocols so we don't have to do it manually ever. - To generate mocks go to `ZcashLightClientKit/Tests/TestUtils/Sourcery` directory and run `generateMocks.sh` script. - Your protocol must be mentioned in `AutoMockable.swift` file. Generated mocks are in `AutoMockable.generated.swift` file. [#888] Fix Offline tests - Offline tests target now runs and tests are green. - There is log of changes in tests. But logic is not changed. - Updated `AutoMockable.stencil` so sourcery is able to generate mock as actor when protocol is marked with: `// sourcery: mockActor`. - Last few updates in `ZcashRustBackendWelding`. In previous PR `rewindCacheToHeight` methods was overlooked and it didn't throw error. - Removed `MockRustBackend` and using generated `ZCashRustBackendWeldingMock` instead. - Using generated `SynchronizerMock`. [#888] Fix NetworkTests - Changed a bit how rust backend mock is used in the tests. Introduced `RustBackendMockHelper`. There are some state variables that must be preserved within one instance of the mock. This helper does exactly this. It keeps this state variables in the memory and helping mock to work as expected. [#888] Fix Darkside tests Create ZcashKeyDeriving internal protocol Use New DerivationTool that does not require RustBackend Remove duplicated methods that had been copied over [#888] Fix potentially broken tests I broke the tests because I moved `testTempDirectory` from each `TestCase` to the `Environment`. By this I caused that each tests uses exactly same URL. Which is directly against purpose of `testTempDirectory`. So now each test calls this one and store it to local variable. So each test has unique URL. [#888] Add ability to mock nonisolated methods to AutoMockable.stencil [#888] Add changelog and fix the documentation in ZcashRustBackendWelding [#888] Rename derivation rust backend protocol and remove static methods - Renamed `ZcashKeyDeriving` to `ZcashKeyDerivationBackendWelding`. So the naming scheme is same as for `ZcashRustBackendWelding`. - `ZcashKeyDerivationBackend` is now struct instead of enum. - Methods in `ZcashKeyDerivationBackendWelding` (except one) are no longer static. Because of this the respective methods in `DerivationTool` aren't also static anymore.
2023-03-31 10:10:35 -07:00
try await rustBackend.putUnspentTransparentOutput(
2021-04-08 10:18:16 -07:00
txid: utxo.txid.bytes,
index: utxo.index,
script: utxo.script.bytes,
value: Int64(utxo.valueZat),
[#888] Make actor from ZcashRustBackendWelding Closes #888. - `ZcashRustBackend` is actor now. So majority of methods in this actor are now async. - Some methods stayed `static` in `ZcashRustBackend`. It would be hard to pass instance of the `ZcashRustBackend` to the places where these methods are used in static manner. And it would change lot of APIs. But it isn't problem from technical perspective because these methods would be `nonisolated` otherwise. - Methods `lastError()` and `getLastError()` in `ZcashRustBackend` are now private. This makes sure that ther won't be aby race condition between other methods and these two error methods. - All the methods for which was `lastError()` used in code now throw error. So `lastError()` is no longer needed outside of the `ZcashRustBackend`. - There are in the public API related to `DerivationTool`. - `DerivationTool` now requires instance of the `ZcashRustBackend`. And `ZcashRustBackend` isn't public type. So `DerivationTool` doesn't have any public constructor now. It can be created only via `Initializer.makeDerivationTool()` instance method. - `deriveUnifiedSpendingKey()` and `deriveUnifiedFullViewingKey()` in `DerivationTool` are now async. It is because these are using `ZcashRustBackend` inside. `DerivationTool` offers alternative (closure and combine) APIs. But downside is that there is no sync API to dervie spending key or viewing key. - Some methods of the `DerivationTool` are now static. These methods don't use anything that requires instance of the `DerivationTool` inside. [#888] Use Sourcery to generate mocks - I wrote mock for `Synchronizer` manually. And it's tedious and long and boring work. - Now `ZcashRustBackendWelding` is changed a lot so it means `MockRustBackend` must be changed a lot. So I decided to introduce `sourcery` to generate mocks from protocols so we don't have to do it manually ever. - To generate mocks go to `ZcashLightClientKit/Tests/TestUtils/Sourcery` directory and run `generateMocks.sh` script. - Your protocol must be mentioned in `AutoMockable.swift` file. Generated mocks are in `AutoMockable.generated.swift` file. [#888] Fix Offline tests - Offline tests target now runs and tests are green. - There is log of changes in tests. But logic is not changed. - Updated `AutoMockable.stencil` so sourcery is able to generate mock as actor when protocol is marked with: `// sourcery: mockActor`. - Last few updates in `ZcashRustBackendWelding`. In previous PR `rewindCacheToHeight` methods was overlooked and it didn't throw error. - Removed `MockRustBackend` and using generated `ZCashRustBackendWeldingMock` instead. - Using generated `SynchronizerMock`. [#888] Fix NetworkTests - Changed a bit how rust backend mock is used in the tests. Introduced `RustBackendMockHelper`. There are some state variables that must be preserved within one instance of the mock. This helper does exactly this. It keeps this state variables in the memory and helping mock to work as expected. [#888] Fix Darkside tests Create ZcashKeyDeriving internal protocol Use New DerivationTool that does not require RustBackend Remove duplicated methods that had been copied over [#888] Fix potentially broken tests I broke the tests because I moved `testTempDirectory` from each `TestCase` to the `Environment`. By this I caused that each tests uses exactly same URL. Which is directly against purpose of `testTempDirectory`. So now each test calls this one and store it to local variable. So each test has unique URL. [#888] Add ability to mock nonisolated methods to AutoMockable.stencil [#888] Add changelog and fix the documentation in ZcashRustBackendWelding [#888] Rename derivation rust backend protocol and remove static methods - Renamed `ZcashKeyDeriving` to `ZcashKeyDerivationBackendWelding`. So the naming scheme is same as for `ZcashRustBackendWelding`. - `ZcashKeyDerivationBackend` is now struct instead of enum. - Methods in `ZcashKeyDerivationBackendWelding` (except one) are no longer static. Because of this the respective methods in `DerivationTool` aren't also static anymore.
2023-03-31 10:10:35 -07:00
height: utxo.height
)
refreshed.append(utxo)
2021-04-08 10:18:16 -07:00
} catch {
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
logger.info("failed to put utxo - error: \(error)")
2021-04-08 10:18:16 -07:00
skipped.append(utxo)
}
}
return (inserted: refreshed, skipped: skipped)
}
}
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
// MARK: - Config provider
extension CompactBlockProcessor {
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
actor ConfigProvider {
var config: Configuration
init(config: Configuration) {
self.config = config
}
- [#679] Implementation of the File-system based block cache (#679) Closes https://github.com/zcash/ZcashLightClientKit/issues/697 Closes https://github.com/zcash/ZcashLightClientKit/issues/720 Closes https://github.com/zcash/ZcashLightClientKit/issues/587 Closes https://github.com/zcash/ZcashLightClientKit/issues/667 Closes https://github.com/zcash/ZcashLightClientKit/issues/443 Closes https://github.com/zcash/ZcashLightClientKit/issues/754 - [#790] Fix ShieldFundsTests Closes #790 Removes comments on `ShieldFundsTests` since those issues have been fixed Depends on zcash-light-client-ffi changes that adopt newer versions of librustzcash crates `zcash_primitives 0.10`, `zcash_client_backend 0.7`, `zcash_proofs 0.10`, `zcash_client_sqlite 0.5.0`. Also allows wallets to define a shielding_threshold and will set foundations to customize minimum confirmations for balances, spends and shielding operations. **Test Bootstrapping** - `ZcashCompactBlockDescriptor`: struct that holds functions to describe blocks as filenames and compare those filenames `ZcashCompactBlockDescriptor.live` has the actual implementation but it can be replaced by mocks if needed on Tests main implementations are held under `FSCompactBlockRepository.filenameDescription` and `FSCompactBlockRepository.filenameComparison` on a separate extention `DirectoryListingProviders` provide two default implementations of listing a directory deterministically. `FileManager` does not define a sorting and needs to be done in-memory by calling `.sorted()` on the resulting collection. If this is a big toll on performance it can be changed to a POSIX implementation but this is good for now. `ZcashCompactBlockDescriptor` adds a `height` helper function to turn a filename into the height of the block stored. Implemented `func latestHeight() throws -> BlockHeight ` that returns the blockheight by querying the cache directory in a sorted fashion and getting the last value and turning the filename into a `BlockHeight` Added `Meta` struct to ZcashCompactBlock. Tests implemented: - `filterBlockFiles` - `testClearTheCache` - `testLatestHeightEmptyCacheThrows` - `testLatestHeightEmptyCacheThrowsAsync` - `testRewindEmptyCacheDoesNothing` - `testRewindEmptyCacheDoesNothingAsync` - `testWhenBlockIsStoredItFollowsTheDescribedFormat` - `testWhenBlockIsStoredItFollowsTheFilenameConvention` - `testGetLatestHeight` - `testRewindDeletesTheRightBlocks` test - `testPerformanceExample` test. This isn't a real performance test because the API doesn't work with async/await yet adopts `shield_funds` shielding threshold parameter Implements `initBlockMetadataDb` and fix tests Renames dbCache parameter to `fsBlockDbRoot`. Builds but tests don't pass. Removes cacheDb uses from code. Testing utilities still persist. Added needed information in MIGRATING and CHANGELOG. Added helper to perform deletion of legacy db and creation a the new file system backed cache. Renames parameters and changes code where needed. Network Constants turned into `enum` with static methods. DeletelastDownloadedBlock helper from initializer Removes CompactBlockStorage and CompactBlockEntity. Implements `latestCachedBlockHeight` on rustbackend. *Replaces dependencies on ZcashRustWelding with `FSMetadataStore`* This allows the tests to not depend in a particular implementation of either the MockRustBackend of or ZcashRustBackend. Also provides a way to test errors properly and switch implementations of critical areas like `writeBlocks`.
2023-02-02 08:58:12 -08:00
[#700] CompactBlockProcessor as state machine proof of concept - For now I created `CompactBlockProcessorNG` where I started with implementation of the state machine. I did it to not break the rest of the SDK. This change will be merged to the feature branch. And before it is merged to `main` branch code from `CompactBlockProcessorNG` will be moved to `CompactBlockProcessor`. - The new code is not used. It just shows and explains how it is done. It is proof of concept. - I did put either commented current code or comment to some places to explain what should be done there. - New important data types: - `ActionContext` is context that can hold any data that needs to be shared between actions. For example sync ranges or current state. - `CBPState` is state of the `CompactBlockProcessor`. Each state is handled by one action. This doesn't apply to terminal states like `finished` or `failed`. - `ActionProgress` is very similar to `CompactBlockProgress`. Different actions reports progress differently and `ActionProgress` represents this. - `Action` is protocol that defines API of an action. It has one run method that executes the code of the action - CBP first creates actions for (almost) each state in `makeActions()` method. Then the "magic" is done in `CompactBlockProcessorNG.run()` method. Here is main loop which takes action for current state and execute it. It's expected that action does it's work and then updates the context with new state. And this happens until some terminal state (`finished`, `failed`, `stopped`) is reached. - After the transition to state machine API of the `CompactBlockProcessor` should stay the same. No changes should be required in `SDKSynchronizer`. [#700] Add documentation for CompactBlockProcessor state machine - plantuml tool is used to generate diagram. [#1054] Add config to state machine CBP Closes #1054 [#1043] Implement DownloadAction Closes #1043 [#1049] Implement ValidateAction Closes #1049 [#1050] Implement ValidateServerAction Closes #1050 [#1056] Add constructors to state machine CBP Closes #1056 [#1061] Add failure methods for state machine CBP Closes #1061 [#1055] Implement retry timer to state machine CBP Closes #1055 [#1057] Implement start for state machine CBP Closes #1057 [#1058] Implement stop for state machine CBP Closes #1058 [#1052] Implement AfterSyncHooksManager when using state machine CBP Closes #1052 [#1060] Implement wipe for state machine CBP Closes #1060 [#1059] Implement rewind for state machine CBP Closes #1059 [#700] Add idle state to CBP state machine This is required so the CBP can detect start of the sync process. [#700] Implement sending of some events from CompactBlockProcessorNG [#700] Implement progress reporting in state machine CBP [#1045] Implement FetchUTXOsAction - draft of the fetching [#1045] Implement FetchUTXOsAction - updated the way Actions communicate data back to the CBP - used this mechanism to pass result of utxos fetch so it's passed to the SDKSynchronizer as an Event [#1042] Implement ComputeSyncRangesAction Closes #1042 [#700] Implement cache clearing when some actions fail [#1043] Fix batch range computation in DownloadAction [#1046] Implement SaplingParamsAction - action for sapling param files finished [#1048] Implement ScanDownloadedButUnscannedAction - scan downloaded but unscanned blocks [#1047] Implement ScanAction - scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message [#1044] Implement EnhanceAction Closes #1044 [#1041] Implement ClearCacheAction Closes #1041 [#1040] Implement ClearAlreadyScannedBlocksAction Closes #1040 [#1039] Implement ChecksBeforeSyncAction Closes #1039 [#700] Make CBP state machine work [#1050] Implement ValidateServerAction - broken tests commented out and tracked in the tickets - new test for ValidateServerAction [#1051] Update how progress is computed after switch to state machine Closes #1051 - new proposal for the progress computation - OverallProgress value is passed to the Synchronizer as a Float - OverallProgress is a result of fetch, scan and enhance operations - Order of actions no longer influences the computation - Actions report partial updates, CompactBlockProgress actor holds current state and computes the OverallProgress [#1049] Implement ValidateAction - synchronizer offline tests updated so it compiles, review is requested in a different ticket - ValidateAction tests added - BlockValidator mock generated [#1047] Implement ScanAction - ScanAction tests - refactor of validateAction -> validateServerAction - generated few more mocks for the DI [#1045] Implement FetchUTXOsAction - FetchUTXOsAction tests - UTXOFetcher mocks [#1045] Implement FetchUTXOsAction - enhanced with mocked values and more checks [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - SaplingParamsAction tests - added TODO for TestCoordinator reset() - SaplingParametersHandler mock added [#1046] Implement SaplingParamsAction - rebased so I get functionality of improved mock checks - enhanced SaplingParamsAction tests - enhanced ValidateAction tests - enhanced ScanAction tests [#1046] Implement SaplingParamsAction - scanAction tests more checks added [#1044] Implement EnhanceAction - EnhanceAction tests focused on 2 different methods: - decideWhatToDoNext covered separately, decisions where the state machine goes next - run tests for different cases - new mocks generated for enhacer - some typos fixed [#1044] Implement EnhanceAction (#1107) - empty assert messages fixed [#700] Get rid of ScanDownloadedButUnscannedAction Before the state machine download and scan was called in one loop. And processing range for one batch was same for both of them. Therefore there was code which scanned downloaded but not scanned blocks. But now download and scan are independent. So it is possible to remove `ScanDownloadedButUnscannedAction`. [#700] Make NetworkTests compilable Some tests are disabled for now (list is in #1115). And `NetworkTests` can be compiled and all the enabled tests work. [#1043] Implement DownloadAction - DownloadAction tests - BlockDownloader mock [#1043] Implement DownloadAction (#1110) - support functions set to private [#1039] Implement ChecksBeforeSyncAction - ChecksBeforeSyncAction tests - all support functions in Action tests are set to private - let _ = -> _ = refactor - CompactBlockRepository mock added [#1040] Implement ClearAlreadyScannedBlocksAction - Implement ClearAlreadyScannedBlocksAction tests - CompactBlockRepository mock added [#1041] Implement ClearCacheAction - ClearCacheAction tests - CompactBlockRepository mock added [#1042] Implement ComputeSyncRangesAction - ComputeSyncRangesAction tests - fixed all tests after merge of latest SDK changes related InternalSyncProgress - all actions marked as final class [#1042] Implement ComputeSyncRangesAction (#1120) - Custom LatestBlocksDataProviderMock removed from the project [#1122] Implement FileManager protocol and dependency - ZcashFileManager implemented - MigrateLegacyCacheDBAction refactored to be dependent on ZcashFileManager - ZcashFileManager mock added [#1122] Implement FileManager protocol and dependency (#1124) - code cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests WIP - tests naming cleanup [#1121] Implement MigrateLegacyCacheDBAction - MigrateLegacyCacheDBAction tests finished [#700] Fix DarksideTests Closes #1102 Some tests that can't be compiled are disabled for now. List is in #1126. This PR contains multiple fixes. Most of the fixes is done in the code. Not in the tests. That is good news. Fixes: - `config` inside `CompactBlockProcessor` can be updated during the tests. And it must be also updated inside the actions. So `ConfigProvider` is added and it is wrapper for config that is passed to any instance of `Action` and provides updated config. - Fixed `EnhanceAction`. Now it should update all the blocks in the enhance range even when the remaining count of blocks is lower than 1000. - Fixed `fail()` and `validationFailed()`. These two were canceling `syncTask`. But that stopped run loop in a bad way. [#1129] Final check of all State Machine Action tests - XTCAsset messages checked - test naming checked and fixed [#1126] Fix DarksideTests in state machine branch Closes #1126 Fix offline tests Closes #1098 Closes #1095 Closes #1094 Most of the tests is removed. Either the code that was tested doesn't exists. Or now tests for state machine actions do this work. [#1115] Fix NetworkTests in state machine branch Closes #1115 [#700] Fix progress reporting Some actions in the sync process may not run. For example there are no transactions to enhance and therefore there is no enhance progress. And in cases like this computation of final progress won't work properly. So let's fake 100% progress at the end of the sync process.
2023-05-05 08:04:13 -07:00
func update(config: Configuration) async {
self.config = config
[#209] Add support for multiple instances of the SDKSynchronizer Closes #209. [#845] Introduce ZcashSynchronizerAlias enum Closes #845. [#852] SDKSynchronizer using queues label based on the alias Closes #852. [#847] Remove posibility to use DatabaseStorageManager as singleton Closes #847. [#850] Remove synchronizerConnectionStateChanged notification Closes #850. [#855] Add check if the Alias is already used Closes #855 - Added `UsedAliasesChecker` utility which is used to register aliases that are in use. - `prepare()` and `wipe()` methods now check if the current alias can't be used and if not then `InitializerError.aliasAlreadyInUse` is thrown/emitted. - Some public methods that could cause harm if used with the Alias that is already in use now throw `SynchronizerError.notPrepared`. Thanks to this the client app is forced to call `prepare()` first. And `prepare()` does check for the Alias. - Added tests for new conditions. [#849] Make InternalSyncProgress aware of the Alias Closes #849. [#853] Only instance with default Alias migrates legacy cache DB Closes #853. [#851] Apply the Alias to the URLs Closes #851. - `Initializer` now updates paths according to alias before paths are used anywhere in the SDK. - Paths update can fail. It would be incovenient for the client apps to handle errors thrown from `Initiliazer` constructor. So the error is then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`. [#846] Stop using SDKMetrics as singleton (#862) - metrics are not longer a singleton - tests fixed - metrics outside init of the synchronizer [#848] Make logger aware of the alias - logger is now an instance passed throughout the sdk instead of a static proxy [#848] Make logger aware of the alias (#868) - comments addressed [#848] Make logger aware of the alias (#868) - returning protocol back Fix typos [#856] Add possibility to test multiple synchronizers in the sample app Closes #856. - Added `alias` property to `Synchronizer`. - Added `SyncBlocksListViewController` which provides UI to use multiple synchronizers at once. [#209] Add changelog - Add changelog for #209. - Overall improve readability of the rendered changelog. Tickets references are now prefixed with `###` instead of `- `. Fix compilation
2023-03-22 05:47:32 -07:00
}
}
}