diff --git a/DashSync.podspec b/DashSync.podspec index c02ccd24d..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.0' + 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/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 26565ed39..000000000 Binary files a/DashSync/shared/MasternodeLists/MNT530000.dat and /dev/null differ diff --git a/DashSync/shared/MasternodeLists/MNT530000__70228.dat b/DashSync/shared/MasternodeLists/MNT530000__70228.dat new file mode 100644 index 000000000..71e0fa0e8 Binary files /dev/null and b/DashSync/shared/MasternodeLists/MNT530000__70228.dat differ 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/Chain/DSChainCheckpoints.h b/DashSync/shared/Models/Chain/DSChainCheckpoints.h index df0f0fc81..a2f49d454 100644 --- a/DashSync/shared/Models/Chain/DSChainCheckpoints.h +++ b/DashSync/shared/Models/Chain/DSChainCheckpoints.h @@ -43,8 +43,8 @@ static checkpoint testnet_checkpoint_array[] = { {370368, "000001702422af778c9d1e16a891f58fbaabb6ff82dea8fc1910ab80552bdf9c", 1598642620, 0x1e02336eu, "", "717beedaa6da0d5c1124b9d0788d040ca18eb1fe6ed49c126ea9a2d30d11921c", "00000000000000000000000000000000000000000000000002239b4ac0e84dc4"}, //for tests {414106, "00000674c5269b59d6d3bb6bb08b58add4b3e0eab11136be47bb8e0d4ec86e69", 1609043444, 0x1e0dd96eu, "", "e8c45fabdb650ac2c42105083cb63998142e18be89b61bd034b3714498e6622f", "000000000000000000000000000000000000000000000000022f14058d3b2efc"}, //fork height {480000, "000001210c081f763d18db332b38ec1ac14fac62170a0d1a2028cabe8cecc799", 1618235036, 0x1e01eec7u, "", "d9fae96cce9bf0edcf9ece1b7894e0356165c0a5dcdc6f2e0784461c4168cbec", "000000000000000000000000000000000000000000000000022f14bf215f8016"}, -// {530000, "0000060db4b6bdb17f0617d15637bdf0f18ad738ccb438ee2cd000fef11c7130", 1625277934, 0x1e0fffffu, "MNT530000", "7a6a78a22df2d9dc8c44afd48dfe4a60f75428f5e6004cf4cdf82e4f81a0a68b", "000000000000000000000000000000000000000000000000022f1524ad0dacd3"}, -// {760000, "000000b80d3010bb62b309aec9a7dd748777cc5e2640a26b1981cb3c61c66211", 1657592023, 0x1e01f865u, "", "8302c05bdca60e7dfcac26cebea8d797bda1b87111cf3a3dc33050c43f2abfbe", "000000000000000000000000000000000000000000000000027baba1fe003e84"}, + {530000, "0000060db4b6bdb17f0617d15637bdf0f18ad738ccb438ee2cd000fef11c7130", 1625277934, 0x1e0fffffu, "MNT530000__70228", "7a6a78a22df2d9dc8c44afd48dfe4a60f75428f5e6004cf4cdf82e4f81a0a68b", "000000000000000000000000000000000000000000000000022f1524ad0dacd3"}, + {760000, "000000b80d3010bb62b309aec9a7dd748777cc5e2640a26b1981cb3c61c66211", 1657592023, 0x1e01f865u, "", "8302c05bdca60e7dfcac26cebea8d797bda1b87111cf3a3dc33050c43f2abfbe", "000000000000000000000000000000000000000000000000027baba1fe003e84"}, }; // blockchain checkpoints - these are also used as starting points for partial chain downloads, so they need to be at @@ -83,7 +83,7 @@ static checkpoint mainnet_checkpoint_array[] = { {1060000, "00000000000000132447e6bac9fe0d7d756851450eab29358787dc05d809bf07", 1556260812, 0x191f6aceu, "", "", "000000000000000000000000000000000000000000001392c164c11ca344daec"}, {1080000, "00000000000000099c5cc38bac7878f771408537e520a1ef9e31b5c1040d2d2a", 1559412342, 0x192a9588u, "", "", "0000000000000000000000000000000000000000000015a7e09c202c817e33d8"}, {1088640, "00000000000000112e41e4b3afda8b233b8cc07c532d2eac5de097b68358c43e", 1560773201, 0x1922ae0bu, "", "379fd491044a273372a8e901866fbe6ed9bab7ce2de0968a71d38de5d5eac340", "0000000000000000000000000000000000000000000016a12b2d3216341ba998"}, -// {1088640, "00000000000000112e41e4b3afda8b233b8cc07c532d2eac5de097b68358c43e", 1560773201, 0x1922ae0bu, "ML1088640", "379fd491044a273372a8e901866fbe6ed9bab7ce2de0968a71d38de5d5eac340", "0000000000000000000000000000000000000000000016a12b2d3216341ba998"}, + {1088640, "00000000000000112e41e4b3afda8b233b8cc07c532d2eac5de097b68358c43e", 1560773201, 0x1922ae0bu, "ML1088640__70218", "379fd491044a273372a8e901866fbe6ed9bab7ce2de0968a71d38de5d5eac340", "0000000000000000000000000000000000000000000016a12b2d3216341ba998"}, {1100000, "00000000000000190560ed4b128c156e489fdbe0814bf62c8ab53ab3259d7908", 1562561033, 0x191a9f05u, "", "", "0000000000000000000000000000000000000000000017ffbd499dd0911202a4"}, {1120000, "0000000000000011103eae768e6a322b991c5c20569d95930b87e1305fa19c75", 1565712301, 0x19200768u, "", "", "000000000000000000000000000000000000000000001a7cca810db5e54e95ca"}, {1140000, "00000000000000083ac0e592e180487cb237f659a305d2be19e883ed564fe20f", 1568864488, 0x1923198bu, "", "", "000000000000000000000000000000000000000000001ccf1b2b6718aad9bb8d"}, @@ -115,5 +115,5 @@ static checkpoint mainnet_checkpoint_array[] = { {1680000, "000000000000001d4107019248ea733abc4fd02b31db202f6bfd38f8848c7100", 1653989911, 0x192af7edu, "", "dd516ade3a5b599a6989a36e137be9e14f0fd77dad036c6c0748bfbbd73d9805", "0000000000000000000000000000000000000000000073575a368d41c4d9641c"}, {1700000, "000000000000001d7579a371e782fd9c4480f626a62b916fa4eb97e16a49043a", 1657142113, 0x1927e30eu, "", "dafe57cefc3bc265dfe8416e2f2e3a22af268fd587a48f36affd404bec738305", "000000000000000000000000000000000000000000007562df93a26b81386288"}, {1720000, "000000000000001ef1f8a3d33bbe304c1d12f59f2c8aa989099dc215fd10903e", 1660295895, 0x19362176u, "", "67c6348c35bc42aa4cabd25e29560f5d22c6a9fba274bf0c52fe73021d0e8d5e", "000000000000000000000000000000000000000000007715a9ae4dd7ff1d3902"}, -// {1720000, "000000000000001ef1f8a3d33bbe304c1d12f59f2c8aa989099dc215fd10903e", 1660295895, 0x19362176u, "ML1720000", "67c6348c35bc42aa4cabd25e29560f5d22c6a9fba274bf0c52fe73021d0e8d5e", "000000000000000000000000000000000000000000007715a9ae4dd7ff1d3902"}, + {1720000, "000000000000001ef1f8a3d33bbe304c1d12f59f2c8aa989099dc215fd10903e", 1660295895, 0x19362176u, "ML1720000__70218", "67c6348c35bc42aa4cabd25e29560f5d22c6a9fba274bf0c52fe73021d0e8d5e", "000000000000000000000000000000000000000000007715a9ae4dd7ff1d3902"}, }; diff --git a/DashSync/shared/Models/Chain/DSChainConstants.h b/DashSync/shared/Models/Chain/DSChainConstants.h index db8020b34..f352c2000 100644 --- a/DashSync/shared/Models/Chain/DSChainConstants.h +++ b/DashSync/shared/Models/Chain/DSChainConstants.h @@ -31,14 +31,14 @@ #define TESTNET_DAPI_GRPC_STANDARD_PORT 3010 #define DEVNET_DAPI_GRPC_STANDARD_PORT 3010 -#define PROTOCOL_VERSION_MAINNET 70227 -#define DEFAULT_MIN_PROTOCOL_VERSION_MAINNET 70224 +#define PROTOCOL_VERSION_MAINNET 70228 +#define DEFAULT_MIN_PROTOCOL_VERSION_MAINNET 70228 -#define PROTOCOL_VERSION_TESTNET 70227 -#define DEFAULT_MIN_PROTOCOL_VERSION_TESTNET 70224 +#define PROTOCOL_VERSION_TESTNET 70228 +#define DEFAULT_MIN_PROTOCOL_VERSION_TESTNET 70228 -#define PROTOCOL_VERSION_DEVNET 70227 -#define DEFAULT_MIN_PROTOCOL_VERSION_DEVNET 70224 +#define PROTOCOL_VERSION_DEVNET 70228 +#define DEFAULT_MIN_PROTOCOL_VERSION_DEVNET 70228 #define PLATFORM_PROTOCOL_VERSION_MAINNET 1 #define DEFAULT_MIN_PLATFORM_PROTOCOL_VERSION_MAINNET 1 @@ -49,8 +49,10 @@ #define PLATFORM_PROTOCOL_VERSION_DEVNET 1 #define DEFAULT_MIN_PLATFORM_PROTOCOL_VERSION_DEVNET 1 -#define MAX_VALID_MIN_PROTOCOL_VERSION 70227 -#define MIN_VALID_MIN_PROTOCOL_VERSION 70224 +#define DEFAULT_CHECKPOINT_PROTOCOL_VERSION 70218 + +#define MAX_VALID_MIN_PROTOCOL_VERSION 70228 +#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 diff --git a/DashSync/shared/Models/Chain/DSCheckpoint.h b/DashSync/shared/Models/Chain/DSCheckpoint.h index da81788f6..491bea9dd 100644 --- a/DashSync/shared/Models/Chain/DSCheckpoint.h +++ b/DashSync/shared/Models/Chain/DSCheckpoint.h @@ -44,6 +44,7 @@ typedef NS_ENUM(uint8_t, DSCheckpointOptions) @property (nonatomic, readonly) uint32_t timestamp; @property (nonatomic, readonly) uint32_t target; @property (nonatomic, readonly) NSString *masternodeListName; +@property (nonatomic, readonly) uint32_t protocolVersion; @property (nonatomic, readonly) UInt256 merkleRoot; @property (nonatomic, readonly) UInt256 chainWork; diff --git a/DashSync/shared/Models/Chain/DSCheckpoint.m b/DashSync/shared/Models/Chain/DSCheckpoint.m index 51cc4e7b9..1e0443076 100644 --- a/DashSync/shared/Models/Chain/DSCheckpoint.m +++ b/DashSync/shared/Models/Chain/DSCheckpoint.m @@ -135,6 +135,29 @@ - (uint8_t)parameters { return parameters; } +// This is the old protocol version used for creating checkpoints +// Now when storing list diff we add version at the end of masternode list name like this: MNT530000__70228 +- (uint32_t)protocolVersion { + uint32_t protocolVersion = DEFAULT_CHECKPOINT_PROTOCOL_VERSION; + NSError *error = NULL; + NSRegularExpression *regex = [NSRegularExpression + regularExpressionWithPattern:@"__(\\d+)" + options:NSRegularExpressionCaseInsensitive + error:&error]; + NSTextCheckingResult *match = [regex + firstMatchInString:self.masternodeListName + options:0 + range:NSMakeRange(0, [self.masternodeListName length])]; + if (match) { + NSString *numberString = [self.masternodeListName substringWithRange:[match rangeAtIndex:1]]; + if (numberString) { + protocolVersion = (uint32_t)[numberString integerValue]; + } + } + return protocolVersion; +} + + - (NSData *)serialize { NSMutableData *mData = [NSMutableData data]; [mData appendUInt8:[self parameters]]; 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/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m b/DashSync/shared/Models/Managers/Chain Managers/DSChainManager.m index 811af056b..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; @@ -680,17 +681,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/DSMasternodeManager+Mndiff.h b/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager+Mndiff.h index 403b51d2e..faff3b684 100644 --- a/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager+Mndiff.h +++ b/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager+Mndiff.h @@ -50,7 +50,7 @@ ProcessingError shouldProcessDiffWithRange(uint8_t (*base_block_hash)[32], uint8 + (MasternodeProcessorCache *)createProcessorCache; + (void)destroyProcessorCache:(MasternodeProcessorCache *)processorCache; -- (DSMnDiffProcessingResult *)processMasternodeDiffMessage:(NSData *)message withContext:(DSMasternodeProcessorContext *)context; +- (DSMnDiffProcessingResult *)processMasternodeDiffFromFile:(NSData *)message protocolVersion:(uint32_t)protocolVersion withContext:(DSMasternodeProcessorContext *)context; - (void)processMasternodeDiffWith:(NSData *)message context:(DSMasternodeProcessorContext *)context completion:(void (^)(DSMnDiffProcessingResult *result))completion; - (void)processQRInfoWith:(NSData *)message context:(DSMasternodeProcessorContext *)context completion:(void (^)(DSQRInfoProcessingResult *result))completion; diff --git a/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager+Mndiff.m b/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager+Mndiff.m index 7b277f141..b308e0d99 100644 --- a/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager+Mndiff.m +++ b/DashSync/shared/Models/Managers/Chain Managers/DSMasternodeManager+Mndiff.m @@ -280,7 +280,7 @@ - (void)processQRInfoWith:(NSData *)message context:(DSMasternodeProcessorContex completion(processingResult); } -- (DSMnDiffProcessingResult *)processMasternodeDiffMessage:(NSData *)message withContext:(DSMasternodeProcessorContext *)context { +- (DSMnDiffProcessingResult *)processMasternodeDiffFromFile:(NSData *)message protocolVersion:(uint32_t)protocolVersion withContext:(DSMasternodeProcessorContext *)context { NSAssert(self.processor, @"processMasternodeDiffMessage: No processor created"); DSLog(@"processMasternodeDiffMessage: %@", context); MNListDiffResult *result = NULL; @@ -291,12 +291,7 @@ - (DSMnDiffProcessingResult *)processMasternodeDiffMessage:(NSData *)message wit context.chain.chainType, context.useInsightAsBackup, context.isFromSnapshot, - // TODO: re-orient diff-processor to rely on is_from_snapshot + protocol_version, - // TODO: since now we can't process diff for checkpoint with the protocol version >= 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, + 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/Managers/Chain Managers/DSPeerManager.m b/DashSync/shared/Models/Managers/Chain Managers/DSPeerManager.m index 127976a93..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 @@ -768,12 +769,11 @@ - (void)connect { } } - if (self.connectedPeers.count == 0) { + 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"]; - [[NSNotificationCenter defaultCenter] postNotificationName:DSChainManagerSyncFailedNotification object:nil userInfo:@{@"error": error, DSChainManagerNotificationChainKey: self.chain}]; @@ -996,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 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; 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/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..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 => 'fix/core-v0.19-log' +# 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 ae2bd28c3..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.0) + - DashSharedCore (0.4.5) - DashSync (0.1.0): - CocoaLumberjack (= 3.7.2) - DAPI-GRPC (= 0.22.0-dev.8) - - DashSharedCore (= 0.4.0) + - DashSharedCore (= 0.4.5) - 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: 6e9af4b23b9ec40ae33040fb9ae4d12b320c70ec + DashSync: a00e5103f25ea8f62632f9c763902df7353b0468 DSDynamicOptions: 347cc5d2c4e080eb3de6a86719ad3d861b82adfc DWAlertController: 5f4cd8adf90336331c054857f709f5f8d4b16a5b gRPC: 64f36d689b2ecd99c4351f74e6f91347cdc65d9f @@ -721,11 +721,11 @@ SPEC CHECKSUMS: gRPC-ProtoRPC: 1c223e0f1732bb8d0b9e9e0ea60cc0fe995b8e2d gRPC-RxLibrary: 92327f150e11cf3b1c0f52e083944fd9f5cb5d1e KVO-MVVM: 4df3afd1f7ebcb69735458b85db59c4271ada7c6 - Protobuf: 3dd214698ddb7afd832da281c777b2e9facef401 + Protobuf: d9c3d7e5a3574aa6a5d521f2d9f733c76d294be8 SDWebImage: 9c36e66c8ce4620b41a7407698dda44211a96764 tinycbor: d4d71dddda1f8392fbb4249f63faf8552f327590 TinyCborObjc: 5204540fb90ff0c40fb22d408fa51bab79d78a80 -PODFILE CHECKSUM: a41a20e22bef00611462f1eee0ee28e1d246c77b +PODFILE CHECKSUM: 4a6ed5ed41963191295a38fad9760424b46ae9a9 COCOAPODS: 1.12.1 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 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"); }