From bfb013d7c9b9ba24fe4094d3ecdc3c646be83ab4 Mon Sep 17 00:00:00 2001 From: pankcuf Date: Tue, 20 Jun 2023 18:22:44 +0700 Subject: [PATCH 1/8] feat: core v0.19.2 support --- DashSync.podspec | 2 +- .../shared/MasternodeLists/MNT530000_70228.dat | Bin 0 -> 83712 bytes .../shared/Models/Chain/DSChainCheckpoints.h | 4 ++-- DashSync/shared/Models/Chain/DSChainConstants.h | 16 ++++++++-------- .../Chain Managers/DSMasternodeManager+Mndiff.m | 2 +- Example/Podfile.lock | 12 ++++++------ 6 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 DashSync/shared/MasternodeLists/MNT530000_70228.dat diff --git a/DashSync.podspec b/DashSync.podspec index c02ccd24d..90f0ceb1c 100644 --- a/DashSync.podspec +++ b/DashSync.podspec @@ -34,7 +34,7 @@ Pod::Spec.new do |s| s.ios.framework = 'UIKit' s.macos.framework = 'Cocoa' s.compiler_flags = '-Wno-comma' - s.dependency 'DashSharedCore', '0.4.0' + s.dependency 'DashSharedCore', '0.4.2' s.dependency 'CocoaLumberjack', '3.7.2' s.ios.dependency 'DWAlertController', '0.2.1' s.dependency 'DSDynamicOptions', '0.1.2' diff --git a/DashSync/shared/MasternodeLists/MNT530000_70228.dat b/DashSync/shared/MasternodeLists/MNT530000_70228.dat new file mode 100644 index 0000000000000000000000000000000000000000..71e0fa0e858866c7879d1c48f0f54f871d2c809b GIT binary patch literal 83712 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 kbJ>N>Rhg= 70221 // TODO: or we can include protocol version into checkpoint obj, probably it's even better // TODO: or to recreate checkpoints for the latest protocol version after mainnet upgrading - 70221, + context.chain.protocolVersion, // 70228 for testnet // context.chain.protocolVersion, self.processor, self.processorCache, diff --git a/Example/Podfile.lock b/Example/Podfile.lock index ae2bd28c3..b70ce2bac 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -586,11 +586,11 @@ PODS: - "!ProtoCompiler-gRPCPlugin (~> 1.0)" - DAPI-GRPC/Messages - gRPC-ProtoRPC - - DashSharedCore (0.4.0) + - DashSharedCore (0.4.2) - DashSync (0.1.0): - CocoaLumberjack (= 3.7.2) - DAPI-GRPC (= 0.22.0-dev.8) - - DashSharedCore (= 0.4.0) + - DashSharedCore (= 0.4.2) - DSDynamicOptions (= 0.1.2) - DWAlertController (= 0.2.1) - TinyCborObjc (= 0.4.6) @@ -657,7 +657,7 @@ PODS: - gRPC/Interface-Legacy (1.49.0): - gRPC-RxLibrary/Interface (= 1.49.0) - KVO-MVVM (0.5.1) - - Protobuf (3.23.1) + - Protobuf (3.23.3) - SDWebImage (5.14.3): - SDWebImage/Core (= 5.14.3) - SDWebImage/Core (5.14.3) @@ -712,8 +712,8 @@ SPEC CHECKSUMS: CocoaImageHashing: 8656031d0899abe6c1c415827de43e9798189c53 CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da DAPI-GRPC: 138d62523bbfe7e88a39896f1053c0bc12390d9f - DashSharedCore: 4d583600745bc8b8ff32c3968d297fb1bd0e4218 - DashSync: 3ff50b1878685726b452638405d49d5802012732 + DashSharedCore: 3dc6c97bc6e1abdf9f09c388c7e9ce07fd541db4 + DashSync: ce844eeec4355c77f4be9c7f4f3158b91072c731 DSDynamicOptions: 347cc5d2c4e080eb3de6a86719ad3d861b82adfc DWAlertController: 5f4cd8adf90336331c054857f709f5f8d4b16a5b gRPC: 64f36d689b2ecd99c4351f74e6f91347cdc65d9f @@ -721,7 +721,7 @@ SPEC CHECKSUMS: gRPC-ProtoRPC: 1c223e0f1732bb8d0b9e9e0ea60cc0fe995b8e2d gRPC-RxLibrary: 92327f150e11cf3b1c0f52e083944fd9f5cb5d1e KVO-MVVM: 4df3afd1f7ebcb69735458b85db59c4271ada7c6 - Protobuf: 3dd214698ddb7afd832da281c777b2e9facef401 + Protobuf: d9c3d7e5a3574aa6a5d521f2d9f733c76d294be8 SDWebImage: 9c36e66c8ce4620b41a7407698dda44211a96764 tinycbor: d4d71dddda1f8392fbb4249f63faf8552f327590 TinyCborObjc: 5204540fb90ff0c40fb22d408fa51bab79d78a80 From aca7ddaa51277f626bd1f04e5b54f1d3a420a9c7 Mon Sep 17 00:00:00 2001 From: pankcuf Date: Wed, 21 Jun 2023 17:36:29 +0700 Subject: [PATCH 2/8] fix: avoid error flickering while sync phase change --- .../Models/Managers/Chain Managers/DSChainManager.m | 9 +++------ .../Models/Managers/Chain Managers/DSPeerManager.m | 4 +--- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m b/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m index 811af056b..983a25a3f 100644 --- a/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m +++ b/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m @@ -680,17 +680,14 @@ - (void)syncBlockchain { [self.peerManager connect]; } else if (!self.peerManager.masternodeList && self.masternodeManager.currentMasternodeList) { [self.peerManager useMasternodeList:self.masternodeManager.currentMasternodeList withConnectivityNonce:self.sessionConnectivityNonce]; - } else { - if (self.syncPhase == DSChainSyncPhase_InitialTerminalBlocks) { - self.syncPhase = DSChainSyncPhase_ChainSync; - [self chainShouldStartSyncingBlockchain:self.chain onPeer:self.peerManager.downloadPeer]; - } + } else if (self.syncPhase == DSChainSyncPhase_InitialTerminalBlocks) { + self.syncPhase = DSChainSyncPhase_ChainSync; + [self chainShouldStartSyncingBlockchain:self.chain onPeer:self.peerManager.downloadPeer]; } } - (void)chainFinishedSyncingMasternodeListsAndQuorums:(DSChain *)chain { DSLog(@"Chain finished syncing masternode list and quorums, it should start syncing chain"); - if (chain.isEvolutionEnabled) { [self.identitiesManager syncBlockchainIdentitiesWithCompletion:^(NSArray *_Nullable blockchainIdentities) { [self syncBlockchain]; diff --git a/DashSync/shared/Models/Managers/Chain Managers/DSPeerManager.m b/DashSync/shared/Models/Managers/Chain Managers/DSPeerManager.m index 127976a93..91d1be6cc 100644 --- a/DashSync/shared/Models/Managers/Chain Managers/DSPeerManager.m +++ b/DashSync/shared/Models/Managers/Chain Managers/DSPeerManager.m @@ -768,12 +768,10 @@ - (void)connect { } } - if (self.connectedPeers.count == 0) { + if (peers.count == 0) { [self chainSyncStopped]; - dispatch_async(dispatch_get_main_queue(), ^{ NSError *error = [NSError errorWithCode:1 localizedDescriptionKey:@"No peers found"]; - [[NSNotificationCenter defaultCenter] postNotificationName:DSChainManagerSyncFailedNotification object:nil userInfo:@{@"error": error, DSChainManagerNotificationChainKey: self.chain}]; From e079a1907b48a0e8d8d740588e6604bbbbb89a5d Mon Sep 17 00:00:00 2001 From: pankcuf Date: Thu, 29 Jun 2023 04:25:24 +0700 Subject: [PATCH 3/8] feat: keychain migration --- DashSync.podspec | 2 +- DashSync/shared/Models/Chain/DSChain.h | 3 +++ DashSync/shared/Models/Chain/DSChain.m | 8 ++++++++ .../DSAuthenticationKeysDerivationPath.m | 4 ++-- .../Models/Derivation Paths/DSDerivationPath.m | 17 +++++++++++------ Example/DashSync.xcodeproj/project.pbxproj | 2 +- Example/Podfile | 2 +- Example/Podfile.lock | 10 +++++----- 8 files changed, 32 insertions(+), 16 deletions(-) diff --git a/DashSync.podspec b/DashSync.podspec index 90f0ceb1c..77417e6ee 100644 --- a/DashSync.podspec +++ b/DashSync.podspec @@ -34,7 +34,7 @@ Pod::Spec.new do |s| s.ios.framework = 'UIKit' s.macos.framework = 'Cocoa' s.compiler_flags = '-Wno-comma' - s.dependency 'DashSharedCore', '0.4.2' + s.dependency 'DashSharedCore', '0.4.4' s.dependency 'CocoaLumberjack', '3.7.2' s.ios.dependency 'DWAlertController', '0.2.1' s.dependency 'DSDynamicOptions', '0.1.2' diff --git a/DashSync/shared/Models/Chain/DSChain.h b/DashSync/shared/Models/Chain/DSChain.h index a75aca91c..33819890f 100644 --- a/DashSync/shared/Models/Chain/DSChain.h +++ b/DashSync/shared/Models/Chain/DSChain.h @@ -479,6 +479,9 @@ typedef NS_ENUM(uint16_t, DSChainSyncPhase) - (BOOL)isDevnetAny; - (BOOL)isEvolutionEnabled; - (BOOL)isDevnetWithGenesisHash:(UInt256)genesisHash; +- (BOOL)isCore19Active; +- (KeyKind)getActiveBLSType; + @end @protocol DSChainTransactionsDelegate diff --git a/DashSync/shared/Models/Chain/DSChain.m b/DashSync/shared/Models/Chain/DSChain.m index a0480a934..4fe32cced 100644 --- a/DashSync/shared/Models/Chain/DSChain.m +++ b/DashSync/shared/Models/Chain/DSChain.m @@ -405,6 +405,14 @@ - (void)setUp { // MARK: - Helpers +- (BOOL)isCore19Active { + return self.lastTerminalBlockHeight >= chain_core19_activation_height(self.chainType); +} + +- (KeyKind)getActiveBLSType { + return [self isCore19Active] ? KeyKind_BLSBasic : KeyKind_BLS; +} + - (NSDictionary *)syncBlocks { return [self.mSyncBlocks copy]; } diff --git a/DashSync/shared/Models/Derivation Paths/DSAuthenticationKeysDerivationPath.m b/DashSync/shared/Models/Derivation Paths/DSAuthenticationKeysDerivationPath.m index 3c92666c2..ab798568e 100644 --- a/DashSync/shared/Models/Derivation Paths/DSAuthenticationKeysDerivationPath.m +++ b/DashSync/shared/Models/Derivation Paths/DSAuthenticationKeysDerivationPath.m @@ -83,7 +83,7 @@ + (instancetype)providerOwnerKeysDerivationPathForChain:(DSChain *)chain { + (instancetype)providerOperatorKeysDerivationPathForChain:(DSChain *)chain { UInt256 indexes[] = {uint256_from_long(FEATURE_PURPOSE), uint256_from_long(chain_coin_type(chain.chainType)), uint256_from_long(3), uint256_from_long(3)}; BOOL hardenedIndexes[] = {YES, YES, YES, YES}; - return [DSAuthenticationKeysDerivationPath derivationPathWithIndexes:indexes hardened:hardenedIndexes length:4 type:DSDerivationPathType_SingleUserAuthentication signingAlgorithm:KeyKind_BLS reference:DSDerivationPathReference_ProviderOperatorKeys onChain:chain]; + return [DSAuthenticationKeysDerivationPath derivationPathWithIndexes:indexes hardened:hardenedIndexes length:4 type:DSDerivationPathType_SingleUserAuthentication signingAlgorithm:[chain getActiveBLSType] reference:DSDerivationPathReference_ProviderOperatorKeys onChain:chain]; } + (instancetype)platformNodeKeysDerivationPathForChain:(DSChain *)chain { @@ -107,7 +107,7 @@ + (instancetype)blockchainIdentityECDSAKeysDerivationPathForChain:(DSChain *)cha + (instancetype)blockchainIdentityBLSKeysDerivationPathForChain:(DSChain *)chain { UInt256 indexes[] = {uint256_from_long(FEATURE_PURPOSE), uint256_from_long(chain_coin_type(chain.chainType)), uint256_from_long(FEATURE_PURPOSE_IDENTITIES), uint256_from_long(FEATURE_PURPOSE_IDENTITIES_SUBFEATURE_AUTHENTICATION), uint256_from_long(1)}; BOOL hardenedIndexes[] = {YES, YES, YES, YES, YES}; - DSAuthenticationKeysDerivationPath *blockchainIdentityBLSKeysDerivationPath = [DSAuthenticationKeysDerivationPath derivationPathWithIndexes:indexes hardened:hardenedIndexes length:5 type:DSDerivationPathType_MultipleUserAuthentication signingAlgorithm:KeyKind_BLS reference:DSDerivationPathReference_BlockchainIdentities onChain:chain]; + DSAuthenticationKeysDerivationPath *blockchainIdentityBLSKeysDerivationPath = [DSAuthenticationKeysDerivationPath derivationPathWithIndexes:indexes hardened:hardenedIndexes length:5 type:DSDerivationPathType_MultipleUserAuthentication signingAlgorithm:[chain getActiveBLSType] reference:DSDerivationPathReference_BlockchainIdentities onChain:chain]; blockchainIdentityBLSKeysDerivationPath.shouldStoreExtendedPrivateKey = YES; blockchainIdentityBLSKeysDerivationPath.usesHardenedKeys = YES; return blockchainIdentityBLSKeysDerivationPath; diff --git a/DashSync/shared/Models/Derivation Paths/DSDerivationPath.m b/DashSync/shared/Models/Derivation Paths/DSDerivationPath.m index 0563e1599..174407f67 100644 --- a/DashSync/shared/Models/Derivation Paths/DSDerivationPath.m +++ b/DashSync/shared/Models/Derivation Paths/DSDerivationPath.m @@ -256,15 +256,19 @@ - (NSData *)extendedPublicKeyData { return nil; } -//- (DSKey *)extendedPublicKey { - (OpaqueKey *)extendedPublicKey { if (!_extendedPublicKey) { if (self.wallet && (self.length || self.reference == DSDerivationPathReference_Root)) { NSData *extendedPublicKeyData = getKeychainData([self walletBasedExtendedPublicKeyLocationString], nil); -// NSAssert(extendedPublicKeyData, @"extended public key data not set"); if (extendedPublicKeyData) { _extendedPublicKey = key_create_from_extended_public_key_data(extendedPublicKeyData.bytes, extendedPublicKeyData.length, (int16_t) self.signingAlgorithm); -// _extendedPublicKey = [DSKey keyWithExtendedPublicKeyData:extendedPublicKeyData forKeyType:self.signingAlgorithm]; + if (!_extendedPublicKey && self.signingAlgorithm == KeyKind_BLSBasic) { + // Migrate BLS key from keychain: legacy -> basic + _extendedPublicKey = key_bls_migrate_from_legacy_extended_public_key_data(extendedPublicKeyData.bytes, extendedPublicKeyData.length); + if (_extendedPublicKey) { + setKeychainData([DSKeyManager extendedPublicKeyData:_extendedPublicKey], [self standaloneExtendedPublicKeyLocationString], NO); + } + } NSAssert(_extendedPublicKey, @"extended public key not set"); } } else { @@ -289,10 +293,11 @@ - (OpaqueKey *)extendedPublicKey { } } #endif -// NSAssert(extendedPublicKeyData, @"extended public key data not set"); _extendedPublicKey = key_create_from_extended_public_key_data(extendedPublicKeyData.bytes, extendedPublicKeyData.length, (int16_t) self.signingAlgorithm); -// _extendedPublicKey = [DSKey keyWithExtendedPublicKeyData:extendedPublicKeyData forKeyType:self.signingAlgorithm]; -// NSAssert(_extendedPublicKey, @"extended public key not set"); + if (!_extendedPublicKey && self.signingAlgorithm == KeyKind_BLSBasic) { + // Migrate BLS key from keychain: legacy -> basic + _extendedPublicKey = key_bls_migrate_from_legacy_extended_public_key_data(extendedPublicKeyData.bytes, extendedPublicKeyData.length); + } } } return _extendedPublicKey; diff --git a/Example/DashSync.xcodeproj/project.pbxproj b/Example/DashSync.xcodeproj/project.pbxproj index 30361eaac..4523bb92a 100644 --- a/Example/DashSync.xcodeproj/project.pbxproj +++ b/Example/DashSync.xcodeproj/project.pbxproj @@ -612,7 +612,7 @@ 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = ""; }; - 64A245673BBAE1DA7DAB4907 /* DashSync.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = DashSync.podspec; path = ../DashSync.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 64A245673BBAE1DA7DAB4907 /* DashSync.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = DashSync.podspec; path = ../DashSync.podspec; sourceTree = ""; }; 6675EA01A2AC0589160069A4 /* libPods-NetworkInfo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NetworkInfo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 74FDA0D6BCD2D779E20B58FC /* Pods-DashSync-DashSync_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync-DashSync_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-DashSync-DashSync_Example/Pods-DashSync-DashSync_Example.release.xcconfig"; sourceTree = ""; }; diff --git a/Example/Podfile b/Example/Podfile index 86b6791ae..5e742b661 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -1,5 +1,5 @@ def common_pods -# pod 'DashSharedCore', :git => 'https://github.com/dashpay/dash-shared-core.git', :branch => 'fix/core-v0.19-log' +# pod 'DashSharedCore', :git => 'https://github.com/dashpay/dash-shared-core.git', :branch => 'feat/bls-migration-utils' # pod 'DashSharedCore', :git => 'https://github.com/dashpay/dash-shared-core.git', :commit => '27157c7' pod 'DashSync', :path => '../' pod 'SDWebImage', '5.14.3' diff --git a/Example/Podfile.lock b/Example/Podfile.lock index b70ce2bac..4a79eea8c 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -586,11 +586,11 @@ PODS: - "!ProtoCompiler-gRPCPlugin (~> 1.0)" - DAPI-GRPC/Messages - gRPC-ProtoRPC - - DashSharedCore (0.4.2) + - DashSharedCore (0.4.4) - DashSync (0.1.0): - CocoaLumberjack (= 3.7.2) - DAPI-GRPC (= 0.22.0-dev.8) - - DashSharedCore (= 0.4.2) + - DashSharedCore (= 0.4.4) - DSDynamicOptions (= 0.1.2) - DWAlertController (= 0.2.1) - TinyCborObjc (= 0.4.6) @@ -712,8 +712,8 @@ SPEC CHECKSUMS: CocoaImageHashing: 8656031d0899abe6c1c415827de43e9798189c53 CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da DAPI-GRPC: 138d62523bbfe7e88a39896f1053c0bc12390d9f - DashSharedCore: 3dc6c97bc6e1abdf9f09c388c7e9ce07fd541db4 - DashSync: ce844eeec4355c77f4be9c7f4f3158b91072c731 + DashSharedCore: 2fc4af970b21cc06d423e3c1fe4efa49688065ad + DashSync: d9a3fd99460f4b8718f296b26573c50c0c262163 DSDynamicOptions: 347cc5d2c4e080eb3de6a86719ad3d861b82adfc DWAlertController: 5f4cd8adf90336331c054857f709f5f8d4b16a5b gRPC: 64f36d689b2ecd99c4351f74e6f91347cdc65d9f @@ -726,6 +726,6 @@ SPEC CHECKSUMS: tinycbor: d4d71dddda1f8392fbb4249f63faf8552f327590 TinyCborObjc: 5204540fb90ff0c40fb22d408fa51bab79d78a80 -PODFILE CHECKSUM: a41a20e22bef00611462f1eee0ee28e1d246c77b +PODFILE CHECKSUM: 7608d075b7d9d3881f0ff995dc86deed6d3c4999 COCOAPODS: 1.12.1 From db1b2a5ca4c71a1a5670c1098129921c42ccdcf4 Mon Sep 17 00:00:00 2001 From: pankcuf Date: Thu, 29 Jun 2023 15:29:12 +0700 Subject: [PATCH 4/8] chore: update min protocol version for mainnet 70228 --- DashSync/shared/Models/Chain/DSChainConstants.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DashSync/shared/Models/Chain/DSChainConstants.h b/DashSync/shared/Models/Chain/DSChainConstants.h index fd937d739..efe88487c 100644 --- a/DashSync/shared/Models/Chain/DSChainConstants.h +++ b/DashSync/shared/Models/Chain/DSChainConstants.h @@ -32,7 +32,7 @@ #define DEVNET_DAPI_GRPC_STANDARD_PORT 3010 #define PROTOCOL_VERSION_MAINNET 70228 -#define DEFAULT_MIN_PROTOCOL_VERSION_MAINNET 70227 +#define DEFAULT_MIN_PROTOCOL_VERSION_MAINNET 70228 #define PROTOCOL_VERSION_TESTNET 70228 #define DEFAULT_MIN_PROTOCOL_VERSION_TESTNET 70228 @@ -50,7 +50,7 @@ #define DEFAULT_MIN_PLATFORM_PROTOCOL_VERSION_DEVNET 1 #define MAX_VALID_MIN_PROTOCOL_VERSION 70228 -#define MIN_VALID_MIN_PROTOCOL_VERSION 70227 +#define MIN_VALID_MIN_PROTOCOL_VERSION 70228 #define MAX_TARGET_PROOF_OF_WORK_MAINNET 0x1e0fffffu // highest value for difficulty target (higher values are less difficult) #define MAX_TARGET_PROOF_OF_WORK_TESTNET 0x1e0fffffu From 8b44d120647b4c8869afaa913118b07fe13ebb3a Mon Sep 17 00:00:00 2001 From: pankcuf Date: Thu, 29 Jun 2023 18:03:34 +0700 Subject: [PATCH 5/8] feat: make checkpoints to use protocol version ($masternode_list_name__$protocol_version.dat) --- .../{ML1088640.dat => ML1088640__70218.dat} | Bin .../{ML1720000.dat => ML1720000__70218.dat} | Bin DashSync/shared/MasternodeLists/MNT530000.dat | Bin 82854 -> 0 bytes ...T530000_70228.dat => MNT530000__70228.dat} | Bin .../shared/Models/Chain/DSChainCheckpoints.h | 6 +- .../shared/Models/Chain/DSChainConstants.h | 2 + DashSync/shared/Models/Chain/DSCheckpoint.h | 1 + DashSync/shared/Models/Chain/DSCheckpoint.m | 23 +++++++ .../DSMasternodeManager+Mndiff.h | 2 +- .../DSMasternodeManager+Mndiff.m | 9 +-- .../Chain Managers/DSMasternodeManager.m | 21 +++++-- .../DSMasternodeListStore+Protected.h | 1 - .../Models/Masternode/DSMasternodeListStore.m | 16 ----- .../DSDeterministicMasternodeListTests.m | 56 ++++++++++++++---- 14 files changed, 92 insertions(+), 45 deletions(-) rename DashSync/shared/MasternodeLists/{ML1088640.dat => ML1088640__70218.dat} (100%) rename DashSync/shared/MasternodeLists/{ML1720000.dat => ML1720000__70218.dat} (100%) delete mode 100644 DashSync/shared/MasternodeLists/MNT530000.dat rename DashSync/shared/MasternodeLists/{MNT530000_70228.dat => MNT530000__70228.dat} (100%) diff --git a/DashSync/shared/MasternodeLists/ML1088640.dat b/DashSync/shared/MasternodeLists/ML1088640__70218.dat similarity index 100% rename from DashSync/shared/MasternodeLists/ML1088640.dat rename to DashSync/shared/MasternodeLists/ML1088640__70218.dat diff --git a/DashSync/shared/MasternodeLists/ML1720000.dat b/DashSync/shared/MasternodeLists/ML1720000__70218.dat similarity index 100% rename from DashSync/shared/MasternodeLists/ML1720000.dat rename to DashSync/shared/MasternodeLists/ML1720000__70218.dat diff --git a/DashSync/shared/MasternodeLists/MNT530000.dat b/DashSync/shared/MasternodeLists/MNT530000.dat deleted file mode 100644 index 26565ed3944c9016e56232696878efefa33fbfce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82854 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 fGF6Y%9^qce^l= 70221 - // TODO: or we can include protocol version into checkpoint obj, probably it's even better - // TODO: or to recreate checkpoints for the latest protocol version after mainnet upgrading - context.chain.protocolVersion, // 70228 for testnet -// context.chain.protocolVersion, + protocolVersion, self.processor, self.processorCache, (__bridge void *)(context)); diff --git a/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager.m b/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager.m index 95d37b715..61fa94896 100644 --- a/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager.m +++ b/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager.m @@ -368,17 +368,30 @@ - (BOOL)requestMasternodeListForBlockHash:(UInt256)blockHash { } - (DSMasternodeList *__nullable)processRequestFromFileForBlockHash:(UInt256)blockHash { - NSData *message = [self.store messageFromFileForBlockHash:blockHash]; + DSCheckpoint *checkpoint = [self.chain checkpointForBlockHash:blockHash]; + if (!checkpoint || !checkpoint.masternodeListName || [checkpoint.masternodeListName isEqualToString:@""]) { + return nil; + } + NSString *bundlePath = [[NSBundle bundleForClass:self.class] pathForResource:@"DashSync" ofType:@"bundle"]; + NSBundle *bundle = [NSBundle bundleWithPath:bundlePath]; + NSString *masternodeListName = checkpoint.masternodeListName; + NSString *filePath = [bundle pathForResource:masternodeListName ofType:@"dat"]; + if (!filePath) { + return nil; + } + NSData *message = [NSData dataWithContentsOfFile:filePath]; + if (!message) { return NULL; } + MerkleBlockFinder blockFinder = ^DSMerkleBlock *(UInt256 blockHash) { return [self.chain blockForBlockHash:blockHash]; }; DSMasternodeProcessorContext *context = [self createDiffMessageContext:NO isFromSnapshot:YES isDIP0024:NO peer:nil merkleRootLookup:^UInt256(UInt256 blockHash) { return blockFinder(blockHash).merkleRoot; }]; - DSMnDiffProcessingResult *result = [self processMasternodeDiffMessage:message withContext:context]; + DSMnDiffProcessingResult *result = [self processMasternodeDiffFromFile:message protocolVersion:[checkpoint protocolVersion] withContext:context]; __block DSMerkleBlock *block = blockFinder(blockHash); if (![result isValid]) { @@ -688,7 +701,7 @@ - (void)peer:(DSPeer *)peer relayedMasternodeDiffMessage:(NSData *)message { UInt256 blockHash = result.blockHash; DSLog(@"•••• -> processed mnlistdiff %u..%u %@ .. %@", [self heightForBlockHash:baseBlockHash], [self heightForBlockHash:blockHash], uint256_hex(baseBlockHash), uint256_hex(blockHash)); #if SAVE_MASTERNODE_DIFF_TO_FILE - NSString *fileName = [NSString stringWithFormat:@"MNL_%@_%@.dat", @([self heightForBlockHash:baseBlockHash]), @([self heightForBlockHash:blockHash])]; + NSString *fileName = [NSString stringWithFormat:@"MNL_%@_%@__%d.dat", @([self heightForBlockHash:baseBlockHash]), @([self heightForBlockHash:blockHash]), @(peer.version)]; DSLog(@"•-• File %@ saved", fileName); [message saveToFile:fileName inDirectory:NSCachesDirectory]; #endif @@ -736,7 +749,7 @@ - (void)peer:(DSPeer *)peer relayedQuorumRotationInfoMessage:(NSData *)message { DSLog(@"•••• -> processed qrinfo h-4c %u..%u %@ .. %@", [self heightForBlockHash:result.mnListDiffResultAtH4C.baseBlockHash], [self heightForBlockHash:result.mnListDiffResultAtH4C.blockHash], uint256_hex(result.mnListDiffResultAtH4C.baseBlockHash), uint256_hex(result.mnListDiffResultAtH4C.blockHash)); } #if SAVE_MASTERNODE_DIFF_TO_FILE - NSString *fileName = [NSString stringWithFormat:@"QRINFO_%@_%@.dat", @([self heightForBlockHash:baseBlockHash]), @([self heightForBlockHash:blockHash])]; + NSString *fileName = [NSString stringWithFormat:@"QRINFO_%@_%@__%d.dat", @([self heightForBlockHash:baseBlockHash]), @([self heightForBlockHash:blockHash]), @(peer.version)]; DSLog(@"•-• File %@ saved", fileName); [message saveToFile:fileName inDirectory:NSCachesDirectory]; #endif diff --git a/DashSync/shared/Models/Masternode/DSMasternodeListStore+Protected.h b/DashSync/shared/Models/Masternode/DSMasternodeListStore+Protected.h index c7cb14182..a9954344d 100644 --- a/DashSync/shared/Models/Masternode/DSMasternodeListStore+Protected.h +++ b/DashSync/shared/Models/Masternode/DSMasternodeListStore+Protected.h @@ -33,7 +33,6 @@ NS_ASSUME_NONNULL_BEGIN inContext:(NSManagedObjectContext *)context; //- (void)checkPingTimesForMasternodesInContext:(NSManagedObjectContext *)context withCompletion:(void (^)(NSMutableDictionary *pingTimes, NSMutableDictionary *errors))completion; - (UInt256)closestKnownBlockHashForBlockHash:(UInt256)blockHash; -- (NSData *_Nullable)messageFromFileForBlockHash:(UInt256)blockHash; - (DSQuorumEntry *)quorumEntryForChainLockRequestID:(UInt256)requestID forMerkleBlock:(DSMerkleBlock *)merkleBlock; - (DSQuorumEntry *)quorumEntryForInstantSendRequestID:(UInt256)requestID forMerkleBlock:(DSMerkleBlock *)merkleBlock; diff --git a/DashSync/shared/Models/Masternode/DSMasternodeListStore.m b/DashSync/shared/Models/Masternode/DSMasternodeListStore.m index d734f7366..4e965dfdc 100644 --- a/DashSync/shared/Models/Masternode/DSMasternodeListStore.m +++ b/DashSync/shared/Models/Masternode/DSMasternodeListStore.m @@ -79,22 +79,6 @@ - (void)setUp:(void (^)(DSMasternodeList *masternodeList))completion { [self loadLocalMasternodes]; } -- (NSData *_Nullable)messageFromFileForBlockHash:(UInt256)blockHash { - DSCheckpoint *checkpoint = [self.chain checkpointForBlockHash:blockHash]; - if (!checkpoint || !checkpoint.masternodeListName || [checkpoint.masternodeListName isEqualToString:@""]) { - //DSLog(@"No masternode list checkpoint found at height %u", [self heightForBlockHash:blockHash]); - return nil; - } - NSString *bundlePath = [[NSBundle bundleForClass:self.class] pathForResource:@"DashSync" ofType:@"bundle"]; - NSBundle *bundle = [NSBundle bundleWithPath:bundlePath]; - NSString *filePath = [bundle pathForResource:checkpoint.masternodeListName ofType:@"dat"]; - if (!filePath) { - return nil; - } - NSData *message = [NSData dataWithContentsOfFile:filePath]; - return message; -} - - (void)savePlatformPingInfoForEntries:(NSArray *)entries inContext:(NSManagedObjectContext *)context { [context performBlockAndWait:^{ diff --git a/Example/Tests/DSDeterministicMasternodeListTests.m b/Example/Tests/DSDeterministicMasternodeListTests.m index 060edf449..bc090350d 100644 --- a/Example/Tests/DSDeterministicMasternodeListTests.m +++ b/Example/Tests/DSDeterministicMasternodeListTests.m @@ -546,7 +546,7 @@ - (void)performMNListDiffTestForMessage:(NSString *)hexString }]; [mndiffContext setBlockHeightLookup:blockHeightLookup]; - DSMnDiffProcessingResult *result = [chain.chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result = [chain.chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; DSMasternodeList *masternodeList = result.masternodeList; NSArray *proTxHashes = masternodeList.reversedRegistrationTransactionHashes; proTxHashes = [proTxHashes sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { @@ -619,7 +619,7 @@ - (void)loadMasternodeListsForFiles:(NSArray *)files [mndiffContext setBlockHeightLookup:blockHeightLookup]; DSMasternodeManager *masternodeManager = chain.chainManager.masternodeManager; - DSMnDiffProcessingResult *result = [masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result = [masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; XCTAssert(result.foundCoinbase, @"Did not find coinbase at height %u", blockHeightLookup(blockHash)); // turned off on purpose as we don't have the coinbase block // XCTAssert(result.validCoinbase,@"Coinbase not valid at height %u",[chain heightForBlockHash:blockHash]); @@ -726,7 +726,7 @@ - (void)testMainnetMasternodeSaving { [mndiffContext setBlockHeightLookup:^uint32_t(UInt256 blockHash) { return 1100000; }]; - DSMnDiffProcessingResult *result = [chain.chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result = [chain.chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; XCTAssert(result.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash]); // turned off on purpose as we don't have the coinbase block // XCTAssert(result.validCoinbase,@"Coinbase not valid at height %u",[chain heightForBlockHash:blockHash]); @@ -788,7 +788,7 @@ - (void)testMNLSavingToDisk { [mndiffContext setBlockHeightLookup:^uint32_t(UInt256 blockHash) { return 122088; }]; - DSMnDiffProcessingResult *result = [chain.chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result = [chain.chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; NSData *masternodeListMerkleRoot = @"94d0af97187af3b9311c98b1cf40c9c9849df0af55dc63b097b80d4cf6c816c5".hexToData; DSMasternodeList *masternodeList = result.masternodeList; BOOL equal = uint256_eq(masternodeListMerkleRoot.UInt256, [masternodeList masternodeMerkleRoot]); @@ -869,7 +869,7 @@ - (void)testMNLSavingAndRetrievingFromDisk { return @"ac841d3551d012e8ce5fbec60217043209317b50268d1c3717d79350d23fd593".hexToData.reverse.UInt256; }]; [mndiffContext setBlockHeightLookup:blockHeightLookup122064]; - DSMnDiffProcessingResult *result = [chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result = [chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; DSMasternodeList *masternodeList122064 = result.masternodeList; XCTAssert(result.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash122064]); // turned off on purpose as we don't have the coinbase block @@ -919,7 +919,7 @@ - (void)testMNLSavingAndRetrievingFromDisk { } }]; [mndiffContext setBlockHeightLookup:blockHeightLookup122088]; - DSMnDiffProcessingResult *result122088 = [chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result122088 = [chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; XCTAssert(result122088.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash]); XCTAssert(result122088.validCoinbase, @"Coinbase not valid at height %u",[chain heightForBlockHash:blockHash]); //turned off on purpose as we don't have the coinbase block XCTAssert(result122088.rootMNListValid, @"rootMNListValid not valid at height %u", [chain heightForBlockHash:blockHash]); @@ -2827,7 +2827,7 @@ - (void)testMNLSavingAndRetrievingInIncorrectOrderFromDisk { [mndiffContext setMerkleRootLookup:merkleRootLookup]; [mndiffContext setBlockHeightLookup:blockHeightLookup]; - DSMnDiffProcessingResult *result = [chain.chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result = [chain.chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; XCTAssert(result.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash1092912]); // XCTAssert(validCoinbase,@"Coinbase not valid at height %u",[chain heightForBlockHash:blockHash]); //turned off on purpose as we don't have the coinbase block XCTAssert(result.rootMNListValid, @"rootMNListValid not valid at height %u", [chain heightForBlockHash:blockHash1092912]); @@ -2872,7 +2872,7 @@ - (void)testMNLSavingAndRetrievingInIncorrectOrderFromDisk { }]; [mndiffContext setMerkleRootLookup:merkleRootLookup]; [mndiffContext setBlockHeightLookup:blockHeightLookup]; - DSMnDiffProcessingResult *result1092940 = [chain.chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result1092940 = [chain.chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; DSMasternodeList *masternodeList1092940 = result1092940.masternodeList; XCTAssert(result1092940.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash1092940]); // XCTAssert(validCoinbase,@"Coinbase not valid at height %u",[chain heightForBlockHash:blockHash]); //turned off on purpose as we don't have the coinbase block @@ -3003,7 +3003,7 @@ - (void)testTestnetQuorumVerification { NSAssert(NO, @"All values must be here"); return UINT32_MAX; }]; - DSMnDiffProcessingResult *result119064 = [chain.chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result119064 = [chain.chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; XCTAssert(result119064.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash119064]); // turned off on purpose as we don't have the coinbase block // XCTAssert(validCoinbase,@"Coinbase not valid at height %u",[chain heightForBlockHash:blockHash]); @@ -3052,7 +3052,7 @@ - (void)testTestnetQuorumVerification { return UINT256_ZERO; }]; [mndiffContext setBlockHeightLookup:blockHeightLookup2]; - DSMnDiffProcessingResult *result119200 = [chain.chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result119200 = [chain.chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; XCTAssert(result119200.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash]); // XCTAssert(validCoinbase,@"Coinbase not valid at height %u",[chain heightForBlockHash:blockHash]); //turned off on purpose as we don't have the coinbase block XCTAssert(result119200.rootMNListValid, @"rootMNListValid not valid at height %u", [chain heightForBlockHash:blockHash]); @@ -3158,7 +3158,7 @@ - (void)testTestnetSizeQuorumVerification { [mndiffContext setBlockHeightLookup:^uint32_t(UInt256 blockHash) { return 370368; }]; - DSMnDiffProcessingResult *result370368 = [chain.chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result370368 = [chain.chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; XCTAssert(result370368.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash370368]); // XCTAssert(validCoinbase,@"Coinbase not valid at height %u",[chain heightForBlockHash:blockHash]); //turned off on purpose as we don't have the coinbase block XCTAssert(result370368.rootMNListValid, @"rootMNListValid not valid at height %u", [chain heightForBlockHash:blockHash370368]); @@ -3204,7 +3204,7 @@ - (void)testTestnetSizeQuorumVerification { [mndiffContext setBlockHeightLookup:^uint32_t(UInt256 blockHash) { return 370944; }]; - DSMnDiffProcessingResult *result370944 = [chain.chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result370944 = [chain.chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; XCTAssert(result370944.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash]); // XCTAssert(result370944.validCoinbase,@"Coinbase not valid at height %u",[chain heightForBlockHash:blockHash]); //turned off on purpose as we don't have the coinbase block XCTAssert(result370944.rootMNListValid, @"rootMNListValid not valid at height %u", [chain heightForBlockHash:blockHash]); @@ -3302,7 +3302,7 @@ - (void)testCheckpoints { return @"ac841d3551d012e8ce5fbec60217043209317b50268d1c3717d79350d23fd593".hexToData.reverse.UInt256; }]; [mndiffContext setBlockHeightLookup:blockHeightLookup122064]; - DSMnDiffProcessingResult *result = [chainManager.masternodeManager processMasternodeDiffMessage:message withContext:mndiffContext]; + DSMnDiffProcessingResult *result = [chainManager.masternodeManager processMasternodeDiffFromFile:message protocolVersion:DEFAULT_CHECKPOINT_PROTOCOL_VERSION withContext:mndiffContext]; DSMasternodeList *masternodeList122064 = result.masternodeList; XCTAssert(result.foundCoinbase, @"Did not find coinbase at height %u", [chain heightForBlockHash:blockHash122064]); // turned off on purpose as we don't have the coinbase block @@ -3311,7 +3311,37 @@ - (void)testCheckpoints { XCTAssert(result.rootQuorumListValid, @"rootQuorumListValid not valid at height %u", [chain heightForBlockHash:blockHash122064]); XCTAssert(result.validQuorums, @"validQuorums not valid at height %u", [chain heightForBlockHash:blockHash122064]); XCTAssertEqualObjects(uint256_data([masternodeList122064 calculateMasternodeMerkleRootWithBlockHeightLookup:blockHeightLookup122064]).hexString, @"86cfe9b759dfd012f8d00e980c560c5c1d9c487bfa8b59305e14c7fc60ef1150", @""); +} +- (uint32_t)extractProtocolVersion:(NSString *)masternodeListName { + uint32_t protocolVersion = DEFAULT_CHECKPOINT_PROTOCOL_VERSION; + NSError *error = NULL; + NSRegularExpression *regex = [NSRegularExpression + regularExpressionWithPattern:@"__(\\d+)" + options:NSRegularExpressionCaseInsensitive + error:&error]; + NSTextCheckingResult *match = [regex + firstMatchInString:masternodeListName + options:0 + range:NSMakeRange(0, [masternodeListName length])]; + if (match) { + NSString *numberString = [masternodeListName substringWithRange:[match rangeAtIndex:1]]; + if (numberString) { + protocolVersion = (uint32_t)[numberString integerValue]; + } + } + return protocolVersion; } +- (void)testCheckpointsName { + XCTAssertEqual([self extractProtocolVersion:@"ML1088640__70218"], 70218); + XCTAssertEqual([self extractProtocolVersion:@"ML1088640__70218"], DEFAULT_CHECKPOINT_PROTOCOL_VERSION); + XCTAssertEqual([self extractProtocolVersion:@"ML1720000__70218"], 70218); + XCTAssertEqual([self extractProtocolVersion:@"MNT530000__70228"], 70228); + XCTAssertEqual([self extractProtocolVersion:@"MNL_1092916_1092940"], 70218); + XCTAssertEqual([self extractProtocolVersion:@"MNL_0_122928"], 70218); + XCTAssertEqual([self extractProtocolVersion:@"MNL_0_122928"], DEFAULT_CHECKPOINT_PROTOCOL_VERSION); + XCTAssertEqual([self extractProtocolVersion:@"QRINFO_122222_122223__70227"], 70227); + +} @end From 91d9adca3aefc899630c0d962c8e3f8b72e99d90 Mon Sep 17 00:00:00 2001 From: pankcuf Date: Tue, 4 Jul 2023 03:09:55 +0700 Subject: [PATCH 6/8] fix: bls key test --- DashSync.podspec | 2 +- Example/Podfile | 2 +- Example/Podfile.lock | 10 +++++----- Example/Tests/DSKeyTests.m | 6 ++++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/DashSync.podspec b/DashSync.podspec index 77417e6ee..37001eb4b 100644 --- a/DashSync.podspec +++ b/DashSync.podspec @@ -34,7 +34,7 @@ Pod::Spec.new do |s| s.ios.framework = 'UIKit' s.macos.framework = 'Cocoa' s.compiler_flags = '-Wno-comma' - s.dependency 'DashSharedCore', '0.4.4' + s.dependency 'DashSharedCore', '0.4.5' s.dependency 'CocoaLumberjack', '3.7.2' s.ios.dependency 'DWAlertController', '0.2.1' s.dependency 'DSDynamicOptions', '0.1.2' diff --git a/Example/Podfile b/Example/Podfile index 5e742b661..a6f01f405 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -1,5 +1,5 @@ def common_pods -# pod 'DashSharedCore', :git => 'https://github.com/dashpay/dash-shared-core.git', :branch => 'feat/bls-migration-utils' +# pod 'DashSharedCore', :git => 'https://github.com/dashpay/dash-shared-core.git', :branch => 'fix/bls-bindings' # pod 'DashSharedCore', :git => 'https://github.com/dashpay/dash-shared-core.git', :commit => '27157c7' pod 'DashSync', :path => '../' pod 'SDWebImage', '5.14.3' diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 4a79eea8c..a1c03effc 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -586,11 +586,11 @@ PODS: - "!ProtoCompiler-gRPCPlugin (~> 1.0)" - DAPI-GRPC/Messages - gRPC-ProtoRPC - - DashSharedCore (0.4.4) + - DashSharedCore (0.4.5) - DashSync (0.1.0): - CocoaLumberjack (= 3.7.2) - DAPI-GRPC (= 0.22.0-dev.8) - - DashSharedCore (= 0.4.4) + - DashSharedCore (= 0.4.5) - DSDynamicOptions (= 0.1.2) - DWAlertController (= 0.2.1) - TinyCborObjc (= 0.4.6) @@ -712,8 +712,8 @@ SPEC CHECKSUMS: CocoaImageHashing: 8656031d0899abe6c1c415827de43e9798189c53 CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da DAPI-GRPC: 138d62523bbfe7e88a39896f1053c0bc12390d9f - DashSharedCore: 2fc4af970b21cc06d423e3c1fe4efa49688065ad - DashSync: d9a3fd99460f4b8718f296b26573c50c0c262163 + DashSharedCore: 6e9af4b23b9ec40ae33040fb9ae4d12b320c70ec + DashSync: a00e5103f25ea8f62632f9c763902df7353b0468 DSDynamicOptions: 347cc5d2c4e080eb3de6a86719ad3d861b82adfc DWAlertController: 5f4cd8adf90336331c054857f709f5f8d4b16a5b gRPC: 64f36d689b2ecd99c4351f74e6f91347cdc65d9f @@ -726,6 +726,6 @@ SPEC CHECKSUMS: tinycbor: d4d71dddda1f8392fbb4249f63faf8552f327590 TinyCborObjc: 5204540fb90ff0c40fb22d408fa51bab79d78a80 -PODFILE CHECKSUM: 7608d075b7d9d3881f0ff995dc86deed6d3c4999 +PODFILE CHECKSUM: 4a6ed5ed41963191295a38fad9760424b46ae9a9 COCOAPODS: 1.12.1 diff --git a/Example/Tests/DSKeyTests.m b/Example/Tests/DSKeyTests.m index 1f7dd411f..dfbc0d1b4 100644 --- a/Example/Tests/DSKeyTests.m +++ b/Example/Tests/DSKeyTests.m @@ -166,7 +166,9 @@ - (void)testBLSVerify { NSData *seedData1 = [NSData dataWithBytes:seed1 length:5]; uint8_t message1[3] = {7, 8, 9}; NSData *messageData1 = [NSData dataWithBytes:message1 length:3]; - OpaqueKey *wrapper = key_with_seed_data(seedData1.bytes, seedData1.length, KeyKind_BLS); + BLSKey *bls_key = key_bls_with_seed_data(seedData1.bytes, seedData1.length, true); + OpaqueKey *wrapper = &((OpaqueKey) {.tag = OpaqueKey_BLSLegacy, .bls_legacy = bls_key }); +// OpaqueKey *wrapper = key_with_seed_data(seedData1.bytes, seedData1.length, KeyKind_BLS); NSData *publicKeyData = [DSKeyManager publicKeyData:wrapper]; NSData *privateKeyData = [DSKeyManager privateKeyData:wrapper]; XCTAssertEqualObjects(publicKeyData.hexString, @"02a8d2aaa6a5e2e08d4b8d406aaf0121a2fc2088ed12431e6b0663028da9ac5922c9ea91cde7dd74b7d795580acc7a61"); @@ -175,7 +177,7 @@ - (void)testBLSVerify { XCTAssertEqualObjects(signature1.hexString, @"023f5c750f402c69dab304e5042a7419722536a38d58ce46ba045be23e99d4f9ceeffbbc6796ebbdab6e9813c411c78f07167a3b76bef2262775a1e9f95ff1a80c5fa9fe8daa220d4d9da049a96e8932d5071aaf48fbff27a920bc4aa7511fd4"); NSData *pkData = [DSKeyManager NSDataFrom:key_bls_public_key(wrapper->bls_legacy)]; BOOL verified = key_bls_verify(pkData.bytes, true, [messageData1 SHA256_2].u8, signature1.bytes); - processor_destroy_opaque_key(wrapper); +// processor_destroy_opaque_key(wrapper); XCTAssertTrue(verified, @"Testing BLS signature verification"); } From 9187e626a9d6e997561bb89f6c3f776a405626f4 Mon Sep 17 00:00:00 2001 From: pankcuf Date: Tue, 4 Jul 2023 03:11:26 +0700 Subject: [PATCH 7/8] chore: some peer management logs --- .../shared/Models/Managers/Chain Managers/DSChainManager.m | 1 + .../shared/Models/Managers/Chain Managers/DSPeerManager.m | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m b/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m index 983a25a3f..da0fede06 100644 --- a/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m +++ b/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m @@ -673,6 +673,7 @@ - (void)chainFinishedSyncingTransactionsAndBlocks:(DSChain *)chain fromPeer:(DSP } - (void)syncBlockchain { + DSLog(@"syncBlockchain connected peers: %d phase: %d", self.peerManager.connectedPeerCount, self.syncPhase); if (self.peerManager.connectedPeerCount == 0) { if (self.syncPhase == DSChainSyncPhase_InitialTerminalBlocks) { self.syncPhase = DSChainSyncPhase_ChainSync; diff --git a/DashSync/shared/Models/Managers/Chain Managers/DSPeerManager.m b/DashSync/shared/Models/Managers/Chain Managers/DSPeerManager.m index 91d1be6cc..ae53a7073 100644 --- a/DashSync/shared/Models/Managers/Chain Managers/DSPeerManager.m +++ b/DashSync/shared/Models/Managers/Chain Managers/DSPeerManager.m @@ -695,6 +695,7 @@ - (void)useMasternodeList:(DSMasternodeList *)masternodeList withConnectivityNon // MARK: - Connectivity - (void)connect { + DSLog(@"[DSPeerManager] connect (%d)", self.connectedPeers); self.desiredState = DSPeerManagerDesiredState_Connected; dispatch_async(self.networkingQueue, ^{ if ([self.chain syncsBlockchain] && ![self.chain canConstructAFilter]) return; // check to make sure the wallet has been created if only are a basic wallet with no dash features @@ -769,6 +770,7 @@ - (void)connect { } if (peers.count == 0) { + DSLog(@"[DSPeerManager] connect failed peers: (%d) connected: (%d) mutableConnected: (%d)", peers, self.connectedPeers, self.mutableConnectedPeers); [self chainSyncStopped]; dispatch_async(dispatch_get_main_queue(), ^{ NSError *error = [NSError errorWithCode:1 localizedDescriptionKey:@"No peers found"]; @@ -994,10 +996,10 @@ - (void)peer:(DSPeer *)peer disconnectedWithError:(NSError *)error { } }]; + DSLog(@"[DSPeerManager] disconnectedWithError: peers: (%d) connected: (%d) mutableConnected: (%d) connectFailures: (%d)", _peers, self.connectedPeers, self.mutableConnectedPeers, self.connectFailures); @synchronized(self) { _peers = nil; } - dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:DSChainManagerSyncFailedNotification object:nil From 925670f0fe63d570d1c504d9e759a883a0883e3a Mon Sep 17 00:00:00 2001 From: pankcuf Date: Tue, 4 Jul 2023 16:20:36 +0700 Subject: [PATCH 8/8] fix: support platform node key for local masternode --- DashSync/shared/Models/Masternode/DSLocalMasternode.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DashSync/shared/Models/Masternode/DSLocalMasternode.m b/DashSync/shared/Models/Masternode/DSLocalMasternode.m index f44abbd61..8eccc738f 100644 --- a/DashSync/shared/Models/Masternode/DSLocalMasternode.m +++ b/DashSync/shared/Models/Masternode/DSLocalMasternode.m @@ -143,19 +143,23 @@ - (instancetype)initWithProviderTransactionRegistration:(DSProviderRegistrationT uint32_t votingAddressIndex; uint32_t operatorAddressIndex; uint32_t holdingAddressIndex; + uint32_t platformNodeAddressIndex; DSWallet *ownerWallet = [providerRegistrationTransaction.chain walletHavingProviderOwnerAuthenticationHash:providerRegistrationTransaction.ownerKeyHash foundAtIndex:&ownerAddressIndex]; DSWallet *votingWallet = [providerRegistrationTransaction.chain walletHavingProviderVotingAuthenticationHash:providerRegistrationTransaction.votingKeyHash foundAtIndex:&votingAddressIndex]; DSWallet *operatorWallet = [providerRegistrationTransaction.chain walletHavingProviderOperatorAuthenticationKey:providerRegistrationTransaction.operatorKey foundAtIndex:&operatorAddressIndex]; DSWallet *holdingWallet = [providerRegistrationTransaction.chain walletContainingMasternodeHoldingAddressForProviderRegistrationTransaction:providerRegistrationTransaction foundAtIndex:&holdingAddressIndex]; + DSWallet *platformNodeWallet = [providerRegistrationTransaction.chain walletHavingPlatformNodeAuthenticationHash:providerRegistrationTransaction.platformNodeID foundAtIndex:&platformNodeAddressIndex]; //DSLogPrivate(@"%@",[uint160_data(providerRegistrationTransaction.ownerKeyHash) addressFromHash160DataForChain:providerRegistrationTransaction.chain]); self.operatorKeysWallet = operatorWallet; self.holdingKeysWallet = holdingWallet; self.ownerKeysWallet = ownerWallet; self.votingKeysWallet = votingWallet; + self.platformNodeKeysWallet = platformNodeWallet; self.ownerWalletIndex = ownerAddressIndex; self.operatorWalletIndex = operatorAddressIndex; self.votingWalletIndex = votingAddressIndex; self.holdingWalletIndex = holdingAddressIndex; + self.platformNodeWalletIndex = platformNodeAddressIndex; self.ipAddress = providerRegistrationTransaction.ipAddress; self.port = providerRegistrationTransaction.port; self.providerRegistrationTransaction = providerRegistrationTransaction;