From 8083782e76085d6e67f1591f9e9636713f3e5a35 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Tue, 24 Dec 2019 03:22:13 +0800 Subject: [PATCH] Turn core directory into submodule; --- core/consensus/consensus-bftsmart/pom.xml | 55 - .../BftsmartClientIncomingConfig.java | 67 - .../BftsmartClientIncomingSettings.java | 22 - .../bftsmart/BftsmartCommitBlockConfig.java | 35 - .../bftsmart/BftsmartCommitBlockSettings.java | 17 - .../bftsmart/BftsmartConsensusConfig.java | 54 - .../bftsmart/BftsmartConsensusProvider.java | 42 - .../bftsmart/BftsmartConsensusSettings.java | 20 - .../BftsmartConsensusSettingsBuilder.java | 308 ---- .../bftsmart/BftsmartNodeConfig.java | 66 - .../bftsmart/BftsmartNodeSettings.java | 45 - .../bftsmart/BftsmartSettingsFactory.java | 73 - .../consensus/bftsmart/BftsmartTopology.java | 30 - .../bftsmart/BftsmartTransactionType.java | 16 - .../bftsmart/client/BftsmartClientConfig.java | 79 - .../client/BftsmartClientIdentification.java | 56 - .../client/BftsmartClientSettings.java | 12 - .../client/BftsmartConsensusClient.java | 129 -- .../BftsmartConsensusClientFactory.java | 133 -- .../client/BftsmartMessageService.java | 73 - .../client/BftsmartPeerProxyFactory.java | 47 - .../client/BftsmartPeerProxyPool.java | 25 - .../client/BftsmartPeerProxyPoolConfig.java | 32 - .../BftsmartConsensusManageService.java | 71 - .../bftsmart/service/BftsmartNodeServer.java | 549 ------ .../service/BftsmartNodeServerFactory.java | 110 -- .../service/BftsmartServerSettingConfig.java | 40 - .../service/BftsmartServerSettings.java | 10 - .../src/main/resources/bftsmart.config | 144 -- .../consensus/bftsmart/ProxyClientTest.java | 137 -- .../src/test/resources/bftsmart.config | 178 -- .../src/test/resources/system.config | 121 -- core/consensus/consensus-mq/pom.xml | 71 - .../mq/MsgQueueConsensusProvider.java | 55 - .../mq/MsgQueueConsensusSettingsBuilder.java | 301 ---- .../mq/client/DefaultMessageTransmitter.java | 311 ---- .../mq/client/MessageTransmitter.java | 30 - .../mq/client/MsgQueueClientFactory.java | 92 - .../client/MsgQueueClientIdentification.java | 74 - .../mq/client/MsgQueueConsensusClient.java | 100 -- .../mq/config/MsgQueueBlockConfig.java | 47 - .../mq/config/MsgQueueClientConfig.java | 65 - .../config/MsgQueueClientIncomingConfig.java | 69 - .../mq/config/MsgQueueConsensusConfig.java | 65 - .../mq/config/MsgQueueNetworkConfig.java | 71 - .../mq/config/MsgQueueNodeConfig.java | 46 - .../mq/config/MsgQueueServerConfig.java | 72 - .../mq/config/MsgQueueSettingsFactory.java | 105 -- .../mq/consumer/AbstractConsumer.java | 44 - .../mq/consumer/MsgQueueConsumer.java | 28 - .../consensus/mq/consumer/NatsConsumer.java | 76 - .../consensus/mq/consumer/RabbitConsumer.java | 92 - .../consensus/mq/event/BlockEvent.java | 64 - .../consensus/mq/event/MessageEvent.java | 44 - .../consensus/mq/event/TxBlockedEvent.java | 58 - .../mq/exchange/BytesEventFactory.java | 30 - .../mq/exchange/BytesEventProducer.java | 40 - .../mq/exchange/ExchangeEntityFactory.java | 31 - .../mq/exchange/ExchangeEventFactory.java | 30 - .../mq/exchange/ExchangeEventInnerEntity.java | 53 - .../mq/exchange/ExchangeEventProducer.java | 40 - .../consensus/mq/exchange/ExchangeType.java | 23 - .../consensus/mq/factory/MsgQueueConfig.java | 23 - .../consensus/mq/factory/MsgQueueFactory.java | 52 - .../consensus/mq/factory/NatsFactory.java | 32 - .../consensus/mq/factory/RabbitFactory.java | 52 - .../mq/producer/MsgQueueProducer.java | 36 - .../consensus/mq/producer/NatsProducer.java | 100 -- .../consensus/mq/producer/RabbitProducer.java | 106 -- .../DefaultMsgQueueMessageDispatcher.java | 297 ---- .../server/ExtendMsgQueueMessageExecutor.java | 126 -- .../MsgQueueConsensusManageService.java | 70 - .../mq/server/MsgQueueMessageDispatcher.java | 28 - .../mq/server/MsgQueueMessageExecutor.java | 182 -- .../mq/server/MsgQueueNodeServer.java | 196 --- .../mq/server/MsgQueueNodeServerFactory.java | 61 - .../mq/settings/MsgQueueBlockSettings.java | 30 - .../MsgQueueClientIncomingSettings.java | 30 - .../mq/settings/MsgQueueClientSettings.java | 23 - .../settings/MsgQueueConsensusSettings.java | 33 - .../mq/settings/MsgQueueNetworkSettings.java | 36 - .../mq/settings/MsgQueueNodeSettings.java | 25 - .../mq/settings/MsgQueueServerSettings.java | 25 - .../consensus/mq/util/MessageConvertUtil.java | 95 - core/consensus/pom.xml | 17 - core/contract/README.MD | 27 - core/contract/contract-jvm/pom.xml | 43 - .../contract/jvm/AbstractContractCode.java | 105 -- .../contract/jvm/ContractDefinition.java | 24 - .../jvm/InstantiatedContractCode.java | 25 - .../contract/jvm/JVMContractEngine.java | 41 - .../jvm/JVMContractServiceProvider.java | 20 - .../contract/jvm/JavaContractCode.java | 108 -- core/contract/contract-maven-plugin/ReadME.MD | 274 --- .../contract-maven-plugin/conf/jd-com.priv | 1 - .../contract-maven-plugin/conf/jd-com.pub | 1 - .../conf/ownerPassword.txt | 1 - core/contract/contract-maven-plugin/pom.xml | 74 - .../contract/contract-maven-plugin/readme.txt | 19 - .../jd/blockchain/ContractDeployExeUtil.java | 178 -- .../com/jd/blockchain/ContractDeployMojo.java | 119 -- .../contract/maven/AbstractContract.java | 98 -- .../contract/maven/ContractClass.java | 66 - .../contract/maven/ContractCompileMojo.java | 288 ---- .../contract/maven/ContractConstant.java | 9 - .../contract/maven/ContractField.java | 43 - .../contract/maven/ContractMethod.java | 81 - .../contract/maven/asm/ASMClassVisitor.java | 22 - .../contract/maven/asm/ASMMethodVisitor.java | 108 -- .../contract/maven/rule/BlackList.java | 155 -- .../maven/rule/DependencyExclude.java | 93 - .../contract/maven/rule/WhiteList.java | 30 - .../contract/maven/verify/ResolveEngine.java | 169 -- .../contract/maven/verify/VerifyEngine.java | 224 --- .../src/main/resources/blacks.conf | 19 - .../src/main/resources/providers.conf | 22 - .../src/main/resources/whites.conf | 3 - .../ledger/ContractDeployMojoTest.java | 21 - .../blockchain/ledger/ContractTestBase.java | 50 - .../ledger/ContractVerifyMojoTest.java | 28 - .../ledger/ContractVerifyTest_.java | 47 - .../jd/blockchain/ledger/MyProjectStub.java | 67 - .../test/resources/AssetContract3.contract | Bin 9125 -> 0 bytes .../src/test/resources/complex.jar | Bin 476981 -> 0 bytes .../src/test/resources/contract.properties | 3 - .../project-to-test/AssetContract2.java | 39 - .../project-to-test/AssetContractImpl2.java | 98 -- .../test/resources/project-to-test/pom.xml | 24 - core/contract/pom.xml | 17 - core/crypto/crypto-adv/pom.xml | 56 - .../com/jd/blockchain/crypto/ecvrf/VRF.java | 105 -- .../crypto/elgamal/ElGamalUtils.java | 118 -- .../jd/blockchain/crypto/mpc/EqualVerify.java | 113 -- .../jd/blockchain/crypto/mpc/IntCompare.java | 284 --- .../jd/blockchain/crypto/mpc/MultiSum.java | 120 -- .../paillier/PaillierKeyPairGenerator.java | 51 - .../PaillierPrivateKeyParameters.java | 101 -- .../paillier/PaillierPublicKeyParameters.java | 59 - .../crypto/paillier/PaillierUtils.java | 218 --- .../src/main/resources/libsodium.23.dylib | Bin 730552 -> 0 bytes .../src/main/resources/libsodium.so.23.1.0 | Bin 2018224 -> 0 bytes .../jd/blockchain/crypto/ecvrf/VRFTest.java | 75 - .../crypto/elgamal/ElGamalUtilsTest.java | 73 - .../crypto/mpc/EqualVerifyTest.java | 67 - .../blockchain/crypto/mpc/IntCompareTest.java | 45 - .../blockchain/crypto/mpc/MultiSumTest.java | 89 - .../crypto/paillier/PaillierUtilsTest.java | 173 -- core/crypto/crypto-pki/pom.xml | 35 - .../crypto/service/pki/PKIAlgorithm.java | 26 - .../crypto/service/pki/PKICryptoService.java | 38 - .../pki/SHA1WITHRSA2048SignatureFunction.java | 220 --- .../pki/SHA1WITHRSA4096SignatureFunction.java | 220 --- .../pki/SM3WITHSM2SignatureFunction.java | 236 --- .../blockchain/crypto/utils/CSRBuilder.java | 178 -- .../blockchain/crypto/utils/CertParser.java | 147 -- .../com.jd.blockchain.crypto.CryptoService | 1 - .../SHA1WITHRSA2048SignatureFunctionTest.java | 273 --- .../SHA1WITHRSA4096SignatureFunctionTest.java | 314 ---- .../pki/SM3WITHSM2SignatureFunctionTest.java | 353 ---- .../crypto/utils/CSRBuilderTest.java | 396 ----- .../crypto/utils/CertParserTest.java | 150 -- core/crypto/pom.xml | 19 - core/gateway/.gitignore | 2 - core/gateway/pom.xml | 141 -- .../gateway/GatewayConfigProperties.java | 299 ---- .../gateway/GatewayConfiguration.java | 14 - .../gateway/GatewayServerBooter.java | 178 -- .../jd/blockchain/gateway/PeerConnector.java | 20 - .../jd/blockchain/gateway/PeerService.java | 12 - .../gateway/service/DataRetrievalService.java | 22 - .../service/DataRetrievalServiceHandler.java | 33 - .../service/GatewayInterceptService.java | 8 - .../GatewayInterceptServiceHandler.java | 73 - .../gateway/service/GatewayQueryService.java | 49 - .../service/GatewayQueryServiceHandler.java | 143 -- .../service/GatewayQueryServiceImpl.java | 37 - .../service/PeerConnectionManager.java | 108 -- .../gateway/web/BlockBrowserController.java | 632 ------- .../web/GatewayGlobalExceptionHandler.java | 43 - .../web/GatewayJsonResponseAdvice.java | 45 - .../gateway/web/GatewayTimeTasks.java | 46 - .../web/GatewayWebSecurityConfigurer.java | 17 - .../web/GatewayWebServerConfigurer.java | 91 - .../gateway/web/TxProcessingController.java | 72 - .../main/resources/application-gw.properties | 0 core/gateway/src/main/resources/banner.txt | 13 - core/gateway/src/main/resources/gateway.conf | 31 - core/gateway/src/main/resources/log4j2.xml | 62 - .../gateway/GatewayConfigPropertiesTest.java | 59 - .../gateway/data/HashDigestDeserializer.java | 31 - .../data/HashDigestJSONSerializeTest.java | 64 - .../gateway/data/HashDigestSerializer.java | 27 - core/gateway/src/test/resources/gateway.conf | 31 - core/ledger/ledger-database/pom.xml | 119 -- .../ledger/core/AccountAccessPolicy.java | 26 - .../ledger/core/AccountDecorator.java | 45 - .../blockchain/ledger/core/AccountQuery.java | 38 - .../ledger/core/CompositeAccount.java | 12 - .../ledger/core/ConsensusConfig.java | 28 - .../ledger/core/ContractAccount.java | 73 - .../ledger/core/ContractAccountQuery.java | 5 - .../ledger/core/ContractAccountSet.java | 131 -- .../blockchain/ledger/core/CryptoConfig.java | 94 - .../blockchain/ledger/core/DataAccount.java | 234 --- .../ledger/core/DataAccountQuery.java | 5 - .../ledger/core/DataAccountSet.java | 113 -- .../DefaultOperationHandleRegisteration.java | 122 -- .../ledger/core/EmptyAccountSet.java | 52 - .../ledger/core/EmptyLedgerDataset.java | 105 -- .../core/FullPermissionedSecurityManager.java | 98 -- .../ledger/core/GenericAccountDataset.java | 36 - .../ledger/core/GenericAccountSet.java | 92 - .../ledger/core/GenericDataEntry.java | 11 - .../ledger/core/GenericMerkleDataEntry.java | 9 - .../ledger/core/GenericMerkleDataSet.java | 259 --- .../core/GenesisLedgerStorageProxy.java | 68 - .../ledger/core/HashDigestList.java | 42 - .../blockchain/ledger/core/HashProvable.java | 10 - .../ledger/core/LedgerAdminDataQuery.java | 12 - .../ledger/core/LedgerAdminDataset.java | 481 ------ .../ledger/core/LedgerAdminInfoData.java | 92 - .../ledger/core/LedgerBlockData.java | 170 -- .../ledger/core/LedgerConfiguration.java | 58 - .../blockchain/ledger/core/LedgerConsts.java | 11 - .../ledger/core/LedgerDataQuery.java | 19 - .../blockchain/ledger/core/LedgerDataset.java | 97 -- .../blockchain/ledger/core/LedgerEditor.java | 96 -- .../ledger/core/LedgerInitDecision.java | 46 - .../ledger/core/LedgerInitProposal.java | 45 - .../ledger/core/LedgerInitProposalData.java | 33 - .../ledger/core/LedgerInitializer.java | 316 ---- .../blockchain/ledger/core/LedgerManage.java | 31 - .../blockchain/ledger/core/LedgerManager.java | 161 -- .../ledger/core/LedgerMetadata.java | 36 - .../blockchain/ledger/core/LedgerQuery.java | 125 -- .../ledger/core/LedgerQueryService.java | 430 ----- .../ledger/core/LedgerRepository.java | 27 - .../ledger/core/LedgerRepositoryImpl.java | 622 ------- .../ledger/core/LedgerSecurityManager.java | 20 - .../core/LedgerSecurityManagerImpl.java | 396 ----- .../blockchain/ledger/core/LedgerService.java | 30 - .../ledger/core/LedgerTransactionContext.java | 79 - .../ledger/core/LedgerTransactionData.java | 176 -- .../core/LedgerTransactionalEditor.java | 634 ------- .../blockchain/ledger/core/MerkleAccount.java | 516 ------ .../ledger/core/MerkleAccountHeader.java | 12 - .../ledger/core/MerkleAccountSet.java | 411 ----- .../ledger/core/MerkleDataCluster.java | 74 - .../ledger/core/MerkleDataEntry.java | 12 - .../ledger/core/MerkleDataNodeEncoder.java | 14 - .../ledger/core/MerkleDataNodeEncoder_V0.java | 128 -- .../ledger/core/MerkleDataNodeEncoder_V1.java | 200 --- .../blockchain/ledger/core/MerkleDataSet.java | 740 -------- .../ledger/core/MerkleProofException.java | 23 - .../ledger/core/MerkleProvable.java | 21 - .../core/MerkleSequenceSNGenerator.java | 20 - .../jd/blockchain/ledger/core/MerkleTree.java | 1536 ----------------- .../ledger/core/MerkleTreeEncoder.java | 31 - .../ledger/core/MultiIDsPolicy.java | 21 - .../com/jd/blockchain/ledger/core/Node.java | 11 - .../ledger/core/OpeningAccessPolicy.java | 27 - .../ledger/core/OperationHandle.java | 32 - .../ledger/core/OperationHandleContext.java | 15 - .../core/OperationHandleRegisteration.java | 9 - .../ledger/core/ParticipantCertData.java | 73 - .../ledger/core/ParticipantDataset.java | 139 -- .../com/jd/blockchain/ledger/core/Peer.java | 22 - .../ledger/core/PermissionService.java | 7 - .../ledger/core/PrefixAppender.java | 119 -- .../ledger/core/PrivilegeModelSetting.java | 9 - .../ledger/core/RolePrivilegeDataset.java | 294 ---- .../blockchain/ledger/core/SNGenerator.java | 15 - .../ledger/core/SecurityContext.java | 31 - .../ledger/core/SecurityPolicy.java | 142 -- .../ledger/core/SettingContext.java | 51 - .../blockchain/ledger/core/SmartContract.java | 12 - .../core/TransactionBatchProcessor.java | 504 ------ .../ledger/core/TransactionEngineImpl.java | 95 - .../ledger/core/TransactionQuery.java | 24 - .../core/TransactionRequestExtension.java | 115 -- .../core/TransactionRequestExtensionImpl.java | 108 -- .../ledger/core/TransactionSet.java | 182 -- .../core/TransactionStagedSnapshot.java | 49 - .../blockchain/ledger/core/UserAccount.java | 85 - .../ledger/core/UserAccountQuery.java | 5 - .../ledger/core/UserAccountSet.java | 121 -- .../ledger/core/UserRoleDataset.java | 196 --- .../ledger/core/UserRolesPrivileges.java | 63 - .../AbstractLedgerOperationHandle.java | 63 - ...tractContractEventSendOperationHandle.java | 81 - .../ContractCodeDeployOperationHandle.java | 39 - .../core/handles/ContractLedgerContext.java | 390 ----- .../DataAccountKVSetOperationHandle.java | 48 - .../DataAccountRegisterOperationHandle.java | 35 - .../JVMContractEventSendOperationHandle.java | 42 - .../handles/LedgerInitOperationHandle.java | 26 - .../ParticipantRegisterOperationHandle.java | 101 -- ...ParticipantStateUpdateOperationHandle.java | 117 -- .../RolesConfigureOperationHandle.java | 49 - .../handles/UserAuthorizeOperationHandle.java | 78 - .../handles/UserRegisterOperationHandle.java | 37 - .../serialize/LedgerBlockDeserializer.java | 29 - .../core/serialize/LedgerBlockSerializer.java | 24 - .../core/MerkleDataNodeEncoderTest.java | 153 -- .../ledger/core/PreviousDataNode.java | 191 -- .../ledger/ContractInvokingHandle.java | 50 - .../ledger/ContractInvokingTest.java | 199 --- .../jd/blockchain/ledger/KeyValueEntry.java | 19 - .../jd/blockchain/ledger/KeyValueObject.java | 47 - .../jd/blockchain/ledger/TxTestContract.java | 15 - .../blockchain/ledger/TxTestContractImpl.java | 74 - .../ledger/core/AccountSetTest.java | 70 - .../ledger/core/BaseAccountTest.java | 93 - .../ledger/core/BlockFullRollBackTest.java | 188 -- .../ledger/core/ContractInvokingHandle.java | 28 - .../ledger/core/ContractInvokingTest.java | 508 ------ .../ledger/core/LedgerAccountTest.java | 51 - .../ledger/core/LedgerAdminDatasetTest.java | 308 ---- .../ledger/core/LedgerBlockImplTest.java | 120 -- .../ledger/core/LedgerEditorTest.java | 149 -- .../ledger/core/LedgerInitOperationTest.java | 149 -- .../core/LedgerInitSettingSerializeTest.java | 156 -- .../ledger/core/LedgerManagerTest.java | 243 --- .../ledger/core/LedgerMetaDataTest.java | 227 --- .../core/LedgerSecurityManagerTest.java | 181 -- .../ledger/core/LedgerTestUtils.java | 236 --- .../core/LedgerTransactionDataTest.java | 264 --- .../ledger/core/MerkleAccountSetTest.java | 58 - .../ledger/core/MerkleDataSetTest.java | 450 ----- .../ledger/core/MerkleTreeTest.java | 815 --------- .../ledger/core/RolePrivilegeDatasetTest.java | 69 - .../blockchain/ledger/core/TestContract.java | 58 - .../ledger/core/TestContractImpl.java | 49 - .../core/TransactionBatchProcessorTest.java | 453 ----- .../ledger/core/TransactionSetTest.java | 190 -- .../core/TransactionStagedSnapshotTest.java | 55 - .../ledger/core/UserRoleDatasetTest.java | 62 - .../resources/contract-JDChain-Contract.jar | Bin 96020 -> 0 bytes .../src/test/resources/logback-test.xml | 6 - core/ledger/pom.xml | 16 - core/manager/manager-booter/pom.xml | 153 -- .../java/com/jd/blockchain/ump/UmpBooter.java | 322 ---- .../src/main/resources/META-INF/MANIFEST.MF | 10 - .../src/main/resources/application.properties | 8 - .../src/main/resources/assembly.xml | 27 - .../src/main/resources/banner.txt | 13 - .../src/main/resources/config.properties | 11 - .../src/main/resources/log4j2-jump.xml | 46 - core/manager/manager-model/pom.xml | 82 - .../jd/blockchain/ump/dao/DBConnection.java | 20 - .../ump/dao/DBConnectionProvider.java | 58 - .../ump/dao/MemoryDBConnection.java | 58 - .../blockchain/ump/dao/RocksDBConnection.java | 171 -- .../com/jd/blockchain/ump/dao/UmpDao.java | 4 - .../jd/blockchain/ump/dao/UmpDaoHandler.java | 125 -- .../jd/blockchain/ump/model/ApiResult.java | 73 - .../jd/blockchain/ump/model/ErrorCode.java | 33 - .../jd/blockchain/ump/model/MasterAddr.java | 47 - .../jd/blockchain/ump/model/PartiNode.java | 92 - .../ump/model/PeerSharedConfigs.java | 219 --- .../jd/blockchain/ump/model/UmpConstant.java | 139 -- .../com/jd/blockchain/ump/model/UmpQueue.java | 50 - .../ump/model/config/ConsensusConfig.java | 24 - .../ump/model/config/LedgerConfig.java | 46 - .../model/config/LedgerIdentification.java | 92 - .../ump/model/config/LedgerInitConfig.java | 152 -- .../ump/model/config/MasterConfig.java | 89 - .../ump/model/config/PeerLocalConfig.java | 160 -- .../ump/model/config/PeerSharedConfig.java | 86 - .../ump/model/config/PeerSharedConfigVv.java | 180 -- .../model/penetrate/DataAccountSchema.java | 47 - .../ump/model/penetrate/FieldSchema.java | 46 - .../ump/model/penetrate/LeaderDomain.java | 79 - .../ump/model/penetrate/PeerDomain.java | 177 -- .../ump/model/penetrate/SchemaDomain.java | 90 - .../ump/model/penetrate/store/MemQueue.java | 70 - .../ump/model/penetrate/store/MemStore.java | 49 - .../ump/model/state/InstallProcess.java | 21 - .../ump/model/state/InstallSchedule.java | 54 - .../ump/model/state/LedgerBindingConf.java | 33 - .../ump/model/state/LedgerInited.java | 101 -- .../ump/model/state/LedgerMasterInstall.java | 156 -- .../ump/model/state/LedgerPeerInited.java | 42 - .../ump/model/state/LedgerPeerInstall.java | 117 -- .../ump/model/state/PeerInstallSchedule.java | 32 - .../ump/model/state/PeerInstallSchedules.java | 61 - .../ump/model/state/PeerStartupSchedules.java | 40 - .../ump/model/state/ScheduleState.java | 43 - .../ump/model/state/StartupState.java | 48 - .../ump/model/user/UserKeyBuilder.java | 34 - .../blockchain/ump/model/user/UserKeys.java | 68 - .../blockchain/ump/model/user/UserKeysVv.java | 69 - .../blockchain/ump/model/web/ErrorCode.java | 20 - .../blockchain/ump/model/web/WebResponse.java | 97 -- core/manager/manager-service/pom.xml | 118 -- .../ump/service/DataAccountUmpService.java | 26 - .../service/DataAccountUmpServiceImpl.java | 41 - .../ump/service/DataRetrievalService.java | 28 - .../service/DataRetrievalServiceHandler.java | 45 - .../blockchain/ump/service/LedgerService.java | 31 - .../ump/service/LedgerServiceHandler.java | 310 ---- .../ump/service/SecurityService.java | 12 - .../ump/service/SecurityServiceHandler.java | 96 -- .../jd/blockchain/ump/service/UmpService.java | 36 - .../ump/service/UmpServiceHandler.java | 929 ---------- .../ump/service/UmpSimulateService.java | 17 - .../service/UmpSimulateServiceHandler.java | 134 -- .../ump/service/UmpStateService.java | 66 - .../ump/service/UmpStateServiceHandler.java | 905 ---------- .../ump/service/UmpStoreService.java | 51 - .../ump/service/UmpStoreServiceImpl.java | 76 - .../blockchain/ump/service/UtilService.java | 15 - .../ump/service/UtilServiceHandler.java | 80 - .../service/consensus/ConsensusProvider.java | 21 - .../service/consensus/ConsensusService.java | 10 - .../consensus/ConsensusServiceHandler.java | 81 - .../providers/BftsmartConsensusProvider.java | 162 -- .../consensus/providers/BftsmartConstant.java | 17 - .../providers/MsgQueueConsensusProvider.java | 41 - .../jd/blockchain/ump/util/Base58Utils.java | 153 -- .../jd/blockchain/ump/util/CommandUtils.java | 133 -- .../blockchain/ump/util/HttpClientPool.java | 303 ---- .../ump/util/HttpJsonClientUtils.java | 61 - .../main/resources/bftsmart.default.config | 122 -- .../src/main/resources/mq.default.config | 0 .../main/resources/security.default.config | 21 - core/manager/manager-web/pom.xml | 83 - .../blockchain/ump/UmpApplicationStarter.java | 29 - .../jd/blockchain/ump/UmpConfiguration.java | 14 - .../ump/controller/RetrievalController.java | 297 ---- .../controller/TaskRetrievalController.java | 59 - .../ump/controller/UmpDBController.java | 22 - .../ump/controller/UmpKeyController.java | 85 - .../ump/controller/UmpMasterController.java | 76 - .../ump/controller/UmpPeerController.java | 147 -- .../controller/UmpPeerSimulateController.java | 64 - .../ump/web/ControllerConfigurer.java | 29 - .../ump/web/ExceptionResponseAdvice.java | 38 - .../ump/web/JsonResponseAdvice.java | 58 - .../ump/web/LogPrintInterceptor.java | 32 - .../blockchain/ump/web/RetrievalConfig.java | 62 - .../ump/web/RetrievalConfigListener.java | 20 - .../ump/web/UmpSecurityConfiguration.java | 18 - core/manager/pom.xml | 33 - core/peer/.gitignore | 2 - core/peer/config/hosts.config | 36 - core/peer/config/system.config | 121 -- core/peer/pom.xml | 87 - core/peer/shell/start.bat | 1 - core/peer/shell/start.sh | 1 - core/peer/shell/stop.sh | 6 - .../jd/blockchain/peer/ConsensusManage.java | 33 - .../jd/blockchain/peer/ConsensusRealm.java | 35 - .../peer/LedgerBindingConfigAware.java | 12 - .../jd/blockchain/peer/PeerConfiguration.java | 15 - .../com/jd/blockchain/peer/PeerManage.java | 5 - .../jd/blockchain/peer/PeerServerBooter.java | 195 --- .../BlockchainConsensusServiceImpl.java | 213 --- .../consensus/ConsensusMessageDispatcher.java | 384 ----- .../ConsensusMessageDispatcher2.java | 474 ----- .../peer/consensus/ConsensusRealmImpl.java | 97 -- .../consensus/ConsensusViewDefinition.java | 93 - .../peer/consensus/LedgerStateManager.java | 43 - .../peer/ledger/LedgerConfigurer.java | 31 - .../statetransfer/DataSequenceReaderImpl.java | 132 -- .../statetransfer/DataSequenceWriterImpl.java | 170 -- .../peer/web/LedgerQueryController.java | 537 ------ .../peer/web/ManagementController.java | 281 --- .../peer/web/PeerGlobalExceptionHandler.java | 48 - .../peer/web/PeerJsonResponseAdvice.java | 61 - .../jd/blockchain/peer/web/PeerTimeTasks.java | 127 -- .../web/PeerWebSecurityConfiguration.java | 20 - .../peer/web/PeerWebServerConfigurer.java | 51 - core/peer/src/main/resources/banner.txt | 13 - core/peer/src/main/resources/log4j2.xml | 62 - .../service/ConsensusViewDefinitionTest.java | 47 - .../service/LedgerInitCordinatorTest.java | 151 -- .../peer/web/ControllerTestConfiguration.java | 37 - .../web/LedgerInitializingControllerTest.java | 245 --- .../peer/web/LedgerInitializingTest.java | 252 --- .../peer/web/PeerKeyStorageServiceImpl.java | 140 -- core/pom.xml | 78 - core/runtime/pom.xml | 31 - core/runtime/runtime-context/pom.xml | 19 - .../jd/blockchain/runtime/AbstractModule.java | 104 -- .../com/jd/blockchain/runtime/Module.java | 39 - .../jd/blockchain/runtime/RuntimeContext.java | 279 --- .../src/main/resources/black.config | 2 - core/runtime/runtime-modular-booter/pom.xml | 11 - .../blockchain/runtime/boot/ArgumentSet.java | 158 -- .../runtime/boot/ClassPathUtils.java | 20 - .../blockchain/runtime/boot/HomeBooter.java | 155 -- .../blockchain/runtime/boot/HomeContext.java | 51 - core/runtime/runtime-modular/pom.xml | 20 - .../runtime/modular/JarsModule.java | 28 - .../runtime/modular/ModularFactory.java | 20 - .../modular/ModularRuntimeContext.java | 60 - .../runtime/modular/MuduleClassLoader.java | 23 - .../runtime/modular/SystemModule.java | 62 - core/storage/pom.xml | 27 - core/storage/storage-redis/.gitignore | 1 - core/storage/storage-redis/pom.xml | 42 - .../service/impl/redis/JedisConnection.java | 29 - .../service/impl/redis/JedisProperties.java | 35 - .../impl/redis/RedisConnectionFactory.java | 109 -- .../service/impl/redis/RedisConsts.java | 17 - .../impl/redis/RedisExPolicyStorage.java | 67 - .../impl/redis/RedisStorageConfiguration.java | 31 - .../impl/redis/RedisStorageService.java | 39 - .../impl/redis/RedisVerioningStorage.java | 135 -- .../main/resources/META-INF/spring.factories | 2 - .../redis/RedisConnectionFactoryTest.java | 32 - .../storage/service/impl/redis/Test.java | 88 - core/storage/storage-rocksdb/pom.xml | 45 - .../service/demo/rocksdb/RocksDBDemo.java | 286 --- .../RocksDBStoragePerformanceTest.java | 92 - .../service/impl/rocksdb/KVWritingCache.java | 68 - .../impl/rocksdb/RocksDBConnection.java | 60 - .../rocksdb/RocksDBConnectionFactory.java | 126 -- .../impl/rocksdb/RocksDBExPolicyStorage.java | 55 - .../impl/rocksdb/RocksDBStorageService.java | 30 - .../rocksdb/RocksDBVersioningStorage.java | 258 --- .../impl/rocksdb/RocksDBStorageTest.java | 153 -- core/tools/pom.xml | 21 - core/tools/tools-capability/pom.xml | 95 - .../capability/CapabilityBooter.java | 26 - .../capability/CapabilityEngine.java | 108 -- .../service/RemoteTransactionService.java | 364 ---- .../capability/service/SettingsInit.java | 139 -- .../settings/CapabilitySettings.java | 47 - .../src/main/resources/META-INF/MANIFEST.MF | 10 - .../src/main/resources/settings.conf | 4 - .../tools-initializer-booter/ledger.init | 85 - .../tools/tools-initializer-booter/local.conf | 22 - core/tools/tools-initializer-booter/pom.xml | 61 - .../boot/LedgerInitCommandBooter.java | 95 - .../src/main/resources/META-INF/MANIFEST.MF | 10 - core/tools/tools-initializer/.gitignore | 1 - core/tools/tools-initializer/bftsmart.config | 144 -- core/tools/tools-initializer/pom.xml | 111 -- .../tools/initializer/ConsolePrompter.java | 45 - .../tools/initializer/DBConnectionConfig.java | 31 - .../initializer/InitializerConfiguration.java | 13 - .../tools/initializer/InitializingStep.java | 9 - .../initializer/LedgerBindingConfig.java | 401 ----- .../tools/initializer/LedgerInitCommand.java | 254 --- .../tools/initializer/LedgerInitProcess.java | 41 - .../tools/initializer/LocalConfig.java | 153 -- .../tools/initializer/LogPrompter.java | 52 - .../initializer/PresetAnswerPrompter.java | 30 - .../tools/initializer/Prompter.java | 37 - .../tools/initializer/web/DataCodes.java | 5 - .../web/DecisionRequestBodyConverter.java | 20 - .../web/DecisionResponseConverter.java | 23 - .../web/HttpInitConsensServiceFactory.java | 17 - .../web/InitConsensusServiceFactory.java | 9 - .../web/InitServiceExceptionHandler.java | 26 - .../web/InitWebSecurityConfiguration.java | 19 - .../web/InitWebServerConfiguration.java | 38 - .../web/LedgerInitConfiguration.java | 282 --- .../web/LedgerInitConsensusService.java | 37 - .../web/LedgerInitDecisionData.java | 42 - .../web/LedgerInitMessageConverter.java | 113 -- .../initializer/web/LedgerInitResponse.java | 85 - .../web/LedgerInitializeWebController.java | 727 -------- .../web/PermissionResponseConverter.java | 24 - .../SignatureDigestRequestBodyConverter.java | 19 - .../main/resources/META-INF/spring.factories | 2 - .../src/main/resources/application.properties | 13 - .../src/main/resources/banner.txt | 13 - .../src/main/resources/local.conf | 18 - .../src/main/resources/log4j2-init.xml | 62 - .../src/main/resources/mq.config | 6 - .../src/main/resources/system.config | 126 -- .../initializer/ConsensusSettingTest.java | 52 - .../initializer/LedgerBindingConfigTest.java | 101 -- .../tools/initializer/TestConsts.java | 37 - .../src/test/resources/bftsmart.config | 144 -- .../src/test/resources/keys/parti2.pub | 1 - .../src/test/resources/ledger-binding.conf | 38 - .../src/test/resources/ledger.init | 158 -- .../src/test/resources/local.conf | 25 - .../src/test/resources/mq.config | 6 - .../src/test/resources/system.config | 121 -- .../test/java/com/jd/blockchain/AppTest.java | 20 - core/tools/tools-keygen-booter/pom.xml | 58 - .../tools/keygen/boot/KeyGenBooter.java | 96 -- .../src/main/resources/META-INF/MANIFEST.MF | 9 - core/tools/tools-keygen/pom.xml | 33 - .../tools/keygen/KeyGenCommand.java | 218 --- core/tools/tools-mocker/pom.xml | 61 - .../mocker/MockerLedgerInitializer.java | 339 ---- .../blockchain/mocker/MockerNodeContext.java | 512 ------ .../config/LedgerInitWebConfiguration.java | 22 - .../mocker/config/MockerConstant.java | 67 - .../mocker/config/PresetAnswerPrompter.java | 32 - .../mocker/contracts/AccountContract.java | 17 - .../mocker/contracts/AccountContractImpl.java | 72 - .../mocker/contracts/WriteContract.java | 14 - .../mocker/contracts/WriteContractImpl.java | 33 - .../com/jd/blockchain/mocker/data/KvData.java | 54 - .../blockchain/mocker/data/ResponseData.java | 38 - .../handler/MockerContractExeHandle.java | 152 -- .../mocker/handler/MockerNodeHandler.java | 189 -- .../MockerOperationHandleRegister.java | 54 - .../mocker/handler/MockerServiceHandler.java | 216 --- .../mocker/node/GatewayNodeRunner.java | 75 - .../mocker/node/NodeWebContext.java | 106 -- .../mocker/node/PeerNodeRunner.java | 62 - .../mocker/proxy/ContractProxy.java | 88 - .../mocker/proxy/ExecutorProxy.java | 34 - .../src/main/resources/bftsmart.config | 167 -- .../src/main/resources/bftsmart4.config | 167 -- .../src/main/resources/bftsmart8.config | 208 --- .../src/main/resources/ledger4.init | 72 - .../src/main/resources/ledger8.init | 125 -- .../contract/AccountMockerTest.java | 50 - .../com/jd/blockchain/contract/MockTest.java | 54 - .../jd/blockchain/contract/SampleTest.java | 49 - 619 files changed, 60998 deletions(-) delete mode 100644 core/consensus/consensus-bftsmart/pom.xml delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartClientIncomingConfig.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartClientIncomingSettings.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartCommitBlockConfig.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartCommitBlockSettings.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusConfig.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusProvider.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettings.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartNodeConfig.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartNodeSettings.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartSettingsFactory.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartTopology.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartTransactionType.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientConfig.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientIdentification.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientSettings.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClient.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClientFactory.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartMessageService.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyFactory.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyPool.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyPoolConfig.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartConsensusManageService.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServerFactory.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartServerSettingConfig.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartServerSettings.java delete mode 100644 core/consensus/consensus-bftsmart/src/main/resources/bftsmart.config delete mode 100644 core/consensus/consensus-bftsmart/src/test/java/test/com/jd/blockchain/consensus/bftsmart/ProxyClientTest.java delete mode 100644 core/consensus/consensus-bftsmart/src/test/resources/bftsmart.config delete mode 100644 core/consensus/consensus-bftsmart/src/test/resources/system.config delete mode 100644 core/consensus/consensus-mq/pom.xml delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusProvider.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/DefaultMessageTransmitter.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MessageTransmitter.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueClientFactory.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueClientIdentification.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueConsensusClient.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueBlockConfig.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueClientConfig.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueClientIncomingConfig.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueConsensusConfig.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueNetworkConfig.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueNodeConfig.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueServerConfig.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueSettingsFactory.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/AbstractConsumer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/MsgQueueConsumer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/NatsConsumer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/RabbitConsumer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/BlockEvent.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/MessageEvent.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/TxBlockedEvent.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/BytesEventFactory.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/BytesEventProducer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEntityFactory.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventFactory.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventInnerEntity.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventProducer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeType.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/MsgQueueConfig.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/MsgQueueFactory.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/NatsFactory.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/RabbitFactory.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/MsgQueueProducer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/NatsProducer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/RabbitProducer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/DefaultMsgQueueMessageDispatcher.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/ExtendMsgQueueMessageExecutor.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueConsensusManageService.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueMessageDispatcher.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueMessageExecutor.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueNodeServer.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueNodeServerFactory.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueBlockSettings.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueClientIncomingSettings.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueClientSettings.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueConsensusSettings.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueNetworkSettings.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueNodeSettings.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueServerSettings.java delete mode 100644 core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/util/MessageConvertUtil.java delete mode 100644 core/consensus/pom.xml delete mode 100644 core/contract/README.MD delete mode 100644 core/contract/contract-jvm/pom.xml delete mode 100644 core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/AbstractContractCode.java delete mode 100644 core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/ContractDefinition.java delete mode 100644 core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/InstantiatedContractCode.java delete mode 100644 core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JVMContractEngine.java delete mode 100644 core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JVMContractServiceProvider.java delete mode 100644 core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java delete mode 100644 core/contract/contract-maven-plugin/ReadME.MD delete mode 100644 core/contract/contract-maven-plugin/conf/jd-com.priv delete mode 100644 core/contract/contract-maven-plugin/conf/jd-com.pub delete mode 100644 core/contract/contract-maven-plugin/conf/ownerPassword.txt delete mode 100644 core/contract/contract-maven-plugin/pom.xml delete mode 100644 core/contract/contract-maven-plugin/readme.txt delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/AbstractContract.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractClass.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractConstant.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractField.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractMethod.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/asm/ASMClassVisitor.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/asm/ASMMethodVisitor.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/BlackList.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/DependencyExclude.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/WhiteList.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/ResolveEngine.java delete mode 100644 core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/VerifyEngine.java delete mode 100644 core/contract/contract-maven-plugin/src/main/resources/blacks.conf delete mode 100644 core/contract/contract-maven-plugin/src/main/resources/providers.conf delete mode 100644 core/contract/contract-maven-plugin/src/main/resources/whites.conf delete mode 100644 core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractDeployMojoTest.java delete mode 100644 core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractTestBase.java delete mode 100644 core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyMojoTest.java delete mode 100644 core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyTest_.java delete mode 100644 core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/MyProjectStub.java delete mode 100644 core/contract/contract-maven-plugin/src/test/resources/AssetContract3.contract delete mode 100644 core/contract/contract-maven-plugin/src/test/resources/complex.jar delete mode 100644 core/contract/contract-maven-plugin/src/test/resources/contract.properties delete mode 100644 core/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContract2.java delete mode 100644 core/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContractImpl2.java delete mode 100644 core/contract/contract-maven-plugin/src/test/resources/project-to-test/pom.xml delete mode 100644 core/contract/pom.xml delete mode 100644 core/crypto/crypto-adv/pom.xml delete mode 100644 core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/ecvrf/VRF.java delete mode 100644 core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/elgamal/ElGamalUtils.java delete mode 100644 core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/EqualVerify.java delete mode 100644 core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/IntCompare.java delete mode 100644 core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/MultiSum.java delete mode 100644 core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierKeyPairGenerator.java delete mode 100644 core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierPrivateKeyParameters.java delete mode 100644 core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierPublicKeyParameters.java delete mode 100644 core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierUtils.java delete mode 100755 core/crypto/crypto-adv/src/main/resources/libsodium.23.dylib delete mode 100755 core/crypto/crypto-adv/src/main/resources/libsodium.so.23.1.0 delete mode 100644 core/crypto/crypto-adv/src/test/java/test/com/jd/blockchain/crypto/ecvrf/VRFTest.java delete mode 100644 core/crypto/crypto-adv/src/test/java/test/com/jd/blockchain/crypto/elgamal/ElGamalUtilsTest.java delete mode 100644 core/crypto/crypto-adv/src/test/java/test/com/jd/blockchain/crypto/mpc/EqualVerifyTest.java delete mode 100644 core/crypto/crypto-adv/src/test/java/test/com/jd/blockchain/crypto/mpc/IntCompareTest.java delete mode 100644 core/crypto/crypto-adv/src/test/java/test/com/jd/blockchain/crypto/mpc/MultiSumTest.java delete mode 100644 core/crypto/crypto-adv/src/test/java/test/com/jd/blockchain/crypto/paillier/PaillierUtilsTest.java delete mode 100644 core/crypto/crypto-pki/pom.xml delete mode 100644 core/crypto/crypto-pki/src/main/java/com/jd/blockchain/crypto/service/pki/PKIAlgorithm.java delete mode 100644 core/crypto/crypto-pki/src/main/java/com/jd/blockchain/crypto/service/pki/PKICryptoService.java delete mode 100644 core/crypto/crypto-pki/src/main/java/com/jd/blockchain/crypto/service/pki/SHA1WITHRSA2048SignatureFunction.java delete mode 100644 core/crypto/crypto-pki/src/main/java/com/jd/blockchain/crypto/service/pki/SHA1WITHRSA4096SignatureFunction.java delete mode 100644 core/crypto/crypto-pki/src/main/java/com/jd/blockchain/crypto/service/pki/SM3WITHSM2SignatureFunction.java delete mode 100644 core/crypto/crypto-pki/src/main/java/com/jd/blockchain/crypto/utils/CSRBuilder.java delete mode 100644 core/crypto/crypto-pki/src/main/java/com/jd/blockchain/crypto/utils/CertParser.java delete mode 100644 core/crypto/crypto-pki/src/main/resources/META-INF/services/com.jd.blockchain.crypto.CryptoService delete mode 100644 core/crypto/crypto-pki/src/test/java/com/jd/blockchain/crypto/service/pki/SHA1WITHRSA2048SignatureFunctionTest.java delete mode 100644 core/crypto/crypto-pki/src/test/java/com/jd/blockchain/crypto/service/pki/SHA1WITHRSA4096SignatureFunctionTest.java delete mode 100644 core/crypto/crypto-pki/src/test/java/com/jd/blockchain/crypto/service/pki/SM3WITHSM2SignatureFunctionTest.java delete mode 100644 core/crypto/crypto-pki/src/test/java/com/jd/blockchain/crypto/utils/CSRBuilderTest.java delete mode 100644 core/crypto/crypto-pki/src/test/java/com/jd/blockchain/crypto/utils/CertParserTest.java delete mode 100644 core/crypto/pom.xml delete mode 100644 core/gateway/.gitignore delete mode 100644 core/gateway/pom.xml delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/GatewayConfigProperties.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/GatewayConfiguration.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/GatewayServerBooter.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/PeerConnector.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/PeerService.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalService.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalServiceHandler.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayInterceptService.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayInterceptServiceHandler.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryService.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceHandler.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceImpl.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/service/PeerConnectionManager.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/web/GatewayGlobalExceptionHandler.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/web/GatewayJsonResponseAdvice.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/web/GatewayTimeTasks.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/web/GatewayWebSecurityConfigurer.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/web/GatewayWebServerConfigurer.java delete mode 100644 core/gateway/src/main/java/com/jd/blockchain/gateway/web/TxProcessingController.java delete mode 100644 core/gateway/src/main/resources/application-gw.properties delete mode 100644 core/gateway/src/main/resources/banner.txt delete mode 100644 core/gateway/src/main/resources/gateway.conf delete mode 100644 core/gateway/src/main/resources/log4j2.xml delete mode 100644 core/gateway/src/test/java/test/com/jd/blockchain/gateway/GatewayConfigPropertiesTest.java delete mode 100644 core/gateway/src/test/java/test/com/jd/blockchain/gateway/data/HashDigestDeserializer.java delete mode 100644 core/gateway/src/test/java/test/com/jd/blockchain/gateway/data/HashDigestJSONSerializeTest.java delete mode 100644 core/gateway/src/test/java/test/com/jd/blockchain/gateway/data/HashDigestSerializer.java delete mode 100644 core/gateway/src/test/resources/gateway.conf delete mode 100644 core/ledger/ledger-database/pom.xml delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/AccountAccessPolicy.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/AccountDecorator.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/AccountQuery.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/CompositeAccount.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/ConsensusConfig.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/ContractAccount.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/ContractAccountQuery.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/ContractAccountSet.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/CryptoConfig.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/DataAccount.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/DataAccountQuery.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/DataAccountSet.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/DefaultOperationHandleRegisteration.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/EmptyAccountSet.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/EmptyLedgerDataset.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/FullPermissionedSecurityManager.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/GenericAccountDataset.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/GenericAccountSet.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/GenericDataEntry.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/GenericMerkleDataEntry.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/GenericMerkleDataSet.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/GenesisLedgerStorageProxy.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/HashDigestList.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/HashProvable.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataQuery.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminInfoData.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerBlockData.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerConfiguration.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerConsts.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerDataQuery.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerDataset.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerEditor.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerInitDecision.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerInitProposal.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerInitProposalData.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerInitializer.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerManage.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerManager.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerMetadata.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerQuery.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerQueryService.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerRepository.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerRepositoryImpl.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerSecurityManager.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerSecurityManagerImpl.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerService.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionData.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionalEditor.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleAccount.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleAccountHeader.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleAccountSet.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleDataCluster.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleDataEntry.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleDataNodeEncoder.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleDataNodeEncoder_V0.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleDataNodeEncoder_V1.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleDataSet.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleProofException.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleProvable.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleSequenceSNGenerator.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleTree.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MerkleTreeEncoder.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/MultiIDsPolicy.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/Node.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/OpeningAccessPolicy.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/OperationHandleContext.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/OperationHandleRegisteration.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/ParticipantCertData.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/ParticipantDataset.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/Peer.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/PermissionService.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/PrefixAppender.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/PrivilegeModelSetting.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/RolePrivilegeDataset.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/SNGenerator.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/SecurityContext.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/SecurityPolicy.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/SettingContext.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/SmartContract.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/TransactionBatchProcessor.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/TransactionEngineImpl.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/TransactionQuery.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/TransactionRequestExtension.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/TransactionRequestExtensionImpl.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/TransactionSet.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/TransactionStagedSnapshot.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/UserAccount.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/UserAccountQuery.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/UserAccountSet.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/UserRoleDataset.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/UserRolesPrivileges.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/AbstractLedgerOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/AbtractContractEventSendOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/ContractCodeDeployOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/ContractLedgerContext.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/DataAccountKVSetOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/DataAccountRegisterOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/JVMContractEventSendOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/LedgerInitOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/RolesConfigureOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/UserAuthorizeOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/handles/UserRegisterOperationHandle.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/serialize/LedgerBlockDeserializer.java delete mode 100644 core/ledger/ledger-database/src/main/java/com/jd/blockchain/ledger/core/serialize/LedgerBlockSerializer.java delete mode 100644 core/ledger/ledger-database/src/test/java/com/jd/blockchain/ledger/core/MerkleDataNodeEncoderTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/com/jd/blockchain/ledger/core/PreviousDataNode.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingHandle.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/KeyValueEntry.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/KeyValueObject.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/TxTestContract.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/TxTestContractImpl.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/AccountSetTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/BaseAccountTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/BlockFullRollBackTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingHandle.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerAccountTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerAdminDatasetTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerBlockImplTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerEditorTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitOperationTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitSettingSerializeTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerManagerTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerMetaDataTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerSecurityManagerTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerTestUtils.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/LedgerTransactionDataTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/MerkleAccountSetTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/MerkleDataSetTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/MerkleTreeTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/RolePrivilegeDatasetTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/TestContract.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/TestContractImpl.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/TransactionBatchProcessorTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/TransactionSetTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/TransactionStagedSnapshotTest.java delete mode 100644 core/ledger/ledger-database/src/test/java/test/com/jd/blockchain/ledger/core/UserRoleDatasetTest.java delete mode 100644 core/ledger/ledger-database/src/test/resources/contract-JDChain-Contract.jar delete mode 100644 core/ledger/ledger-database/src/test/resources/logback-test.xml delete mode 100644 core/ledger/pom.xml delete mode 100644 core/manager/manager-booter/pom.xml delete mode 100644 core/manager/manager-booter/src/main/java/com/jd/blockchain/ump/UmpBooter.java delete mode 100644 core/manager/manager-booter/src/main/resources/META-INF/MANIFEST.MF delete mode 100644 core/manager/manager-booter/src/main/resources/application.properties delete mode 100644 core/manager/manager-booter/src/main/resources/assembly.xml delete mode 100644 core/manager/manager-booter/src/main/resources/banner.txt delete mode 100644 core/manager/manager-booter/src/main/resources/config.properties delete mode 100644 core/manager/manager-booter/src/main/resources/log4j2-jump.xml delete mode 100644 core/manager/manager-model/pom.xml delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/DBConnection.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/DBConnectionProvider.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/MemoryDBConnection.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/RocksDBConnection.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/UmpDao.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/UmpDaoHandler.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/ApiResult.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/ErrorCode.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/MasterAddr.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/PartiNode.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/PeerSharedConfigs.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/UmpConstant.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/UmpQueue.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/ConsensusConfig.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerConfig.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerIdentification.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerInitConfig.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/MasterConfig.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerLocalConfig.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfig.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfigVv.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/DataAccountSchema.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/FieldSchema.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/LeaderDomain.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/PeerDomain.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/SchemaDomain.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemQueue.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemStore.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/InstallProcess.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/InstallSchedule.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerBindingConf.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerInited.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerMasterInstall.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInited.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInstall.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedule.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedules.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/PeerStartupSchedules.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/ScheduleState.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/StartupState.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeyBuilder.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeys.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeysVv.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/web/ErrorCode.java delete mode 100644 core/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/web/WebResponse.java delete mode 100644 core/manager/manager-service/pom.xml delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpServiceImpl.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalServiceHandler.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/LedgerService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/LedgerServiceHandler.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/SecurityService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/SecurityServiceHandler.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpServiceHandler.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateServiceHandler.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStateService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStateServiceHandler.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreServiceImpl.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UtilService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UtilServiceHandler.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusProvider.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusService.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusServiceHandler.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConsensusProvider.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConstant.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/MsgQueueConsensusProvider.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/Base58Utils.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/CommandUtils.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/HttpClientPool.java delete mode 100644 core/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/HttpJsonClientUtils.java delete mode 100644 core/manager/manager-service/src/main/resources/bftsmart.default.config delete mode 100644 core/manager/manager-service/src/main/resources/mq.default.config delete mode 100644 core/manager/manager-service/src/main/resources/security.default.config delete mode 100644 core/manager/manager-web/pom.xml delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/UmpApplicationStarter.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/UmpConfiguration.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/RetrievalController.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/TaskRetrievalController.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpDBController.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpKeyController.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpMasterController.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerController.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerSimulateController.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/ControllerConfigurer.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/ExceptionResponseAdvice.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/JsonResponseAdvice.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/LogPrintInterceptor.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfig.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfigListener.java delete mode 100644 core/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/UmpSecurityConfiguration.java delete mode 100644 core/manager/pom.xml delete mode 100644 core/peer/.gitignore delete mode 100644 core/peer/config/hosts.config delete mode 100644 core/peer/config/system.config delete mode 100644 core/peer/pom.xml delete mode 100644 core/peer/shell/start.bat delete mode 100644 core/peer/shell/start.sh delete mode 100644 core/peer/shell/stop.sh delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/ConsensusManage.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/ConsensusRealm.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/LedgerBindingConfigAware.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/PeerConfiguration.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/PeerManage.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/PeerServerBooter.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/consensus/BlockchainConsensusServiceImpl.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher2.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusRealmImpl.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusViewDefinition.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/consensus/LedgerStateManager.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/ledger/LedgerConfigurer.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/statetransfer/DataSequenceReaderImpl.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/statetransfer/DataSequenceWriterImpl.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/web/PeerGlobalExceptionHandler.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/web/PeerJsonResponseAdvice.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/web/PeerTimeTasks.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/web/PeerWebSecurityConfiguration.java delete mode 100644 core/peer/src/main/java/com/jd/blockchain/peer/web/PeerWebServerConfigurer.java delete mode 100644 core/peer/src/main/resources/banner.txt delete mode 100644 core/peer/src/main/resources/log4j2.xml delete mode 100644 core/peer/src/test/java/test/com/jd/blockchain/peer/service/ConsensusViewDefinitionTest.java delete mode 100644 core/peer/src/test/java/test/com/jd/blockchain/peer/service/LedgerInitCordinatorTest.java delete mode 100644 core/peer/src/test/java/test/com/jd/blockchain/peer/web/ControllerTestConfiguration.java delete mode 100644 core/peer/src/test/java/test/com/jd/blockchain/peer/web/LedgerInitializingControllerTest.java delete mode 100644 core/peer/src/test/java/test/com/jd/blockchain/peer/web/LedgerInitializingTest.java delete mode 100644 core/peer/src/test/java/test/com/jd/blockchain/peer/web/PeerKeyStorageServiceImpl.java delete mode 100644 core/pom.xml delete mode 100644 core/runtime/pom.xml delete mode 100644 core/runtime/runtime-context/pom.xml delete mode 100644 core/runtime/runtime-context/src/main/java/com/jd/blockchain/runtime/AbstractModule.java delete mode 100644 core/runtime/runtime-context/src/main/java/com/jd/blockchain/runtime/Module.java delete mode 100644 core/runtime/runtime-context/src/main/java/com/jd/blockchain/runtime/RuntimeContext.java delete mode 100644 core/runtime/runtime-context/src/main/resources/black.config delete mode 100644 core/runtime/runtime-modular-booter/pom.xml delete mode 100644 core/runtime/runtime-modular-booter/src/main/java/com/jd/blockchain/runtime/boot/ArgumentSet.java delete mode 100644 core/runtime/runtime-modular-booter/src/main/java/com/jd/blockchain/runtime/boot/ClassPathUtils.java delete mode 100644 core/runtime/runtime-modular-booter/src/main/java/com/jd/blockchain/runtime/boot/HomeBooter.java delete mode 100644 core/runtime/runtime-modular-booter/src/main/java/com/jd/blockchain/runtime/boot/HomeContext.java delete mode 100644 core/runtime/runtime-modular/pom.xml delete mode 100644 core/runtime/runtime-modular/src/main/java/com/jd/blockchain/runtime/modular/JarsModule.java delete mode 100644 core/runtime/runtime-modular/src/main/java/com/jd/blockchain/runtime/modular/ModularFactory.java delete mode 100644 core/runtime/runtime-modular/src/main/java/com/jd/blockchain/runtime/modular/ModularRuntimeContext.java delete mode 100644 core/runtime/runtime-modular/src/main/java/com/jd/blockchain/runtime/modular/MuduleClassLoader.java delete mode 100644 core/runtime/runtime-modular/src/main/java/com/jd/blockchain/runtime/modular/SystemModule.java delete mode 100644 core/storage/pom.xml delete mode 100644 core/storage/storage-redis/.gitignore delete mode 100644 core/storage/storage-redis/pom.xml delete mode 100644 core/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/JedisConnection.java delete mode 100644 core/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/JedisProperties.java delete mode 100644 core/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/RedisConnectionFactory.java delete mode 100644 core/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/RedisConsts.java delete mode 100644 core/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/RedisExPolicyStorage.java delete mode 100644 core/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/RedisStorageConfiguration.java delete mode 100644 core/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/RedisStorageService.java delete mode 100644 core/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/RedisVerioningStorage.java delete mode 100644 core/storage/storage-redis/src/main/resources/META-INF/spring.factories delete mode 100644 core/storage/storage-redis/src/test/java/test/com/jd/blockchain/storage/service/impl/redis/RedisConnectionFactoryTest.java delete mode 100644 core/storage/storage-redis/src/test/java/test/com/jd/blockchain/storage/service/impl/redis/Test.java delete mode 100644 core/storage/storage-rocksdb/pom.xml delete mode 100644 core/storage/storage-rocksdb/src/main/java/com/jd/blockchain/storage/service/demo/rocksdb/RocksDBDemo.java delete mode 100644 core/storage/storage-rocksdb/src/main/java/com/jd/blockchain/storage/service/demo/rocksdb/RocksDBStoragePerformanceTest.java delete mode 100644 core/storage/storage-rocksdb/src/main/java/com/jd/blockchain/storage/service/impl/rocksdb/KVWritingCache.java delete mode 100644 core/storage/storage-rocksdb/src/main/java/com/jd/blockchain/storage/service/impl/rocksdb/RocksDBConnection.java delete mode 100644 core/storage/storage-rocksdb/src/main/java/com/jd/blockchain/storage/service/impl/rocksdb/RocksDBConnectionFactory.java delete mode 100644 core/storage/storage-rocksdb/src/main/java/com/jd/blockchain/storage/service/impl/rocksdb/RocksDBExPolicyStorage.java delete mode 100644 core/storage/storage-rocksdb/src/main/java/com/jd/blockchain/storage/service/impl/rocksdb/RocksDBStorageService.java delete mode 100644 core/storage/storage-rocksdb/src/main/java/com/jd/blockchain/storage/service/impl/rocksdb/RocksDBVersioningStorage.java delete mode 100644 core/storage/storage-rocksdb/src/test/java/test/com/jd/blockchain/storage/service/impl/rocksdb/RocksDBStorageTest.java delete mode 100644 core/tools/pom.xml delete mode 100644 core/tools/tools-capability/pom.xml delete mode 100644 core/tools/tools-capability/src/main/java/com/jd/blockchain/capability/CapabilityBooter.java delete mode 100644 core/tools/tools-capability/src/main/java/com/jd/blockchain/capability/CapabilityEngine.java delete mode 100644 core/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/RemoteTransactionService.java delete mode 100644 core/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/SettingsInit.java delete mode 100644 core/tools/tools-capability/src/main/java/com/jd/blockchain/capability/settings/CapabilitySettings.java delete mode 100644 core/tools/tools-capability/src/main/resources/META-INF/MANIFEST.MF delete mode 100644 core/tools/tools-capability/src/main/resources/settings.conf delete mode 100644 core/tools/tools-initializer-booter/ledger.init delete mode 100644 core/tools/tools-initializer-booter/local.conf delete mode 100644 core/tools/tools-initializer-booter/pom.xml delete mode 100644 core/tools/tools-initializer-booter/src/main/java/com/jd/blockchain/tools/initializer/boot/LedgerInitCommandBooter.java delete mode 100644 core/tools/tools-initializer-booter/src/main/resources/META-INF/MANIFEST.MF delete mode 100644 core/tools/tools-initializer/.gitignore delete mode 100644 core/tools/tools-initializer/bftsmart.config delete mode 100644 core/tools/tools-initializer/pom.xml delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/ConsolePrompter.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/DBConnectionConfig.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/InitializerConfiguration.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/InitializingStep.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerBindingConfig.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitCommand.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProcess.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LocalConfig.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LogPrompter.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/PresetAnswerPrompter.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/Prompter.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/DataCodes.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/DecisionRequestBodyConverter.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/DecisionResponseConverter.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/HttpInitConsensServiceFactory.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/InitConsensusServiceFactory.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/InitServiceExceptionHandler.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/InitWebSecurityConfiguration.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/InitWebServerConfiguration.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitConfiguration.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitConsensusService.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitDecisionData.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitMessageConverter.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitResponse.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/PermissionResponseConverter.java delete mode 100644 core/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/SignatureDigestRequestBodyConverter.java delete mode 100644 core/tools/tools-initializer/src/main/resources/META-INF/spring.factories delete mode 100644 core/tools/tools-initializer/src/main/resources/application.properties delete mode 100644 core/tools/tools-initializer/src/main/resources/banner.txt delete mode 100644 core/tools/tools-initializer/src/main/resources/local.conf delete mode 100644 core/tools/tools-initializer/src/main/resources/log4j2-init.xml delete mode 100644 core/tools/tools-initializer/src/main/resources/mq.config delete mode 100644 core/tools/tools-initializer/src/main/resources/system.config delete mode 100644 core/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/ConsensusSettingTest.java delete mode 100644 core/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/LedgerBindingConfigTest.java delete mode 100644 core/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/TestConsts.java delete mode 100644 core/tools/tools-initializer/src/test/resources/bftsmart.config delete mode 100644 core/tools/tools-initializer/src/test/resources/keys/parti2.pub delete mode 100644 core/tools/tools-initializer/src/test/resources/ledger-binding.conf delete mode 100644 core/tools/tools-initializer/src/test/resources/ledger.init delete mode 100644 core/tools/tools-initializer/src/test/resources/local.conf delete mode 100644 core/tools/tools-initializer/src/test/resources/mq.config delete mode 100644 core/tools/tools-initializer/src/test/resources/system.config delete mode 100644 core/tools/tools-joiner/src/test/java/com/jd/blockchain/AppTest.java delete mode 100644 core/tools/tools-keygen-booter/pom.xml delete mode 100644 core/tools/tools-keygen-booter/src/main/java/com/jd/blockchain/tools/keygen/boot/KeyGenBooter.java delete mode 100644 core/tools/tools-keygen-booter/src/main/resources/META-INF/MANIFEST.MF delete mode 100644 core/tools/tools-keygen/pom.xml delete mode 100644 core/tools/tools-keygen/src/main/java/com/jd/blockchain/tools/keygen/KeyGenCommand.java delete mode 100644 core/tools/tools-mocker/pom.xml delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerLedgerInitializer.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/config/LedgerInitWebConfiguration.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/config/MockerConstant.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/config/PresetAnswerPrompter.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/AccountContract.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/AccountContractImpl.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContract.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContractImpl.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/data/KvData.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/data/ResponseData.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerContractExeHandle.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerNodeHandler.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerOperationHandleRegister.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerServiceHandler.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/node/GatewayNodeRunner.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/node/NodeWebContext.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/node/PeerNodeRunner.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/proxy/ContractProxy.java delete mode 100644 core/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/proxy/ExecutorProxy.java delete mode 100644 core/tools/tools-mocker/src/main/resources/bftsmart.config delete mode 100644 core/tools/tools-mocker/src/main/resources/bftsmart4.config delete mode 100644 core/tools/tools-mocker/src/main/resources/bftsmart8.config delete mode 100644 core/tools/tools-mocker/src/main/resources/ledger4.init delete mode 100644 core/tools/tools-mocker/src/main/resources/ledger8.init delete mode 100644 core/tools/tools-mocker/src/test/java/test/com/jd/blockchain/contract/AccountMockerTest.java delete mode 100644 core/tools/tools-mocker/src/test/java/test/com/jd/blockchain/contract/MockTest.java delete mode 100644 core/tools/tools-mocker/src/test/java/test/com/jd/blockchain/contract/SampleTest.java diff --git a/core/consensus/consensus-bftsmart/pom.xml b/core/consensus/consensus-bftsmart/pom.xml deleted file mode 100644 index b9b7ef7b..00000000 --- a/core/consensus/consensus-bftsmart/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - 4.0.0 - - com.jd.blockchain - consensus-core - 1.2.0-SNAPSHOT - - consensus-bftsmart - - - - com.jd.blockchain - bft-smart - ${bftsmart.version} - - - com.jd.blockchain - base - ${project.version} - - - com.jd.blockchain - consensus-framework - ${framework.version} - - - com.jd.blockchain - utils-common - ${framework.version} - - - org.apache.commons - commons-pool2 - - - com.jd.blockchain - ledger-model - ${framework.version} - - - com.jd.blockchain - tools-keygen - ${project.version} - - - - - - \ No newline at end of file diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartClientIncomingConfig.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartClientIncomingConfig.java deleted file mode 100644 index afa21aeb..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartClientIncomingConfig.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import com.jd.blockchain.crypto.PubKey; - -public class BftsmartClientIncomingConfig implements BftsmartClientIncomingSettings { - - private BftsmartConsensusSettings consensusSettings; - - private byte[] topology; - - private byte[] tomConfig; - - private int clientId; - - private PubKey pubKey; - - - @Override - public BftsmartConsensusSettings getConsensusSettings() { - return consensusSettings; - } - - public void setConsensusSettings(BftsmartConsensusSettings consensusSettings) { - this.consensusSettings = consensusSettings; - } - - @Override - public byte[] getTopology() { - return topology; - } - - public void setTopology(byte[] topology) { - this.topology = topology; - } - - @Override - public int getClientId() { - return clientId; - } - - @Override - public String getProviderName() { - return BftsmartConsensusProvider.NAME; - } - - public void setClientId(int clientId) { - this.clientId = clientId; - } - - @Override - public byte[] getTomConfig() { - return tomConfig; - } - - public void setTomConfig(byte[] tomConfig) { - this.tomConfig = tomConfig; - } - - @Override - public PubKey getPubKey() { - return pubKey; - } - - public void setPubKey(PubKey pubKey) { - this.pubKey = pubKey; - } -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartClientIncomingSettings.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartClientIncomingSettings.java deleted file mode 100644 index 2838542a..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartClientIncomingSettings.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.binaryproto.PrimitiveType; -import com.jd.blockchain.consensus.ClientIncomingSettings; -import com.jd.blockchain.consts.DataCodes; -import com.jd.blockchain.crypto.PubKey; - -@DataContract(code = DataCodes.CONSENSUS_BFTSMART_CLI_INCOMING_SETTINGS) -public interface BftsmartClientIncomingSettings extends ClientIncomingSettings { - - @DataField(order = 1, primitiveType = PrimitiveType.BYTES) - byte[] getTopology(); - - @DataField(order = 2, primitiveType = PrimitiveType.BYTES) - byte[] getTomConfig(); - - @DataField(order = 3, primitiveType=PrimitiveType.BYTES) - PubKey getPubKey(); - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartCommitBlockConfig.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartCommitBlockConfig.java deleted file mode 100644 index 5fa31a11..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartCommitBlockConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -//package com.jd.blockchain.consensus.bftsmart; -// -//public class BftsmartCommitBlockConfig implements BftsmartCommitBlockSettings { -// -// private int txSizePerBlock; -// -// private long maxDelayMilliSecondsPerBlock; -// -// -// public BftsmartCommitBlockConfig() { -// -// } -// -// public BftsmartCommitBlockConfig(int txSizePerBlock, long maxDelayMilliSecondsPerBlock) { -// this.txSizePerBlock = txSizePerBlock; -// this.maxDelayMilliSecondsPerBlock = maxDelayMilliSecondsPerBlock; -// } -// @Override -// public int getTxSizePerBlock() { -// return txSizePerBlock; -// } -// -// public void setTxSizePerBlock(int txSizePerBlock) { -// this.txSizePerBlock = txSizePerBlock; -// } -// -// @Override -// public long getMaxDelayMilliSecondsPerBlock() { -// return maxDelayMilliSecondsPerBlock; -// } -// -// public void setMaxDelayMilliSecondsPerBlock(long maxDelayMilliSecondsPerBlock) { -// this.maxDelayMilliSecondsPerBlock = maxDelayMilliSecondsPerBlock; -// } -//} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartCommitBlockSettings.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartCommitBlockSettings.java deleted file mode 100644 index 2924c9f0..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartCommitBlockSettings.java +++ /dev/null @@ -1,17 +0,0 @@ -//package com.jd.blockchain.consensus.bftsmart; -// -//import com.jd.blockchain.binaryproto.DataContract; -//import com.jd.blockchain.binaryproto.DataField; -//import com.jd.blockchain.binaryproto.PrimitiveType; -//import com.jd.blockchain.consts.DataCodes; -// -// -//@DataContract(code = DataCodes.CONSENSUS_BFTSMART_BLOCK_SETTINGS) -//public interface BftsmartCommitBlockSettings { -// -// @DataField(order = 0, primitiveType = PrimitiveType.INT32) -// int getTxSizePerBlock(); -// -// @DataField(order = 1, primitiveType = PrimitiveType.INT64) -// long getMaxDelayMilliSecondsPerBlock(); -//} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusConfig.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusConfig.java deleted file mode 100644 index 48d5acb9..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusConfig.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.utils.Property; - -public class BftsmartConsensusConfig implements BftsmartConsensusSettings { - - private Property[] bftsmartSystemConfig; - - private BftsmartNodeSettings[] nodes; - -// private BftsmartCommitBlockSettings commitBlockSettings; - - static { - DataContractRegistry.register(BftsmartConsensusSettings.class); - } - /** - * 创建 bftsmart 共识配置; - * - * @param nodes - * 节点列表 - * @param commitBlockSettings - * 结块设置; - * @param bftsmartSystemConfigs - * bftsmart系统配置; - */ - public BftsmartConsensusConfig(BftsmartNodeSettings[] nodes, -// BftsmartCommitBlockSettings commitBlockSettings, - Property[] bftsmartSystemConfigs) { - this.nodes = nodes; -// this.commitBlockSettings = commitBlockSettings; - this.bftsmartSystemConfig = bftsmartSystemConfigs; - } - - @Override - public BftsmartNodeSettings[] getNodes() { - return nodes; - } - - @Override - public Property[] getSystemConfigs() { - return bftsmartSystemConfig; - } - -// @Override -// public BftsmartCommitBlockSettings getCommitBlockSettings() { -// return commitBlockSettings; -// } -// -// -// public void setCommitBlockSettings(BftsmartCommitBlockSettings commitBlockSettings) { -// this.commitBlockSettings = commitBlockSettings; -// } -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusProvider.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusProvider.java deleted file mode 100644 index a8290286..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusProvider.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import com.jd.blockchain.consensus.ConsensusProvider; -import com.jd.blockchain.consensus.SettingsFactory; -import com.jd.blockchain.consensus.bftsmart.client.BftsmartConsensusClientFactory; -import com.jd.blockchain.consensus.bftsmart.service.BftsmartNodeServerFactory; -import com.jd.blockchain.consensus.client.ClientFactory; -import com.jd.blockchain.consensus.service.NodeServerFactory; - -public class BftsmartConsensusProvider implements ConsensusProvider { - - public static final String NAME = BftsmartConsensusProvider.class.getName(); - - private static BftsmartSettingsFactory settingsFactory = new BftsmartSettingsFactory(); - - private static BftsmartConsensusClientFactory clientFactory = new BftsmartConsensusClientFactory(); - - private static BftsmartNodeServerFactory nodeServerFactory = new BftsmartNodeServerFactory(); - - - @Override - public String getName() { - return NAME; - } - - @Override - public SettingsFactory getSettingsFactory() { - return settingsFactory; - } - - @Override - public ClientFactory getClientFactory() { - return clientFactory; - } - - @Override - public NodeServerFactory getServerFactory() { - return nodeServerFactory; - } - - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettings.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettings.java deleted file mode 100644 index d3ce6494..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettings.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.binaryproto.PrimitiveType; -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consts.DataCodes; -import com.jd.blockchain.utils.Property; -import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils; - -@DataContract(code = DataCodes.CONSENSUS_BFTSMART_SETTINGS) -public interface BftsmartConsensusSettings extends ConsensusSettings { - - @DataField(order = 1, primitiveType = PrimitiveType.BYTES, list=true) - Property[] getSystemConfigs(); - -// @DataField(order = 2, refContract = true) -// BftsmartCommitBlockSettings getCommitBlockSettings(); - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java deleted file mode 100644 index 9d6637db..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java +++ /dev/null @@ -1,308 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import com.jd.blockchain.consensus.ConsensusProviders; -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.ledger.ParticipantInfo; -import com.jd.blockchain.ledger.ParticipantNode; -import com.jd.blockchain.tools.keygen.KeyGenCommand; -import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.PropertiesUtils; -import com.jd.blockchain.utils.Property; -import com.jd.blockchain.utils.codec.Base58Utils; -import com.jd.blockchain.utils.io.BytesUtils; -import com.jd.blockchain.utils.net.NetworkAddress; - -import org.springframework.core.io.ClassPathResource; - -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consensus.ConsensusSettingsBuilder; -import com.jd.blockchain.crypto.PubKey; - -public class BftsmartConsensusSettingsBuilder implements ConsensusSettingsBuilder { - - private static final int DEFAULT_TXSIZE = 1000; - - private static final int DEFAULT_MAXDELAY = 1000; - - private static final String CONFIG_TEMPLATE_FILE = "bftsmart.config"; - - private static final String CONFIG_LEDGER_INIT = "ledger.init"; - - /** - * 参数键:节点数量; - */ - public static final String SERVER_NUM_KEY = "system.servers.num"; - - /** - * 参数键:结块条件设置; - */ - public static final String BFTSMART_BLOCK_TXSIZE_KEY = "system.block.txsize"; - - public static final String BFTSMART_BLOCK_MAXDELAY_KEY = "system.block.maxdelay"; - - // /** - // * 参数键格式:节点地址; - // */ - // public static final String ADDRESS_PATTERN = "node.%s.address"; - - /** - * 参数键格式:节点公钥; - */ - public static final String PUBKEY_PATTERN = "system.server.%s.pubkey"; - - /** - * 参数键格式:节点共识服务的网络地址; - */ - public static final String CONSENSUS_HOST_PATTERN = "system.server.%s.network.host"; - - /** - * 参数键格式:节点共识服务的端口; - */ - public static final String CONSENSUS_PORT_PATTERN = "system.server.%s.network.port"; - - /** - * 参数键格式:节点共识服务的通讯是否开启安全选项; - */ - public static final String CONSENSUS_SECURE_PATTERN = "system.server.%s.network.secure"; - - public static final String BFTSMART_PROVIDER = "com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider"; - - - - private static Properties CONFIG_TEMPLATE; - static { - ClassPathResource configResource = new ClassPathResource(CONFIG_TEMPLATE_FILE); - try { - try (InputStream in = configResource.getInputStream()) { - CONFIG_TEMPLATE = PropertiesUtils.load(in, BytesUtils.DEFAULT_CHARSET); - } - } catch (IOException e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - - //解析得到结块的相关配置信息 -// public BftsmartCommitBlockConfig createBlockConfig(Properties resolvingProps) { -// BftsmartCommitBlockConfig blockConfig = new BftsmartCommitBlockConfig(); -// -// String txSizeString = PropertiesUtils.getRequiredProperty(resolvingProps, BFTSMART_BLOCK_TXSIZE_KEY); -// resolvingProps.remove(BFTSMART_BLOCK_TXSIZE_KEY); -// -// if (txSizeString == null || txSizeString.length() == 0) { -// blockConfig.setTxSizePerBlock(DEFAULT_TXSIZE); -// } -// else { -// blockConfig.setTxSizePerBlock(Integer.parseInt(txSizeString)); -// } -// -// String maxDelayString = PropertiesUtils.getRequiredProperty(resolvingProps, BFTSMART_BLOCK_MAXDELAY_KEY); -// resolvingProps.remove(BFTSMART_BLOCK_MAXDELAY_KEY); -// -// if (maxDelayString == null || maxDelayString.length() == 0) { -// blockConfig.setMaxDelayMilliSecondsPerBlock(DEFAULT_MAXDELAY); -// } -// else { -// blockConfig.setMaxDelayMilliSecondsPerBlock(Long.parseLong(maxDelayString)); -// } -// -// return blockConfig; -// } - - @Override - public Properties createPropertiesTemplate() { - return PropertiesUtils.cloneFrom(CONFIG_TEMPLATE); - } - - @Override - public BftsmartConsensusSettings createSettings(Properties props, ParticipantNode[] participantNodes) { - Properties resolvingProps = PropertiesUtils.cloneFrom(props); - int serversNum = PropertiesUtils.getInt(resolvingProps, SERVER_NUM_KEY); - if (serversNum < 0) { - throw new IllegalArgumentException(String.format("Property[%s] is negative!", SERVER_NUM_KEY)); - } - if (serversNum < 4) { - throw new IllegalArgumentException(String.format("Property[%s] is less than 4!", SERVER_NUM_KEY)); - } - if (participantNodes == null) { - throw new IllegalArgumentException("ParticipantNodes is Empty !!!"); - } - if (serversNum != participantNodes.length) { - throw new IllegalArgumentException(String.format("Property[%s] which is [%s] unequal " + - "ParticipantNodes's length which is [%s] !", SERVER_NUM_KEY, serversNum, participantNodes.length)); - } - -// BftsmartCommitBlockConfig blockConfig = createBlockConfig(resolvingProps); - - BftsmartNodeSettings[] nodesSettings = new BftsmartNodeSettings[serversNum]; - for (int i = 0; i < serversNum; i++) { - int id = i; - -// String keyOfPubkey = keyOfNode(PUBKEY_PATTERN, id); -// String base58PubKey = PropertiesUtils.getRequiredProperty(resolvingProps, keyOfPubkey); -// PubKey pubKey = new PubKey(Base58Utils.decode(base58PubKey)); -// PubKey pubKey = KeyGenCommand.decodePubKey(base58PubKey); - PubKey pubKey = participantNodes[i].getPubKey(); -// resolvingProps.remove(keyOfPubkey); - - String keyOfHost = keyOfNode(CONSENSUS_HOST_PATTERN, id); - String networkAddressHost = PropertiesUtils.getRequiredProperty(resolvingProps, keyOfHost); - resolvingProps.remove(keyOfHost); - - String keyOfPort = keyOfNode(CONSENSUS_PORT_PATTERN, id); - int networkAddressPort = PropertiesUtils.getInt(resolvingProps, keyOfPort); - resolvingProps.remove(keyOfPort); - - String keyOfSecure = keyOfNode(CONSENSUS_SECURE_PATTERN, id); - boolean networkAddressSecure = PropertiesUtils.getBoolean(resolvingProps, keyOfSecure); - resolvingProps.remove(keyOfSecure); - - BftsmartNodeConfig nodeConfig = new BftsmartNodeConfig(pubKey, id, - new NetworkAddress(networkAddressHost, networkAddressPort, networkAddressSecure)); - nodesSettings[i] = nodeConfig; - } - - BftsmartConsensusConfig config = new BftsmartConsensusConfig(nodesSettings, -// blockConfig, - PropertiesUtils.getOrderedValues(resolvingProps)); - return config; - } - - @Override - public Bytes updateSettings(Bytes oldConsensusSettings, ParticipantInfo participantInfo) { - - //update consensus setting through node and system config two aspects - BftsmartConsensusSettings consensusSettings = (BftsmartConsensusSettings) ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(oldConsensusSettings.toBytes()); - - Property[] systemConfigs = systemConfigs(consensusSettings.getSystemConfigs()); - - BftsmartNodeSettings[] nodeSettings = nodeSettings(consensusSettings.getNodes(), participantInfo); - - BftsmartConsensusConfig bftsmartConsensusConfig = new BftsmartConsensusConfig(nodeSettings, systemConfigs); - -// for(int i = 0 ;i < bftsmartConsensusConfig.getNodes().length; i++) { -// System.out.printf("id = %d, host = %s, port = %d\r\n", bftsmartConsensusConfig.getNodes()[i].getId(), bftsmartConsensusConfig.getNodes()[i].getNetworkAddress().getHost(), bftsmartConsensusConfig.getNodes()[i].getNetworkAddress().getPort()); -// } -// -// for(int i = 0 ;i < bftsmartConsensusConfig.getSystemConfigs().length; i++) { -// System.out.printf("property name = %s, property value = %s\r\n",bftsmartConsensusConfig.getSystemConfigs()[i].getName(), bftsmartConsensusConfig.getSystemConfigs()[i].getValue()); -// } - - return new Bytes(ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().encode(bftsmartConsensusConfig)); - - } - - private static String keyOfNode(String pattern, int id) { - return String.format(pattern, id); - } - - @Override - public void writeSettings(ConsensusSettings settings, Properties props) { - int serversNum = PropertiesUtils.getInt(props, SERVER_NUM_KEY); - if (serversNum > 0) { - for (int i = 0; i < serversNum; i++) { - int id = i; -// String keyOfPubkey = keyOfNode(PUBKEY_PATTERN, id); -// props.remove(keyOfPubkey); - - String keyOfHost = keyOfNode(CONSENSUS_HOST_PATTERN, id); - props.remove(keyOfHost); - - String keyOfPort = keyOfNode(CONSENSUS_PORT_PATTERN, id); - props.remove(keyOfPort); - - String keyOfSecure = keyOfNode(CONSENSUS_SECURE_PATTERN, id); - props.remove(keyOfSecure); - } - } - - BftsmartConsensusSettings bftsmartSettings = (BftsmartConsensusSettings) settings; - BftsmartNodeSettings[] nodesSettings = (BftsmartNodeSettings[]) bftsmartSettings.getNodes(); - serversNum = nodesSettings.length; - props.setProperty(SERVER_NUM_KEY, serversNum + ""); - - //获得结块相关的属性信息 -// BftsmartCommitBlockSettings blockSettings = bftsmartSettings.getCommitBlockSettings(); -// if (blockSettings == null) { -// props.setProperty(BFTSMART_BLOCK_TXSIZE_KEY, DEFAULT_TXSIZE + ""); -// props.setProperty(BFTSMART_BLOCK_MAXDELAY_KEY, DEFAULT_MAXDELAY + ""); -// } else { -// int txSize = blockSettings.getTxSizePerBlock(); -// long maxDelay = blockSettings.getMaxDelayMilliSecondsPerBlock(); -// props.setProperty(BFTSMART_BLOCK_TXSIZE_KEY, txSize + ""); -// props.setProperty(BFTSMART_BLOCK_MAXDELAY_KEY, maxDelay + ""); -// } - - for (int i = 0; i < serversNum; i++) { - BftsmartNodeSettings ns = nodesSettings[i]; - int id = i; -// String keyOfPubkey = keyOfNode(PUBKEY_PATTERN, id); -// props.setProperty(keyOfPubkey, ns.getPubKey().toBase58()); - - String keyOfHost = keyOfNode(CONSENSUS_HOST_PATTERN, id); - props.setProperty(keyOfHost, ns.getNetworkAddress() == null ? "" : ns.getNetworkAddress().getHost()); - - String keyOfPort = keyOfNode(CONSENSUS_PORT_PATTERN, id); - props.setProperty(keyOfPort, ns.getNetworkAddress() == null ? "" : ns.getNetworkAddress().getPort() + ""); - - String keyOfSecure = keyOfNode(CONSENSUS_SECURE_PATTERN, id); - props.setProperty(keyOfSecure, ns.getNetworkAddress() == null ? "false" : ns.getNetworkAddress().isSecure() + ""); - } - - PropertiesUtils.setValues(props, bftsmartSettings.getSystemConfigs()); - } - - /** - * - * update system.servers.num property - * - */ - private Property[] systemConfigs(Property[] systemConfigs) { - Map propertyMap = convert2Map(systemConfigs); - int serverNum = Integer.parseInt(propertyMap.get("system.servers.num").getValue()); - propertyMap.put("system.servers.num", new Property("system.servers.num", String.valueOf(serverNum + 1))); - return convert2Array(propertyMap); - - } - - private Map convert2Map(Property[] properties) { - Map propertyMap = new HashMap<>(); - for (Property property : properties) { - propertyMap.put(property.getName(), property); - } - return propertyMap; - } - - private Property[] convert2Array(Map map) { - Property[] properties = new Property[map.size()]; - int index = 0; - for (Map.Entry entry : map.entrySet()) { - properties[index++] = entry.getValue(); - } - return properties; - } - - /** - * - * update node setting - * - */ - private BftsmartNodeSettings[] nodeSettings(NodeSettings[] nodeSettings, ParticipantInfo participantInfo) { - - BftsmartNodeConfig bftsmartNodeConfig = new BftsmartNodeConfig(participantInfo.getPubKey(), nodeSettings.length, participantInfo.getNetworkAddress()); - - BftsmartNodeSettings[] bftsmartNodeSettings = new BftsmartNodeSettings[nodeSettings.length + 1]; - for (int i = 0; i < nodeSettings.length; i++) { - bftsmartNodeSettings[i] = (BftsmartNodeSettings)nodeSettings[i]; - } - bftsmartNodeSettings[nodeSettings.length] = bftsmartNodeConfig; - return bftsmartNodeSettings; - } - - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartNodeConfig.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartNodeConfig.java deleted file mode 100644 index fd45b144..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartNodeConfig.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.crypto.AddressEncoding; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.utils.net.NetworkAddress; - -public class BftsmartNodeConfig implements BftsmartNodeSettings { - - private int id; - - private String address; - - private PubKey pubKey; - - private NetworkAddress networkAddress; - - public BftsmartNodeConfig() { - } - - static { - DataContractRegistry.register(BftsmartNodeSettings.class); - } - - public BftsmartNodeConfig(PubKey pubKey, int id, NetworkAddress networkAddress) { - this.address = AddressEncoding.generateAddress(pubKey).toBase58(); - this.pubKey = pubKey; - this.id = id; - this.networkAddress = networkAddress; - } - - @Override - public String getAddress() { - return address; - } - - @Override - public int getId() { - return id; - } - - @Override - public NetworkAddress getNetworkAddress() { - return networkAddress; - } - - public void setId(int id) { - this.id = id; - } - - public void setAddress(String address) { - this.address = address; - } - - public void setNetworkAddress(NetworkAddress networkAddress) { - this.networkAddress = networkAddress; - } - - public PubKey getPubKey() { - return pubKey; - } - - public void setPubKey(PubKey pubKey) { - this.pubKey = pubKey; - } -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartNodeSettings.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartNodeSettings.java deleted file mode 100644 index a7158b68..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartNodeSettings.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.binaryproto.PrimitiveType; -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.consts.DataCodes; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.utils.net.NetworkAddress; - -@DataContract(code = DataCodes.CONSENSUS_BFTSMART_NODE_SETTINGS) -public interface BftsmartNodeSettings extends NodeSettings { - - /** - * 节点所属的参与方的区块链地址; - */ -// @DataField(order = 0, primitiveType = ValueType.TEXT) -// @Override -// String getAddress(); - - /** - * Base58 格式的公钥; - * - * @return - */ -// @DataField(order = 1, primitiveType = ValueType.BYTES) -// PubKey getPubKey(); - - /** - * 节点的ID; - * - * @return - */ - @DataField(order = 2, primitiveType = PrimitiveType.INT32) - int getId(); - - /** - * 共识协议的网络地址; - * - * @return - */ - @DataField(order = 3, primitiveType = PrimitiveType.BYTES) - NetworkAddress getNetworkAddress(); - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartSettingsFactory.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartSettingsFactory.java deleted file mode 100644 index a3e345ec..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartSettingsFactory.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import com.jd.blockchain.binaryproto.BinaryProtocol; -import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.consensus.*; -import com.jd.blockchain.utils.io.BytesEncoder; - -public class BftsmartSettingsFactory implements SettingsFactory { - - private static ConsensusSettingsEncoder CS_ENCODER = new ConsensusSettingsEncoder(); - - private static ClientIncomingSettingsEncoder CI_ENCODER =new ClientIncomingSettingsEncoder(); - - static { - DataContractRegistry.register(BftsmartConsensusSettings.class); - - DataContractRegistry.register(BftsmartClientIncomingSettings.class); - } - - @Override - public BftsmartConsensusSettingsBuilder getConsensusSettingsBuilder() { - - return new BftsmartConsensusSettingsBuilder(); - } - - @Override - public BytesEncoder getConsensusSettingsEncoder() { - return CS_ENCODER; - } - - @Override - public BytesEncoder getIncomingSettingsEncoder() { - return CI_ENCODER; - } - - - - private static class ConsensusSettingsEncoder implements BytesEncoder{ - - @Override - public byte[] encode(ConsensusSettings data) { - if (data instanceof BftsmartConsensusSettings) { - return BinaryProtocol.encode(data, BftsmartConsensusSettings.class); - } - throw new IllegalArgumentException("Settings data isn't supported! Accept BftsmartConsensusSettings only!"); - } - - @Override - public ConsensusSettings decode(byte[] bytes) { - return BinaryProtocol.decodeAs(bytes, BftsmartConsensusSettings.class); - } - - } - - private static class ClientIncomingSettingsEncoder implements BytesEncoder{ - - @Override - public byte[] encode(ClientIncomingSettings data) { - if (data instanceof BftsmartClientIncomingSettings) { - return BinaryProtocol.encode(data, BftsmartClientIncomingSettings.class); - } - throw new IllegalArgumentException("Settings data isn't supported! Accept BftsmartClientIncomingSettings only!"); - } - - @Override - public ClientIncomingSettings decode(byte[] bytes) { - return BinaryProtocol.decodeAs(bytes, BftsmartClientIncomingSettings.class); - } - - } - - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartTopology.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartTopology.java deleted file mode 100644 index f6832fb8..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartTopology.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart; - -import bftsmart.reconfiguration.views.View; -import com.jd.blockchain.consensus.Topology; -import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils; - -public class BftsmartTopology implements Topology { - - private static final long serialVersionUID = -3042599438265726240L; - - private View view; - - public BftsmartTopology(View view){ - this.view = view; - } - - @Override - public int getId() { - return view.getId(); - } - - @Override - public Topology copyOf() { - return BinarySerializeUtils.copyOf(this); - } - - public View getView() { - return view; - } -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartTransactionType.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartTransactionType.java deleted file mode 100644 index bf42510f..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartTransactionType.java +++ /dev/null @@ -1,16 +0,0 @@ -//package com.jd.blockchain.consensus.bftsmart; -// -//public enum BftsmartTransactionType { -// TRANSACTION((int)0), -// COMMITBLOCK((int)1); -// -// public final int CODE; -// -// public int getCode() { -// return CODE; -// } -// private BftsmartTransactionType(int code) { -// this.CODE = code; -// } -// -//} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientConfig.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientConfig.java deleted file mode 100644 index 89dfe1e4..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientConfig.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.client; - -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consensus.bftsmart.BftsmartClientIncomingSettings; -import com.jd.blockchain.crypto.PubKey; - - -public class BftsmartClientConfig implements BftsmartClientSettings { - - private int clientId; - private PubKey clientPubkey; - private ConsensusSettings consensusSettings; - private byte[] topology; - private byte[] tomConfig; - BftsmartClientIncomingSettings clientIncomingSettings; - - public BftsmartClientConfig(int clientId, PubKey clientPubkey, ConsensusSettings consensusSettings, byte[] topology, byte[] tomConfig) { - this.clientId = clientId; - this.clientPubkey = clientPubkey; - this.consensusSettings = consensusSettings; - this.topology = topology; - this.tomConfig = tomConfig; - } - - public BftsmartClientConfig(BftsmartClientIncomingSettings clientIncomingSettings) { - this.clientIncomingSettings = clientIncomingSettings; - this.clientId = clientIncomingSettings.getClientId(); - this.clientPubkey = clientIncomingSettings.getPubKey(); - this.consensusSettings = clientIncomingSettings.getConsensusSettings(); - this.topology = clientIncomingSettings.getTopology(); - this.tomConfig = clientIncomingSettings.getTomConfig(); - - } - @Override - public int getClientId() { - return clientId; - } - - public void setClientId(int clientId) { - this.clientId = clientId; - } - - - @Override - public PubKey getClientPubKey() { - return clientPubkey; - } - - public void setClientPubkey(PubKey clientPubkey) { - this.clientPubkey = clientPubkey; - } - - @Override - public ConsensusSettings getConsensusSettings() { - return consensusSettings; - } - - public void setConsensusSettings(ConsensusSettings consensusSettings) { - this.consensusSettings = consensusSettings; - } - - public byte[] getTopology() { - return topology; - } - - public void setTopology(byte[] topology) { - this.topology = topology; - } - - @Override - public byte[] getTomConfig() { - return tomConfig; - } - - public void setTomConfig(byte[] tomConfig) { - this.tomConfig = tomConfig; - } -} - diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientIdentification.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientIdentification.java deleted file mode 100644 index 695e9feb..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientIdentification.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.client; - -import com.jd.blockchain.consensus.ClientIdentification; -import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.crypto.SignatureDigest; - -public class BftsmartClientIdentification implements ClientIdentification { - - private byte[] identityInfo; - private PubKey pubKey; - private SignatureDigest signatureDigest; - - public BftsmartClientIdentification() { - - } - - public BftsmartClientIdentification(ClientIdentification clientIdentification) { - identityInfo = clientIdentification.getIdentityInfo(); - pubKey = clientIdentification.getPubKey(); - signatureDigest = clientIdentification.getSignature(); - } - - @Override - public byte[] getIdentityInfo() { - return identityInfo; - } - - public void setIdentityInfo(byte[] identityInfo) { - this.identityInfo = identityInfo; - } - - @Override - public PubKey getPubKey() { - return pubKey; - } - - public void setPubKey(PubKey pubKey) { - this.pubKey = pubKey; - } - - @Override - public SignatureDigest getSignature() { - return signatureDigest; - } - - @Override - public String getProviderName() { - return BftsmartConsensusProvider.NAME; - } - - public void setSignatureDigest(SignatureDigest signatureDigest) { - this.signatureDigest = signatureDigest; - } - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientSettings.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientSettings.java deleted file mode 100644 index 94bf3d53..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartClientSettings.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.client; - -import com.jd.blockchain.consensus.client.ClientSettings; - - -public interface BftsmartClientSettings extends ClientSettings { - - byte[] getTopology(); - - byte[] getTomConfig(); - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClient.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClient.java deleted file mode 100644 index 9561263d..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClient.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.client; - -import com.jd.blockchain.consensus.MessageService; -import com.jd.blockchain.consensus.client.ClientSettings; -import com.jd.blockchain.consensus.client.ConsensusClient; -import java.util.concurrent.atomic.AtomicInteger; - -public class BftsmartConsensusClient implements ConsensusClient { - - - private final AtomicInteger addId = new AtomicInteger(); - - private BftsmartPeerProxyPool asyncPeerProxyPool; - - private int gatewayId; - - private ClientSettings clientSettings; - - public BftsmartConsensusClient(ClientSettings clientSettings) { - - this.clientSettings = clientSettings; - this.gatewayId = clientSettings.getClientId(); - } - - - public BftsmartPeerProxyPool getConsensusClientPool() { - return this.asyncPeerProxyPool; - } - - @Override - public MessageService getMessageService() { - return new BftsmartMessageService(asyncPeerProxyPool); - } - - @Override - public ClientSettings getSettings() { - return clientSettings; - } - - @Override - public boolean isConnected() { - return this.asyncPeerProxyPool != null; - } - - @Override - public synchronized void connect() { - - //consensus client pool - BftsmartPeerProxyFactory peerProxyFactory = new BftsmartPeerProxyFactory((BftsmartClientSettings)clientSettings, gatewayId); - this.asyncPeerProxyPool = new BftsmartPeerProxyPool(peerProxyFactory); - -// MemoryBasedViewStorage viewStorage = new MemoryBasedViewStorage(((BftsmartClientSettings)clientSettings).getTopology().getView()); -// TOMConfiguration tomConfiguration = ((BftsmartConsensusConfig)clientSettings.getConsensusSettings()).getBftsmartConfig(); -// -// //by serialize keep origin tom config -// byte[] tomBytes = BinarySerializeUtils.serialize(tomConfiguration); -// TOMConfiguration decodeTom = BinarySerializeUtils.deserialize(tomBytes); -// -// int clientId = gatewayId *100 + addId.incrementAndGet(); -// -// //every proxy client has unique id; -// decodeTom.setProcessId(clientId); -// this.peerProxy = new AsynchServiceProxy(decodeTom, viewStorage); - - } - - @Override - public void close() { - if (asyncPeerProxyPool != null) { - asyncPeerProxyPool.close(); - } - } - -// public void asyncSendOrdered(byte[] message, AsyncCallback callback) { -// AsyncReplier replier = new AsyncReplier(callback, peerProxy); -// peerProxy.invokeAsynchRequest(message, replier, TOMMessageType.ORDERED_REQUEST); -// } - -// private static class AsyncReplier implements ReplyListener { -// -// private AsynchServiceProxy peerProxy; -// -// private AtomicInteger replies = new AtomicInteger(0); -// -// private AsyncCallback messageHandle; -// -// public AsyncReplier(AsyncCallback messageHandle, AsynchServiceProxy peerProxy) { -// this.messageHandle = messageHandle; -// this.peerProxy = peerProxy; -// } -// -// @Override -// public void reset() { -// replies.set(0); -// } -// -// @Override -// public void replyReceived(RequestContext context, TOMMessage reply) { -// int replyCount = replies.incrementAndGet(); -// -// double q = Math.ceil((double) (peerProxy.getViewManager().getCurrentViewN() -// + peerProxy.getViewManager().getCurrentViewF() + 1) / 2.0); -// -// if (replyCount >= q) { -// peerProxy.cleanAsynchRequest(context.getOperationId()); -// messageHandle.complete(reply.getContent(), null); -// } -// } -// -// } - -// private static class BftsmartAsyncFuture extends CompletableAsyncFuture { -// @Override -// public void setSuccess(T value) { -// super.setSuccess(value); -// } -// -// @Override -// public void setError(Throwable ex) { -// super.setError(ex); -// } -// -// @Override -// public void setError(String errorCode) { -// super.setError(errorCode); -// } -// } - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClientFactory.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClientFactory.java deleted file mode 100644 index 16d8bfae..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClientFactory.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.client; - -import java.util.concurrent.atomic.AtomicInteger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.jd.blockchain.consensus.ClientIncomingSettings; -import com.jd.blockchain.consensus.ConsensusManageService; -import com.jd.blockchain.consensus.bftsmart.BftsmartClientIncomingSettings; -import com.jd.blockchain.consensus.client.ClientFactory; -import com.jd.blockchain.consensus.client.ClientSettings; -import com.jd.blockchain.consensus.client.ConsensusClient; -import com.jd.blockchain.crypto.AsymmetricKeypair; -import com.jd.blockchain.crypto.Crypto; -import com.jd.blockchain.crypto.PrivKey; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.crypto.SignatureDigest; -import com.jd.blockchain.crypto.SignatureFunction; -import com.jd.blockchain.utils.net.NetworkAddress; - -public class BftsmartConsensusClientFactory implements ClientFactory { - - - private AtomicInteger addId = new AtomicInteger(); - - private String localDomain = "localhost"; - private String localIp = "127.0.0.1"; - - public BftsmartConsensusClientFactory() { - - } - - - @Override - public BftsmartClientIdentification buildAuthId(AsymmetricKeypair clientKeyPair) { - - PubKey pubKey = clientKeyPair.getPubKey(); - PrivKey privKey = clientKeyPair.getPrivKey(); - - SignatureFunction signatureFunction =Crypto.getSignatureFunction(pubKey.getAlgorithm()); - SignatureDigest signatureDigest = signatureFunction.sign(privKey, pubKey.toBytes()); - - BftsmartClientIdentification bftsmartClientIdentification = new BftsmartClientIdentification(); - bftsmartClientIdentification.setIdentityInfo(pubKey.toBytes()); - bftsmartClientIdentification.setPubKey(pubKey); - bftsmartClientIdentification.setSignatureDigest(signatureDigest); - - return bftsmartClientIdentification; - } - - @Override - public ClientSettings buildClientSettings(ClientIncomingSettings incomingSettings) { - - BftsmartClientIncomingSettings clientIncomingSettings = (BftsmartClientIncomingSettings) incomingSettings; - - BftsmartClientSettings clientSettings = new BftsmartClientConfig(clientIncomingSettings); - - return clientSettings; - } - - @Override - public ConsensusClient setupClient(ClientSettings settings) { - - return new BftsmartConsensusClient(settings); - } - - @Override - public ConsensusManageService createManageServiceClient(String[] serviceNodes) { -// BftsmartConsensusManageService consensusManageService = null; -// BftsmartClientIncomingSettings clientIncomingSettings; -// -// -// try { -// if (serviceNodes == null) { -// throw new ConsensusSecurityException("createManageServiceClient param error!"); -// } -// -// for (int i = 0; i < serviceNodes.length; i++) { -// -// NetworkAddress networkAddress = getIpPortFromUrl(serviceNodes[i]); -// if (networkAddress == null) { -// continue; -// } -// ServiceEndpoint peerServer = new ServiceEndpoint(networkAddress.getHost(), networkAddress.getPort(), false); -// consensusManageService = HttpServiceAgent.createService(BftsmartConsensusManageService.class, peerServer); -// clientIncomingSettings = consensusManageService.authClientIncoming(clientIdentification); -// -// if (clientIncomingSettings == null) { -// consensusManageService = null; -// } else { -// //认证成功 -// break; -// } -// } -// -// } catch (Exception e) { -// e.printStackTrace(); -// } - -// return consensusManageService; - return null; - } - - private NetworkAddress getIpPortFromUrl(String url) { - - // 1.check null - if (url == null || url.trim().equals("")) { - return null; - } - - // 2. localhost replace to 127.0.0.1 - if(url.startsWith("http://" + localDomain) ){ - url = url.replace("http://" + localDomain, "http://" + localIp) ; - } - - String host = ""; - Pattern p = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+(:\\d{0,5})?"); - Matcher matcher = p.matcher(url); - if (matcher.find()) { - host = matcher.group() ; - } - - if(host.contains(":") == false){ - //default port :80 - return new NetworkAddress(host, 80); - } - else { - String[] ipPortArr = host.split(":"); - return new NetworkAddress(ipPortArr[0], Integer.parseInt(ipPortArr[1])); - } - } - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartMessageService.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartMessageService.java deleted file mode 100644 index 5ecf6596..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartMessageService.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.client; - -import bftsmart.tom.AsynchServiceProxy; -import com.jd.blockchain.consensus.MessageService; -import com.jd.blockchain.utils.concurrent.AsyncFuture; -import com.jd.blockchain.utils.concurrent.CompletableAsyncFuture; -import com.jd.blockchain.utils.io.BytesUtils; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class BftsmartMessageService implements MessageService { - - private BftsmartPeerProxyPool asyncPeerProxyPool; - - public BftsmartMessageService(BftsmartPeerProxyPool peerProxyPool) { - this.asyncPeerProxyPool = peerProxyPool; - } - - @Override - public AsyncFuture sendOrdered(byte[] message) { - return sendOrderedMessage(message); - } - - private AsyncFuture sendOrderedMessage(byte[] message) { - CompletableAsyncFuture asyncFuture = new CompletableAsyncFuture<>(); - AsynchServiceProxy asynchServiceProxy = null; - try { - asynchServiceProxy = asyncPeerProxyPool.borrowObject(); -// //0: Transaction msg, 1: Commitblock msg -// byte[] msgType = BytesUtils.toBytes(0); -// byte[] wrapMsg = new byte[message.length + 4]; -// System.arraycopy(message, 0, wrapMsg, 4, message.length); -// System.arraycopy(msgType, 0, wrapMsg, 0, 4); -// -// System.out.printf("BftsmartMessageService invokeOrdered time = %s, id = %s threadId = %s \r\n", -// System.currentTimeMillis(), asynchServiceProxy.getProcessId(), Thread.currentThread().getId()); - - byte[] result = asynchServiceProxy.invokeOrdered(message); - asyncFuture.complete(result); - - } catch (Exception e) { - throw new RuntimeException(e); - - } finally { - asyncPeerProxyPool.returnObject(asynchServiceProxy); - } - - return asyncFuture; - } - - @Override - public AsyncFuture sendUnordered(byte[] message) { - return sendUnorderedMessage(message); - } - - private AsyncFuture sendUnorderedMessage(byte[] message) { - CompletableAsyncFuture asyncFuture = new CompletableAsyncFuture<>(); - AsynchServiceProxy asynchServiceProxy = null; - try { - asynchServiceProxy = asyncPeerProxyPool.borrowObject(); - byte[] result = asynchServiceProxy.invokeUnordered(message); - asyncFuture.complete(result); - - } catch (Exception e) { - throw new RuntimeException(e); - } finally { - asyncPeerProxyPool.returnObject(asynchServiceProxy); - } - return asyncFuture; - } - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyFactory.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyFactory.java deleted file mode 100644 index 306a71f0..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.client; - -import bftsmart.reconfiguration.util.TOMConfiguration; -import bftsmart.reconfiguration.views.MemoryBasedViewStorage; -import bftsmart.tom.AsynchServiceProxy; -import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusConfig; -import com.jd.blockchain.consensus.bftsmart.BftsmartTopology; -import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils; - -import org.apache.commons.pool2.BasePooledObjectFactory; -import org.apache.commons.pool2.PooledObject; -import org.apache.commons.pool2.impl.DefaultPooledObject; - -import java.util.concurrent.atomic.AtomicInteger; - -public class BftsmartPeerProxyFactory extends BasePooledObjectFactory { - - private BftsmartClientSettings bftsmartClientSettings; - - private int gatewayId; - - private AtomicInteger index = new AtomicInteger(1); - - public BftsmartPeerProxyFactory(BftsmartClientSettings bftsmartClientSettings, int gatewayId) { - this.bftsmartClientSettings = bftsmartClientSettings; - this.gatewayId = gatewayId; - } - - @Override - public AsynchServiceProxy create() throws Exception { - - BftsmartTopology topology = BinarySerializeUtils.deserialize(bftsmartClientSettings.getTopology()); - - MemoryBasedViewStorage viewStorage = new MemoryBasedViewStorage(topology.getView()); - TOMConfiguration tomConfiguration = BinarySerializeUtils.deserialize(bftsmartClientSettings.getTomConfig()); - - //every proxy client has unique id; - tomConfiguration.setProcessId(gatewayId + index.getAndIncrement()); - AsynchServiceProxy peerProxy = new AsynchServiceProxy(tomConfiguration, viewStorage); - return peerProxy; - } - - @Override - public PooledObject wrap(AsynchServiceProxy asynchServiceProxy) { - return new DefaultPooledObject<>(asynchServiceProxy); - } -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyPool.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyPool.java deleted file mode 100644 index 1b5a5f8e..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyPool.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.bft.BftsmartConsensusClientPool - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/10/30 下午6:50 - * Description: - */ -package com.jd.blockchain.consensus.bftsmart.client; - -import bftsmart.tom.AsynchServiceProxy; -import org.apache.commons.pool2.PooledObjectFactory; -import org.apache.commons.pool2.impl.GenericObjectPool; -import org.apache.commons.pool2.impl.GenericObjectPoolConfig; - -public class BftsmartPeerProxyPool extends GenericObjectPool { - - public BftsmartPeerProxyPool(PooledObjectFactory factory) { - this(factory, null); - } - - public BftsmartPeerProxyPool(PooledObjectFactory factory, GenericObjectPoolConfig config) { - super(factory, config == null ? new BftsmartPeerProxyPoolConfig() : config); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyPoolConfig.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyPoolConfig.java deleted file mode 100644 index fb0b3884..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartPeerProxyPoolConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.bft.BftsmartConsensusClientPool - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/10/30 下午6:50 - * Description: - */ -package com.jd.blockchain.consensus.bftsmart.client; - -import org.apache.commons.pool2.impl.GenericObjectPoolConfig; - -public class BftsmartPeerProxyPoolConfig extends GenericObjectPoolConfig { - - public static final int MAX_TOTAL = 100; - - private final int MIN_IDLE = 0; - - private final int MAX_IDLE = 100; - - public BftsmartPeerProxyPoolConfig() { - setMaxTotal(MAX_TOTAL); - setMinIdle(MIN_IDLE); - setMaxIdle(MAX_IDLE); - } - - public BftsmartPeerProxyPoolConfig(int maxTotal, int minIdle, int maxIdle) { - setMaxTotal(maxTotal); - setMinIdle(minIdle); - setMaxIdle(maxIdle); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartConsensusManageService.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartConsensusManageService.java deleted file mode 100644 index 1e82ee0f..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartConsensusManageService.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.service; - -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -import com.jd.blockchain.consensus.ClientIdentification; -import com.jd.blockchain.consensus.ConsensusManageService; -import com.jd.blockchain.consensus.bftsmart.BftsmartClientIncomingConfig; -import com.jd.blockchain.consensus.bftsmart.BftsmartClientIncomingSettings; -import com.jd.blockchain.crypto.Crypto; -import com.jd.blockchain.crypto.SignatureFunction; -import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils; - -public class BftsmartConsensusManageService implements ConsensusManageService { - - public static final int GATEWAY_SIZE = 100; - - public static final int CLIENT_SIZE_PER_GATEWAY = 1000; - - public static final int CLIENT_RANGE = GATEWAY_SIZE * CLIENT_SIZE_PER_GATEWAY; - - private BftsmartNodeServer nodeServer; - - private int clientId; - - private static final Lock authLock = new ReentrantLock(); - - public BftsmartConsensusManageService(BftsmartNodeServer nodeServer) { - this.nodeServer = nodeServer; - // Assume that each peer node corresponds to up to 100 gateways - clientId = nodeServer.getServerId() * CLIENT_RANGE; - } - - @Override - public BftsmartClientIncomingSettings authClientIncoming(ClientIdentification authId) { - if (verify(authId)) { - BftsmartClientIncomingConfig clientIncomingSettings = new BftsmartClientIncomingConfig(); - - clientIncomingSettings - .setTopology(BinarySerializeUtils.serialize(nodeServer.getTopology())); - - clientIncomingSettings - .setTomConfig(BinarySerializeUtils.serialize(nodeServer.getTomConfig())); - - clientIncomingSettings - .setConsensusSettings(nodeServer.getConsensusSetting()); - - clientIncomingSettings.setPubKey(authId.getPubKey()); - // compute gateway id - authLock.lock(); - try { - clientIncomingSettings.setClientId(clientId++); - clientId += CLIENT_SIZE_PER_GATEWAY; - } finally { - authLock.unlock(); - } - - return clientIncomingSettings; - } - - return null; - } - - public boolean verify(ClientIdentification authId) { - - SignatureFunction signatureFunction = Crypto - .getSignatureFunction(authId.getPubKey().getAlgorithm()); - - return signatureFunction.verify(authId.getSignature(), authId.getPubKey(), authId.getIdentityInfo()); - } -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java deleted file mode 100644 index 61a6a619..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java +++ /dev/null @@ -1,549 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.service; - -import java.io.ByteArrayOutputStream; -import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import bftsmart.consensus.app.BatchAppResultImpl; -import bftsmart.tom.*; -import com.jd.blockchain.binaryproto.BinaryProtocol; -import com.jd.blockchain.consensus.service.*; -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.*; -import com.jd.blockchain.transaction.TxResponseMessage; -import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.jd.blockchain.consensus.ConsensusManageService; -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider; -import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusSettings; -import com.jd.blockchain.consensus.bftsmart.BftsmartNodeSettings; -import com.jd.blockchain.consensus.bftsmart.BftsmartTopology; -import com.jd.blockchain.utils.PropertiesUtils; -import com.jd.blockchain.utils.concurrent.AsyncFuture; -import com.jd.blockchain.utils.io.BytesUtils; -import bftsmart.reconfiguration.util.HostsConfig; -import bftsmart.reconfiguration.util.TOMConfiguration; -import bftsmart.tom.server.defaultservices.DefaultRecoverable; - -public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer { - - private static Logger LOGGER = LoggerFactory.getLogger(BftsmartNodeServer.class); - - private static final String DEFAULT_BINDING_HOST = "0.0.0.0"; - - private List stateHandles = new CopyOnWriteArrayList<>(); - - // TODO 暂不处理队列溢出问题 - private ExecutorService notifyReplyExecutors = Executors.newSingleThreadExecutor(); - - private volatile Status status = Status.STOPPED; - - private final Object mutex = new Object(); - - private volatile ServiceReplica replica; - - private StateMachineReplicate stateMachineReplicate; - - private ServerSettings serverSettings; - - private BftsmartConsensusManageService manageService; - - - private volatile BftsmartTopology topology; - - private volatile BftsmartConsensusSettings setting; - - private TOMConfiguration tomConfig; - - private TOMConfiguration outerTomConfig; - - private HostsConfig hostsConfig; - private Properties systemConfig; - - private MessageHandle messageHandle; - - private String providerName; - - private String realmName; - - private int serverId; - - public BftsmartNodeServer() { - - } - - public BftsmartNodeServer(ServerSettings serverSettings, MessageHandle messageHandler, StateMachineReplicate stateMachineReplicate) { - this.serverSettings = serverSettings; - this.realmName = serverSettings.getRealmName(); - //used later - this.stateMachineReplicate = stateMachineReplicate; - this.messageHandle = messageHandler; - createConfig(); - serverId = findServerId(); - initConfig(serverId, systemConfig, hostsConfig); - this.manageService = new BftsmartConsensusManageService(this); - } - - protected int findServerId() { - int serverId = 0; - - for (int i = 0; i < hostsConfig.getNum(); i++) { - String host = ((BftsmartNodeSettings)serverSettings.getReplicaSettings()).getNetworkAddress().getHost(); - int port = ((BftsmartNodeSettings)serverSettings.getReplicaSettings()).getNetworkAddress().getPort(); - - if (hostsConfig.getHost(i).equals(host) && hostsConfig.getPort(i) == port) { - serverId = i; - break; - } - } - - return serverId; - } - - public int getServerId() { - return serverId; - } - - protected void createConfig() { - - setting = ((BftsmartServerSettings) serverSettings).getConsensusSettings(); - - List configList = new ArrayList<>(); - - NodeSettings[] nodeSettingsArray = setting.getNodes(); - for (NodeSettings nodeSettings : nodeSettingsArray) { - BftsmartNodeSettings node = (BftsmartNodeSettings)nodeSettings; - configList.add(new HostsConfig.Config(node.getId(), node.getNetworkAddress().getHost(), node.getNetworkAddress().getPort())); - } - - //create HostsConfig instance based on consensus realm nodes - hostsConfig = new HostsConfig(configList.toArray(new HostsConfig.Config[configList.size()])); - - systemConfig = PropertiesUtils.createProperties(setting.getSystemConfigs()); - - return; - } - - protected void initConfig(int id, Properties systemsConfig, HostsConfig hostConfig) { - byte[] serialHostConf = BinarySerializeUtils.serialize(hostConfig); - Properties sysConfClone = (Properties)systemsConfig.clone(); - int port = hostConfig.getPort(id); - hostConfig.add(id, DEFAULT_BINDING_HOST, port); - this.tomConfig = new TOMConfiguration(id, systemsConfig, hostConfig); - this.outerTomConfig = new TOMConfiguration(id, sysConfClone, BinarySerializeUtils.deserialize(serialHostConf)); - } - - @Override - public ConsensusManageService getManageService() { - return manageService; - } - - @Override - public ServerSettings getSettings() { - return serverSettings; - } - - @Override - public String getProviderName() { - return BftsmartConsensusProvider.NAME; - } - - public TOMConfiguration getTomConfig() { - return outerTomConfig; - } - - public int getId() { - return tomConfig.getProcessId(); - } - - public void setId(int id) { - if (id < 0) { - throw new IllegalArgumentException("ReplicaID is negative!"); - } - this.tomConfig.setProcessId(id); - this.outerTomConfig.setProcessId(id); - } - - public BftsmartConsensusSettings getConsensusSetting() { - return setting; - } - - public BftsmartTopology getTopology() { - return topology; - } - - public Status getStatus() { - return status; - } - - @Override - public boolean isRunning() { - return status == Status.RUNNING; - } - - public byte[] appExecuteUnordered(byte[] bytes, MessageContext messageContext) { - return messageHandle.processUnordered(bytes).get(); - } - - /** - * - * Only block, no reply, used by state transfer when peer start - * - */ - private void block(List manageConsensusCmds) { - - String batchId = messageHandle.beginBatch(realmName); - try { - int msgId = 0; - for (byte[] txContent : manageConsensusCmds) { - AsyncFuture asyncFuture = messageHandle.processOrdered(msgId++, txContent, realmName, batchId); - } - messageHandle.completeBatch(realmName, batchId); - messageHandle.commitBatch(realmName, batchId); - } catch (Exception e) { - // todo 需要处理应答码 404 - LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); - messageHandle.rollbackBatch(realmName, batchId, TransactionState.CONSENSUS_ERROR.CODE); - } - - } - - /** - * - * Local peer has cid diff with remote peer, used by state transfer when peer start - * - */ - private byte[][] appExecuteDiffBatch(byte[][] commands, MessageContext[] msgCtxs) { - - int manageConsensusId = msgCtxs[0].getConsensusId(); - List manageConsensusCmds = new ArrayList<>(); - - int index = 0; - for (MessageContext msgCtx : msgCtxs) { - if (msgCtx.getConsensusId() == manageConsensusId) { - manageConsensusCmds.add(commands[index]); - } else { - // 达到结块标准,需要进行结块并应答 - block(manageConsensusCmds); - // 重置链表和共识ID - manageConsensusCmds = new ArrayList<>(); - manageConsensusId = msgCtx.getConsensusId(); - manageConsensusCmds.add(commands[index]); - } - index++; - } - // 结束时,肯定有最后一个结块请求未处理 - if (!manageConsensusCmds.isEmpty()) { - block(manageConsensusCmds); - } - return null; - - } - - /** - * - * Invoked by state transfer when peer start - * - */ - @Override - public byte[][] appExecuteBatch(byte[][] commands, MessageContext[] msgCtxs, boolean fromConsensus) { - - // Not from consensus outcomes, from state transfer - if (!fromConsensus) { - return appExecuteDiffBatch(commands, msgCtxs); - } - - return null; - } - - /** - * - * From consensus outcomes, do nothing now - * The operation of executing the batch was moved to the consensus stage 2 and 3, in order to guaranteed ledger consistency - */ - @Override - public byte[][] appExecuteBatch(byte[][] commands, MessageContext[] msgCtxs, boolean fromConsensus, List replyList) { - -// if (replyList == null || replyList.size() == 0) { -// throw new IllegalArgumentException(); -// } -// // todo 此部分需要重新改造 -// /** -// * 默认BFTSmart接口提供的commands是一个或多个共识结果的顺序集合 -// * 根据共识的规定,目前的做法是将其根据msgCtxs的内容进行分组,每组都作为一个结块标识来处理 -// * 从msgCtxs可以获取对应commands的分组情况 -// */ -// int manageConsensusId = msgCtxs[0].getConsensusId(); -// List manageConsensusCmds = new ArrayList<>(); -// List manageReplyMsgs = new ArrayList<>(); -// -// int index = 0; -// for (MessageContext msgCtx : msgCtxs) { -// if (msgCtx.getConsensusId() == manageConsensusId) { -// manageConsensusCmds.add(commands[index]); -// manageReplyMsgs.add(replyList.get(index)); -// } else { -// // 达到结块标准,需要进行结块并应答 -// blockAndReply(manageConsensusCmds, manageReplyMsgs); -// // 重置链表和共识ID -// manageConsensusCmds = new ArrayList<>(); -// manageReplyMsgs = new ArrayList<>(); -// manageConsensusId = msgCtx.getConsensusId(); -// manageConsensusCmds.add(commands[index]); -// manageReplyMsgs.add(replyList.get(index)); -// } -// index++; -// } -// // 结束时,肯定有最后一个结块请求未处理 -// if (!manageConsensusCmds.isEmpty()) { -// blockAndReply(manageConsensusCmds, manageReplyMsgs); -// } - return null; - } - - /** - * - * Block and reply are moved to consensus completion stage - * - */ - private void blockAndReply(List manageConsensusCmds, List replyList) { -// consensusBatchId = messageHandle.beginBatch(realmName); -// List> asyncFutureLinkedList = new ArrayList<>(manageConsensusCmds.size()); -// try { -// int msgId = 0; -// for (byte[] txContent : manageConsensusCmds) { -// AsyncFuture asyncFuture = messageHandle.processOrdered(msgId++, txContent, realmName, consensusBatchId); -// asyncFutureLinkedList.add(asyncFuture); -// } -// messageHandle.completeBatch(realmName, consensusBatchId); -// messageHandle.commitBatch(realmName, consensusBatchId); -// } catch (Exception e) { -// // todo 需要处理应答码 404 -// LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); -// messageHandle.rollbackBatch(realmName, consensusBatchId, TransactionState.CONSENSUS_ERROR.CODE); -// } -// -// // 通知线程单独处理应答 -// notifyReplyExecutors.execute(() -> { -// // 应答对应的结果 -// int replyIndex = 0; -// for(ReplyContextMessage msg : replyList) { -// msg.setReply(asyncFutureLinkedList.get(replyIndex).get()); -// TOMMessage request = msg.getTomMessage(); -// ReplyContext replyContext = msg.getReplyContext(); -// request.reply = new TOMMessage(replyContext.getId(), request.getSession(), request.getSequence(), -// request.getOperationId(), msg.getReply(), replyContext.getCurrentViewId(), -// request.getReqType()); -// -// if (replyContext.getNumRepliers() > 0) { -// bftsmart.tom.util.Logger.println("(ServiceReplica.receiveMessages) sending reply to " -// + request.getSender() + " with sequence number " + request.getSequence() -// + " and operation ID " + request.getOperationId() + " via ReplyManager"); -// replyContext.getRepMan().send(request); -// } else { -// bftsmart.tom.util.Logger.println("(ServiceReplica.receiveMessages) sending reply to " -// + request.getSender() + " with sequence number " + request.getSequence() -// + " and operation ID " + request.getOperationId()); -// replyContext.getReplier().manageReply(request, msg.getMessageContext()); -// } -// replyIndex++; -// } -// }); - } - - /** - * Used by consensus write phase, pre compute new block hash - */ - public BatchAppResultImpl preComputeAppHash(byte[][] commands) { - - List> asyncFutureLinkedList = new ArrayList<>(commands.length); - List responseLinkedList = new ArrayList<>(); - StateSnapshot newStateSnapshot = null; - StateSnapshot preStateSnapshot = null; - StateSnapshot genisStateSnapshot = null; - BatchAppResultImpl result = null; - String batchId = null; - int msgId = 0; - - try { - - batchId = messageHandle.beginBatch(realmName); - genisStateSnapshot = messageHandle.getGenisStateSnapshot(realmName); - preStateSnapshot = messageHandle.getStateSnapshot(realmName); - - if (preStateSnapshot == null) { - throw new IllegalStateException("Pre block state snapshot is null!"); - } - - for (int i = 0; i < commands.length; i++) { - byte[] txContent = commands[i]; - AsyncFuture asyncFuture = messageHandle.processOrdered(msgId++, txContent, realmName, batchId); - asyncFutureLinkedList.add(asyncFuture); - } - newStateSnapshot = messageHandle.completeBatch(realmName, batchId); - - for (int i = 0; i < asyncFutureLinkedList.size(); i++) { - responseLinkedList.add(asyncFutureLinkedList.get(i).get()); - } - - result = new BatchAppResultImpl(responseLinkedList, newStateSnapshot.getSnapshot(), batchId, genisStateSnapshot.getSnapshot()); - result.setErrorCode((byte) 0); - - } catch (Exception e) { - LOGGER.error("Error occurred while pre compute app! --" + e.getMessage(), e); - for (int i = 0; i < commands.length; i++) { - responseLinkedList.add(createAppResponse(commands[i],TransactionState.IGNORED_BY_BLOCK_FULL_ROLLBACK)); - } - - result = new BatchAppResultImpl(responseLinkedList,preStateSnapshot.getSnapshot(), batchId, genisStateSnapshot.getSnapshot()); - result.setErrorCode((byte) 1); - } - - return result; - } - - // Block full rollback responses, generated in pre compute phase, due to tx exception - private byte[] createAppResponse(byte[] command, TransactionState transactionState) { - TransactionRequest txRequest = BinaryProtocol.decode(command); - - TxResponseMessage resp = new TxResponseMessage(txRequest.getTransactionContent().getHash()); - - resp.setExecutionState(transactionState); - - return BinaryProtocol.encode(resp, TransactionResponse.class); - } - - public List updateAppResponses(List asyncResponseLinkedList, byte[] commonHash, boolean isConsistent) { - List updatedResponses = new ArrayList<>(); - TxResponseMessage resp = null; - - for(int i = 0; i < asyncResponseLinkedList.size(); i++) { - TransactionResponse txResponse = BinaryProtocol.decode(asyncResponseLinkedList.get(i)); - if (isConsistent) { - resp = new TxResponseMessage(txResponse.getContentHash()); - } - else { - resp = new TxResponseMessage(new HashDigest(commonHash)); - } - resp.setExecutionState(TransactionState.IGNORED_BY_BLOCK_FULL_ROLLBACK); - updatedResponses.add(BinaryProtocol.encode(resp, TransactionResponse.class)); - } - return updatedResponses; -} - /** - * - * Decision has been made at the consensus stage, commit block - * - */ - public void preComputeAppCommit(String batchId) { - try { - messageHandle.commitBatch(realmName, batchId); - } catch (BlockRollbackException e) { - LOGGER.error("Error occurred while pre compute commit --" + e.getMessage(), e); - throw e; - } - } - - /** - * - * Consensus write phase will terminate, new block hash values are inconsistent, rollback block - * - */ - public void preComputeAppRollback(String batchId) { - messageHandle.rollbackBatch(realmName, batchId, TransactionState.IGNORED_BY_BLOCK_FULL_ROLLBACK.CODE); - LOGGER.debug("Rollback of operations that cause inconsistencies in the ledger"); - } - - //notice - public byte[] getSnapshot() { - LOGGER.debug("------- GetSnapshot...[replica.id=" + this.getId() + "]"); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - BytesUtils.writeInt(stateHandles.size(), out); - for (StateHandle stateHandle : stateHandles) { - // TODO: 测试代码; - return stateHandle.takeSnapshot(); - } - return out.toByteArray(); - } - - public void installSnapshot(byte[] snapshot) { -// System.out.println("Not implement!"); - } - - @Override - public void start() { - if (this.getId() < 0) { - throw new IllegalStateException("Unset server node ID!"); - } - LOGGER.debug("=============================== Start replica ==================================="); - - if (status != Status.STOPPED) { - return; - } - synchronized (mutex) { - if (status != Status.STOPPED) { - return; - } - status = Status.STARTING; - - try { - LOGGER.debug("Start replica...[ID=" + getId() + "]"); - this.replica = new ServiceReplica(tomConfig, this, this); - this.topology = new BftsmartTopology(replica.getReplicaContext().getCurrentView()); - status = Status.RUNNING; -// createProxyClient(); - LOGGER.debug( - "=============================== Replica started success! ==================================="); - } catch (RuntimeException e) { - status = Status.STOPPED; - throw e; - } - } - - } - - @Override - public void stop() { - if (status != Status.RUNNING) { - return; - } - synchronized (mutex) { - if (status != Status.RUNNING) { - return; - } - status = Status.STOPPING; - - try { - ServiceReplica rep = this.replica; - if (rep != null) { - LOGGER.debug("Stop replica...[ID=" + rep.getId() + "]"); - this.replica = null; - this.topology = null; - - rep.kill(); - LOGGER.debug("Replica had stopped! --[ID=" + rep.getId() + "]"); - } - } finally { - status = Status.STOPPED; - } - } - } - - enum Status { - - STARTING, - - RUNNING, - - STOPPING, - - STOPPED - - } - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServerFactory.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServerFactory.java deleted file mode 100644 index 50ffd90f..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServerFactory.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.service; - -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusSettings; -import com.jd.blockchain.consensus.bftsmart.BftsmartNodeSettings; -import com.jd.blockchain.consensus.service.MessageHandle; -import com.jd.blockchain.consensus.service.NodeServer; -import com.jd.blockchain.consensus.service.NodeServerFactory; -import com.jd.blockchain.consensus.service.ServerSettings; -import com.jd.blockchain.consensus.service.StateMachineReplicate; -import com.jd.blockchain.utils.net.NetworkAddress; - -import java.util.Arrays; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class BftsmartNodeServerFactory implements NodeServerFactory { - - private static Map nodeServerMap = new ConcurrentHashMap<>(); - - - @Override - public ServerSettings buildServerSettings(String realmName, ConsensusSettings consensusSetting, String currentNodeAddress) { - - NodeSettings serverNode = null; - - BftsmartServerSettingConfig serverSettings = new BftsmartServerSettingConfig(); - - //find current node according to current address - for (NodeSettings nodeSettings : consensusSetting.getNodes()) { - if (nodeSettings.getAddress().equals(currentNodeAddress)) { - serverNode = nodeSettings; - break; - } - } - - if (serverNode == null) { - throw new IllegalArgumentException(); - } - - //set server settings - serverSettings.setRealmName(realmName); - - serverSettings.setReplicaSettings(serverNode); - - serverSettings.setConsensusSettings((BftsmartConsensusSettings) consensusSetting); - - return serverSettings; - - } - - @Override - public NodeServer setupServer(ServerSettings serverSettings, MessageHandle messageHandler, - StateMachineReplicate stateMachineReplicator) { - - NodeSettings[] currNodeSettings = (((BftsmartServerSettings)serverSettings).getConsensusSettings()).getNodes(); - - //check conflict realm - if (!hasIntersection(currNodeSettings)) { - BftsmartNodeServer nodeServer = new BftsmartNodeServer(serverSettings, messageHandler, stateMachineReplicator); - nodeServerMap.put(serverSettings.getRealmName(), currNodeSettings); - return nodeServer; - } - else { - throw new IllegalArgumentException("setupServer serverSettings parameters error!"); - } - } - - - //check if consensus realm conflict, by this support multi ledgers - private boolean hasIntersection(NodeSettings[] currNodeSettings) { - - int currHashCode = getHashcode(currNodeSettings); - - //first check if is same consensus realm - for (NodeSettings[] exisitNodeSettings : nodeServerMap.values()) { - if (currHashCode == getHashcode(exisitNodeSettings)) { - return false; - } - } - //check conflict - for (NodeSettings[] exisitNodeSettings : nodeServerMap.values()) { - for (NodeSettings curr : currNodeSettings) { - for (NodeSettings exist : exisitNodeSettings) { - if (((BftsmartNodeSettings)curr).getNetworkAddress().equals(((BftsmartNodeSettings)exist).getNetworkAddress())) { - return true; - } - } - } - } - - return false; - } - - //compute hashcode for consensus nodes - private int getHashcode(NodeSettings[] nodeSettings) { - - int i = 0; - NetworkAddress[] nodeAddrs = new NetworkAddress[nodeSettings.length]; - for (NodeSettings setting : nodeSettings) { - - nodeAddrs[i++] = ((BftsmartNodeSettings)setting).getNetworkAddress(); - } - int hashCode = Arrays.hashCode(nodeAddrs); - return hashCode; - - } - -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartServerSettingConfig.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartServerSettingConfig.java deleted file mode 100644 index 3b42bb0d..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartServerSettingConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.service; - -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusSettings; - -public class BftsmartServerSettingConfig implements BftsmartServerSettings { - private NodeSettings replicaSettings; - private String realmName; - private BftsmartConsensusSettings consensusSettings; - - - @Override - public String getRealmName() { - return realmName; - } - - public void setRealmName(String realmName) { - this.realmName = realmName; - } - - - @Override - public NodeSettings getReplicaSettings() { - return replicaSettings; - } - - public void setReplicaSettings(NodeSettings replicaSettings) { - this.replicaSettings = replicaSettings; - } - - - @Override - public BftsmartConsensusSettings getConsensusSettings() { - return consensusSettings; - } - - public void setConsensusSettings(BftsmartConsensusSettings consensusSettings) { - this.consensusSettings = consensusSettings; - } -} diff --git a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartServerSettings.java b/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartServerSettings.java deleted file mode 100644 index f6806b96..00000000 --- a/core/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartServerSettings.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.jd.blockchain.consensus.bftsmart.service; - -import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusSettings; -import com.jd.blockchain.consensus.service.ServerSettings; - -public interface BftsmartServerSettings extends ServerSettings { - - BftsmartConsensusSettings getConsensusSettings(); - -} diff --git a/core/consensus/consensus-bftsmart/src/main/resources/bftsmart.config b/core/consensus/consensus-bftsmart/src/main/resources/bftsmart.config deleted file mode 100644 index df69caf5..00000000 --- a/core/consensus/consensus-bftsmart/src/main/resources/bftsmart.config +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright (c) 2007-2013 Alysson Bessani, Eduardo Alchieri, Paulo Sousa, and the authors indicated in the @author tags -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -############################################ -####### Communication Configurations ####### -############################################ - -#HMAC algorithm used to authenticate messages between processes (HmacMD5 is the default value) -#This parameter is not currently being used being used -#system.authentication.hmacAlgorithm = HmacSHA1 - -#Specify if the communication system should use a thread to send data (true or false) -system.communication.useSenderThread = true - -#Force all processes to use the same public/private keys pair and secret key. This is useful when deploying experiments -#and benchmarks, but must not be used in production systems. -system.communication.defaultkeys = true - -############################################ -### Replication Algorithm Configurations ### -############################################ - -#Timeout to asking for a client request -system.totalordermulticast.timeout = 2000 - - -#Maximum batch size (in number of messages) -system.totalordermulticast.maxbatchsize = 400 - -#Number of nonces (for non-determinism actions) generated -system.totalordermulticast.nonces = 10 - -#if verification of leader-generated timestamps are increasing -#it can only be used on systems in which the network clocks -#are synchronized -system.totalordermulticast.verifyTimestamps = false - -#Quantity of messages that can be stored in the receive queue of the communication system -system.communication.inQueueSize = 500000 - -# Quantity of messages that can be stored in the send queue of each replica -system.communication.outQueueSize = 500000 - -#Set to 1 if SMaRt should use signatures, set to 0 if otherwise -system.communication.useSignatures = 0 - -#Set to 1 if SMaRt should use MAC's, set to 0 if otherwise -system.communication.useMACs = 1 - -#Set to 1 if SMaRt should use the standard output to display debug messages, set to 0 if otherwise -system.debug = 0 - -#Print information about the replica when it is shutdown -system.shutdownhook = true - -############################################ -###### State Transfer Configurations ####### -############################################ - -#Activate the state transfer protocol ('true' to activate, 'false' to de-activate) -system.totalordermulticast.state_transfer = true - -#Maximum ahead-of-time message not discarded -system.totalordermulticast.highMark = 10000 - -#Maximum ahead-of-time message not discarded when the replica is still on EID 0 (after which the state transfer is triggered) -system.totalordermulticast.revival_highMark = 10 - -#Number of ahead-of-time messages necessary to trigger the state transfer after a request timeout occurs -system.totalordermulticast.timeout_highMark = 200 - -############################################ -###### Log and Checkpoint Configurations ### -############################################ - -system.totalordermulticast.log = true -system.totalordermulticast.log_parallel = false -system.totalordermulticast.log_to_disk = false -system.totalordermulticast.sync_log = false - -#Period at which BFT-SMaRt requests the state to the application (for the state transfer state protocol) -system.totalordermulticast.checkpoint_period = 1000 -system.totalordermulticast.global_checkpoint_period = 120000 - -system.totalordermulticast.checkpoint_to_disk = false -system.totalordermulticast.sync_ckp = false - - -############################################ -###### Reconfiguration Configurations ###### -############################################ - -#The ID of the trust third party (TTP) -system.ttp.id = 7002 - -#This sets if the system will function in Byzantine or crash-only mode. Set to "true" to support Byzantine faults -system.bft = true - -#Custom View Storage; -#view.storage.handler=bftsmart.reconfiguration.views.DefaultViewStorage - - -#Number of servers in the group -system.servers.num = 4 - -#Maximum number of faulty replicas -system.servers.f = 1 - -#Replicas ID for the initial view, separated by a comma. -# The number of replicas in this parameter should be equal to that specified in 'system.servers.num' -system.initial.view = 0,1,2,3 - -#Configuration of all node servers; -#PubKey of node server with specified ID, with base58 encoding. -system.server.0.pubkey= -system.server.0.network.host=127.0.0.1 -system.server.0.network.port=8900 -system.server.0.network.secure=false - -system.server.1.pubkey= -system.server.1.network.host=127.0.0.1 -system.server.1.network.port=8910 -system.server.1.network.secure=false - -system.server.2.pubkey= -system.server.2.network.host=127.0.0.1 -system.server.2.network.port=8920 -system.server.2.network.secure=false - -system.server.3.pubkey= -system.server.3.network.host=127.0.0.1 -system.server.3.network.port=8920 -system.server.3.network.secure=false diff --git a/core/consensus/consensus-bftsmart/src/test/java/test/com/jd/blockchain/consensus/bftsmart/ProxyClientTest.java b/core/consensus/consensus-bftsmart/src/test/java/test/com/jd/blockchain/consensus/bftsmart/ProxyClientTest.java deleted file mode 100644 index 3f32fd6b..00000000 --- a/core/consensus/consensus-bftsmart/src/test/java/test/com/jd/blockchain/consensus/bftsmart/ProxyClientTest.java +++ /dev/null @@ -1,137 +0,0 @@ -package test.com.jd.blockchain.consensus.bftsmart; - -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.consensus.bftsmart.*; -import com.jd.blockchain.consensus.bftsmart.client.BftsmartClientConfig; -import com.jd.blockchain.consensus.bftsmart.client.BftsmartConsensusClient; -import com.jd.blockchain.consensus.bftsmart.client.BftsmartMessageService; -import com.jd.blockchain.consensus.bftsmart.service.BftsmartNodeServer; -import com.jd.blockchain.consensus.bftsmart.service.BftsmartServerSettingConfig; -import com.jd.blockchain.consensus.service.ServerSettings; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.BlockchainKeyGenerator; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.utils.PropertiesUtils; -import com.jd.blockchain.utils.io.BytesUtils; -import com.jd.blockchain.utils.net.NetworkAddress; -import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils; -import org.junit.Test; -import org.springframework.core.io.ClassPathResource; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; -import java.util.Random; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class ProxyClientTest { - - int number = 1500000; - - int peerStartPort = 11000; - - int nodeNum = 4; - - Random random = new Random(); - - byte[] bytes = null; - - CountDownLatch startPeer = new CountDownLatch(nodeNum); - - private static Properties bftsmartConf; - - private final ExecutorService nodeStartPools = Executors.newCachedThreadPool(); - - private final ExecutorService txSendPools = Executors.newFixedThreadPool(20); - - static { - ClassPathResource configResource = new ClassPathResource("system.config"); - try { - try (InputStream in = configResource.getInputStream()) { - bftsmartConf = PropertiesUtils.load(in, BytesUtils.DEFAULT_CHARSET); - } - } catch (IOException e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - - public void peerStart(BftsmartNodeServer[] nodeServers) { - - BftsmartNodeSettings[] nodesSettings = new BftsmartNodeSettings[nodeNum]; - - for (int i = 0; i < nodeNum; i++) { - BlockchainKeypair keyPair = BlockchainKeyGenerator.getInstance().generate(); - PubKey pubKey = keyPair.getPubKey(); - NetworkAddress peerNodeServ = new NetworkAddress("127.0.0.1", peerStartPort + i * 10); - NodeSettings node = new BftsmartNodeConfig(pubKey, i, peerNodeServ); - nodesSettings[i] = (BftsmartNodeSettings) node; - } - - BftsmartConsensusConfig consensusConfig = new BftsmartConsensusConfig(nodesSettings, -// null, - PropertiesUtils.getOrderedValues(bftsmartConf)); - - for (int j = 0; j < nodeNum; j++) { - BftsmartServerSettingConfig serverSettings = new BftsmartServerSettingConfig(); - serverSettings.setReplicaSettings(nodesSettings[j]); - serverSettings.setConsensusSettings(consensusConfig); - BftsmartNodeServer server = new BftsmartNodeServer(serverSettings, null, null); - nodeServers[j] = server; - nodeStartPools.execute(() -> { - server.start(); - startPeer.countDown(); - }); - } - } - - public void proxyClientSend(BftsmartNodeServer nodeServer) { - BftsmartClientIncomingConfig clientIncomingConfig = new BftsmartClientIncomingConfig(); - BlockchainKeypair keyPair = BlockchainKeyGenerator.getInstance().generate(); - clientIncomingConfig.setPubKey(keyPair.getPubKey()); - clientIncomingConfig.setClientId(0); - clientIncomingConfig.setConsensusSettings(nodeServer.getConsensusSetting()); - clientIncomingConfig.setTomConfig(BinarySerializeUtils.serialize(nodeServer.getTomConfig())); - clientIncomingConfig.setTopology(BinarySerializeUtils.serialize(nodeServer.getTopology())); - - BftsmartClientConfig clientSettings = new BftsmartClientConfig(clientIncomingConfig); - BftsmartConsensusClient consensusClient = new BftsmartConsensusClient(clientSettings); - bytes = new byte[1024]; - - BftsmartMessageService messageService = (BftsmartMessageService) consensusClient.getMessageService(); - - for (int j = 0; j < number; j++) { - txSendPools.execute(() -> { - random.nextBytes(bytes); - messageService.sendOrdered(bytes); - }); - } - - } - -// @Test - public void sendTest() { - - BftsmartNodeServer[] nodeServers = new BftsmartNodeServer[nodeNum]; - //启动服务 - peerStart(nodeServers); - - try { - startPeer.await(); - Thread.sleep(5000); - } catch (Exception e) { - e.printStackTrace(); - } - - proxyClientSend(nodeServers[0]); - - - try { - Thread.sleep(50000); - System.out.println("send test complete!"); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/core/consensus/consensus-bftsmart/src/test/resources/bftsmart.config b/core/consensus/consensus-bftsmart/src/test/resources/bftsmart.config deleted file mode 100644 index 970ddf4b..00000000 --- a/core/consensus/consensus-bftsmart/src/test/resources/bftsmart.config +++ /dev/null @@ -1,178 +0,0 @@ - -# Copyright (c) 2007-2013 Alysson Bessani, Eduardo Alchieri, Paulo Sousa, and the authors indicated in the @author tags -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -############################################ -###### Consensus Commit Block Parameters: transaction count ###### -############################################ -system.block.txsize=15 - -############################################ -###### Consensus Commit Block Parameters: delay time ###### -############################################ -system.block.maxdelay=500 - -############################################ -###### Consensus Participant0 ###### -############################################ -system.server.0.pubkey=endPsK36koyFr1D245Sa9j83vt6pZUdFBJoJRB3xAsWM6cwhRbna - -system.server.0.network.host=127.0.0.1 - -system.server.0.network.port=8910 - -system.server.0.network.secure=false - -############################################ -###### #Consensus Participant1 ###### -############################################ -system.server.1.pubkey=endPsK36sC5JdPCDPDAXUwZtS3sxEmqEhFcC4whayAsTTh8Z6eoZ - -system.server.1.network.host=127.0.0.1 - -system.server.1.network.port=8920 - -system.server.1.network.secure=false - -############################################ -###### #Consensus Participant2 ###### -############################################ -system.server.2.pubkey=endPsK36jEG281HMHeh6oSqzqLkT95DTnCM6REDURjdb2c67uR3R - -system.server.2.network.host=127.0.0.1 - -system.server.2.network.port=8930 - -system.server.2.network.secure=false - -############################################ -###### Consensus Participant3 ###### -############################################ -system.server.3.pubkey=endPsK36nse1dck4uF19zPvAMijCV336Y3zWdgb4rQG8QoRj5ktR - -system.server.3.network.host=127.0.0.1 - -system.server.3.network.port=8940 - -system.server.3.network.secure=false - -############################################ -####### Communication Configurations ####### -############################################ - -#HMAC algorithm used to authenticate messages between processes (HmacMD5 is the default value) -#This parameter is not currently being used being used -#system.authentication.hmacAlgorithm = HmacSHA1 - -#Specify if the communication system should use a thread to send data (true or false) -system.communication.useSenderThread = true - -#Force all processes to use the same public/private keys pair and secret key. This is useful when deploying experiments -#and benchmarks, but must not be used in production systems. -system.communication.defaultkeys = true - -############################################ -### Replication Algorithm Configurations ### -############################################ - -#Number of servers in the group -system.servers.num = 4 - -#Maximum number of faulty replicas -#system.servers.f = 1 - -#Timeout to asking for a client request -system.totalordermulticast.timeout = 2000 - - -#Maximum batch size (in number of messages) -system.totalordermulticast.maxbatchsize = 400 - -#Number of nonces (for non-determinism actions) generated -system.totalordermulticast.nonces = 10 - -#if verification of leader-generated timestamps are increasing -#it can only be used on systems in which the network clocks -#are synchronized -system.totalordermulticast.verifyTimestamps = false - -#Quantity of messages that can be stored in the receive queue of the communication system -system.communication.inQueueSize = 500000 - -# Quantity of messages that can be stored in the send queue of each replica -system.communication.outQueueSize = 500000 - -#Set to 1 if SMaRt should use signatures, set to 0 if otherwise -system.communication.useSignatures = 0 - -#Set to 1 if SMaRt should use MAC's, set to 0 if otherwise -system.communication.useMACs = 1 - -#Set to 1 if SMaRt should use the standard output to display debug messages, set to 0 if otherwise -system.debug = 0 - -#Print information about the replica when it is shutdown -system.shutdownhook = true - -############################################ -###### State Transfer Configurations ####### -############################################ - -#Activate the state transfer protocol ('true' to activate, 'false' to de-activate) -system.totalordermulticast.state_transfer = true - -#Maximum ahead-of-time message not discarded -system.totalordermulticast.highMark = 10000 - -#Maximum ahead-of-time message not discarded when the replica is still on EID 0 (after which the state transfer is triggered) -system.totalordermulticast.revival_highMark = 10 - -#Number of ahead-of-time messages necessary to trigger the state transfer after a request timeout occurs -system.totalordermulticast.timeout_highMark = 200 - -############################################ -###### Log and Checkpoint Configurations ### -############################################ - -system.totalordermulticast.log = true -system.totalordermulticast.log_parallel = false -system.totalordermulticast.log_to_disk = false -system.totalordermulticast.sync_log = false - -#Period at which BFT-SMaRt requests the state to the application (for the state transfer state protocol) -system.totalordermulticast.checkpoint_period = 1000 -system.totalordermulticast.global_checkpoint_period = 120000 - -system.totalordermulticast.checkpoint_to_disk = false -system.totalordermulticast.sync_ckp = false - - -############################################ -###### Reconfiguration Configurations ###### -############################################ - -#Replicas ID for the initial view, separated by a comma. -# The number of replicas in this parameter should be equal to that specified in 'system.servers.num' -#system.initial.view = 0,1,2,3 - -#The ID of the trust third party (TTP) -system.ttp.id = 7002 - -#This sets if the system will function in Byzantine or crash-only mode. Set to "true" to support Byzantine faults -system.bft = true - -#Custom View Storage; -#view.storage.handler=bftsmart.reconfiguration.views.DefaultViewStorage - diff --git a/core/consensus/consensus-bftsmart/src/test/resources/system.config b/core/consensus/consensus-bftsmart/src/test/resources/system.config deleted file mode 100644 index 275edc4e..00000000 --- a/core/consensus/consensus-bftsmart/src/test/resources/system.config +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (c) 2007-2013 Alysson Bessani, Eduardo Alchieri, Paulo Sousa, and the authors indicated in the @author tags -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -############################################ -####### Communication Configurations ####### -############################################ - -#HMAC algorithm used to authenticate messages between processes (HmacMD5 is the default value) -#This parameter is not currently being used being used -#system.authentication.hmacAlgorithm = HmacSHA1 - -#Specify if the communication system should use a thread to send data (true or false) -system.communication.useSenderThread = true - -#Force all processes to use the same public/private keys pair and secret key. This is useful when deploying experiments -#and benchmarks, but must not be used in production systems. -system.communication.defaultkeys = true - -############################################ -### Replication Algorithm Configurations ### -############################################ - -#Number of servers in the group -system.servers.num = 4 - -#Maximum number of faulty replicas -#system.servers.f = 1 - -#Timeout to asking for a client request -system.totalordermulticast.timeout = 2000 - - -#Maximum batch size (in number of messages) -system.totalordermulticast.maxbatchsize = 400 - -#Number of nonces (for non-determinism actions) generated -system.totalordermulticast.nonces = 10 - -#if verification of leader-generated timestamps are increasing -#it can only be used on systems in which the network clocks -#are synchronized -system.totalordermulticast.verifyTimestamps = false - -#Quantity of messages that can be stored in the receive queue of the communication system -system.communication.inQueueSize = 500000 - -# Quantity of messages that can be stored in the send queue of each replica -system.communication.outQueueSize = 500000 - -#Set to 1 if SMaRt should use signatures, set to 0 if otherwise -system.communication.useSignatures = 0 - -#Set to 1 if SMaRt should use MAC's, set to 0 if otherwise -system.communication.useMACs = 1 - -#Set to 1 if SMaRt should use the standard output to display debug messages, set to 0 if otherwise -system.debug = 0 - -#Print information about the replica when it is shutdown -system.shutdownhook = true - -############################################ -###### State Transfer Configurations ####### -############################################ - -#Activate the state transfer protocol ('true' to activate, 'false' to de-activate) -system.totalordermulticast.state_transfer = true - -#Maximum ahead-of-time message not discarded -system.totalordermulticast.highMark = 10000 - -#Maximum ahead-of-time message not discarded when the replica is still on EID 0 (after which the state transfer is triggered) -system.totalordermulticast.revival_highMark = 10 - -#Number of ahead-of-time messages necessary to trigger the state transfer after a request timeout occurs -system.totalordermulticast.timeout_highMark = 200 - -############################################ -###### Log and Checkpoint Configurations ### -############################################ - -system.totalordermulticast.log = true -system.totalordermulticast.log_parallel = false -system.totalordermulticast.log_to_disk = false -system.totalordermulticast.sync_log = false - -#Period at which BFT-SMaRt requests the state to the application (for the state transfer state protocol) -system.totalordermulticast.checkpoint_period = 1000 -system.totalordermulticast.global_checkpoint_period = 120000 - -system.totalordermulticast.checkpoint_to_disk = false -system.totalordermulticast.sync_ckp = false - - -############################################ -###### Reconfiguration Configurations ###### -############################################ - -#Replicas ID for the initial view, separated by a comma. -# The number of replicas in this parameter should be equal to that specified in 'system.servers.num' -#system.initial.view = 0,1,2,3 - -#The ID of the trust third party (TTP) -system.ttp.id = 7002 - -#This sets if the system will function in Byzantine or crash-only mode. Set to "true" to support Byzantine faults -system.bft = true - -#Custom View Storage; -#view.storage.handler=bftsmart.reconfiguration.views.DefaultViewStorage diff --git a/core/consensus/consensus-mq/pom.xml b/core/consensus/consensus-mq/pom.xml deleted file mode 100644 index 477f187a..00000000 --- a/core/consensus/consensus-mq/pom.xml +++ /dev/null @@ -1,71 +0,0 @@ - - 4.0.0 - - com.jd.blockchain - consensus-core - 1.2.0-SNAPSHOT - - consensus-mq - - consensus-mq - - - UTF-8 - 1.8 - 1.8 - - - - - com.jd.blockchain - consensus-framework - ${project.version} - - - com.jd.blockchain - tools-keygen - ${project.version} - - - com.jd.blockchain - ledger-model - ${project.version} - - - - com.lmax - disruptor - - - io.nats - jnats - - - - com.rabbitmq - amqp-client - - - - junit - junit - test - - - - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.8.2 - - true - - - - - - diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusProvider.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusProvider.java deleted file mode 100644 index 4bd555ce..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/18 下午2:50 - * Description: - */ -package com.jd.blockchain.consensus.mq; - -import com.jd.blockchain.consensus.ConsensusProvider; -import com.jd.blockchain.consensus.SettingsFactory; -import com.jd.blockchain.consensus.client.ClientFactory; -import com.jd.blockchain.consensus.mq.client.MsgQueueClientFactory; -import com.jd.blockchain.consensus.mq.config.MsgQueueSettingsFactory; -import com.jd.blockchain.consensus.mq.server.MsgQueueNodeServerFactory; -import com.jd.blockchain.consensus.service.NodeServerFactory; - -/** - * - * @author shaozhuguang - * @create 2018/12/18 - * @since 1.0.0 - */ - -public class MsgQueueConsensusProvider implements ConsensusProvider { - - public static final String NAME = MsgQueueConsensusProvider.class.getName(); - - private static MsgQueueSettingsFactory settingsFactory = new MsgQueueSettingsFactory(); - - private static MsgQueueClientFactory clientFactory = new MsgQueueClientFactory(); - - private static MsgQueueNodeServerFactory nodeServerFactory = new MsgQueueNodeServerFactory(); - - @Override - public String getName() { - return NAME; - } - - @Override - public SettingsFactory getSettingsFactory() { - return settingsFactory; - } - - @Override - public ClientFactory getClientFactory() { - return clientFactory; - } - - @Override - public NodeServerFactory getServerFactory() { - return nodeServerFactory; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java deleted file mode 100644 index 448955c8..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java +++ /dev/null @@ -1,301 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.MsgQueueConsensusSettingsBuilder - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 下午1:46 - * Description: - */ -package com.jd.blockchain.consensus.mq; - -import com.jd.blockchain.consensus.ConsensusProviders; -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consensus.ConsensusSettingsBuilder; -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.consensus.mq.config.MsgQueueBlockConfig; -import com.jd.blockchain.consensus.mq.config.MsgQueueConsensusConfig; -import com.jd.blockchain.consensus.mq.config.MsgQueueNetworkConfig; -import com.jd.blockchain.consensus.mq.config.MsgQueueNodeConfig; -import com.jd.blockchain.consensus.mq.settings.MsgQueueBlockSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueNetworkSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueNodeSettings; -import com.jd.blockchain.crypto.AddressEncoding; -import com.jd.blockchain.crypto.KeyGenUtils; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.ParticipantInfo; -import com.jd.blockchain.ledger.ParticipantNode; -import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.PropertiesUtils; -import com.jd.blockchain.utils.codec.Base58Utils; -import com.jd.blockchain.utils.io.BytesEncoder; -import com.jd.blockchain.utils.io.BytesUtils; -import com.jd.blockchain.utils.io.FileUtils; -import com.jd.blockchain.utils.net.NetworkAddress; - -import org.springframework.core.io.ClassPathResource; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueConsensusSettingsBuilder implements ConsensusSettingsBuilder { - - private static final String DEFAULT_TOPIC_TX = "tx-topic"; - - private static final String DEFAULT_TOPIC_BL = "bl-topic"; - - private static final String DEFAULT_TOPIC_MSG = "msg-topic"; - - private static final int DEFAULT_TXSIZE = 1000; - - private static final int DEFAULT_MAXDELAY = 1000; - - /** - * - */ - private static final String CONFIG_TEMPLATE_FILE = "mq.config"; - - /** - * 参数键:节点数量; - */ - public static final String SERVER_NUM_KEY = "system.servers.num"; - - /** - * 参数键格式:节点公钥; - */ - public static final String PUBKEY_PATTERN = "system.server.%s.pubkey"; - - public static final String MSG_QUEUE_SERVER = "system.msg.queue.server"; - - public static final String MSG_QUEUE_TOPIC_TX = "system.msg.queue.topic.tx"; - - public static final String MSG_QUEUE_TOPIC_BL = "system.msg.queue.topic.bl"; - - public static final String MSG_QUEUE_TOPIC_MSG = "system.msg.queue.topic.msg"; - - public static final String MSG_QUEUE_BLOCK_TXSIZE = "system.msg.queue.block.txsize"; - - public static final String MSG_QUEUE_BLOCK_MAXDELAY = "system.msg.queue.block.maxdelay"; - - public static final String MSG_QUEUE_PROVIDER = "com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider"; - - private static Properties CONFIG_TEMPLATE; - - static { - if (FileUtils.existFile(CONFIG_TEMPLATE_FILE)) { - ClassPathResource configResource = new ClassPathResource(CONFIG_TEMPLATE_FILE); - try { - try (InputStream in = configResource.getInputStream()) { - CONFIG_TEMPLATE = PropertiesUtils.load(in, BytesUtils.DEFAULT_CHARSET); - } - } catch (IOException e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - } - - @Override - public MsgQueueConsensusSettings createSettings(Properties props, ParticipantNode[] participantNodes) { - MsgQueueNetworkConfig networkConfig = new MsgQueueNetworkConfig(); - Properties resolvingProps = PropertiesUtils.cloneFrom(props); - - String server = PropertiesUtils.getProperty(resolvingProps, MSG_QUEUE_SERVER, true); - if (server == null || server.length()<= 0) { - throw new IllegalArgumentException(String.format("Property[%s] is empty!", MSG_QUEUE_SERVER)); - } - networkConfig.setServer(server) - .setTxTopic(initProp(resolvingProps, MSG_QUEUE_TOPIC_TX, DEFAULT_TOPIC_TX)) - .setBlTopic(initProp(resolvingProps, MSG_QUEUE_TOPIC_BL, DEFAULT_TOPIC_BL)) - .setMsgTopic(initProp(resolvingProps, MSG_QUEUE_TOPIC_MSG, DEFAULT_TOPIC_MSG)) - ; - - MsgQueueBlockConfig blockConfig = new MsgQueueBlockConfig() - .setTxSizePerBlock(initProp(resolvingProps, MSG_QUEUE_BLOCK_TXSIZE, DEFAULT_TXSIZE)) - .setMaxDelayMilliSecondsPerBlock(initProp(resolvingProps, MSG_QUEUE_BLOCK_MAXDELAY, DEFAULT_MAXDELAY)) - ; - - MsgQueueConsensusConfig consensusConfig = new MsgQueueConsensusConfig() - .setBlockSettings(blockConfig) - .setNetworkSettings(networkConfig) - ; - // load node settings - int serversNum = PropertiesUtils.getInt(resolvingProps, SERVER_NUM_KEY); - for (int i = 0; i < serversNum; i++) { - int id = i; - - String keyOfPubkey = nodeKey(PUBKEY_PATTERN, id); - - String base58PubKey = PropertiesUtils.getRequiredProperty(resolvingProps, keyOfPubkey); - PubKey pubKey = KeyGenUtils.decodePubKey(base58PubKey); - -// PubKey pubKey = new PubKey(Base58Utils.decode(base58PubKey)); - resolvingProps.remove(keyOfPubkey); - Bytes address = AddressEncoding.generateAddress(pubKey); - - String networkAddress = address.toBase58(); - MsgQueueNodeConfig nodeConfig = new MsgQueueNodeConfig() - .setAddress(networkAddress) - .setPubKey(pubKey) - ; - consensusConfig.addNodeSettings(nodeConfig); - } - return consensusConfig; - } - - private MsgQueueNodeSettings[] nodeSettings(NodeSettings[] nodeSettings, ParticipantInfo participantInfo) { - - MsgQueueNodeSettings msgQueueNodeSettings = new MsgQueueNodeConfig(); - ((MsgQueueNodeConfig) msgQueueNodeSettings).setAddress(AddressEncoding.generateAddress(participantInfo.getPubKey()).toBase58()); - ((MsgQueueNodeConfig) msgQueueNodeSettings).setPubKey(participantInfo.getPubKey()); - - MsgQueueNodeSettings[] msgQueuetNodeSettings = new MsgQueueNodeSettings[nodeSettings.length + 1]; - for (int i = 0; i < nodeSettings.length; i++) { - msgQueuetNodeSettings[i] = (MsgQueueNodeSettings)nodeSettings[i]; - } - msgQueuetNodeSettings[nodeSettings.length] = msgQueueNodeSettings; - - return msgQueuetNodeSettings; - } - - @Override - public Bytes updateSettings(Bytes oldConsensusSettings, ParticipantInfo participantInfo) { - - BytesEncoder consensusEncoder = ConsensusProviders.getProvider(MSG_QUEUE_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder(); - - MsgQueueConsensusSettings consensusSettings = (MsgQueueConsensusSettings) consensusEncoder.decode(oldConsensusSettings.toBytes()); - - MsgQueueNodeSettings[] nodeSettings = nodeSettings(consensusSettings.getNodes(), participantInfo); - - MsgQueueConsensusConfig msgQueueConsensusConfig = new MsgQueueConsensusConfig(); - for (int i = 0; i < nodeSettings.length; i++) { - msgQueueConsensusConfig.addNodeSettings(nodeSettings[i]); - } - - msgQueueConsensusConfig.setBlockSettings(consensusSettings.getBlockSettings()); - - msgQueueConsensusConfig.setNetworkSettings(consensusSettings.getNetworkSettings()); - - -// for(int i = 0 ;i < msgQueueConsensusConfig.getNodes().length; i++) { -// System.out.printf("node addr = %s\r\n", msgQueueConsensusConfig.getNodes()[i].getAddress()); -// } - - return new Bytes(consensusEncoder.encode(msgQueueConsensusConfig)); - - } - - @Override - public Properties createPropertiesTemplate() { - return PropertiesUtils.cloneFrom(CONFIG_TEMPLATE); - } - - @Override - public void writeSettings(ConsensusSettings settings, Properties props) { - - if (!(settings instanceof MsgQueueConsensusSettings)) { - throw new IllegalArgumentException("ConsensusSettings data isn't supported! Accept MsgQueueConsensusSettings only!"); - } - - MsgQueueConsensusSettings consensusSettings = (MsgQueueConsensusSettings) settings; - - MsgQueueNetworkSettings networkSettings = consensusSettings.getNetworkSettings(); - if (networkSettings == null || networkSettings.getServer() == null || networkSettings.getServer().length() <= 0) { - throw new IllegalArgumentException("MsgQueue Consensus server is empty!"); - } - - String server = networkSettings.getServer(); - props.setProperty(MSG_QUEUE_SERVER, server); - - String txTopic = networkSettings.getTxTopic(); - if (txTopic == null || txTopic.length() <= 0) { - txTopic = DEFAULT_TOPIC_TX; - } - props.setProperty(MSG_QUEUE_TOPIC_TX, txTopic); - - String blTopic = networkSettings.getBlTopic(); - if (blTopic == null || blTopic.length() <= 0) { - blTopic = DEFAULT_TOPIC_BL; - } - props.setProperty(MSG_QUEUE_TOPIC_BL, blTopic); - - String msgTopic = networkSettings.getMsgTopic(); - if (msgTopic == null || msgTopic.length() <= 0) { - msgTopic = DEFAULT_TOPIC_MSG; - } - props.setProperty(MSG_QUEUE_TOPIC_MSG, msgTopic); - - MsgQueueBlockSettings blockSettings = consensusSettings.getBlockSettings(); - if (blockSettings == null) { - props.setProperty(MSG_QUEUE_BLOCK_TXSIZE, DEFAULT_TXSIZE + ""); - props.setProperty(MSG_QUEUE_BLOCK_MAXDELAY, DEFAULT_MAXDELAY + ""); - } else { - int txSize = blockSettings.getTxSizePerBlock(); - long maxDelay = blockSettings.getMaxDelayMilliSecondsPerBlock(); - props.setProperty(MSG_QUEUE_BLOCK_TXSIZE, txSize + ""); - props.setProperty(MSG_QUEUE_BLOCK_MAXDELAY, maxDelay + ""); - } - - -// int serversNum = PropertiesUtils.getInt(props, SERVER_NUM_KEY); -// if (serversNum > 0) { -// for (int i = 0; i < serversNum; i++) { -// int id = i; -// String keyOfPubkey = nodeKey(PUBKEY_PATTERN, id); -// props.remove(keyOfPubkey); -// -// String keyOfHost = nodeKey(CONSENSUS_HOST_PATTERN, id); -// props.remove(keyOfHost); -// } -// } -// -// NodeSettings[] nodesSettings = consensusSettings.getNodes(); -// serversNum = nodesSettings.length; -// props.setProperty(SERVER_NUM_KEY, serversNum + ""); -// -// for (int i = 0; i < serversNum; i++) { -// MsgQueueNodeSettings mqns = (MsgQueueNodeSettings) nodesSettings[i]; -// int id = i; -// String keyOfPubkey = nodeKey(PUBKEY_PATTERN, id); -// props.setProperty(keyOfPubkey, mqns.getPubKey().toBase58()); -// -// String keyOfHost = nodeKey(CONSENSUS_HOST_PATTERN, id); -// props.setProperty(keyOfHost, mqns.getAddress() == null ? "" : mqns.getAddress()); -// } - } - - private String initProp(Properties resolvingProps, String key, String defaultVal) { - try { - String value = PropertiesUtils.getProperty(resolvingProps, key, true); - if (value == null || value.length() <= 0) { - value = defaultVal; - } - return value; - } catch (Exception e) { - return defaultVal; - } - } - - private int initProp(Properties resolvingProps, String key, int defaultVal) { - try { - int value = PropertiesUtils.getInt(resolvingProps, key); - if (value <= 0) { - value = defaultVal; - } - return value; - } catch (Exception e) { - return defaultVal; - } - } - - private static String nodeKey(String pattern, int id) { - return String.format(pattern, id); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/DefaultMessageTransmitter.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/DefaultMessageTransmitter.java deleted file mode 100644 index 61333cfc..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/DefaultMessageTransmitter.java +++ /dev/null @@ -1,311 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.client.DefaultMessageTransmitter - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 下午3:05 - * Description: - */ -package com.jd.blockchain.consensus.mq.client; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicBoolean; - -import com.jd.blockchain.consensus.event.EventEntity; -import com.lmax.disruptor.EventHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.jd.blockchain.consensus.MessageService; -import com.jd.blockchain.consensus.mq.consumer.MsgQueueConsumer; -import com.jd.blockchain.consensus.mq.event.TxBlockedEvent; -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; -import com.jd.blockchain.consensus.mq.util.MessageConvertUtil; -import com.jd.blockchain.utils.concurrent.AsyncFuture; -import com.jd.blockchain.utils.concurrent.CompletableAsyncFuture; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class DefaultMessageTransmitter implements MessageTransmitter, MessageService { - - private static final Logger LOGGER = LoggerFactory.getLogger(DefaultMessageTransmitter.class); - - private final ExecutorService messageExecutorArray = Executors.newFixedThreadPool(10); - -// private final ExecutorService blockExecutor = Executors.newSingleThreadExecutor(); -// -// private final ExecutorService extendExecutor = Executors.newSingleThreadExecutor(); - - private final Map messageListeners = new ConcurrentHashMap<>(); - - private final BlockEventHandler blockEventHandler = new BlockEventHandler(); - - private final ExtendEventHandler extendEventHandler = new ExtendEventHandler(); - - private MsgQueueProducer txProducer; - - private MsgQueueProducer msgProducer; - - private MsgQueueConsumer blConsumer; - - private MsgQueueConsumer msgConsumer; - - private boolean isConnected = false; - - public DefaultMessageTransmitter setTxProducer(MsgQueueProducer txProducer) { - this.txProducer = txProducer; - return this; - } - - public DefaultMessageTransmitter setMsgProducer(MsgQueueProducer msgProducer) { - this.msgProducer = msgProducer; - return this; - } - - public DefaultMessageTransmitter setBlConsumer(MsgQueueConsumer blConsumer) { - this.blConsumer = blConsumer; - return this; - } - - public DefaultMessageTransmitter setMsgConsumer(MsgQueueConsumer msgConsumer) { - this.msgConsumer = msgConsumer; - return this; - } - - @Override - public AsyncFuture sendOrdered(byte[] message) { - - AsyncFuture messageFuture; - - try { - publishMessage(txProducer, message); - messageFuture = messageHandle(message); - } catch (Exception e) { - throw new RuntimeException(e); - } - return messageFuture; - } - - @Override - public AsyncFuture sendUnordered(byte[] message) { - AsyncFuture messageFuture; - try { - publishMessage(msgProducer, message); - messageFuture = messageHandle(message); - } catch (Exception e) { - throw new RuntimeException(e); - } - return messageFuture; - } - - @Override - public void connect() throws Exception{ - if (!isConnected) { - this.txProducer.connect(); - this.blConsumer.connect(blockEventHandler); - this.msgProducer.connect(); - this.msgConsumer.connect(extendEventHandler); - isConnected = true; - blConsumer.start(); - msgConsumer.start(); -// blockConsumerListening(); -// extendConsumerListening(); - } - } - - @Override - public void publishMessage(MsgQueueProducer producer, byte[] message) throws Exception { - producer.publish(message); - } - - @Override - public void close() { - try { - txProducer.close(); - blConsumer.close(); - msgProducer.close(); - msgConsumer.close(); - isConnected = false; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private AsyncFuture messageHandle(byte[] message) throws Exception { -// 异步回调 -// 需要监听MQ结块的应答 -// 首先需要一个Consumer,在子类已实现 - String messageKey = messageKey(message); - AsyncFuture messageFuture = registerMessageListener(messageKey); - return messageFuture; - } - - private String messageKey(byte[] message) { - return MessageConvertUtil.messageKey(message); - } - - private AsyncFuture registerMessageListener(String messageKey) { - CompletableAsyncFuture future = new CompletableAsyncFuture<>(); - MessageListener messageListener = new MessageListener(messageKey, future); - messageListener.addListener(); - return future; - } - -// private void blockConsumerListening() { -// // 区块事件由单独一个线程处理 -// blockExecutor.execute(() -> { -// while(isConnected) { -// try { -// byte[] txBlockedEventBytes = blConsumer.start(); -// // 交由事件处理机制来处理 -// if (txBlockedEventBytes != null && txBlockedEventBytes.length > 0) { -// txBlockedEventHandle(txBlockedEventBytes); -// } -// } catch (Exception e) { -// LOGGER.error("process block listening message exception {}", e.getMessage()); -// } -// } -// }); -// } - -// private void extendConsumerListening() { -// extendExecutor.execute(() -> { -// while (isConnected) { -// try { -// byte[] msgBytes = msgConsumer.start(); -// // 交由事件处理机制来处理 -// if (msgBytes != null && msgBytes.length > 0) { -// extendMessageHandle(msgBytes); -// } -// } catch (Exception e) { -// LOGGER.error("process extend listening message exception {}", e.getMessage()); -// } -// } -// }); -// } - - private void txBlockedEventHandle(byte[] bytes) { - messageExecutorArray.execute(() -> { - if (!this.messageListeners.isEmpty()) { - // 首先将字节数组转换为BlockEvent - final TxBlockedEvent txBlockedEvent = - MessageConvertUtil.convertBytes2TxBlockedEvent(bytes); - if (txBlockedEvent != null) { - // 需要判断该区块是否需要处理 - if (isTxBlockedEventNeedManage(txBlockedEvent)) { - dealTxBlockedEvent(txBlockedEvent); - } - } - } - }); - } - - private void extendMessageHandle(byte[] message) { - messageExecutorArray.execute(() -> { - String messageKey = messageKey(message); - if (messageListeners.containsKey(messageKey)) { - dealExtendMessage(messageKey, message); - } - }); - } - - private boolean isTxBlockedEventNeedManage(final TxBlockedEvent txBlockedEvent) { - if (this.messageListeners.isEmpty()) { - return false; - } - if (messageListeners.containsKey(txBlockedEvent.getTxKey())) { - return true; - } - // 无须处理区块高度 - return false; - } - - private void dealTxBlockedEvent(final TxBlockedEvent txBlockedEvent) { - String txKey = txBlockedEvent.getTxKey(); - MessageListener txListener = this.messageListeners.get(txKey); - if (txListener != null) { - txListener.received(txBlockedEvent); - this.messageListeners.remove(txKey); - } - } - - private void dealExtendMessage(final String messageKey, final byte[] message) { - MessageListener txListener = this.messageListeners.get(messageKey); - if (txListener != null) { - txListener.received(message); - this.messageListeners.remove(messageKey); - } - } - - private class MessageListener { - - final String messageKey; - - final CompletableAsyncFuture future; - - final AtomicBoolean isDeal = new AtomicBoolean(false); - - public MessageListener(String messageKey, CompletableAsyncFuture future) { - this.messageKey = messageKey; - this.future = future; - addListener(); - } - - public void addListener() { - synchronized (messageListeners) { - messageListeners.put(messageKey, this); - } - } - - public void received(final TxBlockedEvent txBlockedEvent) { - // 期望是false,假设是false则设置为true,成功的情况下表示是第一次 - byte[] txResp = txBlockedEvent.txResponseBytes(); - if (txResp != null) { - if (isDeal.compareAndSet(false, true)) { - //生成对应的交易应答 - future.complete(txResp); - } - } - } - - public void received(final byte[] message) { - // 期望是false,假设是false则设置为true,成功的情况下表示是第一次 - if (message != null) { - if (isDeal.compareAndSet(false, true)) { - //生成对应的交易应答 - future.complete(message); - } - } - } - } - - public class BlockEventHandler implements EventHandler> { - - @Override - public void onEvent(EventEntity event, long sequence, boolean endOfBatch) throws Exception { - byte[] txBlockedEventBytes = event.getEntity(); - if (txBlockedEventBytes != null && txBlockedEventBytes.length > 0) { - txBlockedEventHandle(txBlockedEventBytes); - } - } - } - - public class ExtendEventHandler implements EventHandler> { - - @Override - public void onEvent(EventEntity event, long sequence, boolean endOfBatch) throws Exception { - byte[] msgBytes = event.getEntity(); - if (msgBytes != null && msgBytes.length > 0) { - extendMessageHandle(msgBytes); - } - } - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MessageTransmitter.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MessageTransmitter.java deleted file mode 100644 index 73c574e0..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MessageTransmitter.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.client.MessageTransmitter - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:21 - * Description: - */ -package com.jd.blockchain.consensus.mq.client; - - -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public interface MessageTransmitter { - - void connect() throws Exception; - - void publishMessage(MsgQueueProducer producer, byte[] message) throws Exception; - -// void processMsg(byte[] message); - - void close(); -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueClientFactory.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueClientFactory.java deleted file mode 100644 index 227a0d78..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueClientFactory.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.client.MsgQueueClientFactory - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:23 - * Description: - */ -package com.jd.blockchain.consensus.mq.client; - -import com.jd.blockchain.consensus.ClientIncomingSettings; -import com.jd.blockchain.consensus.ConsensusManageService; -import com.jd.blockchain.consensus.client.ClientFactory; -import com.jd.blockchain.consensus.client.ClientSettings; -import com.jd.blockchain.consensus.mq.config.MsgQueueClientConfig; -import com.jd.blockchain.consensus.mq.settings.MsgQueueClientIncomingSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueClientSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; -import com.jd.blockchain.crypto.AsymmetricKeypair; -import com.jd.blockchain.crypto.Crypto; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.crypto.SignatureDigest; -import com.jd.blockchain.crypto.SignatureFunction; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueClientFactory implements ClientFactory { - - @Override - public MsgQueueClientIdentification buildAuthId(AsymmetricKeypair clientKeyPair) { - PubKey pubKey = clientKeyPair.getPubKey(); - byte[] address = pubKey.toBytes(); // 使用公钥地址作为认证信息 - - SignatureFunction signatureFunction = Crypto.getSignatureFunction(pubKey.getAlgorithm()); - SignatureDigest signatureDigest = signatureFunction.sign(clientKeyPair.getPrivKey(), address); - - MsgQueueClientIdentification mqci = new MsgQueueClientIdentification() - .setPubKey(clientKeyPair.getPubKey()) - .setIdentityInfo(address) - .setSignature(signatureDigest) - ; - return mqci; - } - - @Override - public MsgQueueClientSettings buildClientSettings(ClientIncomingSettings incomingSettings) { - - MsgQueueClientIncomingSettings mqcic = (MsgQueueClientIncomingSettings)incomingSettings; - if (mqcic != null) { - return buildClientSettings(mqcic.getClientId(), mqcic.getPubKey(), (MsgQueueConsensusSettings)(mqcic.getConsensusSettings())); - } - throw new IllegalArgumentException("ClientIncomingSettings data isn't supported! Accept MsgQueueClientIncomingSettings only!"); - } - - private MsgQueueClientSettings buildClientSettings(int clientId, PubKey pubKey, MsgQueueConsensusSettings mqcs) { - - MsgQueueClientSettings msgQueueClientConfig = new MsgQueueClientConfig() - .setId(clientId) - .setPubKey(pubKey) - .setConsensusSettings(mqcs) - ; - return msgQueueClientConfig; - } - - @Override - public ConsensusManageService createManageServiceClient(String[] serviceNodes) { - // todo serviceNodes // IP:port - return null; - } - - @Override - public MsgQueueConsensusClient setupClient(ClientSettings settings) { - if (settings instanceof MsgQueueClientSettings) { - return setupClient((MsgQueueClientSettings)settings); - } - throw new IllegalArgumentException("ClientSettings data isn't supported! Accept MsgQueueClientSettings only!"); - } - - private MsgQueueConsensusClient setupClient(MsgQueueClientSettings settings) { - MsgQueueConsensusClient mqcc = new MsgQueueConsensusClient() - .setClientSettings(settings) - .setMsgQueueNetworkSettings(settings.getMsgQueueNetworkSettings()) - ; - mqcc.init(); - return mqcc; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueClientIdentification.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueClientIdentification.java deleted file mode 100644 index 7dca555f..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueClientIdentification.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.client.MsgQueueClientIdentification - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 下午2:04 - * Description: - */ -package com.jd.blockchain.consensus.mq.client; - -import com.jd.blockchain.consensus.ClientIdentification; -import com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.crypto.SignatureDigest; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueClientIdentification implements ClientIdentification { - - private byte[] identityInfo; - - private PubKey pubKey; - - private SignatureDigest signature; - - public MsgQueueClientIdentification() { - } - - public MsgQueueClientIdentification(ClientIdentification clientIdentification) { - identityInfo = clientIdentification.getIdentityInfo(); - pubKey = clientIdentification.getPubKey(); - signature = clientIdentification.getSignature(); - } - - public MsgQueueClientIdentification setIdentityInfo(byte[] identityInfo) { - this.identityInfo = identityInfo; - return this; - } - - public MsgQueueClientIdentification setPubKey(PubKey pubKey) { - this.pubKey = pubKey; - return this; - } - - public MsgQueueClientIdentification setSignature(SignatureDigest signature) { - this.signature = signature; - return this; - } - - @Override - public byte[] getIdentityInfo() { - return this.identityInfo; - } - - @Override - public PubKey getPubKey() { - return this.pubKey; - } - - @Override - public SignatureDigest getSignature() { - return this.signature; - } - - @Override - public String getProviderName() { - return MsgQueueConsensusProvider.NAME; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueConsensusClient.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueConsensusClient.java deleted file mode 100644 index 6432dcb3..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/client/MsgQueueConsensusClient.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.client.MsgQueueConsensusClient - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 下午3:23 - * Description: - */ -package com.jd.blockchain.consensus.mq.client; - -import com.jd.blockchain.consensus.MessageService; -import com.jd.blockchain.consensus.client.ClientSettings; -import com.jd.blockchain.consensus.client.ConsensusClient; -import com.jd.blockchain.consensus.mq.consumer.MsgQueueConsumer; -import com.jd.blockchain.consensus.mq.factory.MsgQueueFactory; -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; -import com.jd.blockchain.consensus.mq.settings.MsgQueueClientSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueNetworkSettings; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueConsensusClient implements ConsensusClient { - - private boolean isConnected; - - private DefaultMessageTransmitter transmitter; - - private MsgQueueNetworkSettings msgQueueNetworkSettings; - - private MsgQueueClientSettings clientSettings; - - public MsgQueueConsensusClient setClientSettings(MsgQueueClientSettings clientSettings) { - this.clientSettings = clientSettings; - return this; - } - - public MsgQueueConsensusClient setMsgQueueNetworkSettings(MsgQueueNetworkSettings msgQueueNetworkSettings) { - this.msgQueueNetworkSettings = msgQueueNetworkSettings; - return this; - } - - public void init() { - String server = msgQueueNetworkSettings.getServer(); - String txTopic = msgQueueNetworkSettings.getTxTopic(); - String blTopic = msgQueueNetworkSettings.getBlTopic(); - String msgTopic = msgQueueNetworkSettings.getMsgTopic(); - - MsgQueueProducer txProducer = MsgQueueFactory.newProducer(server, txTopic); - MsgQueueProducer msgProducer = MsgQueueFactory.newProducer(server, msgTopic); - MsgQueueConsumer blConsumer = MsgQueueFactory.newConsumer(server, blTopic); - MsgQueueConsumer msgConsumer = MsgQueueFactory.newConsumer(server, msgTopic); - - transmitter = new DefaultMessageTransmitter() - .setTxProducer(txProducer) - .setMsgProducer(msgProducer) - .setBlConsumer(blConsumer) - .setMsgConsumer(msgConsumer) - ; - } - - @Override - public MessageService getMessageService() { - return transmitter; - } - - @Override - public ClientSettings getSettings() { - return clientSettings; - } - - @Override - public boolean isConnected() { - return isConnected; - } - - @Override - public synchronized void connect() { - if (!isConnected) { - try { - this.transmitter.connect(); - isConnected = true; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - @Override - public synchronized void close() { - if (isConnected) { - transmitter.close(); - isConnected = false; - } - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueBlockConfig.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueBlockConfig.java deleted file mode 100644 index 7a8a7560..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueBlockConfig.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.config.MsgQueueBlockConfig - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 下午2:57 - * Description: - */ -package com.jd.blockchain.consensus.mq.config; - -import com.jd.blockchain.consensus.mq.settings.MsgQueueBlockSettings; - -import java.lang.reflect.Method; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ - -public class MsgQueueBlockConfig implements MsgQueueBlockSettings { - - private int txSizePerBlock; - - private long maxDelayMilliSecondsPerBlock; - - @Override - public int getTxSizePerBlock() { - return txSizePerBlock; - } - - public MsgQueueBlockConfig setTxSizePerBlock(int txSizePerBlock) { - this.txSizePerBlock = txSizePerBlock; - return this; - } - - @Override - public long getMaxDelayMilliSecondsPerBlock() { - return maxDelayMilliSecondsPerBlock; - } - - public MsgQueueBlockConfig setMaxDelayMilliSecondsPerBlock(long maxDelayMilliSecondsPerBlock) { - this.maxDelayMilliSecondsPerBlock = maxDelayMilliSecondsPerBlock; - return this; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueClientConfig.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueClientConfig.java deleted file mode 100644 index 78f9f7c3..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueClientConfig.java +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.config.MsgQueueClientConfig - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 下午2:23 - * Description: - */ -package com.jd.blockchain.consensus.mq.config; - -import com.jd.blockchain.consensus.mq.settings.MsgQueueClientSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueNetworkSettings; -import com.jd.blockchain.crypto.PubKey; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueClientConfig implements MsgQueueClientSettings { - - private int id; - - private PubKey pubKey; - - private MsgQueueConsensusSettings consensusSettings; - - public MsgQueueClientConfig setId(int id) { - this.id = id; - return this; - } - - public MsgQueueClientConfig setPubKey(PubKey pubKey) { - this.pubKey = pubKey; - return this; - } - - public MsgQueueClientConfig setConsensusSettings(MsgQueueConsensusSettings consensusSettings) { - this.consensusSettings = consensusSettings; - return this; - } - - @Override - public int getClientId() { - return this.id; - } - - @Override - public PubKey getClientPubKey() { - return this.pubKey; - } - - @Override - public MsgQueueConsensusSettings getConsensusSettings() { - return this.consensusSettings; - } - - @Override - public MsgQueueNetworkSettings getMsgQueueNetworkSettings() { - return this.consensusSettings.getNetworkSettings(); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueClientIncomingConfig.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueClientIncomingConfig.java deleted file mode 100644 index 967c03de..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueClientIncomingConfig.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.config.MsgQueueClientIncomingConfig - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:50 - * Description: - */ -package com.jd.blockchain.consensus.mq.config; - -import com.jd.blockchain.consensus.ClientIncomingSettings; -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider; -import com.jd.blockchain.consensus.mq.settings.MsgQueueClientIncomingSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; -import com.jd.blockchain.crypto.PubKey; - -import java.lang.reflect.Method; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueClientIncomingConfig implements MsgQueueClientIncomingSettings { - - private int clientId; - - private PubKey pubKey; - - private MsgQueueConsensusSettings consensusSettings; - - public MsgQueueClientIncomingConfig setConsensusSettings(MsgQueueConsensusSettings consensusSettings) { - this.consensusSettings = consensusSettings; - return this; - } - - public MsgQueueClientIncomingConfig setClientId(int clientId) { - this.clientId = clientId; - return this; - } - - public MsgQueueClientIncomingConfig setPubKey(PubKey pubKey) { - this.pubKey = pubKey; - return this; - } - - @Override - public int getClientId() { - return this.clientId; - } - - @Override - public String getProviderName() { - return MsgQueueConsensusProvider.NAME; - } - - @Override - public MsgQueueConsensusSettings getConsensusSettings() { - return this.consensusSettings; - } - - @Override - public PubKey getPubKey() { - return pubKey; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueConsensusConfig.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueConsensusConfig.java deleted file mode 100644 index 9ece2285..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueConsensusConfig.java +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.config.MsgQueueConsensusConfig - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:26 - * Description: - */ -package com.jd.blockchain.consensus.mq.config; - -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.consensus.mq.settings.*; -import com.jd.blockchain.crypto.PubKey; - -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.ArrayList; -import java.util.List; - -/** - * 设置消息队列的信息 - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueConsensusConfig implements MsgQueueConsensusSettings { - - private List nodeSettingsList = new ArrayList<>(); - - private MsgQueueNetworkSettings networkSettings; - - private MsgQueueBlockSettings blockSettings; - - public MsgQueueConsensusConfig addNodeSettings(MsgQueueNodeSettings nodeSettings) { - nodeSettingsList.add(nodeSettings); - return this; - } - - public MsgQueueConsensusConfig setNetworkSettings(MsgQueueNetworkSettings networkSettings) { - this.networkSettings = networkSettings; - return this; - } - - public MsgQueueConsensusConfig setBlockSettings(MsgQueueBlockSettings blockSettings) { - this.blockSettings = blockSettings; - return this; - } - - @Override - public NodeSettings[] getNodes() { - return nodeSettingsList.toArray(new NodeSettings[nodeSettingsList.size()]); - } - - @Override - public MsgQueueNetworkSettings getNetworkSettings() { - return networkSettings; - } - - @Override - public MsgQueueBlockSettings getBlockSettings() { - return blockSettings; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueNetworkConfig.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueNetworkConfig.java deleted file mode 100644 index d73c6b65..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueNetworkConfig.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.config.MsgQueueNetworkConfig - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 下午4:55 - * Description: - */ -package com.jd.blockchain.consensus.mq.config; - -import com.jd.blockchain.consensus.mq.settings.MsgQueueNetworkSettings; - -import java.lang.reflect.Method; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueNetworkConfig implements MsgQueueNetworkSettings { - - private String server; - - private String txTopic; - - private String blTopic; - - private String msgTopic; - - public MsgQueueNetworkConfig setServer(String server) { - this.server = server; - return this; - } - - public MsgQueueNetworkConfig setTxTopic(String txTopic) { - this.txTopic = txTopic; - return this; - } - - public MsgQueueNetworkConfig setBlTopic(String blTopic) { - this.blTopic = blTopic; - return this; - } - - public MsgQueueNetworkConfig setMsgTopic(String msgTopic) { - this.msgTopic = msgTopic; - return this; - } - - @Override - public String getServer() { - return server; - } - - @Override - public String getTxTopic() { - return txTopic; - } - - @Override - public String getBlTopic() { - return blTopic; - } - - @Override - public String getMsgTopic() { - return msgTopic; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueNodeConfig.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueNodeConfig.java deleted file mode 100644 index 9e9506ed..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueNodeConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.config.MsgQueueNodeConfig - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:33 - * Description: - */ -package com.jd.blockchain.consensus.mq.config; - -import com.jd.blockchain.consensus.mq.settings.MsgQueueNodeSettings; -import com.jd.blockchain.crypto.PubKey; - -/** - * peer节点IP - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueNodeConfig implements MsgQueueNodeSettings { - - private String address; - - private PubKey pubKey; - - public MsgQueueNodeConfig setAddress(String address) { - this.address = address; - return this; - } - - public MsgQueueNodeConfig setPubKey(PubKey pubKey) { - this.pubKey = pubKey; - return this; - } - - @Override - public String getAddress() { - return this.address; - } - - @Override - public PubKey getPubKey() { - return this.pubKey; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueServerConfig.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueServerConfig.java deleted file mode 100644 index 7b7a79b9..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueServerConfig.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.config.MsgQueueServerConfig - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:32 - * Description: - */ -package com.jd.blockchain.consensus.mq.config; - -import com.jd.blockchain.consensus.mq.settings.MsgQueueBlockSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueNodeSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueServerSettings; - -/** - * peer节点配置 - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueServerConfig implements MsgQueueServerSettings { - - private MsgQueueBlockSettings blockSettings; - - private MsgQueueConsensusSettings consensusSettings; - - private MsgQueueNodeSettings nodeSettings; - - private String realmName; - - public MsgQueueServerConfig setRealmName(String realmName) { - this.realmName = realmName; - return this; - } - - public MsgQueueServerConfig setBlockSettings(MsgQueueBlockSettings blockSettings) { - this.blockSettings = blockSettings; - return this; - } - - public MsgQueueServerConfig setConsensusSettings(MsgQueueConsensusSettings consensusSettings) { - this.consensusSettings = consensusSettings; - return setBlockSettings(consensusSettings.getBlockSettings()); - } - - public MsgQueueServerConfig setNodeSettings(MsgQueueNodeSettings nodeSettings) { - this.nodeSettings = nodeSettings; - return this; - } - - @Override - public String getRealmName() { - return this.realmName; - } - - @Override - public MsgQueueNodeSettings getReplicaSettings() { - return nodeSettings; - } - - @Override - public MsgQueueBlockSettings getBlockSettings() { - return blockSettings; - } - - @Override - public MsgQueueConsensusSettings getConsensusSettings() { - return consensusSettings; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueSettingsFactory.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueSettingsFactory.java deleted file mode 100644 index 61449436..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/config/MsgQueueSettingsFactory.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.config.MsgQueueSettingsFactory - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:49 - * Description: - */ -package com.jd.blockchain.consensus.mq.config; - -import com.jd.blockchain.binaryproto.BinaryProtocol; -import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.consensus.ClientIncomingSettings; -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.consensus.SettingsFactory; -import com.jd.blockchain.consensus.mq.MsgQueueConsensusSettingsBuilder; -import com.jd.blockchain.consensus.mq.settings.MsgQueueBlockSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueClientIncomingSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueNetworkSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueNodeSettings; -import com.jd.blockchain.utils.io.BytesEncoder; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueSettingsFactory implements SettingsFactory { - - static { - DataContractRegistry.register(NodeSettings.class); - - DataContractRegistry.register(MsgQueueNodeSettings.class); - - DataContractRegistry.register(ConsensusSettings.class); - - DataContractRegistry.register(MsgQueueConsensusSettings.class); - - DataContractRegistry.register(MsgQueueNetworkSettings.class); - - DataContractRegistry.register(MsgQueueBlockSettings.class); - - DataContractRegistry.register(MsgQueueClientIncomingSettings.class); - - DataContractRegistry.register(ClientIncomingSettings.class); - } - - private static final MsgQueueConsensusSettingsEncoder MQCS_ENCODER = new MsgQueueConsensusSettingsEncoder(); - - private static final MsgQueueClientIncomingSettingsEncoder MQCIS_ENCODER = new MsgQueueClientIncomingSettingsEncoder(); - - private static final MsgQueueConsensusSettingsBuilder BUILDER = new MsgQueueConsensusSettingsBuilder(); - - @Override - public MsgQueueConsensusSettingsBuilder getConsensusSettingsBuilder() { - return BUILDER; - } - - @Override - public BytesEncoder getConsensusSettingsEncoder() { - return MQCS_ENCODER; - } - - @Override - public BytesEncoder getIncomingSettingsEncoder() { - return MQCIS_ENCODER; - } - - private static class MsgQueueConsensusSettingsEncoder implements BytesEncoder{ - - @Override - public byte[] encode(ConsensusSettings data) { - if (data instanceof MsgQueueConsensusSettings) { - return BinaryProtocol.encode(data, MsgQueueConsensusSettings.class); - } - throw new IllegalArgumentException("Settings data isn't supported! Accept MsgQueueConsensusSettings only!"); - } - - @Override - public MsgQueueConsensusSettings decode(byte[] bytes) { - return BinaryProtocol.decodeAs(bytes, MsgQueueConsensusSettings.class); - } - } - - private static class MsgQueueClientIncomingSettingsEncoder implements BytesEncoder{ - - @Override - public byte[] encode(ClientIncomingSettings data) { - if (data instanceof MsgQueueClientIncomingSettings) { - return BinaryProtocol.encode(data, MsgQueueClientIncomingSettings.class); - } - throw new IllegalArgumentException("Settings data isn't supported! Accept MsgQueueClientIncomingSettings only!"); - } - - @Override - public MsgQueueClientIncomingSettings decode(byte[] bytes) { - return BinaryProtocol.decodeAs(bytes, MsgQueueClientIncomingSettings.class); - } - - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/AbstractConsumer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/AbstractConsumer.java deleted file mode 100644 index 9c39d8e9..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/AbstractConsumer.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.consumer.AbstractConsumer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/29 下午12:31 - * Description: - */ -package com.jd.blockchain.consensus.mq.consumer; - -import com.jd.blockchain.consensus.event.EventEntity; -import com.jd.blockchain.consensus.event.EventProducer; -import com.jd.blockchain.consensus.mq.exchange.BytesEventFactory; -import com.jd.blockchain.consensus.mq.exchange.BytesEventProducer; -import com.lmax.disruptor.BlockingWaitStrategy; -import com.lmax.disruptor.EventHandler; -import com.lmax.disruptor.RingBuffer; -import com.lmax.disruptor.dsl.Disruptor; -import com.lmax.disruptor.dsl.ProducerType; - -/** - * - * @author shaozhuguang - * @create 2018/12/29 - * @since 1.0.0 - */ - -public abstract class AbstractConsumer implements MsgQueueConsumer { - - protected EventProducer eventProducer; - - protected void initEventHandler(EventHandler eventHandler) { - Disruptor> disruptor = - new Disruptor<>(new BytesEventFactory(), - BytesEventFactory.BUFFER_SIZE, r -> { - return new Thread(r); - }, ProducerType.SINGLE, new BlockingWaitStrategy()); - - disruptor.handleEventsWith(eventHandler); - disruptor.start(); - RingBuffer> ringBuffer = disruptor.getRingBuffer(); - this.eventProducer = new BytesEventProducer(ringBuffer); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/MsgQueueConsumer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/MsgQueueConsumer.java deleted file mode 100644 index 43908abb..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/MsgQueueConsumer.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: MsgQueueConsumer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午10:38 - * Description: - */ -package com.jd.blockchain.consensus.mq.consumer; - -import com.lmax.disruptor.EventHandler; - -import java.io.Closeable; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public interface MsgQueueConsumer extends Closeable { - - void connect(EventHandler eventHandler) throws Exception; - - void start() throws Exception; -} - diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/NatsConsumer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/NatsConsumer.java deleted file mode 100644 index 0df9c6dd..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/NatsConsumer.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.sdk.nats.RabbitConsumer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午10:40 - * Description: - */ -package com.jd.blockchain.consensus.mq.consumer; - -import com.jd.blockchain.utils.ConsoleUtils; -import com.lmax.disruptor.EventHandler; -import io.nats.client.*; - -import java.io.IOException; -import java.time.Duration; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class NatsConsumer extends AbstractConsumer implements MsgQueueConsumer { - - private final ExecutorService msgListener = Executors.newSingleThreadExecutor(); - - private Connection nc; - - private Subscription sub; - - private String server; - - private String topic; - - public NatsConsumer(String server, String topic) { - this.server = server; - this.topic = topic; - } - - @Override - public void connect(EventHandler eventHandler) throws Exception { - initEventHandler(eventHandler); - Options options = new Options.Builder().server(server).noReconnect().build(); - this.nc = Nats.connect(options); - this.sub = nc.subscribe(topic); - this.nc.flush(Duration.ZERO); - ConsoleUtils.info("[*] NatsConsumer[%s, %s] connect success !!!", this.server, this.topic); - } - - @Override - public void start() { - msgListener.execute(() -> { - for (;;) { - try { - Message msg = this.sub.nextMessage(Duration.ZERO); - eventProducer.publish(msg.getData()); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - - @Override - public void close() throws IOException { - try { - nc.close(); - } catch (Exception e) { - throw new IOException(e); - } - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/RabbitConsumer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/RabbitConsumer.java deleted file mode 100644 index 5076537a..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/consumer/RabbitConsumer.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.sdk.nats.RabbitConsumer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午10:40 - * Description: - */ -package com.jd.blockchain.consensus.mq.consumer; - -import com.jd.blockchain.consensus.mq.factory.RabbitFactory; -import com.jd.blockchain.utils.ConsoleUtils; -import com.lmax.disruptor.EventHandler; -import com.rabbitmq.client.*; - -import java.io.IOException; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class RabbitConsumer extends AbstractConsumer implements MsgQueueConsumer { - - private Connection connection; - - private Channel channel; - - private String exchangeName; - - private String server; - - private String queueName; - - public RabbitConsumer(String server, String topic) { - this.server = server; - this.exchangeName = topic; - } - - private void rabbitConsumerHandle() throws Exception { - rabbitConsumerHandleByQueue(); - } - - private void rabbitConsumerHandleByQueue() throws IOException { - DefaultConsumer consumer = new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, - AMQP.BasicProperties properties, byte[] body) { - // 此处将收到的消息加入队列即可 - try { - eventProducer.publish(body); - channel.basicAck(envelope.getDeliveryTag(), false); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - }; - this.channel.basicConsume(this.queueName, false, consumer); - } - - @Override - public void connect(EventHandler eventHandler) throws Exception { - initEventHandler(eventHandler); - ConnectionFactory factory = RabbitFactory.initConnectionFactory(server); - connection = factory.newConnection(); - channel = connection.createChannel(); - - channel.exchangeDeclare(this.exchangeName, "fanout"); - queueName = channel.queueDeclare().getQueue(); - channel.queueBind(queueName, this.exchangeName, ""); - channel.basicQos(8); - - ConsoleUtils.info("[*] RabbitConsumer[%s, %s] connect success !!!", this.server, this.exchangeName); - } - - @Override - public void start() throws Exception { - rabbitConsumerHandle(); - } - - @Override - public void close() throws IOException { - try { - this.channel.close(); - this.connection.close(); - } catch (Exception e) { - throw new IOException(e); - } - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/BlockEvent.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/BlockEvent.java deleted file mode 100644 index 03b92113..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/BlockEvent.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: BlockEvent - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/20 上午11:32 - * Description: - */ -package com.jd.blockchain.consensus.mq.event; - -import com.jd.blockchain.consensus.mq.util.MessageConvertUtil; - -import java.util.HashMap; -import java.util.Map; - -/** - * - * @author shaozhuguang - * @create 2018/11/20 - * @since 1.0.0 - */ - -public class BlockEvent { - - private Map txMap = new HashMap<>(); - - public Map getTxMap() { - return txMap; - } - - public void setTxMap(Map txMap) { - this.txMap = txMap; - } - - public void put(String txKey, String txResp) { - txMap.put(txKey, txResp); - } - - public void put(String txKey, byte[] txResp) { - put(txKey, MessageConvertUtil.base64Encode(txResp)); - } - - public String getTxResp(String txKey) { - return txMap.get(txKey); - } - - public byte[] getTxRespBytes(String txKey) { - String txResp = getTxResp(txKey); - if (txResp != null && txResp.length() > 0) { - // 字符串转字节数组 - return MessageConvertUtil.base64Decode(txResp); - } - return null; - } - - public boolean containTxResp(String txKey) { - return txMap.containsKey(txKey); - } - - public boolean isEmpty() { - if (txMap == null) return true; - return txMap.isEmpty(); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/MessageEvent.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/MessageEvent.java deleted file mode 100644 index 94710a43..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/MessageEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.peer.consensus.MessageEvent - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/23 上午11:45 - * Description: - */ -package com.jd.blockchain.consensus.mq.event; - -/** - * - * @author shaozhuguang - * @create 2018/11/23 - * @since 1.0.0 - */ - -public class MessageEvent { - - String messageKey; - - byte[] message; - - public MessageEvent(String messageKey, byte[] message) { - this.messageKey = messageKey; - this.message = message; - } - - public String getMessageKey() { - return messageKey; - } - - public void setMessageKey(String messageKey) { - this.messageKey = messageKey; - } - - public byte[] getMessage() { - return message; - } - - public void setMessage(byte[] message) { - this.message = message; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/TxBlockedEvent.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/TxBlockedEvent.java deleted file mode 100644 index 5c0515d6..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/event/TxBlockedEvent.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: BlockEvent - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/20 上午11:32 - * Description: - */ -package com.jd.blockchain.consensus.mq.event; - - -import com.jd.blockchain.consensus.mq.util.MessageConvertUtil; - -/** - * - * @author shaozhuguang - * @create 2018/11/20 - * @since 1.0.0 - */ - -public class TxBlockedEvent { - - private String txKey; - - private String transaction; - - public TxBlockedEvent() { - } - - public TxBlockedEvent(String txKey, String transaction) { - this.txKey = txKey; - this.transaction = transaction; - } - - public void setTxKey(String txKey) { - this.txKey = txKey; - } - - public void setTransaction(String transaction) { - this.transaction = transaction; - } - - public String getTxKey() { - return txKey; - } - - public String getTransaction() { - return transaction; - } - - public byte[] txResponseBytes() { - if (transaction != null && transaction.length() > 0) { - // 字符串转字节数组 - return MessageConvertUtil.base64Decode(transaction); - } - return null; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/BytesEventFactory.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/BytesEventFactory.java deleted file mode 100644 index 557c2649..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/BytesEventFactory.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.rabbitmq.nats.consensus.disruptor.ExchangeEventFactory - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 上午10:48 - * Description: - */ -package com.jd.blockchain.consensus.mq.exchange; - -import com.jd.blockchain.consensus.event.EventEntity; -import com.lmax.disruptor.EventFactory; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class BytesEventFactory implements EventFactory> { - - public static final int BUFFER_SIZE = 256 * 1024; -// public static final int BUFFER_SIZE = 8 * 1024; - - @Override - public EventEntity newInstance() { - return new EventEntity<>(); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/BytesEventProducer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/BytesEventProducer.java deleted file mode 100644 index 0421e425..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/BytesEventProducer.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.rabbitmq.nats.consensus.disruptor.ExchangeEventProducer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 上午10:50 - * Description: - */ -package com.jd.blockchain.consensus.mq.exchange; - -import com.jd.blockchain.consensus.event.EventEntity; -import com.jd.blockchain.consensus.event.EventProducer; -import com.lmax.disruptor.RingBuffer; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class BytesEventProducer implements EventProducer { - - private final RingBuffer> ringBuffer; - - public BytesEventProducer(RingBuffer> ringBuffer) { - this.ringBuffer = ringBuffer; - } - - @Override - public void publish(byte[] entity) { - long sequence = ringBuffer.next(); - try { - EventEntity event = ringBuffer.get(sequence); - event.setEntity(entity); - } finally { - this.ringBuffer.publish(sequence); - } - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEntityFactory.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEntityFactory.java deleted file mode 100644 index 39c7494a..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEntityFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.sdk.ExchangeEntityFactory - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午4:08 - * Description: - */ -package com.jd.blockchain.consensus.mq.exchange; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class ExchangeEntityFactory { - - public static ExchangeEventInnerEntity newBlockInstance() { - return new ExchangeEventInnerEntity(ExchangeType.BLOCK); - } - - public static ExchangeEventInnerEntity newEmptyInstance() { - return new ExchangeEventInnerEntity(ExchangeType.EMPTY); - } - - public static ExchangeEventInnerEntity newTransactionInstance(byte[] content) { - return new ExchangeEventInnerEntity(ExchangeType.TRANSACTION, content); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventFactory.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventFactory.java deleted file mode 100644 index 6d16b8c7..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventFactory.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.rabbitmq.nats.consensus.disruptor.ExchangeEventFactory - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 上午10:48 - * Description: - */ -package com.jd.blockchain.consensus.mq.exchange; - -import com.jd.blockchain.consensus.event.EventEntity; -import com.lmax.disruptor.EventFactory; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class ExchangeEventFactory implements EventFactory> { - - public static final int BUFFER_SIZE = 256 * 1024; -// public static final int BUFFER_SIZE = 8 * 1024; - - @Override - public EventEntity newInstance() { - return new EventEntity<>(); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventInnerEntity.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventInnerEntity.java deleted file mode 100644 index 752c1414..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventInnerEntity.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.sdk.ExchangeEventInnerEntity - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午4:04 - * Description: - */ -package com.jd.blockchain.consensus.mq.exchange; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class ExchangeEventInnerEntity { - - private ExchangeType type; - - private byte[] content; - - public ExchangeEventInnerEntity() { - } - - public ExchangeEventInnerEntity(ExchangeType type) { - this.type = type; - } - - public ExchangeEventInnerEntity(ExchangeType type, byte[] content) { - this.type = type; - this.content = content; - } - - - - public ExchangeType getType() { - return type; - } - - public void setType(ExchangeType type) { - this.type = type; - } - - public byte[] getContent() { - return content; - } - - public void setContent(byte[] content) { - this.content = content; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventProducer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventProducer.java deleted file mode 100644 index 942fe167..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeEventProducer.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.rabbitmq.nats.consensus.disruptor.ExchangeEventProducer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 上午10:50 - * Description: - */ -package com.jd.blockchain.consensus.mq.exchange; - -import com.jd.blockchain.consensus.event.EventEntity; -import com.jd.blockchain.consensus.event.EventProducer; -import com.lmax.disruptor.RingBuffer; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class ExchangeEventProducer implements EventProducer { - - private final RingBuffer> ringBuffer; - - public ExchangeEventProducer(RingBuffer> ringBuffer) { - this.ringBuffer = ringBuffer; - } - - @Override - public void publish(ExchangeEventInnerEntity entity) { - long sequence = ringBuffer.next(); - try { - EventEntity event = ringBuffer.get(sequence); - event.setEntity(entity); - } finally { - this.ringBuffer.publish(sequence); - } - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeType.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeType.java deleted file mode 100644 index 1920d89e..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/exchange/ExchangeType.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.sdk.nats.ExchangeType - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午3:34 - * Description: - */ -package com.jd.blockchain.consensus.mq.exchange; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public enum ExchangeType { - BLOCK, - EMPTY, - TRANSACTION, - ; -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/MsgQueueConfig.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/MsgQueueConfig.java deleted file mode 100644 index 1d4419a7..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/MsgQueueConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.factory.MsgQueueConfig - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 下午5:16 - * Description: - */ -package com.jd.blockchain.consensus.mq.factory; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public final class MsgQueueConfig { - - public static final String NATS_PREFIX = "nats"; - - public static final String RABBIT_PREFIX = "rabbit"; -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/MsgQueueFactory.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/MsgQueueFactory.java deleted file mode 100644 index db2b0c1a..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/MsgQueueFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: MsgQueueFactory - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午10:13 - * Description: - */ -package com.jd.blockchain.consensus.mq.factory; - - -import com.jd.blockchain.consensus.mq.consumer.MsgQueueConsumer; -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; - -import static com.jd.blockchain.consensus.mq.factory.MsgQueueConfig.NATS_PREFIX; -import static com.jd.blockchain.consensus.mq.factory.MsgQueueConfig.RABBIT_PREFIX; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class MsgQueueFactory { - - public static MsgQueueProducer newProducer(String server, String topic) { - try { - if (server.startsWith(NATS_PREFIX)) { - return NatsFactory.newProducer(server, topic); - } else if (server.startsWith(RABBIT_PREFIX)) { - return RabbitFactory.newProducer(server, topic); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - return null; - } - - public static MsgQueueConsumer newConsumer(String server, String topic) { - try { - if (server.startsWith(NATS_PREFIX)) { - return NatsFactory.newConsumer(server, topic); - } else if (server.startsWith(RABBIT_PREFIX)) { - return RabbitFactory.newConsumer(server, topic); - } - return null; - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/NatsFactory.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/NatsFactory.java deleted file mode 100644 index c5a4d8f0..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/NatsFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: NatsFactory - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午10:15 - * Description: - */ -package com.jd.blockchain.consensus.mq.factory; - -import com.jd.blockchain.consensus.mq.consumer.MsgQueueConsumer; -import com.jd.blockchain.consensus.mq.consumer.NatsConsumer; -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; -import com.jd.blockchain.consensus.mq.producer.NatsProducer; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class NatsFactory { - - public static MsgQueueProducer newProducer(String server, String topic) throws Exception { - return new NatsProducer(server, topic); - } - - public static MsgQueueConsumer newConsumer(String server, String topic) throws Exception { - return new NatsConsumer(server, topic); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/RabbitFactory.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/RabbitFactory.java deleted file mode 100644 index b66cf3b6..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/factory/RabbitFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.sdk.nats.RabbitFactory - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午10:15 - * Description: - */ -package com.jd.blockchain.consensus.mq.factory; - -import com.jd.blockchain.consensus.mq.consumer.MsgQueueConsumer; -import com.jd.blockchain.consensus.mq.consumer.RabbitConsumer; -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; -import com.jd.blockchain.consensus.mq.producer.RabbitProducer; -import com.rabbitmq.client.ConnectionFactory; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class RabbitFactory { - - public static MsgQueueProducer newProducer(String server, String topic) throws Exception { - return new RabbitProducer(server, topic); - } - - public static MsgQueueConsumer newConsumer(String server, String topic) throws Exception { - return new RabbitConsumer(server, topic); - } - - public static ConnectionFactory initConnectionFactory(String server) { - ConnectionFactory factory = new ConnectionFactory(); - // 解析server,生成host+port,默认格式:rabbit://localhost:5672 - try { - String[] hostAndPort = server.split("//")[1].split(":"); - if (hostAndPort == null || hostAndPort.length == 0) { - factory.setHost("localhost"); - } else if (hostAndPort.length == 1) { - factory.setHost(hostAndPort[0]); - } else { - factory.setHost(hostAndPort[0]); - factory.setPort(Integer.parseInt(hostAndPort[1])); - } - } catch (Exception e) { - factory.setHost("localhost"); - } - return factory; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/MsgQueueProducer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/MsgQueueProducer.java deleted file mode 100644 index 91cee801..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/MsgQueueProducer.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: MsgQueueProducer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午10:37 - * Description: - */ -package com.jd.blockchain.consensus.mq.producer; - -import java.io.Closeable; -import java.util.List; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public interface MsgQueueProducer extends Closeable { - - void connect() throws Exception; - - void publish(byte[] message) throws Exception; - - void publishString(String message) throws Exception; - - void publishStringList(List messages) throws Exception; - - void publishStringArray(String[] messages) throws Exception; - - void publishBytesArray(byte[][] message) throws Exception; - - void publishBytesList(List messages) throws Exception; -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/NatsProducer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/NatsProducer.java deleted file mode 100644 index 2f3b2357..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/NatsProducer.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: NatsProducer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午10:39 - * Description: - */ -package com.jd.blockchain.consensus.mq.producer; - -import io.nats.client.Connection; -import io.nats.client.Nats; -import io.nats.client.Options; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.List; - -import com.jd.blockchain.utils.ConsoleUtils; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class NatsProducer implements MsgQueueProducer { - - // 主要操作:发送MQ请求 - private Connection nc; - - private String server; - - // 主题 - private String topic; - - public NatsProducer() { - - } - - public NatsProducer(String server, String topic) { - this.topic = topic; - this.server = server; - } - - @Override - public void connect() throws Exception{ - Options o = new Options.Builder().server(server).noReconnect().build(); - this.nc = Nats.connect(o); - ConsoleUtils.info("[*] NatsProducer[%s, %s] connect success !!!", this.server, this.topic); - } - - @Override - public void publish(byte[] message) { - nc.publish(topic, message); - } - - @Override - public void publishString(String message) { - publish(message.getBytes(StandardCharsets.UTF_8)); - } - - @Override - public void publishStringList(List messages) { - for (String message : messages) { - publishString(message); - } - } - - @Override - public void publishStringArray(String[] messages) { - for (String message : messages) { - publishString(message); - } - } - - @Override - public void publishBytesArray(byte[][] message) { - for (byte[] bytes : message) { - publish(bytes); - } - } - - @Override - public void publishBytesList(List messages) { - for (byte[] message : messages) { - publish(message); - } - } - - @Override - public void close() throws IOException { - try { - nc.close(); - } catch (Exception e) { - throw new IOException(e); - } - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/RabbitProducer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/RabbitProducer.java deleted file mode 100644 index fcd6979b..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/producer/RabbitProducer.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.sdk.nats.RabbitProducer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/5 下午10:39 - * Description: - */ -package com.jd.blockchain.consensus.mq.producer; - -import com.jd.blockchain.consensus.mq.factory.RabbitFactory; -import com.jd.blockchain.utils.ConsoleUtils; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.List; - -/** - * - * @author shaozhuguang - * @create 2018/11/5 - * @since 1.0.0 - */ - -public class RabbitProducer implements MsgQueueProducer { - - // 主要操作时发送JMQ请求 - private Channel channel; - - private Connection connection; - - private String exchangeName; - - private String server; - - public RabbitProducer() { - - } - - public RabbitProducer(String server, String topic) throws Exception { - this.exchangeName = topic; - this.server = server; - } - - @Override - public void connect() throws Exception { - ConnectionFactory factory = RabbitFactory.initConnectionFactory(server); - connection = factory.newConnection(); - channel = connection.createChannel(); - channel.exchangeDeclare(this.exchangeName, "fanout"); - ConsoleUtils.info("[*] RabbitProducer[%s, %s] connect success !!!", this.server, this.exchangeName); - } - - @Override - public void publish(byte[] message) throws Exception { - channel.basicPublish(this.exchangeName, "", null, message); - } - - @Override - public void publishString(String message) throws Exception { - publish(message.getBytes(StandardCharsets.UTF_8)); - } - - @Override - public void publishStringList(List messages) throws Exception { - for (String message : messages) { - publishString(message); - } - } - - @Override - public void publishStringArray(String[] messages) throws Exception { - for (String message : messages) { - publishString(message); - } - } - - @Override - public void publishBytesArray(byte[][] message) throws Exception { - for (byte[] bytes : message) { - publish(bytes); - } - } - - @Override - public void publishBytesList(List messages) throws Exception { - for (byte[] message : messages) { - publish(message); - } - } - - @Override - public void close() throws IOException { - try { - channel.close(); - connection.close(); - } catch (Exception e) { - throw new IOException(e); - } - } - - -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/DefaultMsgQueueMessageDispatcher.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/DefaultMsgQueueMessageDispatcher.java deleted file mode 100644 index 63af3844..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/DefaultMsgQueueMessageDispatcher.java +++ /dev/null @@ -1,297 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.server.DefaultMsgQueueMessageDispatcher - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 上午11:05 - * Description: - */ -package com.jd.blockchain.consensus.mq.server; - -import com.jd.blockchain.consensus.event.EventEntity; -import com.jd.blockchain.consensus.event.EventProducer; -import com.jd.blockchain.consensus.mq.consumer.MsgQueueConsumer; -import com.jd.blockchain.consensus.mq.exchange.ExchangeEntityFactory; -import com.jd.blockchain.consensus.mq.exchange.ExchangeEventFactory; -import com.jd.blockchain.consensus.mq.exchange.ExchangeEventInnerEntity; -import com.jd.blockchain.consensus.mq.exchange.ExchangeEventProducer; -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; -import com.lmax.disruptor.BlockingWaitStrategy; -import com.lmax.disruptor.EventHandler; -import com.lmax.disruptor.RingBuffer; -import com.lmax.disruptor.dsl.Disruptor; -import com.lmax.disruptor.dsl.ProducerType; - -import java.io.IOException; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicLong; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ - -public class DefaultMsgQueueMessageDispatcher implements MsgQueueMessageDispatcher, EventHandler> { - - private static final byte[] blockCommitBytes = new byte[]{0x00}; - - private final BlockingQueue dataQueue = new ArrayBlockingQueue<>(1024 * 16); - - private final ExecutorService dataExecutor = Executors.newSingleThreadExecutor(); - - private final ScheduledThreadPoolExecutor timeHandleExecutor = new ScheduledThreadPoolExecutor(2); - - private final AtomicLong blockIndex = new AtomicLong(); - - private long syncIndex = 0L; - - private MsgQueueProducer txProducer; - - private MsgQueueConsumer txConsumer; - - private EventProducer eventProducer; - - private EventHandler eventHandler; - - private final int TX_SIZE_PER_BLOCK; - - private final long MAX_DELAY_MILLISECONDS_PER_BLOCK; - - private boolean isRunning; - - private boolean isConnected; - - public DefaultMsgQueueMessageDispatcher(int txSizePerBlock, long maxDelayMilliSecondsPerBlock) { - this.TX_SIZE_PER_BLOCK = txSizePerBlock; - this.MAX_DELAY_MILLISECONDS_PER_BLOCK = maxDelayMilliSecondsPerBlock; - } - - public DefaultMsgQueueMessageDispatcher setTxProducer(MsgQueueProducer txProducer) { - this.txProducer = txProducer; - return this; - } - - public DefaultMsgQueueMessageDispatcher setTxConsumer(MsgQueueConsumer txConsumer) { - this.txConsumer = txConsumer; - return this; - } - - public DefaultMsgQueueMessageDispatcher setEventHandler(EventHandler eventHandler) { - this.eventHandler = eventHandler; - return this; - } - - public void init() { - handleDisruptor(eventHandler); - } - - private void handleDisruptor(EventHandler eventHandler) { - Disruptor> disruptor = - new Disruptor<>(new ExchangeEventFactory(), - ExchangeEventFactory.BUFFER_SIZE, r -> { - return new Thread(r); - }, ProducerType.SINGLE, new BlockingWaitStrategy()); - - disruptor.handleEventsWith(eventHandler); - disruptor.start(); - RingBuffer> ringBuffer = disruptor.getRingBuffer(); - - this.eventProducer = new ExchangeEventProducer(ringBuffer); - } - - public synchronized void connect() throws Exception { - if (!isConnected) { - txProducer.connect(); - txConsumer.connect(this); - isConnected = true; - } - } - - @Override - public synchronized void stop() throws Exception { - isRunning = false; - close(); - } - - @Override - public void run() { - this.isRunning = true; - try { - txConsumer.start(); - } catch (Exception e) { - - } -// handleData(); -// listen(); - } - -// private void listen() { -// while (isRunning) { -// try { -// byte[] data = this.txConsumer.start(); -// dataQueue.put(data); -// // 收到数据后由队列处理 -//// handleData(data); -// } catch (Exception e) { -// // 日志打印 -// ConsoleUtils.info("ERROR dispatcher start data exception {%s}", e.getMessage()); -// } -// } -// } - -// private void handleData() { -// dataExecutor.execute(() -> { -// byte[] data; -// for (;;) { -// try { -// data = dataQueue.take(); -// if (data.length == 1) { -// // 结块标识优先处理 -// syncIndex = 0L; -// this.blockIndex.getAndIncrement(); -// eventProducer.publish(ExchangeEntityFactory.newBlockInstance()); -// } else { -// if (syncIndex == 0) { // 收到第一个交易 -// // 需要判断是否需要进行定时任务 -// if (MAX_DELAY_MILLISECONDS_PER_BLOCK > 0) { -// this.timeHandleExecutor.schedule( -// timeBlockTask(this.blockIndex.get()), -// MAX_DELAY_MILLISECONDS_PER_BLOCK, TimeUnit.MILLISECONDS); -// } -// } -// syncIndex++; -// eventProducer.publish(ExchangeEntityFactory.newTransactionInstance(data)); -// if (syncIndex == TX_SIZE_PER_BLOCK) { -// syncIndex = 0L; -// this.blockIndex.getAndIncrement(); -// eventProducer.publish(ExchangeEntityFactory.newBlockInstance()); -// } -// } -// -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// }); -// for (;;) { -// try { -// final byte[] data = dataQueue.take(); -// dataExecutor.execute(() -> { -// if (data.length == 1) { -// // 结块标识优先处理 -// syncIndex = 0L; -// this.blockIndex.getAndIncrement(); -// eventProducer.publish(ExchangeEntityFactory.newBlockInstance()); -// } else { -// if (syncIndex == 0) { // 收到第一个交易 -// // 需要判断是否需要进行定时任务 -// if (MAX_DELAY_MILLISECONDS_PER_BLOCK > 0) { -// this.timeHandleExecutor.schedule( -// timeBlockTask(this.blockIndex.get()), -// MAX_DELAY_MILLISECONDS_PER_BLOCK, TimeUnit.MILLISECONDS); -// } -// } -// syncIndex++; -// eventProducer.publish(ExchangeEntityFactory.newTransactionInstance(data)); -// if (syncIndex == TX_SIZE_PER_BLOCK) { -// syncIndex = 0L; -// this.blockIndex.getAndIncrement(); -// eventProducer.publish(ExchangeEntityFactory.newBlockInstance()); -// } -// } -// } -// ); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } - -// private void handleData(final byte[] data) { -// dataExecutor.execute(() -> { -// try { -// if (data.length == 1) { -// // 结块标识优先处理 -// syncIndex = 0L; -// this.blockIndex.getAndIncrement(); -// eventProducer.publish(ExchangeEntityFactory.newBlockInstance()); -// } else { -// if (syncIndex == 0) { // 收到第一个交易 -// // 需要判断是否需要进行定时任务 -// if (MAX_DELAY_MILLISECONDS_PER_BLOCK > 0) { -// this.timeHandleExecutor.schedule( -// timeBlockTask(this.blockIndex.get()), -// MAX_DELAY_MILLISECONDS_PER_BLOCK, TimeUnit.MILLISECONDS); -// } -// } -// syncIndex++; -// eventProducer.publish(ExchangeEntityFactory.newTransactionInstance(data)); -// if (syncIndex == TX_SIZE_PER_BLOCK) { -// syncIndex = 0L; -// this.blockIndex.getAndIncrement(); -// eventProducer.publish(ExchangeEntityFactory.newBlockInstance()); -// } -// } -// } catch (Exception e) { -// // 记录日志 -// ConsoleUtils.info("ERROR TransactionDispatcher process queue data exception {%s}", e.getMessage()); -// } -// }); -// -// } - - private Runnable timeBlockTask(final long currentBlockIndex) { - return () -> { - final boolean isEqualBlock = this.blockIndex.compareAndSet( - currentBlockIndex, currentBlockIndex + 1); - if (isEqualBlock) { - try { - txProducer.publish(blockCommitBytes); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - }; - } - - @Override - public void close() throws IOException { - this.txProducer.close(); - this.txConsumer.close(); - } - - @Override - public void onEvent(EventEntity event, long sequence, boolean endOfBatch) throws Exception { - try { - byte[] data = event.getEntity(); -// System.out.printf("Thread [%s, $s] on event !!!\r\n", -// Thread.currentThread().getId(), Thread.currentThread().getName()); - if (data.length == 1) { - // 结块标识优先处理 - syncIndex = 0L; - this.blockIndex.getAndIncrement(); - eventProducer.publish(ExchangeEntityFactory.newBlockInstance()); - } else { - if (syncIndex == 0) { // 收到第一个交易 - // 需要判断是否需要进行定时任务 - if (MAX_DELAY_MILLISECONDS_PER_BLOCK > 0) { - this.timeHandleExecutor.schedule( - timeBlockTask(this.blockIndex.get()), - MAX_DELAY_MILLISECONDS_PER_BLOCK, TimeUnit.MILLISECONDS); - } - } - syncIndex++; - eventProducer.publish(ExchangeEntityFactory.newTransactionInstance(data)); - if (syncIndex == TX_SIZE_PER_BLOCK) { - syncIndex = 0L; - this.blockIndex.getAndIncrement(); - eventProducer.publish(ExchangeEntityFactory.newBlockInstance()); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/ExtendMsgQueueMessageExecutor.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/ExtendMsgQueueMessageExecutor.java deleted file mode 100644 index 9a73ece4..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/ExtendMsgQueueMessageExecutor.java +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.server.DefaultMsgQueueMessageDispatcher - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 上午11:05 - * Description: - */ -package com.jd.blockchain.consensus.mq.server; - -import com.jd.blockchain.consensus.event.EventEntity; -import com.jd.blockchain.consensus.mq.consumer.MsgQueueConsumer; -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; -import com.jd.blockchain.consensus.service.MessageHandle; -import com.jd.blockchain.utils.concurrent.AsyncFuture; -import com.lmax.disruptor.EventHandler; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ - -public class ExtendMsgQueueMessageExecutor implements MsgQueueMessageDispatcher, EventHandler> { - - private static final Logger LOGGER = LoggerFactory.getLogger(ExtendMsgQueueMessageExecutor.class); - - private final ExecutorService dataExecutor = Executors.newSingleThreadExecutor(); - - private MsgQueueProducer msgProducer; - - private MsgQueueConsumer msgConsumer; - - private MessageHandle messageHandle; - - private boolean isRunning; - - private boolean isConnected; - - public ExtendMsgQueueMessageExecutor setMsgProducer(MsgQueueProducer msgProducer) { - this.msgProducer = msgProducer; - return this; - } - - public ExtendMsgQueueMessageExecutor setMsgConsumer(MsgQueueConsumer msgConsumer) { - this.msgConsumer = msgConsumer; - return this; - } - - public ExtendMsgQueueMessageExecutor setMessageHandle(MessageHandle messageHandle) { - this.messageHandle = messageHandle; - return this; - } - - @Override - public void init() { - // do nothing - } - - public synchronized void connect() throws Exception { - if (!isConnected) { - msgProducer.connect(); - msgConsumer.connect(this); - msgConsumer.start(); - isConnected = true; - } - } - - @Override - public synchronized void stop() throws Exception { - isRunning = false; - close(); - } - - @Override - public void run() { - this.isRunning = true; -// this.msgConsumer.start(); -// listen(); - } - -// private void listen() { -// while (isRunning) { -// try { -// byte[] data = this.msgConsumer.start(); -// // 收到数据后由队列处理 -// handleData(data); -// } catch (Exception e) { -// // 日志打印 -// LOGGER.error("extend message handle exception {}", e.getMessage()); -// } -// } -// } - - private void handleData(byte[] data) { - dataExecutor.execute(() -> { - try { - AsyncFuture result = messageHandle.processUnordered(data); - msgProducer.publish(result.get()); - } catch (Exception e) { - LOGGER.error("process Unordered message exception {}", e.getMessage()); - } - }); - } - - @Override - public void close() throws IOException { - isConnected = false; - this.msgProducer.close(); - this.msgConsumer.close(); - } - - @Override - public void onEvent(EventEntity event, long sequence, boolean endOfBatch) throws Exception { - byte[] data = event.getEntity(); - handleData(data); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueConsensusManageService.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueConsensusManageService.java deleted file mode 100644 index 72368e95..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueConsensusManageService.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.server.MsgQueueConsensusManageService - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 下午1:46 - * Description: - */ -package com.jd.blockchain.consensus.mq.server; - -import java.util.Arrays; - -import com.jd.blockchain.consensus.ClientIdentification; -import com.jd.blockchain.consensus.ConsensusManageService; -import com.jd.blockchain.consensus.ConsensusSecurityException; -import com.jd.blockchain.consensus.mq.config.MsgQueueClientIncomingConfig; -import com.jd.blockchain.consensus.mq.settings.MsgQueueClientIncomingSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; -import com.jd.blockchain.crypto.Crypto; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.crypto.SignatureFunction; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueConsensusManageService implements ConsensusManageService { - - private MsgQueueConsensusSettings consensusSettings; - - public MsgQueueConsensusManageService setConsensusSettings(MsgQueueConsensusSettings consensusSettings) { - this.consensusSettings = consensusSettings; - return this; - } - - @Override - public MsgQueueClientIncomingSettings authClientIncoming(ClientIdentification authId) throws ConsensusSecurityException { - boolean isLegal = isLegal(authId); - if (isLegal) { - MsgQueueClientIncomingSettings mqcis = new MsgQueueClientIncomingConfig() - .setPubKey(authId.getPubKey()) - .setClientId(clientId(authId.getIdentityInfo())) - .setConsensusSettings(this.consensusSettings) - ; - return mqcis; - } - return null; - } - - private int clientId(byte[] identityInfo) { - // todo - - return 0; - } - - public boolean isLegal(ClientIdentification authId) { - boolean isLegal = false; - PubKey pubKey = authId.getPubKey(); - byte[] identityInfo = authId.getIdentityInfo(); - byte[] address = pubKey.toBytes(); // 使用公钥地址作为认证信息 - if (Arrays.equals(address, identityInfo)) { - SignatureFunction signatureFunction = Crypto.getSignatureFunction(pubKey.getAlgorithm()); - isLegal = signatureFunction.verify(authId.getSignature(), pubKey, identityInfo); - } - return isLegal; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueMessageDispatcher.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueMessageDispatcher.java deleted file mode 100644 index a3b6e286..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueMessageDispatcher.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.server.MsgQueueMessageDispatcher - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:30 - * Description: - */ -package com.jd.blockchain.consensus.mq.server; - - -import java.io.Closeable; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public interface MsgQueueMessageDispatcher extends Runnable, Closeable { - - void init(); - - void connect() throws Exception; - - void stop() throws Exception; -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueMessageExecutor.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueMessageExecutor.java deleted file mode 100644 index 36454696..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueMessageExecutor.java +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.server.MsgQueueMessageExecutor - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 下午2:10 - * Description: - */ -package com.jd.blockchain.consensus.mq.server; - -import com.jd.blockchain.consensus.event.EventEntity; -import com.jd.blockchain.consensus.mq.event.MessageEvent; -import com.jd.blockchain.consensus.mq.event.TxBlockedEvent; -import com.jd.blockchain.consensus.mq.exchange.ExchangeEventInnerEntity; -import com.jd.blockchain.consensus.mq.exchange.ExchangeType; -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; -import com.jd.blockchain.consensus.mq.util.MessageConvertUtil; -import com.jd.blockchain.consensus.service.MessageHandle; -import com.jd.blockchain.consensus.service.StateMachineReplicate; -import com.jd.blockchain.ledger.TransactionState; -import com.jd.blockchain.utils.concurrent.AsyncFuture; -import com.lmax.disruptor.EventHandler; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ - -public class MsgQueueMessageExecutor implements EventHandler> { - - private static final Logger LOGGER = LoggerFactory.getLogger(MsgQueueMessageExecutor.class); - - // todo 暂不处理队列溢出导致的OOM - private final ExecutorService blockEventExecutor = Executors.newFixedThreadPool(10); - - private MsgQueueProducer blProducer; - - private List exchangeEvents = new ArrayList<>(); - - private String realmName; - - private MessageHandle messageHandle; - - private final AtomicInteger messageId = new AtomicInteger(); - - private int txSizePerBlock = 1000; - - private StateMachineReplicate stateMachineReplicator; - - public MsgQueueMessageExecutor setRealmName(String realmName) { - this.realmName = realmName; - return this; - } - - public MsgQueueMessageExecutor setBlProducer(MsgQueueProducer blProducer) { - this.blProducer = blProducer; - return this; - } - - public MsgQueueMessageExecutor setTxSizePerBlock(int txSizePerBlock) { - this.txSizePerBlock = txSizePerBlock; - return this; - } - - public MsgQueueMessageExecutor setMessageHandle(MessageHandle messageHandle) { - this.messageHandle = messageHandle; - return this; - } - - public MsgQueueMessageExecutor setStateMachineReplicator(StateMachineReplicate stateMachineReplicator) { - this.stateMachineReplicator = stateMachineReplicator; - return this; - } - - public MsgQueueMessageExecutor init() { - try { - long latestStateId = stateMachineReplicator.getLatestStateID(realmName); - // 设置基础消息ID - messageId.set(((int)latestStateId + 1) * txSizePerBlock); - blProducer.connect(); - } catch (Exception e) { - throw new RuntimeException(e); - } - return this; - } - - @Override - public void onEvent(EventEntity event, long sequence, boolean endOfBatch) throws Exception { - ExchangeEventInnerEntity entity = event.getEntity(); - if (entity != null) { - if (entity.getType() == ExchangeType.BLOCK || entity.getType() == ExchangeType.EMPTY) { - if (!exchangeEvents.isEmpty()) { - process(exchangeEvents); - exchangeEvents.clear(); - } - } else { - byte[] bytes = event.getEntity().getContent(); - String key = bytes2Key(bytes); - exchangeEvents.add(new MessageEvent(key, bytes)); - } - } - } - - private void process(List messageEvents) { - if (messageEvents != null && !messageEvents.isEmpty()) { - try { - Map> txResponseMap = execute(messageEvents); - if (txResponseMap != null && !txResponseMap.isEmpty()) { -// byte[] asyncFuture; - for (Map.Entry> entry : txResponseMap.entrySet()) { - final String txKey = entry.getKey(); - final AsyncFuture asyncFuture = entry.getValue(); -// asyncFuture = entry.getValue().get(); - - blockEventExecutor.execute(() -> { - TxBlockedEvent txBlockedEvent = new TxBlockedEvent(txKey, - MessageConvertUtil.base64Encode(asyncFuture.get())); - byte[] serializeBytes = MessageConvertUtil.serializeTxBlockedEvent(txBlockedEvent); - // 通过消息队列发送该消息 - try { - this.blProducer.publish(serializeBytes); - } catch (Exception e) { - LOGGER.error("publish block event message exception {}", e.getMessage()); - } - }); - } - } - } catch (Exception e) { - // 打印日志 - LOGGER.error("process message exception {}", e.getMessage()); - } - } - } - - private Map> execute(List messageEvents) { -// System.out.printf("Thread[%s %s] execute messageEvents !!! \r\n", -// Thread.currentThread().getId(), Thread.currentThread().getName()); - Map> asyncFutureMap = new HashMap<>(); - // 使用MessageHandle处理 -// long startTime = System.currentTimeMillis(); -// int txSize = messageEvents.size(); - String batchId = messageHandle.beginBatch(realmName); - try { - for (MessageEvent messageEvent : messageEvents) { - String txKey = messageEvent.getMessageKey(); - byte[] txContent = messageEvent.getMessage(); - AsyncFuture asyncFuture = messageHandle.processOrdered(messageId.getAndIncrement(), txContent, realmName, batchId); - asyncFutureMap.put(txKey, asyncFuture); - } - messageHandle.completeBatch(realmName, batchId); - messageHandle.commitBatch(realmName, batchId); -// long totalTime = System.currentTimeMillis() - startTime; -// String content = String.format("batch[%s] process, time = {%s}ms, TPS = %.2f \r\n", -// batchId, totalTime, txSize * 1000.0D / totalTime); -// System.out.println(content); -// logQueue.put(content); - // 提交之后需要获取对应的结果 - } catch (Exception e) { - // todo 需要处理应答码 404 - messageHandle.rollbackBatch(realmName, batchId, TransactionState.CONSENSUS_ERROR.CODE); - } - return asyncFutureMap; - } - - - private String bytes2Key(byte[] bytes) { - return MessageConvertUtil.messageKey(bytes); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueNodeServer.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueNodeServer.java deleted file mode 100644 index 3f1f0b82..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueNodeServer.java +++ /dev/null @@ -1,196 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.server.MsgQueueNodeServer - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 上午11:20 - * Description: - */ -package com.jd.blockchain.consensus.mq.server; - -import com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider; -import com.jd.blockchain.consensus.mq.consumer.MsgQueueConsumer; -import com.jd.blockchain.consensus.mq.factory.MsgQueueFactory; -import com.jd.blockchain.consensus.mq.producer.MsgQueueProducer; -import com.jd.blockchain.consensus.mq.settings.MsgQueueBlockSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueNetworkSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueServerSettings; -import com.jd.blockchain.consensus.service.MessageHandle; -import com.jd.blockchain.consensus.service.NodeServer; -import com.jd.blockchain.consensus.service.StateMachineReplicate; - -import java.util.concurrent.Executors; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ - -public class MsgQueueNodeServer implements NodeServer { - - private DefaultMsgQueueMessageDispatcher dispatcher; - - private ExtendMsgQueueMessageExecutor extendExecutor; - - private MessageHandle messageHandle; - - private StateMachineReplicate stateMachineReplicator; - - private MsgQueueMessageExecutor messageExecutor; - - private MsgQueueNetworkSettings networkSettings; - - private MsgQueueConsensusManageService manageService; - - private int txSizePerBlock = 1000; - - private long maxDelayMilliSecondsPerBlock = 1000; - - private MsgQueueServerSettings serverSettings; - - private boolean isRunning; - - public MsgQueueNodeServer setMessageHandle(MessageHandle messageHandle) { - this.messageHandle = messageHandle; - return this; - } - - public MsgQueueNodeServer setStateMachineReplicator(StateMachineReplicate stateMachineReplicator) { - this.stateMachineReplicator = stateMachineReplicator; - return this; - } - - public MsgQueueNodeServer setTxSizePerBlock(int txSizePerBlock) { - this.txSizePerBlock = txSizePerBlock; - return this; - } - - public MsgQueueNodeServer setMaxDelayMilliSecondsPerBlock(long maxDelayMilliSecondsPerBlock) { - this.maxDelayMilliSecondsPerBlock = maxDelayMilliSecondsPerBlock; - return this; - } - - public MsgQueueNodeServer setMsgQueueNetworkSettings(MsgQueueNetworkSettings networkSettings) { - this.networkSettings = networkSettings; - return this; - } - - public MsgQueueNodeServer setServerSettings(MsgQueueServerSettings serverSettings) { - this.serverSettings = serverSettings; - this.manageService = new MsgQueueConsensusManageService() - .setConsensusSettings(serverSettings.getConsensusSettings()); - return this; - } - - public MsgQueueNodeServer init() { - String realmName = this.serverSettings.getRealmName(); - MsgQueueBlockSettings blockSettings = this.serverSettings.getBlockSettings(); - MsgQueueConsensusSettings consensusSettings = this.serverSettings.getConsensusSettings(); - - this.setTxSizePerBlock(blockSettings.getTxSizePerBlock()) - .setMaxDelayMilliSecondsPerBlock(blockSettings.getMaxDelayMilliSecondsPerBlock()) - .setMsgQueueNetworkSettings(consensusSettings.getNetworkSettings()) - ; - - String server = networkSettings.getServer(), - txTopic = networkSettings.getTxTopic(), - blTopic = networkSettings.getBlTopic(), - msgTopic = networkSettings.getMsgTopic(); - - MsgQueueProducer blProducer = MsgQueueFactory.newProducer(server, blTopic), - txProducer = MsgQueueFactory.newProducer(server, txTopic), - msgProducer = MsgQueueFactory.newProducer(server, msgTopic); - - MsgQueueConsumer txConsumer = MsgQueueFactory.newConsumer(server, txTopic), - msgConsumer = MsgQueueFactory.newConsumer(server, msgTopic); - - initMessageExecutor(blProducer, realmName); - - initDispatcher(txProducer, txConsumer); - - initExtendExecutor(msgProducer, msgConsumer); - - return this; - } - - @Override - public String getProviderName() { - return MsgQueueConsensusProvider.NAME; - } - - @Override - public MsgQueueConsensusManageService getManageService() { - return this.manageService; - } - - @Override - public MsgQueueServerSettings getSettings() { - return serverSettings; - } - - @Override - public boolean isRunning() { - return isRunning; - } - - @Override - public synchronized void start() { - if (!isRunning) { - try { - dispatcher.connect(); - Executors.newSingleThreadExecutor().execute(dispatcher); - extendExecutor.connect(); - Executors.newSingleThreadExecutor().execute(extendExecutor); - isRunning = true; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - @Override - public synchronized void stop() { - if (isRunning) { - try { - dispatcher.stop(); - extendExecutor.stop(); - isRunning = false; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - private void initMessageExecutor(MsgQueueProducer blProducer, final String realmName) { - messageExecutor = new MsgQueueMessageExecutor() - .setRealmName(realmName) - .setMessageHandle(messageHandle) - .setBlProducer(blProducer) - .setStateMachineReplicator(stateMachineReplicator) - .setTxSizePerBlock(txSizePerBlock) - .init() - ; - } - - private void initDispatcher(MsgQueueProducer txProducer, MsgQueueConsumer txConsumer) { - dispatcher = new DefaultMsgQueueMessageDispatcher(txSizePerBlock, maxDelayMilliSecondsPerBlock) - .setTxProducer(txProducer) - .setTxConsumer(txConsumer) - .setEventHandler(messageExecutor) - ; - dispatcher.init(); - } - - - private void initExtendExecutor(MsgQueueProducer msgProducer, MsgQueueConsumer msgConsumer) { - extendExecutor = new ExtendMsgQueueMessageExecutor() - .setMessageHandle(messageHandle) - .setMsgConsumer(msgConsumer) - .setMsgProducer(msgProducer) - ; - extendExecutor.init(); - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueNodeServerFactory.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueNodeServerFactory.java deleted file mode 100644 index c8d8f337..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/server/MsgQueueNodeServerFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.server.MsgQueueNodeServerFactory - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:30 - * Description: - */ -package com.jd.blockchain.consensus.mq.server; - -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consensus.mq.config.MsgQueueNodeConfig; -import com.jd.blockchain.consensus.mq.config.MsgQueueServerConfig; -import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueNodeSettings; -import com.jd.blockchain.consensus.mq.settings.MsgQueueServerSettings; -import com.jd.blockchain.consensus.service.*; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ - -public class MsgQueueNodeServerFactory implements NodeServerFactory { - - @Override - public MsgQueueServerSettings buildServerSettings(String realmName, ConsensusSettings consensusSetting, String currentNodeAddress) { - - if (!(consensusSetting instanceof MsgQueueConsensusSettings)) { - throw new IllegalArgumentException("ConsensusSettings data isn't supported! Accept MsgQueueConsensusSettings only!"); - } - - MsgQueueNodeSettings nodeSettings = new MsgQueueNodeConfig().setAddress(currentNodeAddress); - - MsgQueueServerSettings serverSettings = new MsgQueueServerConfig() - .setRealmName(realmName) - .setNodeSettings(nodeSettings) - .setConsensusSettings((MsgQueueConsensusSettings) consensusSetting) - ; - return serverSettings; - - - } - - @Override - public MsgQueueNodeServer setupServer(ServerSettings serverSettings, MessageHandle messageHandler, StateMachineReplicate stateMachineReplicator) { - if (!(serverSettings instanceof MsgQueueServerSettings)) { - throw new IllegalArgumentException("ServerSettings data isn't supported! Accept MsgQueueServerSettings only!"); - } - - MsgQueueNodeServer nodeServer = new MsgQueueNodeServer() - .setServerSettings((MsgQueueServerSettings) serverSettings) - .setMessageHandle(messageHandler) - .setStateMachineReplicator(stateMachineReplicator) - .init() - ; - return nodeServer; - } -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueBlockSettings.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueBlockSettings.java deleted file mode 100644 index 80832ca7..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueBlockSettings.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.config.MsgQueueBlockSettings - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 下午4:28 - * Description: - */ -package com.jd.blockchain.consensus.mq.settings; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.binaryproto.PrimitiveType; -import com.jd.blockchain.consts.DataCodes; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ -@DataContract(code = DataCodes.CONSENSUS_MSGQUEUE_BLOCK_SETTINGS) -public interface MsgQueueBlockSettings { - - @DataField(order = 0, primitiveType = PrimitiveType.INT32) - int getTxSizePerBlock(); - - @DataField(order = 1, primitiveType = PrimitiveType.INT64) - long getMaxDelayMilliSecondsPerBlock(); -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueClientIncomingSettings.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueClientIncomingSettings.java deleted file mode 100644 index 09d2c882..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueClientIncomingSettings.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.config.MsgQueueClientIncomingSettings - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 下午4:35 - * Description: - */ -package com.jd.blockchain.consensus.mq.settings; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.binaryproto.PrimitiveType; -import com.jd.blockchain.consensus.ClientIncomingSettings; -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consts.DataCodes; -import com.jd.blockchain.crypto.PubKey; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ -@DataContract(code = DataCodes.CONSENSUS_MSGQUEUE_CLI_INCOMING_SETTINGS) -public interface MsgQueueClientIncomingSettings extends ClientIncomingSettings { - - @DataField(order = 1, primitiveType=PrimitiveType.BYTES) - PubKey getPubKey(); -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueClientSettings.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueClientSettings.java deleted file mode 100644 index 95f24516..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueClientSettings.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.config.MsgQueueClientSettings - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 下午4:30 - * Description: - */ -package com.jd.blockchain.consensus.mq.settings; - -import com.jd.blockchain.consensus.client.ClientSettings; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ - -public interface MsgQueueClientSettings extends ClientSettings { - - MsgQueueNetworkSettings getMsgQueueNetworkSettings(); -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueConsensusSettings.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueConsensusSettings.java deleted file mode 100644 index 80cadcd7..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueConsensusSettings.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.config.MsgQueueConsensusSettings - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 下午4:37 - * Description: - */ -package com.jd.blockchain.consensus.mq.settings; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.binaryproto.PrimitiveType; -import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.consensus.mq.config.MsgQueueBlockConfig; -import com.jd.blockchain.consts.DataCodes; -import com.jd.blockchain.utils.Property; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ -@DataContract(code = DataCodes.CONSENSUS_MSGQUEUE_SETTINGS) -public interface MsgQueueConsensusSettings extends ConsensusSettings { - - @DataField(order = 0, refContract = true) - MsgQueueNetworkSettings getNetworkSettings(); - - @DataField(order = 1, refContract = true) - MsgQueueBlockSettings getBlockSettings(); -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueNetworkSettings.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueNetworkSettings.java deleted file mode 100644 index 0bfd5061..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueNetworkSettings.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.mq.config.MsgQueueNetworkSettings - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/12 上午11:43 - * Description: - */ -package com.jd.blockchain.consensus.mq.settings; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.binaryproto.PrimitiveType; -import com.jd.blockchain.consts.DataCodes; - -/** - * - * @author shaozhuguang - * @create 2018/12/12 - * @since 1.0.0 - */ -@DataContract(code = DataCodes.CONSENSUS_MSGQUEUE_NETWORK_SETTINGS) -public interface MsgQueueNetworkSettings { - - @DataField(order = 0, primitiveType = PrimitiveType.TEXT) - String getServer(); - - @DataField(order = 1, primitiveType = PrimitiveType.TEXT) - String getTxTopic(); - - @DataField(order = 2, primitiveType = PrimitiveType.TEXT) - String getBlTopic(); - - @DataField(order = 3, primitiveType = PrimitiveType.TEXT) - String getMsgTopic(); -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueNodeSettings.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueNodeSettings.java deleted file mode 100644 index 9bd2a159..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueNodeSettings.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.settings.MsgQueueNodeSettings - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 下午4:50 - * Description: - */ -package com.jd.blockchain.consensus.mq.settings; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.consensus.NodeSettings; -import com.jd.blockchain.consts.DataCodes; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ - -@DataContract(code=DataCodes.CONSENSUS_MSGQUEUE_NODE_SETTINGS) -public interface MsgQueueNodeSettings extends NodeSettings { - -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueServerSettings.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueServerSettings.java deleted file mode 100644 index 04ea74c2..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/settings/MsgQueueServerSettings.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.consensus.mq.config.MsgQueueServerSettings - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/12/13 下午4:39 - * Description: - */ -package com.jd.blockchain.consensus.mq.settings; - -import com.jd.blockchain.consensus.service.ServerSettings; - -/** - * - * @author shaozhuguang - * @create 2018/12/13 - * @since 1.0.0 - */ - -public interface MsgQueueServerSettings extends ServerSettings { - - MsgQueueBlockSettings getBlockSettings(); - - MsgQueueConsensusSettings getConsensusSettings(); -} \ No newline at end of file diff --git a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/util/MessageConvertUtil.java b/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/util/MessageConvertUtil.java deleted file mode 100644 index c0b032a4..00000000 --- a/core/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/util/MessageConvertUtil.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright: Copyright 2016-2020 JD.COM All Right Reserved - * FileName: com.jd.blockchain.sdk.mq.event.MessageConvertUtil - * Author: shaozhuguang - * Department: 区块链研发部 - * Date: 2018/11/21 下午7:28 - * Description: - */ -package com.jd.blockchain.consensus.mq.util; - -import com.alibaba.fastjson.JSON; -import com.jd.blockchain.consensus.mq.event.BlockEvent; -import com.jd.blockchain.consensus.mq.event.TxBlockedEvent; -import com.jd.blockchain.utils.security.ShaUtils; - -import org.springframework.util.Base64Utils; - - -/** - * - * @author shaozhuguang - * @create 2018/11/21 - * @since 1.0.0 - */ - -public class MessageConvertUtil { - - public static final String defaultCharsetName = "UTF-8"; - - public static String base64Encode(byte[] src) { - return Base64Utils.encodeToString(src); - } - - public static byte[] base64Decode(String src) { - return Base64Utils.decodeFromString(src); - } - - public static String messageKey(byte[] src) { - return base64Encode(ShaUtils.hash_256(src)); - } - - public static BlockEvent convertBytes2BlockEvent(byte[] serializeBytes) { - String text; - try{ - text = new String(serializeBytes, defaultCharsetName); - } catch (Exception e) { - throw new RuntimeException(e); - } - return convertString2BlockEvent(text); - } - - public static BlockEvent convertString2BlockEvent(String serializeString) { - return JSON.parseObject(serializeString, BlockEvent.class); - } - - public static TxBlockedEvent convertBytes2TxBlockedEvent(byte[] serializeBytes) { - String text; - try{ - text = new String(serializeBytes, defaultCharsetName); - } catch (Exception e) { - throw new RuntimeException(e); - } - return convertString2TxBlockedEvent(text); - } - - public static TxBlockedEvent convertString2TxBlockedEvent(String serializeString) { - return JSON.parseObject(serializeString, TxBlockedEvent.class); - } - - public static byte[] serializeBlockEvent(BlockEvent blockEvent) { - String serializeString = serializeEvent(blockEvent); - byte[] serializeBytes; - try { - serializeBytes = serializeString.getBytes(defaultCharsetName); - } catch (Exception e) { - throw new RuntimeException(e); - } - return serializeBytes; - } - - public static byte[] serializeTxBlockedEvent(TxBlockedEvent txBlockedEvent) { - String serializeString = JSON.toJSONString(txBlockedEvent); - byte[] serializeBytes; - try { - serializeBytes = serializeString.getBytes(defaultCharsetName); - } catch (Exception e) { - throw new RuntimeException(e); - } - return serializeBytes; - } - - public static String serializeEvent(BlockEvent blockEvent) { - return JSON.toJSONString(blockEvent); - } -} \ No newline at end of file diff --git a/core/consensus/pom.xml b/core/consensus/pom.xml deleted file mode 100644 index d9c9216e..00000000 --- a/core/consensus/pom.xml +++ /dev/null @@ -1,17 +0,0 @@ - - 4.0.0 - - com.jd.blockchain - jdchain-core - 1.2.0-SNAPSHOT - - consensus-core - pom - - - consensus-bftsmart - consensus-mq - - \ No newline at end of file diff --git a/core/contract/README.MD b/core/contract/README.MD deleted file mode 100644 index 9e940486..00000000 --- a/core/contract/README.MD +++ /dev/null @@ -1,27 +0,0 @@ -### 合约相关说明 -1. 编译合约入口:ContractCompilerCmdTest.java; -2. 账本调用合约测试入口:ContractEventSendOperationHandleTest.java; - -### 单元测试注意事项 -使用ContractEventSendOperationHandleTest.java进行单元测试,注意事项: -1. 设置合约使用PUB_CLASS_PATH、CORE_CLASS_PATH位置(sys-contract.properties); -PUB包在根目录中的contract-libs文件夹;core包需要编译来生成。具体如下: - - 进入contract-jar模块,执行maven命令: - ``` - mvn clean assembly:assembly - ``` - - 生成的core包位于模块的target中的contract-jar-xxx所在的coreLib中; - - 将此coreLib目录作为CORE_CLASS_PATH指向的目录。 -2. 编译生成合约压缩包,即执行:ContractCompilerCmdTest.java对应的mainTestOk(); -在编译之前,修改sys-contract.properties文件的变量CONTRACT_FROM_PATH(合约源文件位置)、CONTRACT_SAVE_TO_PATH(合约保存位置)。 -3. 在合约保存位置中可看到生成的压缩包:xxx.contract;然后执行 ContractEventSendOperationHandleTest.java测试用例test1()即可。 - -### 20180910版本改造 -1. 在contract-jar中添加了mvn assembly处理逻辑,将合约用到的lib包全部放置其target/xxx/pubLib文件夹中,执行: -``` -mvn clean assembly:assembly -``` -2. 修改了sys-contract.properties文件,新增了CONTRACT_CLASS_LIBS参数; - - 将CONTRACT_CLASS_PATH专用于存储路径 - - CONTRACT_CLASS_LIBS来存放所有的jar包 -3. 删减了contract-libs文件夹中需要动态生成的jar。 diff --git a/core/contract/contract-jvm/pom.xml b/core/contract/contract-jvm/pom.xml deleted file mode 100644 index c547c43d..00000000 --- a/core/contract/contract-jvm/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - 4.0.0 - - com.jd.blockchain - contract-core - 1.2.0-SNAPSHOT - - contract-jvm - - - - com.jd.blockchain - contract-framework - ${project.version} - - - com.jd.blockchain - runtime-context - ${project.version} - - - com.jd.blockchain - runtime-modular - ${project.version} - - - - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.8.2 - - true - - - - - - \ No newline at end of file diff --git a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/AbstractContractCode.java b/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/AbstractContractCode.java deleted file mode 100644 index 2aee31f8..00000000 --- a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/AbstractContractCode.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.jd.blockchain.contract.jvm; - -import java.lang.reflect.Method; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.ReflectionUtils; - -import com.jd.blockchain.contract.ContractEventContext; -import com.jd.blockchain.contract.ContractException; -import com.jd.blockchain.contract.EventProcessingAware; -import com.jd.blockchain.contract.engine.ContractCode; -import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.ledger.BytesValueEncoding; -import com.jd.blockchain.ledger.BytesValueList; -import com.jd.blockchain.utils.Bytes; - -/** - * @author huanghaiquan - * - */ -public abstract class AbstractContractCode implements ContractCode { - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractContractCode.class); - private Bytes address; - private long version; - - private ContractDefinition contractDefinition; - - public AbstractContractCode(Bytes address, long version, ContractDefinition contractDefinition) { - this.address = address; - this.version = version; - this.contractDefinition = contractDefinition; - } - - public ContractDefinition getContractDefinition() { - return contractDefinition; - } - - @Override - public Bytes getAddress() { - return address; - } - - @Override - public long getVersion() { - return version; - } - - @Override - public BytesValue processEvent(ContractEventContext eventContext) { - EventProcessingAware evtProcAwire = null; - Object retn = null; - Method handleMethod = null; - Exception error = null; - try { - // 执行预处理; - Object contractInstance = getContractInstance(); - if (contractInstance instanceof EventProcessingAware) { - evtProcAwire = (EventProcessingAware) contractInstance; - } - - if (evtProcAwire != null) { - evtProcAwire.beforeEvent(eventContext); - } - - // 反序列化参数; - handleMethod = contractDefinition.getType().getHandleMethod(eventContext.getEvent()); - - if (handleMethod == null) { - throw new ContractException( - String.format("Contract[%s:%s] has no handle method to handle event[%s]!", address.toString(), - contractDefinition.getType().getName(), eventContext.getEvent())); - } - - BytesValueList bytesValues = eventContext.getArgs(); - Object[] args = BytesValueEncoding.decode(bytesValues, handleMethod.getParameterTypes()); - - retn = ReflectionUtils.invokeMethod(handleMethod, contractInstance, args); - - } catch (Exception e) { - error = e; - } - - if (evtProcAwire != null) { - try { - evtProcAwire.postEvent(eventContext, error); - } catch (Exception e) { - String errorMessage = "Error occurred while posting contract event! --" + e.getMessage(); - LOGGER.error(errorMessage, e); - throw new ContractException(errorMessage, e); - } - } - if (error != null) { - // Rethrow error; - throw new ContractException(String.format("Error occurred while processing event[%s] of contract[%s]! --%s", - eventContext.getEvent(), address.toString(), error.getMessage()), error); - } - - BytesValue retnBytes = BytesValueEncoding.encodeSingle(retn, handleMethod.getReturnType()); - return retnBytes; - } - - protected abstract Object getContractInstance(); - -} diff --git a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/ContractDefinition.java b/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/ContractDefinition.java deleted file mode 100644 index d61e037a..00000000 --- a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/ContractDefinition.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jd.blockchain.contract.jvm; - -import com.jd.blockchain.contract.ContractType; - -public class ContractDefinition { - - private ContractType type; - - private Class mainClass; - - public Class getMainClass() { - return mainClass; - } - - public ContractType getType() { - return type; - } - - public ContractDefinition(ContractType type, Class mainClass) { - this.type = type; - this.mainClass = mainClass; - } - -} diff --git a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/InstantiatedContractCode.java b/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/InstantiatedContractCode.java deleted file mode 100644 index 94adc3a7..00000000 --- a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/InstantiatedContractCode.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.jd.blockchain.contract.jvm; - -import com.jd.blockchain.contract.ContractType; -import com.jd.blockchain.utils.Bytes; - -public class InstantiatedContractCode extends AbstractContractCode { - - private T instance; - - public InstantiatedContractCode(Bytes address, long version, Class delaredInterface, T instance) { - super(address, version, resolveContractDefinition(delaredInterface, instance.getClass())); - this.instance = instance; - } - - private static ContractDefinition resolveContractDefinition(Class declaredIntf, Class implementedClass) { - ContractType contractType = ContractType.resolve(declaredIntf); - return new ContractDefinition(contractType, implementedClass); - } - - @Override - protected T getContractInstance() { - return instance; - } - - } \ No newline at end of file diff --git a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JVMContractEngine.java b/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JVMContractEngine.java deleted file mode 100644 index ea1ee9fa..00000000 --- a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JVMContractEngine.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.jd.blockchain.contract.jvm; - -import com.jd.blockchain.contract.engine.ContractCode; -import com.jd.blockchain.contract.engine.ContractEngine; -import com.jd.blockchain.runtime.Module; -import com.jd.blockchain.runtime.RuntimeContext; -import com.jd.blockchain.utils.Bytes; - -public class JVMContractEngine implements ContractEngine { - - private RuntimeContext runtimeContext = RuntimeContext.get(); - - private String getCodeName(Bytes address, long version) { - return address.toBase58() + "_" + version; - } - - @Override - public ContractCode getContract(Bytes address, long version) { - String codeName = getCodeName(address, version); - Module module = runtimeContext.getDynamicModule(codeName); - if (module == null) { - return null; - } - return new JavaContractCode(address, version, module); - } - - @Override - public ContractCode setupContract(Bytes address, long version, byte[] code) { - //is there the contractCode before setup? if yes ,then return; - ContractCode contractCode = getContract(address,version); - if(contractCode != null){ - return contractCode; - } - String codeName = getCodeName(address, version); - Module module = runtimeContext.createDynamicModule(codeName,code); - if (module == null) { - return null; - } - return new JavaContractCode(address, version, module); - } -} diff --git a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JVMContractServiceProvider.java b/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JVMContractServiceProvider.java deleted file mode 100644 index 013537bf..00000000 --- a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JVMContractServiceProvider.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.jd.blockchain.contract.jvm; - -import com.jd.blockchain.contract.engine.ContractEngine; -import com.jd.blockchain.contract.engine.ContractServiceProvider; - -public class JVMContractServiceProvider implements ContractServiceProvider { - @Override - public String getName() { - return JVMContractServiceProvider.class.getName(); - } - - @Override - public ContractEngine getEngine() { - return InnerEngine.INSTANCE; - } - - private static class InnerEngine { - private static final ContractEngine INSTANCE = new JVMContractEngine(); - } -} diff --git a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java b/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java deleted file mode 100644 index fa4d8260..00000000 --- a/core/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.jd.blockchain.contract.jvm; - -import java.util.concurrent.Callable; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.jd.blockchain.contract.Contract; -import com.jd.blockchain.contract.ContractEventContext; -import com.jd.blockchain.contract.ContractException; -import com.jd.blockchain.contract.ContractType; -import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.runtime.Module; -import com.jd.blockchain.utils.Bytes; - -/** - * 基于 java jar 包并且以模块化方式独立加载的合约代码; - * - * @author huanghaiquan - * - */ -public class JavaContractCode extends AbstractContractCode { - private static final Logger LOGGER = LoggerFactory.getLogger(JavaContractCode.class); - private Module codeModule; - private Bytes address; - private long version; - - public JavaContractCode(Bytes address, long version, Module codeModule) { - super(address, version, resolveContractDefinition(codeModule)); - this.address = address; - this.version = version; - this.codeModule = codeModule; - } - - protected static ContractDefinition resolveContractDefinition(Module codeModule) { - String mainClassName = codeModule.getMainClass(); - Class mainClass = codeModule.loadClass(mainClassName); - Class[] interfaces = mainClass.getInterfaces(); - Class contractInterface = null; - for (Class itf : interfaces) { - Contract annoContract = itf.getAnnotation(Contract.class); - if (annoContract != null) { - if (contractInterface == null) { - contractInterface = itf; - } else { - throw new ContractException( - "One contract definition is only allowed to implement one contract type!"); - } - } - } - if (contractInterface == null) { - throw new ContractException("No contract type is implemented!"); - } - ContractType type = ContractType.resolve(contractInterface); - return new ContractDefinition(type, mainClass); - } - - @Override - public Bytes getAddress() { - return address; - } - - @Override - public long getVersion() { - return version; - } - - @Override - public BytesValue processEvent(ContractEventContext eventContext) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Start processing event{} of contract{}...", eventContext.getEvent(), address.toString()); - } - try { - return codeModule.call(new ContractExecution(eventContext)); - } catch (Exception ex) { - LOGGER.error(String.format("Error occurred while processing event[%s] of contract[%s]! --%s", - eventContext.getEvent(), address.toString(), ex.getMessage()), ex); - throw ex; - } finally { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("End processing event{} of contract{}. ", eventContext.getEvent(), address.toString()); - } - } - } - - protected Object getContractInstance() { - try { - // 每一次调用都通过反射创建合约的实例; - return getContractDefinition().getMainClass().newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - - private class ContractExecution implements Callable { - private ContractEventContext eventContext; - - public ContractExecution(ContractEventContext contractEventContext) { - this.eventContext = contractEventContext; - } - - @Override - public BytesValue call() throws Exception { - return JavaContractCode.super.processEvent(eventContext); - } - } - -} diff --git a/core/contract/contract-maven-plugin/ReadME.MD b/core/contract/contract-maven-plugin/ReadME.MD deleted file mode 100644 index 1cc457b6..00000000 --- a/core/contract/contract-maven-plugin/ReadME.MD +++ /dev/null @@ -1,274 +0,0 @@ -# 合约编译插件使用教程 - -### 1、maven引入 - -在pom.xml文件中引入合约编译插件: -```xml - - com.jd.blockchain - contract-maven-plugin - 1.0.0.RELEASE - - - make-contract - package - - compile - - - - - - - com.jd.chain.contracts.ContractTestInfImpl - - - contract - - - -``` - -需要说明的几点如下: - + 1)version:请根据实际JDChain发布版本确认,不同版本会有区别; - + 2)executions->execution->id:该值请随意指定; - + 3)executions->execution->phase:建议使用package及其后续阶段(若不了解phase含义,请自行查阅相关信息); - + 4)executions->execution->goals->goal:必须使用compile; - + 5)mainClass:必填,该类为需要发布的合约执行类(注意此处是类,不是接口),必须正确配置; - + 6)finalName:必填,最终在编译正常的情况下,会产生{finalName}-JDChain-Contract.jar文件,只有该文件是可以发布到JDChain的合约包; - - -### 2、执行命令 -使用mvn执行命令,下面两种方式均可: - -方式一:只执行contract插件命令 -```shell - mvn clean compile contract:compile -``` - -方式二:直接执行打包命令: -```shell -mvn clean package -``` - - -### 3、合约编写要求 -合约的执行结果会对整条链产生比较深刻的影响,为了使用户能够更好、更合理的使用合约,目前JDChain约定合约编写规则包括以下几点: - -(违反其中任何一点都可能导致合约编译失败,但即使合约编译通过也不能保证合约可百分百运行正常) - - + 1)合约工程必须引入com.jd.blockchain:sdk-pack:该包中有合约正常编写需要使用的基本类; - + 2)com.jd.blockchain:sdk-pack的scope必须定义为provided; - + 3)合约发布必须通过合约编译插件进行打包:合约编译插件不但会对Jar包进行校验,同时也会加入JDChain独有的特征,只有具有该特征的Jar才能正常发布; - + 4)合约中严禁使用随机数、IO、NIO等操作; - + 5)合约打包时,请使用provided排除常用的工具包,例如FastJson、apache下的一些工具包等; - + 6)合约必须有一个接口和该接口的实现类,详细要求如下: - - a. 接口必须有@Contract注解; - - b. 接口的可调用方法上必须有@ContractEvent注解,且每个注解中的name属性不能重复; - - c. 合约方法支持入参和返回值,其主要包括所有基本类型; - - - -### 4、合约案例 - -#### 4.1、代码实例 -以下是一个可创建银行账户,指定具体金额,并可以转账的合约代码(逻辑较简单,仅供参考): - -合约接口代码如下: -```java -package com.jd.chain.contract; - - -@Contract -public interface TransferContract { - - @ContractEvent(name = "create") - String create(String address, String account, long money); - - @ContractEvent(name = "transfer") - String transfer(String address, String from, String to, long money); - - @ContractEvent(name = "read") - long read(String address, String account); - - @ContractEvent(name = "readAll") - String readAll(String address, String account); -} - -``` - -合约实现类代码如下: -```java -package com.jd.chain.contract; - -import com.alibaba.fastjson.JSON; -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.KVDataEntry; -import com.jd.blockchain.ledger.KVDataVO; -import com.jd.blockchain.ledger.KVInfoVO; - -public class TransferContractImpl implements EventProcessingAware, TransferContract { - - private ContractEventContext eventContext; - - private HashDigest ledgerHash; - - @Override - public String create(String address, String account, long money) { - KVDataEntry[] kvDataEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, account); - // 肯定有返回值,但若不存在则返回version=-1 - if (kvDataEntries != null && kvDataEntries.length > 0) { - long currVersion = kvDataEntries[0].getVersion(); - if (currVersion > -1) { - throw new IllegalStateException(String.format("%s -> %s already have created !!!", address, account)); - } - eventContext.getLedger().dataAccount(address).setInt64(account, money, -1L); - } else { - throw new IllegalStateException(String.format("Ledger[%s] inner Error !!!", ledgerHash.toBase58())); - } - return String.format("DataAccountAddress[%s] -> Create(By Contract Operation) Account = %s and Money = %s Success!!! \r\n", - address, account, money); - } - - @Override - public String transfer(String address, String from, String to, long money) { - // 首先查询余额 - KVDataEntry[] kvDataEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, from, to); - if (kvDataEntries == null || kvDataEntries.length != 2) { - throw new IllegalStateException(String.format("%s -> %s - %s may be not created !!!", address, from, to)); - } else { - // 判断from账号中钱数量是否足够 - long fromMoney = 0L, toMoney = 0L, fromVersion = 0L, toVersion = 0L; - for (KVDataEntry kvDataEntry : kvDataEntries) { - if (kvDataEntry.getKey().equals(from)) { - fromMoney = (long) kvDataEntry.getValue(); - fromVersion = kvDataEntry.getVersion(); - } else { - toMoney = (long) kvDataEntry.getValue(); - toVersion = kvDataEntry.getVersion(); - } - } - if (fromMoney < money) { - throw new IllegalStateException(String.format("%s -> %s not have enough money !!!", address, from)); - } - long fromNewMoney = fromMoney - money; - long toNewMoney = toMoney + money; - // 重新设置 - eventContext.getLedger().dataAccount(address).setInt64(from, fromNewMoney, fromVersion); - eventContext.getLedger().dataAccount(address).setInt64(to, toNewMoney, toVersion); - } - - return String.format("DataAccountAddress[%s] transfer from [%s] to [%s] and [money = %s] Success !!!", address, from, to, money); - } - - @Override - public long read(String address, String account) { - KVDataEntry[] kvDataEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, account); - if (kvDataEntries == null || kvDataEntries.length == 0) { - return -1; - } - return (long)kvDataEntries[0].getValue(); - } - - @Override - public String readAll(String address, String account) { - KVDataEntry[] kvDataEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, account); - // 获取最新的版本号 - if (kvDataEntries == null || kvDataEntries.length == 0) { - return ""; - } - long newestVersion = kvDataEntries[0].getVersion(); - if (newestVersion == -1) { - return ""; - } - KVDataVO[] kvDataVOS = new KVDataVO[1]; - long[] versions = new long[(int)newestVersion + 1]; - for (int i = 0; i < versions.length; i++) { - versions[i] = i; - } - KVDataVO kvDataVO = new KVDataVO(account, versions); - - kvDataVOS[0] = kvDataVO; - - KVInfoVO kvInfoVO = new KVInfoVO(kvDataVOS); - - KVDataEntry[] allEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, kvInfoVO); - - return JSON.toJSONString(allEntries); - } - - @Override - public void beforeEvent(ContractEventContext eventContext) { - this.eventContext = eventContext; - this.ledgerHash = eventContext.getCurrentLedgerHash(); - } - - @Override - public void postEvent(ContractEventContext eventContext, Exception error) { - - } -} -``` - - -#### 4.2、pom.xml文件实例 - -```xml - - - - - com.jd.chain - 1.0.0.RELEASE - 4.0.0 - - contract-samples - - contract-samples - - - - com.jd.blockchain - sdk-pack - 1.0.0.RELEASE - provided - - - - com.alibaba - fastjson - 1.2.32 - provided - - - - - - - com.jd.blockchain - contract-maven-plugin - 1.0.0.RELEASE - - - make-contract - package - - compile - - - - - - - com.jd.chain.contract.TransferContractImpl - - - contract - - - - - - -``` \ No newline at end of file diff --git a/core/contract/contract-maven-plugin/conf/jd-com.priv b/core/contract/contract-maven-plugin/conf/jd-com.priv deleted file mode 100644 index 93d38cf8..00000000 --- a/core/contract/contract-maven-plugin/conf/jd-com.priv +++ /dev/null @@ -1 +0,0 @@ -177gjsuHdbf3PU68Sm1ZU2aMcyB7sLWj94xwBUoUKvTgHq7qGUfg6ynDB62hocYYXSRXD4X \ No newline at end of file diff --git a/core/contract/contract-maven-plugin/conf/jd-com.pub b/core/contract/contract-maven-plugin/conf/jd-com.pub deleted file mode 100644 index 29ca057d..00000000 --- a/core/contract/contract-maven-plugin/conf/jd-com.pub +++ /dev/null @@ -1 +0,0 @@ -endPsK36imXrY66pru6ttZ8dZ3TynWekmdqoM1K7ZRRoRBBiYVzM \ No newline at end of file diff --git a/core/contract/contract-maven-plugin/conf/ownerPassword.txt b/core/contract/contract-maven-plugin/conf/ownerPassword.txt deleted file mode 100644 index f2ba8f84..00000000 --- a/core/contract/contract-maven-plugin/conf/ownerPassword.txt +++ /dev/null @@ -1 +0,0 @@ -abc \ No newline at end of file diff --git a/core/contract/contract-maven-plugin/pom.xml b/core/contract/contract-maven-plugin/pom.xml deleted file mode 100644 index c089d5b9..00000000 --- a/core/contract/contract-maven-plugin/pom.xml +++ /dev/null @@ -1,74 +0,0 @@ - - 4.0.0 - - com.jd.blockchain - contract-core - 1.2.0-SNAPSHOT - - contract-maven-plugin - maven-plugin - - - - com.jd.blockchain - ledger-model - ${project.version} - - - - com.jd.blockchain - utils-common - ${project.version} - - - - com.jd.blockchain - sdk-client - ${project.version} - - - - com.jd.blockchain - tools-keygen - ${project.version} - - - - - org.apache.maven - maven-plugin-api - 3.3.9 - - - - org.apache.maven.plugin-tools - maven-plugin-annotations - 3.6.0 - - - - org.apache.maven.plugins - maven-assembly-plugin - 2.6 - - - - org.ow2.asm - asm - 5.0.4 - - - - - - - - org.apache.maven.plugins - maven-plugin-plugin - 3.5 - - - - diff --git a/core/contract/contract-maven-plugin/readme.txt b/core/contract/contract-maven-plugin/readme.txt deleted file mode 100644 index 46697cce..00000000 --- a/core/contract/contract-maven-plugin/readme.txt +++ /dev/null @@ -1,19 +0,0 @@ -说明 -1.编译:mvn clean install - -快速自测: -1.ContractRemoteAutoMojoTest类用于快速自测发布和执行,快速自测是在测试链的环境中发布和执行合约; -2.修改sys-contract.properties文件中的相关信息; -3.合约发布之后,会在控制台生成合约地址,待5秒钟之后,会执行此合约。sys-contract.properties的contractArgs参数可修改,查看其不同效果; -### -contract's address=5SmEqUsnLY4APVfS32xYDpRPuz55Rsuupdt1 -execute the contract,result=true -exeContract(),SUCCESS -### -4.在peer节点的控制台可以看到输出的结果信息。 - -通过maven插件中通过ContractAllAutoMojo做简单的编译、发布和执行测试,对应单元测试类ContractAllAutoMojoTest; - - - - diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java deleted file mode 100644 index b84cc712..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.jd.blockchain; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - -import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.crypto.KeyGenUtils; -import com.jd.blockchain.crypto.PrivKey; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.*; -import com.jd.blockchain.sdk.BlockchainService; -import com.jd.blockchain.sdk.client.GatewayServiceFactory; -import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.codec.Base58Utils; -import com.jd.blockchain.utils.net.NetworkAddress; - -/** - * @Author zhaogw - * @Date 2018/11/2 10:18 - */ -public enum ContractDeployExeUtil { - instance; - private BlockchainService bcsrv; - private Bytes contractAddress; - - public BlockchainKeypair getKeyPair(String pubPath, String prvPath, String rawPassword){ - PubKey pub = null; - PrivKey prv = null; - try { - prv = KeyGenUtils.readPrivKey(prvPath, KeyGenUtils.encodePassword(rawPassword)); - pub = KeyGenUtils.readPubKey(pubPath); - - } catch (Exception e) { - e.printStackTrace(); - } - - return new BlockchainKeypair(pub, prv); - } - - public PubKey getPubKey(String pubPath){ - PubKey pub = null; - try { - if(pubPath == null){ - BlockchainKeypair contractKeyPair = BlockchainKeyGenerator.getInstance().generate(); - pub = contractKeyPair.getPubKey(); - }else { - pub = KeyGenUtils.readPubKey(pubPath); - } - - } catch (Exception e) { - e.printStackTrace(); - } - - return pub; - } - public byte[] getChainCode(String path){ - byte[] chainCode = null; - File file = null; - InputStream input = null; - try { - file = new File(path); - input = new FileInputStream(file); - chainCode = new byte[input.available()]; - input.read(chainCode); - - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if(input!=null){ - input.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - return chainCode; - } - - private void register(){ - DataContractRegistry.register(TransactionContent.class); - DataContractRegistry.register(TransactionContentBody.class); - DataContractRegistry.register(TransactionRequest.class); - DataContractRegistry.register(NodeRequest.class); - DataContractRegistry.register(EndpointRequest.class); - DataContractRegistry.register(TransactionResponse.class); - DataContractRegistry.register(DataAccountKVSetOperation.class); - DataContractRegistry.register(DataAccountKVSetOperation.KVWriteEntry.class); - DataContractRegistry.register(Operation.class); - DataContractRegistry.register(ContractCodeDeployOperation.class); - DataContractRegistry.register(ContractEventSendOperation.class); - DataContractRegistry.register(DataAccountRegisterOperation.class); - DataContractRegistry.register(UserRegisterOperation.class); - DataContractRegistry.register(ParticipantRegisterOperation.class); - DataContractRegistry.register(ParticipantStateUpdateOperation.class); - } - - public BlockchainService initBcsrv(String host, int port) { - if(bcsrv!=null){ - return bcsrv; - } - NetworkAddress addr = new NetworkAddress(host, port); - GatewayServiceFactory gwsrvFact = GatewayServiceFactory.connect(addr); - bcsrv = gwsrvFact.getBlockchainService(); - return bcsrv; - } - - public boolean deploy(HashDigest ledgerHash, BlockchainIdentity contractIdentity, BlockchainKeypair ownerKey, byte[] chainCode){ - register(); - - TransactionTemplate txTpl = bcsrv.newTransaction(ledgerHash); - txTpl.contracts().deploy(contractIdentity, chainCode); - PreparedTransaction ptx = txTpl.prepare(); - ptx.sign(ownerKey); - // 提交并等待共识返回; - TransactionResponse txResp = ptx.commit(); - - // 验证结果; - contractAddress = contractIdentity.getAddress(); - this.setContractAddress(contractAddress); - System.out.println("contract's address="+contractAddress); - return txResp.isSuccess(); - } - public boolean deploy(String host, int port, HashDigest ledgerHash, BlockchainKeypair ownerKey, byte[] chainCode){ - register(); - - BlockchainIdentity contractIdentity = BlockchainKeyGenerator.getInstance().generate().getIdentity(); - initBcsrv(host,port); - return deploy(ledgerHash, contractIdentity, ownerKey, chainCode); - } - - // 根据用户指定的公钥生成合约地址 - public boolean deploy(String host, int port, String ledger,String ownerPubPath, String ownerPrvPath, - String ownerPassword, String chainCodePath,String pubPath){ - PubKey pubKey = getPubKey(pubPath); - BlockchainIdentity contractIdentity = new BlockchainIdentityData(pubKey); - byte[] chainCode = getChainCode(chainCodePath); - - BlockchainKeypair ownerKey = getKeyPair(ownerPubPath, ownerPrvPath, ownerPassword); - HashDigest ledgerHash = new HashDigest(Base58Utils.decode(ledger)); - initBcsrv(host,port); - return deploy(ledgerHash, contractIdentity, ownerKey, chainCode); - } - - -// 暂不支持从插件执行合约;此外,由于合约参数调用的格式发生变化,故此方法被废弃;by: huanghaiquan at 2019-04-30; - -// public boolean exeContract(String ledger,String ownerPubPath, String ownerPrvPath, -// String ownerPassword,String event,String contractArgs){ -// BlockchainKeypair ownerKey = getKeyPair(ownerPubPath, ownerPrvPath, ownerPassword); -// HashDigest ledgerHash = new HashDigest(Base58Utils.decode(ledger)); -// -// // 定义交易,传输最简单的数字、字符串、提取合约中的地址; -// TransactionTemplate txTpl = bcsrv.newTransaction(ledgerHash); -// txTpl.contractEvents().send(getContractAddress(),event,contractArgs.getBytes()); -// -// // 签名; -// PreparedTransaction ptx = txTpl.prepare(); -// ptx.sign(ownerKey); -// -// // 提交并等待共识返回; -// TransactionResponse txResp = ptx.commit(); -// -// // 验证结果; -// return txResp.isSuccess(); -// } - - public Bytes getContractAddress() { - return contractAddress; - } - - public void setContractAddress(Bytes contractAddress) { - this.contractAddress = contractAddress; - } -} diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java deleted file mode 100644 index 427fe00f..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.jd.blockchain; - -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.crypto.KeyGenUtils; -import com.jd.blockchain.crypto.PrivKey; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.utils.StringUtils; -import com.jd.blockchain.utils.codec.Base58Utils; -import com.jd.blockchain.utils.io.FileUtils; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.Parameter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -/** - * for contract remote deploy; - * @goal contractDeploy - * @phase process-sources - * @Author zhaogw - * @Date 2018/10/18 10:12 - */ - -@Mojo(name = "deploy") -public class ContractDeployMojo extends AbstractMojo { - Logger logger = LoggerFactory.getLogger(ContractDeployMojo.class); - - @Parameter - private File config; - - @Override - public void execute()throws MojoFailureException { - Properties prop = new Properties(); - InputStream input = null; - - try { - input = new FileInputStream(config); - prop.load(input); - - } catch (IOException ex) { - logger.error(ex.getMessage()); - throw new MojoFailureException("io error"); - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - logger.error(e.getMessage()); - } - } - } - int port; - try { - port = Integer.parseInt(prop.getProperty("port")); - }catch (NumberFormatException e){ - logger.error(e.getMessage()); - throw new MojoFailureException("invalid port"); - } - String host = prop.getProperty("host"); - String ledger = prop.getProperty("ledger"); - String pubKey = prop.getProperty("pubKey"); - String prvKey = prop.getProperty("prvKey"); - String password = prop.getProperty("password"); - String contractPath = prop.getProperty("contractPath"); - - - if(StringUtils.isEmpty(host)){ - logger.info("host不能为空"); - return; - } - - if(StringUtils.isEmpty(ledger)){ - logger.info("ledger不能为空."); - return; - } - if(StringUtils.isEmpty(pubKey)){ - logger.info("pubKey不能为空."); - return; - } - if(StringUtils.isEmpty(prvKey)){ - logger.info("prvKey不能为空."); - return; - } - if(StringUtils.isEmpty(contractPath)){ - logger.info("contractPath不能为空."); - return; - } - - File contract = new File(contractPath); - if (!contract.isFile()){ - logger.info("文件"+contractPath+"不存在"); - return; - } - byte[] contractBytes = FileUtils.readBytes(contractPath); - - - PrivKey prv = KeyGenUtils.decodePrivKeyWithRawPassword(prvKey, password); - PubKey pub = KeyGenUtils.decodePubKey(pubKey); - BlockchainKeypair blockchainKeyPair = new BlockchainKeypair(pub, prv); - HashDigest ledgerHash = new HashDigest(Base58Utils.decode(ledger)); - - StringBuffer sb = new StringBuffer(); - sb.append("host:"+ host).append(",port:"+port).append(",ledgerHash:"+ledgerHash.toBase58()). - append(",pubKey:"+pubKey).append(",prvKey:"+prv).append(",contractPath:"+contractPath); - logger.info(sb.toString()); - ContractDeployExeUtil.instance.deploy(host,port,ledgerHash, blockchainKeyPair, contractBytes); - } - -} - - diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/AbstractContract.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/AbstractContract.java deleted file mode 100644 index 389dd33a..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/AbstractContract.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.jd.blockchain.contract.maven; - -import com.jd.blockchain.contract.maven.rule.BlackList; -import com.jd.blockchain.contract.maven.rule.WhiteList; - -import java.util.List; - -public abstract class AbstractContract { - - protected String className; - - public String getClassName() { - return className; - } - - public String getDotClassName() { - return className.replaceAll("/", "."); - } - - protected String format(final String inputFormat) { - String formatResult; - - String outputFormat = inputFormat; - if (inputFormat.endsWith(";")) { - outputFormat = inputFormat.substring(0, inputFormat.length() - 1); - } - if (outputFormat.startsWith("[L") && outputFormat.length() > 2) { - // 说明是数组,但不显示 - formatResult = outputFormat.substring(2); - } else if (outputFormat.startsWith("[") && outputFormat.length() > 1) { - // 说明是数组 - formatResult = outputFormat.substring(1); - } else if (outputFormat.startsWith("L") && outputFormat.length() > 1) { - // 说明是非基础类型 - formatResult = outputFormat.substring(1); - } else { - formatResult = outputFormat; - } - - return formatResult; - } - - public static BlackList initBlack(List blackList) { - BlackList contractBlack = new BlackList(); - if (blackList != null && !blackList.isEmpty()) { - for (String black : blackList) { - // 首先判断该black是package还是 - String packageName = isPackageAndReturn(black); - if (packageName != null) { - // 说明是包 - contractBlack.addBlackPackage(packageName); - } else { - String[] classAndMethod = black.split("-"); - if (classAndMethod.length == 1) { - // 说明只有ClassName - contractBlack.addBlack(classAndMethod[0], BlackList.COMMON_METHOD); - } else { - contractBlack.addBlack(classAndMethod[0], classAndMethod[1]); - } - } - } - } - - return contractBlack; - } - - public static WhiteList initWhite(List whiteList) { - WhiteList contractWhite = new WhiteList(); - - if (whiteList != null && !whiteList.isEmpty()) { - for (String white : whiteList) { - String packageName = isPackageAndReturn(white); - if (packageName != null) { - // 说明是包 - contractWhite.addWhite(packageName); - } else { - contractWhite.addWhite(white); - } - } - } - - return contractWhite; - } - - /** - * 获取配置的packageName - * - * @param config - * @return - * 假设为包,则返回其包名,否则返回NULL - */ - public static String isPackageAndReturn(String config) { - if (config.endsWith("*")) { - return config.substring(0, config.length() - 2); - } - return null; - } -} diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractClass.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractClass.java deleted file mode 100644 index b9d3de7b..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractClass.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.jd.blockchain.contract.maven; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ContractClass extends AbstractContract { - - // 若出现同名的方法则进行合并(将两个方法中涉及到的内容合并在一起) - private Map methods = new ConcurrentHashMap<>(); - - public ContractClass(String className) { - if (className.contains(".")) { - this.className = className.replaceAll("\\.", "/"); - } else { - this.className = className; - } - } - - /** - * 返回构造方法 - * - * @return - */ - public ContractMethod constructor() { - return methods.get(ContractConstant.METHOD_INIT); - } - - /** - * 返回该类的所有变量 - * - * @return - */ - public List fields() { - - List fields = new ArrayList<>(); - - // 构造方法 - ContractMethod initMethod = constructor(); - if (initMethod != null) { - fields.addAll(initMethod.getClassFieldList(className)); - } - // CLINIT方法 - ContractMethod clInitMethod = methods.get(ContractConstant.METHOD_CLINIT); - if (clInitMethod != null) { - fields.addAll(clInitMethod.getClassFieldList(className)); - } - return fields; - } - - public synchronized ContractMethod method(String methodName) { - if (methods.containsKey(methodName)) { - return methods.get(methodName); - } - ContractMethod method = new ContractMethod(this.className, methodName); - - methods.put(methodName, method); - - return method; - } - - public Map getMethods() { - return methods; - } -} diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java deleted file mode 100644 index a98eeca3..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java +++ /dev/null @@ -1,288 +0,0 @@ -package com.jd.blockchain.contract.maven; - -import com.jd.blockchain.contract.maven.rule.BlackList; -import com.jd.blockchain.contract.maven.rule.WhiteList; -import com.jd.blockchain.contract.maven.rule.DependencyExclude; -import com.jd.blockchain.contract.maven.verify.ResolveEngine; -import com.jd.blockchain.contract.maven.verify.VerifyEngine; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.maven.artifact.Artifact; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugin.assembly.mojos.SingleAssemblyMojo; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.project.MavenProject; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; - -import static com.jd.blockchain.contract.ContractJarUtils.BLACK_CONF; -import static com.jd.blockchain.contract.ContractJarUtils.WHITE_CONF; - -@Mojo(name = "compile") -public class ContractCompileMojo extends SingleAssemblyMojo { - - public static final String JAR_DEPENDENCE = "jar-with-dependencies"; - - public static final String SCOPE_PROVIDED = "provided"; - - public static final String SCOPE_COMPILE = "compile"; - - private DependencyExclude dependencyExclude = new DependencyExclude(); - - private static BlackList black; - - private static WhiteList white; - - static { - init(); - } - - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - // 首先对MainClass进行校验,要求必须有MainClass - String mainClass = mainClassVerify(); - - // 排除所有依赖,只打包当前代码 -// excludeAllArtifactExclude(super.getProject().getDependencyArtifacts()); -// handleArtifactCompile(super.getProject().getDependencyArtifacts()); - handleArtifactExclude(super.getProject().getDependencyArtifacts()); - - // 此参数用于设置将所有第三方依赖的Jar包打散为.class,与主代码打包在一起,生成一个jar包 - super.setDescriptorRefs(new String[]{JAR_DEPENDENCE}); - - // 执行打包命令 - // 该命令生成的是只含有当前项目的实际代码的Jar包,该Jar包仅用于校验MainClass - super.execute(); - - // 生成解析引擎 - ResolveEngine resolveEngine = new ResolveEngine(getLog(), mainClass); - - // 获取本次生成的Jar文件 - File defaultJarFile; - try { - defaultJarFile = rename(getProject(), getFinalName()); - // 校验当前MainClass是否满足需求 - resolveEngine.verifyCurrentProjectMainClass(defaultJarFile); - // 校验完成后将该Jar删除 -// FileUtils.forceDelete(mainClassFile); - } catch (Exception e) { - getLog().error(e); - throw new MojoFailureException(e.getMessage()); - } - -// // 将JDChain本身之外的代码打包进Jar包,然后编译 -// handleArtifactExclude(super.getProject().getDependencyArtifacts()); -// -// // 此参数用于设置将所有第三方依赖的Jar包打散为.class,与主代码打包在一起,生成一个jar包 -// super.setDescriptorRefs(new String[]{JAR_DEPENDENCE}); -// -// // 生成Jar包(该Jar包中不包含JDChain内部的代码) -// super.execute(); -// -// File defaultJarFile; -// try { -// defaultJarFile = rename(getProject(), getFinalName()); -// } catch (Exception e) { -// getLog().error(e); -// throw new MojoFailureException(e.getMessage()); -// } - - // 校验该Jar包 - verify(defaultJarFile, mainClass); - - File deployJarFile = resolveEngine.verify(defaultJarFile); - - // 删除中间产生的临时文件 - try { - FileUtils.forceDelete(defaultJarFile); - } catch (Exception e) { - getLog().error(e); - } - - getLog().info(String.format("JDChain's Contract compile success, path = %s !", deployJarFile.getPath())); - - - -// // 将JDChain本身代码之外的代码移除(不打包进整个Jar) -// handleArtifactExclude(super.getProject().getDependencyArtifacts()); -// -// // 此参数用于设置将所有第三方依赖的Jar包打散为.class,与主代码打包在一起,生成一个jar包 -// super.setDescriptorRefs(new String[]{JAR_DEPENDENCE}); -// -// // 执行打包命令 -// super.execute(); - -// // 将本次打包好的文件重新命名,以便于后续重新打包需要 -// // 把文件改名,然后重新再生成一个文件 -// File dstFile; -// try { -// dstFile = rename(getProject(), getFinalName()); -// } catch (IOException e) { -// getLog().error(e); -// throw new MojoFailureException(e.getMessage()); -// } -// -// // dstFile理论上应该含有 -// -// // 首先校验该类的Jar包中是否包含不符合规范的命名,以及该类的代码中的部分解析 -// -// ResolveEngine resolveEngine = new ResolveEngine(getLog(), mainClass); -// -// // 校验mainClass -// resolveEngine.verifyCurrentProjectMainClass(dstFile); -// -// -// -// File finalJarFile = resolveEngine.verify(); -// -// // 将所有的依赖的jar包全部打包进一个包中,以便于进行ASM检查 -// handleArtifactCompile(super.getProject().getDependencyArtifacts()); -// -// // 然后再打包一次,本次打包完成后,其中的代码包含所有的class(JDK自身的除外) -// super.execute(); -// -// File jarFile = new File(jarPath(getProject(), getFinalName())); -// -// // 校验mainClass -// resolveEngine.verifyCurrentProjectMainClass(jarFile); -// -// // 对代码中的一些规则进行校验,主要是校验其是否包含一些不允许使用的类、包、方法等 -// verify(jarFile, mainClass); -// -// // 删除中间的一些文件 -//// try { -//// FileUtils.forceDelete(dstFile); -//// } catch (IOException e) { -//// throw new MojoFailureException(e.getMessage()); -//// } -// - // 若执行到此处没有异常则表明打包成功,打印打包成功消息 -// getLog().info(String.format("JDChain's Contract compile success, path = %s !", finalJarFile.getPath())); - } - - private String mainClassVerify() throws MojoFailureException { - // 要求必须有MainClass - String mainClass; - try { - mainClass = super.getJarArchiveConfiguration().getManifest().getMainClass(); - // 校验MainClass,要求MainClass必须不能为空 - if (mainClass == null || mainClass.length() == 0) { - throw new MojoFailureException("MainClass is NULL !!!"); - } - super.getLog().debug("MainClass is " + mainClass); - } catch (Exception e) { - throw new MojoFailureException("MainClass is null: " + e.getMessage(), e ); - } - return mainClass; - } - - private void handleArtifactExclude(Set artifacts) { - for (Artifact artifact : artifacts) { - String groupId = artifact.getGroupId(), artifactId = artifact.getArtifactId(); - if (dependencyExclude.isExclude(groupId, artifactId)) { - getLog().info(String.format("GroupId[%s] ArtifactId[%s] belongs to DependencyExclude !!!", groupId, artifactId)); - // 属于排除的名单之中 - artifact.setScope(SCOPE_PROVIDED); - } else { - getLog().info(String.format("GroupId[%s] ArtifactId[%s] not belongs to DependencyExclude !!!", groupId, artifactId)); - // 属于排除的名单之中 - artifact.setScope(SCOPE_COMPILE); - } - } - } - - private void excludeAllArtifactExclude(Set artifacts) { - for (Artifact artifact : artifacts) { - artifact.setScope(SCOPE_PROVIDED); - } - } - - private void handleArtifactCompile(Set artifacts) { - for (Artifact artifact : artifacts) { - if (artifact.getScope().equals(SCOPE_PROVIDED)) { - // 将所有的provided设置为compile,以便于后续编译 - artifact.setScope(SCOPE_COMPILE); - } - } - } - - private File rename(MavenProject project, String finalName) throws IOException { - String srcJarPath = jarPath(project, finalName); - String dstJarPath = project.getBuild().getDirectory() + - File.separator + finalName + ".jar"; - File dstFile = new File(dstJarPath); - FileUtils.copyFile(new File(srcJarPath), dstFile); - FileUtils.forceDelete(new File(srcJarPath)); - return dstFile; - } - - private String jarPath(MavenProject project, String finalName) { - return project.getBuild().getDirectory() + - File.separator + finalName + "-" + JAR_DEPENDENCE + ".jar"; - } - - private void verify(File jarFile, String mainClass) throws MojoFailureException { - try { - VerifyEngine verifyEngine = new VerifyEngine(getLog(), jarFile, mainClass, black, white); - - verifyEngine.verify(); - - // 校验完成后将该jar包删除 -// FileUtils.forceDelete(jarFile); - - } catch (Exception e) { - getLog().error(e); - throw new MojoFailureException(e.getMessage()); - } - } - - - - private static void init() { - try { - black = AbstractContract.initBlack(loadBlackConf()); - white = AbstractContract.initWhite(loadWhiteConf()); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - private static List loadWhiteConf() { - - return resolveConfig(WHITE_CONF); - } - - private static List loadBlackConf() { - return resolveConfig(BLACK_CONF); - } - - private static List resolveConfig(String fileName) { - List configs = new ArrayList<>(); - - try { - List readLines = loadConfig(fileName); - if (!readLines.isEmpty()) { - for (String readLine : readLines) { - String[] lines = readLine.split(","); - configs.addAll(Arrays.asList(lines)); - } - } - } catch (Exception e) { - throw new IllegalStateException(e); - } - - return configs; - } - - public static List loadConfig(String fileName) throws Exception { - - return IOUtils.readLines( - ContractCompileMojo.class.getResourceAsStream("/" + fileName)); - } -} diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractConstant.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractConstant.java deleted file mode 100644 index a94fb624..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractConstant.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.jd.blockchain.contract.maven; - -public class ContractConstant { - - public static final String METHOD_INIT = ""; - - public static final String METHOD_CLINIT = ""; - -} diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractField.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractField.java deleted file mode 100644 index f4b0f396..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractField.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.jd.blockchain.contract.maven; - -public class ContractField extends AbstractContract { - - private String fieldName; - - private String fieldType; - - private boolean isStatic; - - public ContractField(String className, String fieldName, String fieldType) { - this(className, fieldName, fieldType, false); - } - - public ContractField(String className, String fieldName, String fieldType, boolean isStatic) { - this.className = format(className); - this.fieldName = fieldName; - this.fieldType = format(fieldType); - this.isStatic = isStatic; - } - - public String getFieldName() { - return fieldName; - } - - public String getFieldType() { - return fieldType; - } - - public boolean isStatic() { - return isStatic; - } - - @Override - public String toString() { - return "ContractField{" + - "className='" + className + '\'' + - ", fieldName='" + fieldName + '\'' + - ", fieldType='" + fieldType + '\'' + - ", isStatic=" + isStatic + - '}'; - } -} diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractMethod.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractMethod.java deleted file mode 100644 index 6dc2e3a7..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractMethod.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.jd.blockchain.contract.maven; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ContractMethod extends AbstractContract { - - private String methodName; - - private String[] paramTypes; - - private String[] returnTypes; - - private List fieldList = new ArrayList<>(); - - private List methodList = new ArrayList<>(); - - public ContractMethod(String className, String methodName) { - this(className, methodName, null, null); - } - - public ContractMethod(String className, String methodName, String[] paramTypes, String[] returnTypes) { - this.className = format(className); - this.methodName = methodName; - this.paramTypes = paramTypes; - this.returnTypes = returnTypes; - } - - public void addMethod(String className, String methodName, String[] paramTypes, String[] returnTypes) { - methodList.add(new ContractMethod(className, methodName, paramTypes, returnTypes)); - } - - public void addField(String className, String fieldName, String fieldType) { - this.fieldList.add(new ContractField(className, fieldName, fieldType)); - } - - public void addStaticField(String className, String fieldName, String fieldType) { - this.fieldList.add(new ContractField(className, fieldName, fieldType, true)); - } - - public String getMethodName() { - return methodName; - } - - public String[] getParamTypes() { - return paramTypes; - } - - public List getAllFieldList() { - return fieldList; - } - - public List getClassFieldList(String cName) { - List classFieldList = new ArrayList<>(); - if (!fieldList.isEmpty()) { - for (ContractField field : fieldList) { - if (field.getClassName().equals(cName)) { - classFieldList.add(field); - } - } - } - return classFieldList; - } - - public List getMethodList() { - return methodList; - } - - @Override - public String toString() { - return "ContractMethod{" + - "className='" + className + '\'' + - ", methodName='" + methodName + '\'' + - ", paramTypes=" + Arrays.toString(paramTypes) + - ", returnTypes=" + Arrays.toString(returnTypes) + - ", fieldList=" + fieldList + - ", methodList=" + methodList + - '}'; - } -} diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/asm/ASMClassVisitor.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/asm/ASMClassVisitor.java deleted file mode 100644 index 27bfeee4..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/asm/ASMClassVisitor.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jd.blockchain.contract.maven.asm; - -import com.jd.blockchain.contract.maven.ContractClass; -import com.jd.blockchain.contract.maven.ContractMethod; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -public class ASMClassVisitor extends ClassVisitor { - - private ContractClass contractClass; - - public ASMClassVisitor(ContractClass contractClass) { - super(Opcodes.ASM5); - this.contractClass = contractClass; - } - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - MethodVisitor superMV = super.visitMethod(access, name, desc, signature, exceptions); - ContractMethod method = this.contractClass.method(name); - return new ASMMethodVisitor(superMV, method); - } -} \ No newline at end of file diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/asm/ASMMethodVisitor.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/asm/ASMMethodVisitor.java deleted file mode 100644 index 03488203..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/asm/ASMMethodVisitor.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.jd.blockchain.contract.maven.asm; - -import com.jd.blockchain.contract.maven.ContractMethod; -import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.TypePath; - -import java.util.ArrayList; -import java.util.List; - -public class ASMMethodVisitor extends MethodVisitor { - - private ContractMethod method; - - public ASMMethodVisitor(MethodVisitor mv, ContractMethod method) { - super(Opcodes.ASM5, mv); - this.method = method; - } - - @Override - public void visitFieldInsn(int type, String cName, String fName, String fType) { - if (type == 178 || type == 179) { - this.method.addStaticField(cName, fName, fType); - } else { - this.method.addField(cName, fName, fType); - } - super.visitFieldInsn(type, cName, fName, fType); - } - - @Override - public void visitMethodInsn(int type, String cName, String mName, String params, boolean b) { - ParamsAndReturn paramsAndReturn = resolveParamsAndReturn(params); - this.method.addMethod(cName, mName, paramsAndReturn.paramTypes, paramsAndReturn.returnTypes); - super.visitMethodInsn(type, cName, mName, params, b); - } - - private ParamsAndReturn resolveParamsAndReturn(String params) { - // 格式: - // 1、(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; - // 2、()I - // 3、(Ljava/lang/String;)V - // 4、()V - // 5、([Ljava/lang/Object;)Ljava/util/List; false - // 从上面分析可以得出:括号内的是入参,右括号后面的是返回值,其中V表示Void,即空; - String[] paramArray = params.split("\\)"); - String paramTypeChars = ""; - if (!paramArray[0].equals("(")) { - // 表明入参不为空 - paramTypeChars = paramArray[0].split("\\(")[1]; - } - String returnTypeChars = paramArray[1]; - return new ParamsAndReturn(paramTypeChars, returnTypeChars); - } - - static class ParamsAndReturn { - - String[] paramTypes; - - String[] returnTypes; - - public ParamsAndReturn(String paramsTypeChars, String returnTypeChars) { - initParamsType(paramsTypeChars); - initReturnType(returnTypeChars); - } - - private void initParamsType(String paramsTypeChars) { - List paramList = handleTypes(paramsTypeChars); - if (!paramList.isEmpty()) { - this.paramTypes = new String[paramList.size()]; - paramList.toArray(this.paramTypes); - } - } - - private void initReturnType(String returnTypeChar) { - // 按照分号分隔 - List returnList = handleTypes(returnTypeChar); - if (!returnList.isEmpty()) { - this.returnTypes = new String[returnList.size()]; - returnList.toArray(this.returnTypes); - } - } - - private List handleTypes(String typeChars) { - String[] types = typeChars.split(";"); - List typeList = new ArrayList<>(); - if (types.length > 0) { - for (String type : types) { - if (type.length() > 0) { - if (type.startsWith("[L") && type.length() > 2) { - // 说明是数组 - typeList.add(type.substring(2) + "[]"); - } else if (type.startsWith("[") && type.length() > 1) { - // 说明是数组 - typeList.add(type.substring(1)); - } else if (type.startsWith("L") && type.length() > 1) { - // 说明是非基础类型 - typeList.add(type.substring(1)); - } else { - typeList.add(type); - } - } - } - } - return typeList; - } - } -} \ No newline at end of file diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/BlackList.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/BlackList.java deleted file mode 100644 index 593093aa..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/BlackList.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.jd.blockchain.contract.maven.rule; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -public class BlackList { - - public static final String COMMON_METHOD = "*"; - - public static final String INIT_METHOD = "init"; - - // 合约黑名单 - private final Map blackClassMap = new ConcurrentHashMap<>(); - - private final List blackPackages = new ArrayList<>(); - - public synchronized BlackList addBlack(String className, String methodName) { - String trimClassName = className.trim(); - BlackClass blackClass = blackClassMap.get(trimClassName); - if (blackClass != null) { - blackClass.addMethod(methodName); - } else { - blackClass = new BlackClass(trimClassName); - blackClass.addMethod(methodName); - blackClassMap.put(trimClassName, blackClass); - } - return this; - } - - public synchronized BlackList addBlack(Class clazz, String methodName) { - return addBlack(clazz.getName(), methodName); - } - - public synchronized BlackList addBlack(Class clazz) { - return addBlack(clazz.getName(), COMMON_METHOD); - } - - public synchronized BlackList addBlackPackage(String packageName) { - blackPackages.add(packageName.trim() + "."); // 末尾增加一个点,防止后续判断是拼凑 - return this; - } - - public boolean isBlackClass(String className) { - if (isContainsPackage(className)) { - return true; - } - BlackClass blackClass = blackClassMap.get(className); - if (blackClass == null) { - return false; - } - return blackClass.isBlack(); - } - - public boolean isBlack(Class clazz, String methodName) { - - // 判断该Class是否属于黑名单 - if (isCurrentClassBlack(clazz, methodName)) { - return true; - } - // 当前Class不是黑名单的情况下,处理其对应的父类和接口 - // 获取该Class对应的接口和父类列表 - Set> superClassAndAllInterfaces = new HashSet<>(); - - loadSuperClassAndAllInterfaces(clazz, superClassAndAllInterfaces); - - // 循环判断每个父类和接口 - for (Class currClass : superClassAndAllInterfaces) { - if (isCurrentClassBlack(currClass, methodName)) { - return true; - } - } - return false; - } - - public boolean isCurrentClassBlack(Class clazz, String methodName) { - - String packageName = clazz.getPackage().getName(); - for (String bp : blackPackages) { - if ((packageName + ".").equals(bp) || packageName.startsWith(bp)) { - return true; - } - } - // 判断该类本身是否属于黑名单 - String className = clazz.getName(); - BlackClass blackClass = blackClassMap.get(className); - if (blackClass != null) { - // 判断其方法 - return blackClass.isBlack(methodName); - } - return false; - } - - public boolean isBlackField(Class clazz) { - return isBlack(clazz, INIT_METHOD); - } - - private boolean isContainsPackage(String className) { - for (String bp : blackPackages) { - if (className.equals(bp) || className.startsWith(bp)) { - return true; - } - } - return false; - } - - private void loadSuperClassAndAllInterfaces(Class currentClass, Set> allClassList) { - if (currentClass == null) { - return; - } - - if (!allClassList.contains(currentClass)) { - allClassList.add(currentClass); - // 处理其父类 - Class superClass = currentClass.getSuperclass(); - loadSuperClassAndAllInterfaces(superClass, allClassList); - - // 处理其所有接口 - Class[] allInterfaces = currentClass.getInterfaces(); - if (allInterfaces != null && allInterfaces.length > 0) { - for (Class intf : allInterfaces) { - loadSuperClassAndAllInterfaces(intf, allClassList); - } - } - } - } - - private static class BlackClass { - - String className; - - Set methods = new HashSet<>(); - - BlackClass(String className) { - this.className = className; - } - - void addMethod(String methodName) { - methods.add(methodName); - } - - boolean isBlack(String methodName) { - // 假设method为*则表示所有的方法 - if (methods.contains(COMMON_METHOD)) { - return true; - } - return methods.contains(methodName); - } - - boolean isBlack() { - return isBlack(COMMON_METHOD); - } - } -} - - diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/DependencyExclude.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/DependencyExclude.java deleted file mode 100644 index c20ce777..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/DependencyExclude.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.jd.blockchain.contract.maven.rule; - -import com.jd.blockchain.contract.maven.ContractCompileMojo; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class DependencyExclude { - - private static final String COMMON_ARTIFACTID = "*"; - - private static final String CONFIG = "providers.conf"; - - private static final Map> DEPENDENCYS = new ConcurrentHashMap<>(); - - static { - try { - init(); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - private static void init() throws Exception { - List readLines = ContractCompileMojo.loadConfig(CONFIG); - if (!readLines.isEmpty()) { - for (String line : readLines) { - // groupId/artifactId - String[] lines = line.split(","); - if (lines.length > 0) { - for (String depend : lines) { - String[] depends = depend.split("/"); - if (depends.length == 2) { - String groupId = depends[0], artifactId = depends[1]; - Dependency dependency = new Dependency(groupId, artifactId); - addDependency(dependency); - } - } - } - } - } - } - - private synchronized static void addDependency(Dependency dependency) { - String groupId = dependency.groupId; - if (!DEPENDENCYS.containsKey(groupId)) { - List dependencies = new ArrayList<>(); - dependencies.add(dependency); - DEPENDENCYS.put(groupId, dependencies); - } else { - List dependencies = DEPENDENCYS.get(groupId); - dependencies.add(dependency); - } - } - - public boolean isExclude(String groupId, String artifactId) { - List dependencies = DEPENDENCYS.get(groupId); - - if (dependencies == null || dependencies.isEmpty()) { - return false; - } - - for (Dependency dependency : dependencies) { - if (dependency.isEqualArtifactId(artifactId)) { - return true; - } - } - - return false; - } - - - static class Dependency { - - String groupId; - - String artifactId; - - public Dependency(String groupId, String artifactId) { - this.groupId = groupId; - this.artifactId = artifactId; - } - - public boolean isEqualArtifactId(String artiId) { - if (artifactId.equals(COMMON_ARTIFACTID)) { - return true; - } - return artifactId.equals(artiId); - } - } -} diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/WhiteList.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/WhiteList.java deleted file mode 100644 index eeb1e250..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/WhiteList.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jd.blockchain.contract.maven.rule; - -import java.util.ArrayList; -import java.util.List; - -public class WhiteList { - - // 合约白名单(白名单通常数量较少,主要是JDChain内部包) - private final List whiteClasses = new ArrayList<>(); - - public void addWhite(String className) { - whiteClasses.add(className.trim()); - } - - public boolean isWhite(Class clazz) { - String className = clazz.getName(); - return isWhite(className); - } - - public boolean isWhite(String className) { - for (String white : whiteClasses) { - if (white.equals(className) || className.startsWith(white)) { - return true; - } - } - return false; - } -} - - diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/ResolveEngine.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/ResolveEngine.java deleted file mode 100644 index 97744689..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/ResolveEngine.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.jd.blockchain.contract.maven.verify; - -import com.alibaba.fastjson.JSON; -import com.jd.blockchain.contract.Contract; -import com.jd.blockchain.contract.ContractJarUtils; -import com.jd.blockchain.contract.ContractType; -import com.jd.blockchain.contract.EventProcessingAware; -import org.apache.commons.io.FileUtils; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugin.logging.Log; - -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.net.URLClassLoader; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -import static com.jd.blockchain.contract.ContractJarUtils.*; - -public class ResolveEngine { - - private Log LOGGER; - -// private File jarFile; - - private String mainClass; - -// public ResolveEngine(Log LOGGER, File jarFile, String mainClass) { - public ResolveEngine(Log LOGGER, String mainClass) { - this.LOGGER = LOGGER; -// this.jarFile = jarFile; - this.mainClass = mainClass; - } - - /** - * 校验当前项目中MainClass其是否满足JDChain合约写法 - * - * @param mainClassJarFile - * @throws MojoFailureException - */ - public void verifyCurrentProjectMainClass(File mainClassJarFile) throws MojoFailureException { - // 校验MainClass - try { - LOGGER.debug(String.format("Verify Jar [%s] 's MainClass start...", mainClassJarFile.getName())); - // 自定义ClassLoader,必须使用Thread.currentThread().getContextClassLoader() - // 保证其项目内部加载的Jar包无须再加载一次 - URLClassLoader classLoader = new URLClassLoader(new URL[]{mainClassJarFile.toURI().toURL()}, - Thread.currentThread().getContextClassLoader()); - - // 从MainClass作为入口进行MainClass代码校验 - Class mClass = classLoader.loadClass(mainClass); - ContractType.resolve(mClass); - - // 校验完成后需要释放,否则无法删除该Jar文件 - classLoader.close(); - - LOGGER.debug(String.format("Verify Jar [%s] 's MainClass end...", mainClassJarFile.getName())); - } catch (Exception e) { - throw new MojoFailureException(e.getMessage()); - } - } - - public File verify(File defaultJarFile) throws MojoFailureException { - try { - // 检查jar包中所有的class的命名,要求其包名不能为com.jd.blockchain.* - LinkedList totalClasses = loadAllClass(defaultJarFile); - - if (!totalClasses.isEmpty()) { - - for (String clazz : totalClasses) { - - String dotClassName = dotClassName(clazz); - - LOGGER.debug(String.format("Verify Dependency Class[%s] start......", dotClassName)); - // 获取其包名 - // 将class转换为包名 - String packageName = class2Package(dotClassName); - - if (ContractJarUtils.isJDChainPackage(packageName)) { - throw new IllegalStateException(String.format("Class[%s]'s package[%s] cannot start with %s !", - dotClassName, packageName, ContractJarUtils.JDCHAIN_PACKAGE)); - } - - LOGGER.debug(String.format("Verify Class[%s] end......", clazz)); - } - } - - // 处理完成之后,生成finalName-JDChain-Contract.jar - return compileCustomJar(defaultJarFile); - } catch (Exception e) { - LOGGER.error(e.getMessage()); - throw new MojoFailureException(e.getMessage()); - } - } - - private String class2Package(String dotClassName) { - - return dotClassName.substring(0, dotClassName.lastIndexOf(".")); - } - - private File compileCustomJar(File defaultJarFile) throws IOException { - - String fileParentPath = defaultJarFile.getParentFile().getPath(); - - String jarFileName = defaultJarFile.getName(); - - String fileName = jarFileName.substring(0, jarFileName.lastIndexOf(".")); - - // 首先将Jar包转换为指定的格式 - String dstJarPath = fileParentPath + File.separator + - fileName + "-temp-" + System.currentTimeMillis() + ".jar"; - - File srcJar = defaultJarFile, dstJar = new File(dstJarPath); - - LOGGER.debug(String.format("Jar from [%s] to [%s] Copying", defaultJarFile.getPath(), dstJarPath)); - // 首先进行Copy处理 - copy(srcJar, dstJar); - - LOGGER.debug(String.format("Jar from [%s] to [%s] Copied", defaultJarFile.getPath(), dstJarPath)); - - byte[] txtBytes = contractMF(FileUtils.readFileToByteArray(dstJar)).getBytes(StandardCharsets.UTF_8); - - String finalJarPath = fileParentPath + File.separator + fileName + "-JDChain-Contract.jar"; - - File finalJar = new File(finalJarPath); - - // 生成最终的Jar文件 - copy(dstJar, finalJar, contractMFJarEntry(), txtBytes, null); - - // 删除临时文件 - FileUtils.forceDelete(dstJar); - - return finalJar; - } - - private ClassLoader verifyMainClass(File jarFile) throws Exception { - // 加载main-class,开始校验类型 - LOGGER.debug(String.format("Verify Jar [%s] 's MainClass start...", jarFile.getName())); - URL jarURL = jarFile.toURI().toURL(); - ClassLoader classLoader = new URLClassLoader(new URL[]{jarURL}); - Class mClass = classLoader.loadClass(mainClass); - ContractType.resolve(mClass); - LOGGER.debug(String.format("Verify Jar [%s] 's MainClass end...", jarFile.getName())); - return classLoader; - } - - private LinkedList loadAllClass(File file) throws Exception { - JarFile jarFile = new JarFile(file); - LinkedList allClass = new LinkedList<>(); - Enumeration jarEntries = jarFile.entries(); - while (jarEntries.hasMoreElements()) { - JarEntry jarEntry = jarEntries.nextElement(); - String entryName = jarEntry.getName(); - if (entryName.endsWith(".class")) { - // 内部类,不需要处理 - if (!entryName.contains("$")) { - allClass.addLast(entryName.substring(0, entryName.length() - 6)); - } - } - } - // Jar文件使用完成后需要关闭,否则可能会产生无法删除的问题 - jarFile.close(); - - return allClass; - } -} diff --git a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/VerifyEngine.java b/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/VerifyEngine.java deleted file mode 100644 index 7fd59c7e..00000000 --- a/core/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/VerifyEngine.java +++ /dev/null @@ -1,224 +0,0 @@ -package com.jd.blockchain.contract.maven.verify; - -import com.jd.blockchain.contract.ContractJarUtils; -import com.jd.blockchain.contract.maven.ContractClass; -import com.jd.blockchain.contract.maven.ContractField; -import com.jd.blockchain.contract.maven.ContractMethod; -import com.jd.blockchain.contract.maven.asm.ASMClassVisitor; -import com.jd.blockchain.contract.maven.rule.BlackList; -import com.jd.blockchain.contract.maven.rule.WhiteList; -import org.apache.maven.plugin.logging.Log; -import org.objectweb.asm.ClassReader; - -import java.io.File; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import static com.jd.blockchain.contract.ContractJarUtils.loadAllClasses; - - -public class VerifyEngine { - - private Log LOGGER; - - private File jarFile; - - private String mainClass; - - private BlackList black; - - private WhiteList white; - - // 代表的只是当前方法,不代表该方法中的内部方法 - private Set haveManagedMethods = new HashSet<>(); - - // 代表的是处理的参数 - private Set haveManagedFields = new HashSet<>(); - - public VerifyEngine(Log LOGGER, File jarFile, String mainClass, BlackList black, WhiteList white) { - this.LOGGER = LOGGER; - this.jarFile = jarFile; - this.mainClass = mainClass; - this.black = black; - this.white = white; - } - - public void verify() throws Exception { - // 加载所有的jar,然后ASM获取MAP - URL jarURL = jarFile.toURI().toURL(); - - URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{jarURL}, - Thread.currentThread().getContextClassLoader()); - - // 解析Jar包中所有的Class - Map allContractClasses = resolveClasses(jarClasses()); - - // 开始处理MainClass - verify(urlClassLoader, allContractClasses); - - // 校验完成后需要释放ClassLoader,否则无法删除该Jar包 - urlClassLoader.close(); - } - - public void verify(URLClassLoader urlClassLoader, Map allContractClasses) throws Exception { - // 获取MainClass - String mainClassKey = convertClassKey(mainClass); - ContractClass mainContractClass = allContractClasses.get(mainClassKey); - if (mainContractClass == null) { - LOGGER.error(String.format("Load Main Class = [%s] NULL !!!", mainClass)); - throw new IllegalStateException("MainClass is NULL !!!"); - } - // 校验该Class中所有方法 - Map methods = mainContractClass.getMethods(); - if (!methods.isEmpty()) { - for (Map.Entry entry : methods.entrySet()) { - ContractMethod method = entry.getValue(); - verify(urlClassLoader, allContractClasses, method); - } - } - } - - public void verify(URLClassLoader urlClassLoader, Map allContractClasses, ContractMethod method) throws Exception { - // 获取方法中涉及到的所有的Class及Method - // 首先判断该方法对应的Class是否由urlClassLoader加载 - // 首先判断该ClassName对应方法是否处理过 - String managedKey = managedKey(method); - if (haveManagedMethods.contains(managedKey)) { - return; - } - // 将该方法设置为已处理 - haveManagedMethods.add(managedKey); - String dotClassName = method.getDotClassName(); - - - Class dotClass = urlClassLoader.loadClass(dotClassName); - - if (dotClass == null) { - return; - } - String dotClassLoader = null; - ClassLoader classLoader = dotClass.getClassLoader(); - - if (classLoader != null) { - dotClassLoader = dotClass.getClassLoader().toString(); - } - - if (dotClassLoader != null && dotClassLoader.contains("URLClassLoader")) { - - // 说明是URLClassLoader,这个需要先从黑名单和白名单列表中操作 - // 首先判断是否是黑名单,黑名单优先级最高 - if (black.isBlack(dotClass, method.getMethodName())) { - throw new IllegalStateException(String.format("Class [%s] Method [%s] is Black !!!", dotClassName, method.getMethodName())); - } else { - // 不是黑名单的情况下,判断是否为白名单 - if (white.isWhite(dotClass)) { - return; - } - // 如果不属于白名单,则需要判断其子方法 - List innerMethods = method.getMethodList(); - if (!innerMethods.isEmpty()) { - for (ContractMethod innerMethod : innerMethods) { - // 需要重新从AllMap中获取,因为生成时并未处理其关联关系 - ContractClass innerClass = allContractClasses.get(innerMethod.getClassName()); - if (innerClass != null) { - ContractMethod verifyMethod = innerClass.method(innerMethod.getMethodName()); - verify(urlClassLoader, allContractClasses, verifyMethod); - } else { - verify(urlClassLoader, allContractClasses, innerMethod); - } - } - } - List innerFields = method.getAllFieldList(); - if (!innerFields.isEmpty()) { - for (ContractField innerField : innerFields) { - verify(urlClassLoader, innerField); - } - } - } - } else { - // 非URLClassLoader加载的类,只需要做判断即可 - // 对于系统加载的类,其白名单优先级高于黑名单 - // 1、不再需要获取其方法; - // 首先判断是否为白名单 - if (white.isWhite(dotClass)) { - return; - } - // 然后判断其是否为黑名单 - if (black.isBlack(dotClass, method.getMethodName())) { - throw new IllegalStateException(String.format("Class [%s] Method [%s] is Black !!!", dotClassName, method.getMethodName())); - } - } - } - - public void verify(URLClassLoader urlClassLoader, ContractField field) throws Exception { - // 获取方法中涉及到的所有的Class及Method - // 首先判断该方法对应的Class是否由urlClassLoader加载 - // 首先判断该ClassName对应方法是否处理过 - String managedKey = managedKey(field); - if (haveManagedFields.contains(managedKey)) { - return; - } - // 将该字段设置为已读 - haveManagedFields.add(managedKey); - - Class dotClass = urlClassLoader.loadClass(field.getDotClassName()); - - if (dotClass == null) { - return; - } - - if (black.isBlackField(dotClass)) { - throw new IllegalStateException(String.format("Class [%s] Field [%s] is Black !!!", field.getDotClassName(), field.getFieldName())); - } - } - - private Map jarClasses() throws Exception { - return loadAllClasses(jarFile); - } - - private Map resolveClasses(Map allClasses) { - - Map allContractClasses = new ConcurrentHashMap<>(); - - for (Map.Entry entry : allClasses.entrySet()) { - byte[] classContent = entry.getValue(); - if (classContent == null || classContent.length == 0) { - continue; - } - String className = entry.getKey().substring(0, entry.getKey().length() - 6); - - String dotClassName = ContractJarUtils.dotClassName(className); - if (white.isWhite(dotClassName) || black.isBlackClass(dotClassName)) { - continue; - } - - ContractClass contractClass = new ContractClass(className); - ClassReader cr = new ClassReader(classContent); - cr.accept(new ASMClassVisitor(contractClass), ClassReader.SKIP_DEBUG); - allContractClasses.put(className, contractClass); - } - return allContractClasses; - } - - private String convertClassKey(final String classKey) { - String newClassKey = classKey; - if (classKey.endsWith(".class")) { - newClassKey = classKey.substring(0, classKey.length() - 6); - } - newClassKey = newClassKey.replaceAll("\\.", "/"); - return newClassKey; - } - - private String managedKey(ContractMethod method) { - return method.getDotClassName() + "-" + method.getMethodName(); - } - - private String managedKey(ContractField field) { - return field.getDotClassName() + "--" + field.getFieldName(); - } -} diff --git a/core/contract/contract-maven-plugin/src/main/resources/blacks.conf b/core/contract/contract-maven-plugin/src/main/resources/blacks.conf deleted file mode 100644 index caa20370..00000000 --- a/core/contract/contract-maven-plugin/src/main/resources/blacks.conf +++ /dev/null @@ -1,19 +0,0 @@ -java.io.File -java.io.InputStream -java.io.OutputStream -java.io.DataInput -java.io.DataOutput -java.io.Reader -java.io.Writer -java.io.Flushable -java.nio.channels.* -java.nio.file.* -java.net.* -java.sql.* -java.lang.reflect.* -java.lang.Class -java.lang.ClassLoader -java.util.Random -java.lang.System-currentTimeMillis -java.lang.System-nanoTime -com.jd.blockchain.ledger.BlockchainKeyGenerator-generate \ No newline at end of file diff --git a/core/contract/contract-maven-plugin/src/main/resources/providers.conf b/core/contract/contract-maven-plugin/src/main/resources/providers.conf deleted file mode 100644 index b2df66eb..00000000 --- a/core/contract/contract-maven-plugin/src/main/resources/providers.conf +++ /dev/null @@ -1,22 +0,0 @@ -com.jd.blockchain/* -com.alibaba/fastjson -org.slf4j/* -org.apache.logging.log4j/* -org.aspectj/* -redis.clients/* -org.rocksdb/* -io.grpc/* -org.apache.commons/* -org.apache.httpcomponents/* -org.apache.logging.log4j/* -org.reflections/reflections -com.google.guava/guava -commons-cli/commons-cli -commons-codec/commons-codec -commons-httpclient/commons-httpclient -commons-io/commons-io -io.netty/* -org.slf4j/* -org.springframework.boot/* -org.springframework.security/* -org.springframework/* \ No newline at end of file diff --git a/core/contract/contract-maven-plugin/src/main/resources/whites.conf b/core/contract/contract-maven-plugin/src/main/resources/whites.conf deleted file mode 100644 index 08e7d754..00000000 --- a/core/contract/contract-maven-plugin/src/main/resources/whites.conf +++ /dev/null @@ -1,3 +0,0 @@ -com.jd.blockchain.* -java.nio.charset.Charset -com.alibaba.fastjson.* \ No newline at end of file diff --git a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractDeployMojoTest.java b/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractDeployMojoTest.java deleted file mode 100644 index bb907445..00000000 --- a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractDeployMojoTest.java +++ /dev/null @@ -1,21 +0,0 @@ -//package com.jd.blockchain.ledger; -// -//import com.jd.blockchain.contract.maven.ContractDeployMojo; -// -//import java.lang.reflect.Field; -// -///** -// * for contract deploy and exe; -// * @Author zhaogw -// * @Date 2018/11/02 09:06 -// */ -//public class ContractDeployMojoTest { -// private ContractDeployMojo contractDeployMojo = new ContractDeployMojo(); -// -// private void fieldHandle(String fieldName,Object objValue) throws NoSuchFieldException, IllegalAccessException { -// Field field = contractDeployMojo.getClass().getDeclaredField(fieldName);//name为类Instance中的private属性 -// field.setAccessible(true);//=true,可访问私有变量。 -// Class typeClass = field.getType(); -// field.set(contractDeployMojo, objValue); -// } -//} diff --git a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractTestBase.java b/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractTestBase.java deleted file mode 100644 index e3065766..00000000 --- a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractTestBase.java +++ /dev/null @@ -1,50 +0,0 @@ -//package com.jd.blockchain.ledger; -// -//import org.apache.maven.model.Build; -//import org.apache.maven.project.MavenProject; -//import org.junit.Test; -//import org.springframework.core.io.ClassPathResource; -// -//import java.io.File; -// -//public class ContractTestBase { -// -// public static MavenProject mavenProjectInit() { -// MavenProject mavenProject = new MavenProject(); -// mavenProject.setBuild(buildInit()); -// mavenProject.setFile(file()); -// return mavenProject; -// } -// -// public static File file() { -// String resDir = resourceDir(); -// File file = new File(resDir); -// String path = file.getParentFile().getParentFile().getPath(); -// return new File(path + File.separator + "src"); -// } -// -// public static Build buildInit() { -// Build build = new Build(); -// build.setDirectory(resourceDir()); -// return build; -// } -// -// public static String resourceDir() { -// try { -// ClassPathResource classPathResource = new ClassPathResource("complex.jar"); -// return classPathResource.getFile().getParentFile().getPath(); -// } catch (Exception e) { -// throw new IllegalStateException(e); -// } -// } -// -// @Test -// public void testResourceDir() { -// System.out.println(resourceDir()); -// } -// -// @Test -// public void testFile() { -// System.out.println(file().getPath()); -// } -//} diff --git a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyMojoTest.java b/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyMojoTest.java deleted file mode 100644 index 119f5cbf..00000000 --- a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyMojoTest.java +++ /dev/null @@ -1,28 +0,0 @@ -//package com.jd.blockchain.ledger; -// -//import com.jd.blockchain.contract.maven.ContractVerifyMojo; -//import org.apache.maven.plugin.testing.AbstractMojoTestCase; -//import org.junit.Test; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -// -//import java.io.File; -// -///** -// * @Author zhaogw -// * @Date 2019/3/1 21:27 -// */ -//public class ContractVerifyMojoTest extends AbstractMojoTestCase { -// Logger logger = LoggerFactory.getLogger(ContractVerifyMojoTest.class); -// -// @Test -// public void test1() throws Exception { -// File pom = getTestFile( "src/test/resources/project-to-test/pom.xml" ); -// assertNotNull( pom ); -// assertTrue( pom.exists() ); -// -// ContractVerifyMojo myMojo = (ContractVerifyMojo) lookupMojo( "contractVerify", pom ); -// assertNotNull( myMojo ); -// myMojo.execute(); -// } -//} diff --git a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyTest_.java b/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyTest_.java deleted file mode 100644 index ea6828b6..00000000 --- a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyTest_.java +++ /dev/null @@ -1,47 +0,0 @@ -//package com.jd.blockchain.ledger; -// -//import com.jd.blockchain.contract.maven.ContractVerifyMojo; -//import org.apache.maven.project.MavenProject; -//import org.junit.Before; -//import org.junit.Test; -// -//import java.lang.reflect.Field; -// -//import static com.jd.blockchain.ledger.ContractTestBase.mavenProjectInit; -// -//public class ContractVerifyTest_ { -// -// private MavenProject project; -// -// private String finalName; -// -// @Before -// public void testInit() { -// project = mavenProjectInit(); -// finalName = "complex"; -// } -// -// @Test -// public void test() throws Exception { -// ContractVerifyMojo contractVerifyMojo = contractVerifyMojoConf(); -// contractVerifyMojo.execute(); -// } -// -// private ContractVerifyMojo contractVerifyMojoConf() throws Exception { -// ContractVerifyMojo contractVerifyMojo = new ContractVerifyMojo(); -// // 为不影响其内部结构,通过反射进行私有变量赋值 -// Class clazz = contractVerifyMojo.getClass(); -// Field projectField = clazz.getDeclaredField("project"); -// Field finalNameField = clazz.getDeclaredField("finalName"); -// -// // 更新权限 -// projectField.setAccessible(true); -// finalNameField.setAccessible(true); -// -// // 设置具体值 -// projectField.set(contractVerifyMojo, project); -// finalNameField.set(contractVerifyMojo, finalName); -// -// return contractVerifyMojo; -// } -//} diff --git a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/MyProjectStub.java b/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/MyProjectStub.java deleted file mode 100644 index 34614e30..00000000 --- a/core/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/MyProjectStub.java +++ /dev/null @@ -1,67 +0,0 @@ -//package com.jd.blockchain.ledger; -// -//import org.apache.maven.model.Build; -//import org.apache.maven.model.Model; -//import org.apache.maven.model.io.xpp3.MavenXpp3Reader; -//import org.apache.maven.plugin.testing.stubs.MavenProjectStub; -//import org.codehaus.plexus.util.ReaderFactory; -// -//import java.io.File; -//import java.util.ArrayList; -//import java.util.List; -// -///** -// * @author zhaogw -// * date 2019/6/4 18:33 -// */ -// -//public class MyProjectStub extends MavenProjectStub -//{ -// /** -// * Default constructor -// */ -// public MyProjectStub() -// { -// MavenXpp3Reader pomReader = new MavenXpp3Reader(); -// Model model; -// try -// { -// model = pomReader.read( ReaderFactory.newXmlReader( new File( getBasedir(), "pom.xml" ) ) ); -// setModel( model ); -// } -// catch ( Exception e ) -// { -// throw new RuntimeException( e ); -// } -// -// setGroupId( model.getGroupId() ); -// setArtifactId( model.getArtifactId() ); -// setVersion( model.getVersion() ); -// setName( model.getName() ); -// setUrl( model.getUrl() ); -// setPackaging( model.getPackaging() ); -// -// Build build = new Build(); -// build.setFinalName( model.getArtifactId() ); -// build.setDirectory( getBasedir() + "/target" ); -// build.setSourceDirectory( getBasedir() + "/src/main/java" ); -// build.setOutputDirectory( getBasedir() + "/target/classes" ); -// build.setTestSourceDirectory( getBasedir() + "/src/test/java" ); -// build.setTestOutputDirectory( getBasedir() + "/target/test-classes" ); -// setBuild( build ); -// -// List compileSourceRoots = new ArrayList(); -// compileSourceRoots.add( getBasedir() + "/src/main/java" ); -// setCompileSourceRoots( compileSourceRoots ); -// -// List testCompileSourceRoots = new ArrayList(); -// testCompileSourceRoots.add( getBasedir() + "/src/test/java" ); -// setTestCompileSourceRoots( testCompileSourceRoots ); -// } -// -// /** {@inheritDoc} */ -// public File getBasedir() -// { -// return new File( super.getBasedir() + "/src/test/resources/project-to-test/" ); -// } -//} diff --git a/core/contract/contract-maven-plugin/src/test/resources/AssetContract3.contract b/core/contract/contract-maven-plugin/src/test/resources/AssetContract3.contract deleted file mode 100644 index 0874a68f14b3f5b08e8d0770768dcae4d1669413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9125 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≷IgksBbK;^0w$}Vq?TlR)H+F_PA+#m=H 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

fPF&49(+Iv8rtyi>B8dY!?ed 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

    NG*0lFY_wz^}npTMX>ZOp0vWfB)QwIjqY+ zt2( zGScBDJCGQogQldW{2L=E2BDaF^0bz|;s6C}E!HO()RS&xH%Y35im8?3eYU1=fj)Kt z;<*ZS0TtbgC4>ahVuevrd6E@Qa7V+o+F52`%P~Jrg+lqB-}rmg#p$_Xat3jSwo zeZMLiRW~#TO+eTNxIyZ&YmM{S(Mhb*z&Zwks71jQ@47x_>Cj#4s;;HG?fh6};N6={ zV1=1CHp{<06ozD2l&l;Nnf&`a+HSzH0jOu@*x!&geEOb6_2p|)SEufz%$_fM{)xZN zL4ZzpKPhJX{~3Q7{{y*AP~Ykwn*F~en5v#`NUF%+TSl&?u8iU=m?#{2_*@Mcpc%i0 z>&5voz^H->YyEHK^y<^3NwOw`w$uT_nyB;VDJ)r6su0FWg4E6A$Wms^(J zzeadJx_!P*aDB2l8^l?R65zUP+&9@BuiH-UI!>}ZkC(r7T0wGAz8?hy#sLw{X<_no zd-Z9t*a&t@L2-NOr$6vYaE=#4JMH%1S#h5B>9Jn+2iW$8MK@o`az4;!=?;A05><=2Wz8rNJJ`+K6M$l=Y0Rg&q`%v$S0Jx$P zyj~en-XU9kA1u-%(G$H~TdJbPpUUXkB*zbd&0Z z^;MmdD=r^E2)44@JcbxcU;W`cv=fj?<0cn`ElDhtm@JTB*d()z*d`~%jFutRnUR|% z&yYyKVvRn84#Zv_$(xb&e#AHh;M>{~zPZy`+wr2$ z#SlX14(1PDGdne85OEs!Pt92un)feNoSV~JN|4(N-ZZkM4-YtJSk%;y%(DN&asbgy zHV;t4Z`iKOMYk}CfK+F!JY~N{gwwwzQWCzfit|i@PZ#XBn=#UhTLBklSr88f7-gL= zY<1Bn5y7@N`8&~dZ^MSA`YyFJs|YYX=UHMfflGYQm0;zYlS!2KW7mdX!ki%bo;#H0 zWJ)T6H4Ypwp~7`0pSDONs|87Og0C+5P*RL_95G&^G|0^4$lv{&zDcs>)`$*sodEGu z^8qG*Zdrt8GMdy}G)Y@CgOwzSCeVf77KZ3wm8!2&tOzQ~H5l_DPp z8elro4R@P%*Bu^pmXFgZ^mkZmn7#rRJkakHA+2F#c-r0aup7s7VJ*Zvglfjgvb-FN zi<+up5`#}_(qunO0v|tI2sib?*jqygJ*oISrV$4C3p>R@*;~cmEkd0DfqYv7(OnWk z#Ke2^>Bvf|UM)8@emUW<>^}JW%$+i`!mYq6)cepM@syuQe!7uvus($Qzl=ii?}kKs zZH0+uiFaKId}4XS+z@?{?npa_=xn8!K#jQF#0D*dfIid*b#GP6;TgAmLx2tMgqWqz z;+xQ@;g9(eAp+J&EChUzUmKYv_15=SbVE|M-Y@)iLknfvFKsr-^>F57b<*aj42fG67< zH0RSrWKu<95bE*JEV2o-Pjgqc>z0fX;>nX6TnZD-DxbRB(>1ayrA6vhS=@`#>S%O= zmli>?S_qt?&Wmk%NXo&k@^nJEBFa2cimeW=es9InwAIM&seYB~8J^PEjCoP`Idulg z>paxQxK2vNV_Pgr71U|UR7;Xng%G0cPmT3wx=>vfRB@j6al$H0sv?jB70h)-cLF#X&AZM2J7+B630qFF~4$Y>tT))vtMZeYM{Zkp)1CcqI6=rxB-cYuMEh| zkU*8??Q3_}MBJP+d%nt!+gmrbAKIw}-HW~OQ=ppu~Q#cR_p_Ei{nm<02>#;M0S{+`; zu>hA;+PZF2>EnA3h>s3*$cq*X-XOf&OdYtAb8G8$rsduFct9>B%q^(fgI{J6HC#WvZxD~6`Kg_9U|2=|^q^ccih&CNY z2L?M=9fsF7Er=HK7m9OA9F}zNISID^OjGG3S?l);UFTIi-vz`uSNv{a$pK%MD#B)_ zA|7}*fJ~TBSSA@!{vSkPAtd{JHaRa4%?~C`v^(GkZ%3jXV27A0!+%Qp?i*TeaT@n+89LU?bX^5;24 zOG!WyAg@8ZbWv+pfo9-|T+t35If6G|o>;U3>sh#DZBcD?6R9KaH}$|N@snK#Mw1)C zBEN8hVly&v?NucP)##GJTgcM<+#45O`Xk@Sh5=q{(Hv`ohK<4IZYY%W5X*p`g$TcbpWHAp zZ*`gKysV6b!|H#rG`y|$kIzk7)FxGlKzjbFvSKu_!gQ(iULD&vGv#opLvm>-sZG)D z<8cA}yEehrtCQFL=sZ|u5M#wGFJ!Ce#nKdx-6s+;BE7C8RELh^ zRQtIqkci4%i9IERj5nlFn?wdbvI^1&ryPb@`MXL8c@Ifb+|5da-raY3S;}X)F4~Rw zFb;A9o)FW?gMlk{t_Poa?xu?yY3gVF75=Q4+_8P)^1WNY5ky-JTwM34Dm7wz7E|isSo@r~^ zgKj0g>gOY>O~Ozh8gqzC$Aj2XqJF_5zQFI}mZXW6LGXx7XVwbrtsRk)GDBo_U}Hd2 z7_kpSR?FC}!YCU<*kwOlS}(mAsXR?hoZ1!GHagKZHv$5y))~AIS9;-8OsfNXND2E5 z2QJ?q{#T2{aKhYy>rV-_8|nYLS2O)5d7ar0rPt8ue<_FBKguDRkBnG-hB0L@%lfOb zhL!j)_439h@Of`~pEvj)gOA(+}V;jFFSe zkU#h8G@ZMdFP)y-FYZ0rh+khXGp4_)ck}#tHb-;A;zP)>aWPYeNkKer%VIJtz9)O3 zOrSUWGec&Wz4UvPP)LrMH^i>dNOg@ay5`pFwZ3duAfIaSmiTw-bAs>^rLbS}PR*dADEOD3tjd$w0 zh%>U?Y$y}<$~Tb2KH*yNV=>#1jKD%B#Jn9qVlEdkVDO6$vc ztw-lOBUV^;#zsNxkWX=0g&>+BI96Bg z5k66kfv!Yc^j4NYRzHusY6?rb>OXgi-3cD(L08#bj*Zy_)Bfpiw+lTnM*q82c=wKv zy;cjTQ*UCtW#gV#KE5U9Xjb>4T4E>HH(zJ?`y!}ya^>!FN_x3%znUo@0U}6oY2PRH z?3=#KA}Q~&X4Ec5=VmppLF1_>B{~eps)Xmr&AJ;6xd)leVOm*;?SY|YILQ#vG;XO@ zZy$l?Vf?o>l3$20qU&8!c#S-~7}xij5b_HXRa$GTEfW{r9d$QitCP|+#hOd*0jVc| z6x421?^#z7UPg=~l5V9Fe65pG6sO~wF(+lm8K&y!Q`Othv{a7(53OT*fvZ3@_@l^; zDlydNFa&tYO?sr7x`M3qu>Q}0y@CUV7&rH$Yt-~H`^5+ z?|}>=1psXAq(#SF?P4m>b#noYX>Lij_o{(BE59IR*5o2R8cv?2Ut-(^JR;oubp)0DW5ZRRiN?v1YT94X;sNpajX z;S#t{Uf6a>WXZ4B=B$k(#2y(^SyT_TT8`f0|{*W3T$c(C! zFu@0B9`(SY7W`?r`m=DkNmoR~6ZYXV>Y4C}=xSZL)fDu6k)52>u90j;c-Fdn_97Pq z@c0G%(1)1$j$LCdti9!IpMCK(`cd%xGx7uqb`?3`F#l5z-UR#qBWCbBIOx0oTeV@! z7D*ZDd+RfGZA-@b3>At(1#Z>41&RX2Tr#f_ShE@UO5qL8o+HbqM9TF1k}CQAjxP$9 zq8HN6PCi>lHUO_0=NEZF;gXNBPj2Awi~>S2pNBjjIE z4Z9T#GNg7S!62DO2ac0o)WHvK+QY!;wxhGag*X#+A3FYK9E>z@7p|nz{_UAZsRc!A z;0qHMh%ELP4%K-Z2koYJ-IGyo3o7z@w$pZ|%v;SQkKo!F^O0XtbIy(V;{DA{dLA0z zjn_}^**Q10<&^g0|OW%pJ*f%eOk-4P~IdR zsSGIiOB@UIk?pnOk+%I^hxhhFRPT`oRlY#$D%?n7k9o^JLTaZ>!;fh_OSYXp{=u=z zLWbe@!!m~1wz7;^wZ-sBma5-VYhLIcIj%Sj(4BbAb4_^T3Bf-SoV=6Au&0c+T2DJF zy7DqGPm_-XY)VD+7}ZZeSSjv}zp7LW&o3-Xjt_iGpY;1!QKWv!$79cV8*<#}FlFiC zl?j#6w;ZDXz<&?SD>DnYFLnA3+yweujEtqoP6b+^1pA2Ifn2^6i2+n0q@>8n^fdf~ z(ScF*DN~KJ0abH-tbKvg%a?@vu(lKT$jSOurlmKj*K3Ku1AaA2VpURJ{=kc~ZppdkN--caG>V5e2(=mHKP6B5WJ6fJ8OLnL zK$v4RI}lT6Pv#&u3Um7@0tRxAZ~FC#DerPd^3&ZDgAyVg^RYhI)&GQ*p z1xdw`-LmsC1{>Npiocj6j5JM_}R&j^NjaUMs!9<1#E0 zF#(U7<#H=07a3R8Sy~}G!~@Hi7{cPIG|fcgL3y3v%}GCr+>xzy3DYfgMWW8V0W-qm zfkf6XE>iGC|8xZpPTey30BVLysALzb?Yu}lbC^b`7IIP)FDq6AT4QCX+5a*GMT0Np@$o#w`9KAF71*T3#kfhyj z0+Sel2tEFnUv8XQi6x1n5t({%+In#oTj>^t;*p2rCJzBdE-$onkhH9`q^uIPv@~H= z&^14Vay1h6?B$Xod%&41R#xl+hB$av2#ix%%AE(YuMd>xVHq|-vHBa$z&Z+Z)|GACT3Nx$b6w;uBrRbzq6?U zxd?pgKypWL`CN^Vw?qT9zjyu##ay`eF62M5Tpz^$=TK~AYw*wbu9dmIhq1$djqfHY zuQ^}}BXL_(Gh$3cb`AlAj;izN)FLGRicjDZ5L`telp^kwA5y&~?mde$oRBndlbgBPc**YezCK&d@%?^>>IJ4kXY;27;Ta~y zsCFR;>I{*E7D{};sHVJNgl1(za@u6l(-Ucnu((T>pfpciveO*F1_YlpYqiw-rTSxo z^3#grMU%VH)NZ>>MQ+z^)@F(RQ!h0cnpB!<@6m9zOlyC%;^;}xA-QQyVkn8Rc1TAI zli6V2=%Ip>h@FBAdbmdL_lR(jPR6iAKATEI4$bb)w@jPv6epT?&D8fDs)iK8@ob(s z^LStVv`sdZJlZm^Znf|+G{I_U&P=PSl$h{s8c9$Nt)AR$xnNM0dkVo)M}z}L(XUFy zi9A!Abo_$}5NMsY!a~({yApX@zTO|5IaDnm(dIRUK;?@SkD8E~1ox>4g*va0i^PIT7yZ0|RWdJ869lkW}o zGmwF@CWj=kYNt+H*~wpZDK@Rz{n$yu*k@Xw5)b3jE~OL|oBywfqt~{l&rW_SE|V*t+{v{djYtehZ@ag`?(BoMjs66;#>%j2-fgIa^zgmWSxR&O zN2(N)0z`YGry53pypqa%zv9C^c$Wy)6RAcLGJj-AA0opo_^jqmyD-sny=!5L*aua= z3jLh~W)~t2>R%A_hkwbEe*fW}6B;=_ya6{Z7(1l{hcari7D8=?pE`%Y=@G84D@=|I zimx-3HbaXNI3N?sA&gr*!)8vOz2W&hq2sKtvqp#V&Kg@q-JePDK+>jc3cC(7stm(L z`H7}7$g82l*!unbAdPE*%tTHwY~jTHo32XZ);jBiH<+DN%@%Lvy^S*vSAj`NK}1|6 zUH;~wQ9b(}amE$MH1wGiVP>CodJll;hl~tzFzB5zid1TdxMN7UdkW^n)RUub`Z|+* z{EXdTI2m<7Gi|teMer~(c1eGn#sd+>wL`d!OjSQ>2zr8{YB~(kIlzA3KG0UbJ>)5X zmu;65!JSmkn~MTj33rDuQ(Q?+6^bv)HTeQuSK^xCO*(3*+rrS>4gD3FH}zuwO+ ze_apfC=1aahlJVlkG`^%Qk-chu@G`NVIn-OEyjayVj@sbwK0NxI+p?V4Sx20^Q-jytJjE<8@2XrNiPdh8s zFA|B8C*rg@%q-I)#hFTT37=G7h#qE2HYUwdBE^}BOdGQSu$86Ea)5SxBPU53ixs4B zO!|Sywu8}cTnCN|m5uesmY<+8&VlBr2*8f=j-=>lF^IHB!eHlt7Fr?q>rHO=N~P&I zoIfZUlbOEcEO9Oq0=;J#(N#fiFW=~~d-?_&4Emhjjc>Vo#AG2%rc;d@nr;$aJmM9L zR*QL3+cN3i6l^CI?FuQ4m34}Ea<|qnBeONT;lVe%>L5Eyw>;b>d+%;40}n5L{&*HI z2tHC&OO!$b0Y7|1q)CL;@LmQYHVz|B%;P)7e8;hzy%XDbjArQsI<*rLiSW+cJ>iev zeRM1zkg6=yyCe{&{OSuZqI?xz{f#W0kxZC6eJsuSNiAVg9=`q-_ z;u6OH78?`cdRC~&LR?mtt8gn?VaLSpR$7>3s8LjY9l^Tbcj^q7Yx;sZd~x30Gjp~n z?;hDVCP{{RuHA}HGHO(I+G!?Xg{+L4Ofd(z<~yL>i4Wj1&KybW%(q5d$({u4y=clO zIQFq-LQfPGL9a*)`i9A-&1%qcZ5PI2*%^)vPeppnU*}V3IUn8uo=2jqWRE?xDUW@L zX4PUb_6)hGdPo|MOe9ftZ+{Y3G|4mvnl=&D^X zrPif`XOT7_vsGc)GON(L0oiKkbB4M0hW&)P<^fxc|DVbu6)fC~Dg7zS}fXq#!?bxugnm+Z6;4Apftj^<3_P+Cjug_z%DO4p}d*=asT$#Q#bc+RE zl_-zL(X2a+Cq{c@JGDgc8Tr;`%aO$a=-nVYl={3KwoB&O2^F5y_w|=ELGKANkV7)r zOn;V?1XaD%DFwnSHmj$-`663}z+T*m%XmNbHK7XIVuFI#^b2_DdW+O7_#1k}}@($r*z-D+KVZ zVXUC}pTIylF#_%kg1>bgWM+{o$-s|h?Z0I zBA~P@;fIU<@sl5&1}>mF_w!p+j6mKmnXW zm>ALF8KD=D^=m28Uf;66>~w1x80i`50T`I*GcnZBG1So2{J2^1V?e|jfEd7Hrv`f= z{&{-Cm%;xz%Ckp39wd2!Fa7W#gYD+o^ZCv* z0gZR-75LAXQ+%}IoiUxwkgAgxiZ>?f>B~QeBG#?i^sc9!t|h@8ovm2UqkW#vZuU9+ zSk8|JKI*u!1#pmaY)*l9v0xd%54EslxCmwq)S7`K1%TE|buc@~%W$4{U3!eaJGGN> zI7JQ^)LkrANoH)_Z(F0y-F}ZGxQz#t@Vqq7dWo{;%-vCEQ}O==O98)jhwHA`^W@a& zjrjfGE%4PFkiy(qX$YxZ#-$~-NvwUaxA(YHD)SqMV zk_N_yR<7%IE9u@%G*M&p+C+VG{sQAuvFD2Wp)&&5nYRarxxFw)3~SSm$I@A|CyU98 z@0Ne3v>w@_83++|6?R>V5z(AxZPL0RRis*scxN{*A%f91EfIW@W?sQMr{6R~+-fR( zF!zZ4TcC8G*V+r5saRD=5qQOY%q(5k z^EVg@Pfwe<{6p`> zP87w(VC}R}{e~3M_*GY96KU1cIf_rQ*$jD|l^nk#Cq|U(osPf{lHONWnOvp0lmU-1 zSR3N4H^enboX0F`WQ|HCwW3ik2_vfzxJ~&-T9(% z(#dw-fCUP%YtrprAPH0M)M*U%2#X=sn<)pTQggxPZ(%{0o5VnldqoxpJngnD=-mXdzCUA`(k>CSsGbLvxeJF47XrDi*}- zaG>(a-wQUw2jf5*)Ce~U*qcwh1YW7Ajyg>vlg=0H@D)jvQ*+g=;V^sU>NIiQQRxr9 z&K8nT73_r*5-SavK_>0q!jk)1RMnW!XhEhbp41!mk0#ZjE)~3#RfT4`6w-*H$qP zdp)4M!XbV$;M8HG{NdP`DCmd8DF6wZpyr1RqZ3l%WO(l!Hd$;6Zh_F5B$}Wom`XxJ z_vdV8;131A+?gpEN)yMSDNFJ|VUR!t)Ponm1EO;cXve*|LIgzT3!Z}Xb)K$m92K%cMH zFsGPGqt77<9xO;Hk8U3+q(wExjQpvbF8d12J6JI*?ngw?3p^ zl_O0xJhfuOk}gKuI>L@k3ZhyrTvOBv1rer$voRmJSHphYt7szQo>g6#-tk7OYlj9d3+yc{l zBxt5YYw)_MI6gm_+*fG0h+bzxSCCBV2~y=_97+U^FQuO=UV@6v`^r|S3Z2LnW@;)_ zr0u_-7FLonc#rbJKgQ5j(IylD7qTs~R~FaO5P7ytWMfDM-V^1ne2#m7Wcmd`1Lojm zHMQq=8kZ0&ie==h2-vFEkfd0NWTR=hZuPigk)a&SheW5A%XK0GI36C*cc)b&cAyCFvI*K!?x|7Adf-iy$-+fpdT@bcof!Z%ig8oyaxknI?w_+7#X?{M z>rJernQ&!c5bW{J&7;Z|(`YI_)ns;?wISCr4uv^Uw&E4ZgDC0uGim(O(KU(tOAGoT za>|mbC+Jn&pT~vE3;t_Mk3Ob%6H|6AH&3b>>t_>gp?X4wYg21*ug4(SEfT z?shI$fIm%=?7$jW!94{#kp^F964!3HnZR?wu5}gM0-4cnn45q0iTxn0ny_1$5R-EIoR%fStdbF+FzxLZ>1IyTPAhF`u4TSsR2o;|1>D_KBf|9U$Bq z;?FN5&jUwz+Erj%#+*5*LBiiS=ooh(-bdNcA|T$A_EJpdYE-GGL{hBvI>_!-&Y>u0=h!?09xivI3ez91`U+@VkpqV%h1Ej(L=yV4M_zXUR+r*8A7NI zfn}~S)z}fTN(U$x4RK`pkJvFT(srs+W4K<8_)zx|sQYEAYtd@aYaFt=hL7%8RhK)o zH1QnWy@HKD+}%l&cC9e|j+jwTW`(}S%SEuJgt@XJVL3sxoiJ5q)k77?R1^SD<}n9P z6`U442G2~0PhE)3k$j771k-Uv>3Bkx9x0b+HPs|<^l-XD9?k@{_;YrDhd`lmK-#Aj zAgi*A>`9EUYaNyLvqYD*F3iNd>~!Jist{Cu!m)S z5<@3l-__T3n~jEbQy09GAd^swA+iR?TVOfuhdlk*OBO+<+ABaX+S3}u-^rbrosuJv zE;Jd$pv<>Oj{z1O`bbg$@B=@dA5u$w#1Rb*jtoh|F7@FrgaF}0k1MJ_g?cjhWb@zKE3LD*~z zr5a7*^A4E3?vGr~wd5j1aGlkT?VIG4ik0D@%2x&zu@$nHI~X1bT@#owG3Rk~&^cO* z=?`5QcFR%nYI8ciKafeJcLHQnm7ZnENSj3|ozm06d&XDIr44xFz4oH*(Tr>3WMmhY z5!Ld$^XEu|VuD93&67<#TlafiU}mV&LMm|47qHB==R)NjgH<2g>rUTV8mLY_S!z|` zVKYF&JgUN`bS+GSwm`_;8}xu* zvLTphm7zAQB9kReZOk;WHlDXJ>9-zERU1`gJrp%cUvfqLmm#@5!8K=)$qlmRz`Sz^ z5tw#f4&ynvxP(RZ|w$YFut!E0x z|MrGv{ZHOFw$27t#{X{Ho22{?!6!No8(oJ{gCDAdBytmS69GO{k%D{O6N!)_1A?G= zfU+q>M*Ae`gcWP^o9rXpBa=p79g|Ft^Dy3#+qE<}en29f>y7ud_q4mtbl3YcpYIol z9_9{4>z^1z_81PF2he;q`c^fmUBgYOU8GG$J1keHO_o@G8CXe&(I2|C!;2Ir%Hd^p z^h{BMzvl8?P;@?j%!XO8OTjs~mS**v^Tg98jOReJg$vWB#SeSy445{GkHatNK@%%m z@fs5qSRq4ZscJ)K8}8hNJXUAB-nX`D)*Vx$Z9tQ|f~FmYt&;+NDzXY<@cJ#I@JiDK zOQueF$If3l;}-C9!e{Ae*=pWyi($C`W~;c@?pO#gjAM1}>2lbx0vpukpsxNIj}2-t z2iQjJ^lGv!ZHFo)Jmj7?P-T79p?vRK6R_lX&Zz3E^@1hiM2LTFZAu5KxMoDpFoS_0h^m&wckfTw+~QhWGV6^mp(mNEZ&Rbne~5L`XZk znn(rc`j*okd{SD2MMPFbG9@xW7I@Tnh{Jz=+k02YoiEGj-CJ4cW9fE82y|BgvI?>^ zuHJV(@pNrzxdQ6y9seb%gA^D!t6Fwn2R(E6z~}?dS%BJQB@~+oemII23%kcE$qGMW zpIjom^4BHm0EYqD;2h4{|)?_71c;2%$eRwBQRgMC5lIxJIq0?ALh;~9K{=ljFDXc9aZh2t;f zOrRLpnU60jjvW_EC?OW$nRItDd)ySJO24pPGwV9nz;uTgrj73S7W)Mj--A!lb37wf z+@xKYy=U>nL0B`Ju^jxkO6!rMFQ*ZFy2+L!W@+w`!v$`e4DbtSmR?*UA}O{1mkIiC zh+9qvQmfxZ>Hy$zoT;SB3zc`MCS{Un$joVg9eQEw2AyY6#mnTN^v*{{yo7_tBB1qN#{2jQo|Z?c!n@ zBH2ok5z(@lELndj;v|4nw0-~gT1cVvN zpo~yaDUqi79dmcFc7!Mhd{56)BAfG&wNTQ-%Ov~tdWG;uF?FR5?Php3OwiZ;DE4UN4$ zXem`Ap0{8tSStlH?Z~RXVFE!x%^?8T+6Y{1+vva5g9K>i zw_1;XS_E&YC#~oLzx0&XAB{9OeCeY>U^ zt#(i2$&_POaReDnXUnKy5fb+{0sCm}o~$0JqQCN0HSo9b@4V#9=Hys@x+f-S+fjC= zwthXY4tW~~haL#NCgOMDZ&tfsU@TrHyUf#OttPvUS}V6f07&XU99nGjAO_gm04>l` zh9bG{6NxaHBN?DJy^Qn`bTF%)mxccuGwr>%XdYSb1t3{AlP7$US7cs4200Cn6u;9el_g0z5{*Rbohxv0jm`ZX6540ffF*)t0_y*+3z){wq*>=Yp+@=6 zfR4jUvKG`faV*e|&6#JbJD53gqD0u}Jd*m{tWCWRE>0cw2!%3gB8>=U7QLW){kXe_ zsO8HA{cNFt#?Unm%;TVLGPe9= zVETb*DJfL(b8c7qRz!ddn$IJo4&qgeL7t=Ld~Ici*5vwtc+QLT?-r`V$$o|h2cmlX z83sqqp`E)*cQ9-;K8+}qUP&Ahn!1tPTtiRJ^J&M`XK@Sh51#}%D&LE~$SuHySq%_L zZULF96#LOUoywrLXB1r(jNn_c4NF8F(39E&BZ{si#2}oocZ* z{qP?y|9>;D{xMDeeT*h4YT60B{yVAZttgPJpa=Bgojp=$~5BDt1 zT`MOvHW(a~=ulj1ZZI(@7~J?+kosP&w_4pMFte9!^}y=N$sOJyzsnT|PQn2ve0upB zpyOzzf*z@THt|9sn6GBRK%4^t2HdEY&|M1WVU2M8&@7rw)zo{W6QM}CMr6w9Lq!z4 z_%1hW^c2B#(PPDWUUI(D{(O(SUu8uaI!AlVeK`6w|Fo(6-JBE`;XW0*$3q+j7LZMET~8-qTM z#)XE3ii%!uN+z6;1Hue#m93#7Q!v_F#yXsp9WeI@ijfH=lZ;wcqwFj~9Nu)crX)dA zIk%Gp3No)MN3(E~il1d7VH->xLQIsl&JMsuY786kh`F97nyllA{%3+S>l%t9TwzR< zSUP@fY9`gw06DS>Ps~fe!9O9-A$JKwjnq^4pbPyt@;1>0WyL9qy7~arn36_TFT_%jGVw=#ma26b{DV}j4mw{+x>%E) z3G(42PLG{Y;;2Oa&%5ucVOGK7md3fUW`0LwFS74Mtt}Mt%RtY{ljbIQ-37mze7t$M z(ZzLrRnU(3Gwz+Zpu>{l_t%?&Xpw!I1t^frWCqIdL6m`R?z6gAyI#DniivJC+;k4^ z7t2x>KaSP8b@@ateN1O}X_eNm(e-v|hh4p~KIU*(6FEu)_1y;{59HEFEf^fAL)A(e z+etvRW324`f$2PhDn#W<&Dw#;ERucgJ&Zd?#-7%bwvH&p(BToJLrhDuQM`olfg_Cq ze7mu~;f%hiPSWDFa>>Dz=lsD|9B~Ai^dasBC)sHvOpUd@H^RX>2GO2r3?QBQMQNJ< zm{WW310e-JSXlDU=J$W^jsJwF^>4lLuP*5Ni7inYasHaVwy1G&1|Yc8fJQe2nwR+9 z*%uED9?KsM&xkncKUgcK>UL+Lx((*j2tww3$t<0|Y>ivLK-z3*hZz4$AOfNZ#vH~R zSNf_|{GncR#087YI=)#vtJ&o(%k!o>TaBFW`)y=;GK<6UIP-@4c+%(Z6dezUURozp z=qEcuFK_1JaU!ek;&G#&AO6Sa`A8amcCR{+E+kqY**&{FgZicTFH# z_^t7WGQ4k;DWDbY`3Z^krv$v_9oxE>GFo@>)JoDdR{LAax);-*o`D7c?hsq^htBCw zZ-Q=|!x7iV13bt(ZJt9<%HC&~kKSIm0PusLUpj+)=chT1?&9V?g;+W&FuL*>IxM#{ z0v}L5R=Z8VmUqcOeJpl$1Jo)yEdRdmKz~q&a(2QOqVuucM&K_W?EEeL2Df|60re@v z_9=@0PGPO7(CcBn-Fds?1N~BcXM^r6`?PHp1)p*x40daLj!$|Cua$swI%FFJHz+|q z*Z4!kZ7o&{o~0lJFsPI+F3>n`Bv=e=AMrFKaG6jRoQSSKnc7W+BrED!#Y%+{HJIhAxfWJ)ita}hY#MQ`lG8+= zJYhz*fmo)i?aYHrU0llHPk}@zBskr(h-Xc}2@lX$;sWyX0&4(v6RirX^swoN?F>d)^K{0&5 zBQEQ%v-XVe25p%}ucnBxYszB1&uqWtbiQgn^=pL^+#)|sIu4(stH&Wfsi7Jl9uhvn z1&p`{hoyx|mPrig%@{4L86BwyE9QT@^M{d328=KH{R8Vp{58=to4c1x_EX8INoa=T-fn3NH-;B9smUUpYgkNnF z@$@uQIrXZH%TQ+fviNaV@rqbBOe3Y;Kx^SPnvBTBB?b=Qg$jzjc^YeFSPf(lB^9 ziAQu8mvM3!az5$&x>4g9fNgL%gqE05K!?=ho{Qk`;>l!n|1=`H@u)Pj$_Kg&ZMw=u!_qQpazs!4w2UEE+qL|!HXI7 z@~jM0GR*u^YnAb+aEzN)D^#kz;{@2}=Zc_h%)^N3`TYkT>GNk(o5m6W%!~z{G{OP- zZ9yigP(BWU{?kXc<0|HiKVf1|TvmdT5A=*9Gg5281Cz1=4_HWH=vhmNsM@KlX8Y1% zYLTmqL#g#yR(JHc3`NQ|2K(u5r1E|yY4w8Zi#_YoYhkDK1C|UTGpZ+BBo)Ax!(0O} zHFLPN3Y=1H>YUPRRnuJxPql%Wa`Ohs8M$kxD=#nfoh=<``;B!9$+?T!(WK=W%_nq* z$4LSP$*7RN&Wa!K71-J~F~sfxuzA^hVp~F*IH7~*9qpA$7U1G%@PEKeyNo@=wLL+G zU>jV=CAh2#ns>j%baPN{j-9oe%e<8OZjKqM&<|YXwUt@lVdNmG!Poz3Z_&*HXH@Z~bkFJNXVczh+TXG*m3WHj70VDc0d>U$ z#>_Y}M`(o{i_o|)TQ0D`7gZQ{sTYRxRbOKRoSRv5>#YCS4)qrMPKA@^}AgUFhN-ZQyO*WHl7kBZ1 zXEpTs{vB>EG$!_3o_Wun`2ewbFT2!-*@G|Z#G(;h@xoc3eI%nkOKxh0@r#gdnsly&m^m$|17f;mp z&oh_H2-W6+v2Wo%bM>|e)AWrfQitVRU2ra4YhaMOAYE}DhwAS7+j?ddni8ck>I#lv z6l}@*fJHQ_PXEW|69E_6kqfQTeGoC9c|>t9odCiHkJE^&{D&s^o6e+(+9Cseb1oKF zsU2Ao&!8Rqq@3LBF&E__0O#*hK7JOcQo^0`!w&+kU%z$=d)ujN`BLUd%BH&XYV45f%0TDsg`kaCSs7oWFz4k`n*d|}lNWRku zJMS-0Uj2T(DY=VI8nSe4G+lwBRCN0F748!ZT)xznahSTRyd^>bFNCN;kkbYn5tAq} z`psO^21o9dgaiZ2uF$lxEWnn34Z)R?DmlXE9n~)K-MnGUj~(iUbt-wn_Z>?e(QIe6 zoFMwb%c+;+4mc`rpkK?U^#*<=m#5N1|M^?to%qD0TvAsj;@8?ftXoeZ#K87kzZTzXg>cUVVN%zHrzkiK()dIK ze{X8PFcvFMVDrJg6@50TZS9lk#Jll+W%uw@AVgBl9h0SgIi4@L!ZToEyR1H>E1*h( zCm1W#?UULJ|7A#CF2}I4^n%m468wQy`y@cU)O{_GXuh)+gF*1^ek*~myr+Kow1+PB z9+Bn|L$%8FK39CGbfiIITNEEG%`Anci+aOZ=G4;a)S{JaLw6=Z$F6r+-y$_k8hulQ zv_0c=&)a_aZjYka$4weABn4=h2HZ@q)51jT!hqb44ox9)%LAPU$4HEuEBSn&Z}CWh zJtDu&A9Fy>8&z_L!5uKe7=bqe^@82-a&kx6{YQ5n*k|Zrrw7wIR8XPITw(9_D-~=8AWgm4$tT^kEutL2+l#R#r7i_7eWEnj&muB$8n( zc%YTg27Kd8H$F4hy6y{r`i^hD{D6BdviC2xt>2Z{K?cmPUyykJ{q^_nY)Jb5OtwigV?Sti*|rHYBT5LU{n|q(wz4R|J`}f^ZPQND_BG zJ z4zv(7?pwj@XD-CT=0T>x^G$;>L_!H@4T^!M+{On_5CGpffYb#I1}ovf5JuE# zq>h@Sr#vWgs44jVhFv)%lQq!~p%3c}_UA5%lreXc7L*@ogG(kAoyzY>fG@4PUx<#INe9F!v(jg@SzRt=uo!e4Ze(K69vvx}${!ly zXh4@;2N~c{#^;m;ZLjJ)!bT|#Z-j$VnsD}eOH5+Z#=k4+jy5|J#}pcv=ueJKkEQ#_Fq z2HBW52f=i~?NwxUY(+c7#8x~hlyitQIhJdD>d$XB7Tvo&rJz3wHNM-E^(ZDLnQR^d zgPCxgPpzKV&=Zf>ki!I1qQsmAIX5DODgnIHLR-gJ2E|wzuP)}!VYNzvi7Zb0IBhaT zF+zD*!XmaZB88?G4VhqBs6S4w5LPygL9!8dog+_WDdJ{~zOEV})eC|eYCBJBE3?dc ze2hNZ$davEhiKQ%q)j!2{fU<~ZX|ZJXaZA-8BvZgP^{U^K?PL*o)?QqMS^0CZ?bv# z^vyQiLCeEw!zq3ai!SqIQEWFgS>e)Op|+6K)b)iZfhI9jnbv4@P^x<_kQE;k&3d_5 z2P6yGSUE>iC?f@Xg(<`TJvp1ol1fD5s0 z`#W<7m4IL-pZI4P^T4YzXwO9=!a3^IIZ;hNr6yHbMeOUL?0X9y)uWwmYWW%-tl8~Q zkV@B}W+*{nQm-|?pJt|Z8=*o0g0XH7qV~Dr9b{a3T|%v(T|r^%d^@X~D|I7u-dm+j zRq)MQ>2k=Lg+DgdJaq;kLpZajmBt;CK(w1Gg0%T@WjbgE@7P}`%}~YDLikn1DVKpf zJdRXco`-rM2tqCxcAPU!>zS2rK_3y@)g!8BC47qIQMYK?I9gYDC^}GUvaCHIznm_a zv?WluX}JjFer2~7tGnob%|GnfbN9`WdBXYr0yXAvsP>Dc2|J+m!P%u|e=mT7cO`$h zg&u)7mCM8Icm+GHMkIv%4cO@UOWfF>jF_MK3CT;6Jm!{-v{XHcd};()p`qf6K-?V6 zHK;$*J++IQpy@mxPL2gplm9Q^$HbU(yizA%eKoYY=qM~mTZjfP$SYbIFh@@0mT)fB z>>bym-7c8fLuuQ>9hLtBIL=(Y>)tzzK1Y)o+ll;!G7@Z{<#C>G$huvwa7DK0Pn@I7 zqQhp)FWC460_J`C=338|{D^7d(drDU8OI}XncdcXk2LE2*_WL@saV;xzv7oiF;01f zpOX=?;$RfY6ld^tEA<>?z9&pkv+CjZEjdB*Kr`k%Z6s`piW*B9j#NcnDL=8| zV@SKM4GrFvA+>a69chaC$-S>`C5BJFeblLIlorEheysXICx(`bF9Dk1;BnP^pYZNh zag=2w;jOVl7Vnt;W#G~7tk>20qZ)7f`7-?1P4NHAS3%TS-$nnwk>ryU)n$?7(Rosu znXEC4RP6xN7f~sJY~c947%b>P5GCn(w_#h@jW`!3_n&0F?%Cj@grp<8-wGm6V4GMF ztGFjWlV7i2r&~5}_;|emYW=x{k?pGfAdZuwzQy$!#EA?I{w0L|9O;dR*chzm-~L;m z_7;s;s+5&$E;&;*(cXx~7!H@;+d_oW?$oW4_emc&bJV3L%V7yP+QWuqrvZ|!1BF0APrPOD^2a~_k~FwUUKhjj`sn!haWcBvJcjlS@=Ha)38g4jbG8iR6++;fpizo zK+*kOX#DEm%PA-2VM#Jkt?eObT^#@`${v5(up1V^EbT)Mv58{j#I_)!P(ey>^nLTf zX#nVl#%Lh=cpXy?bi>5%k7Pz!j;3Im#V<#pyk*Y; z4$0fpw$lin-HH!d;lCbzgYO=}kGT%v7RK9?E@r7Ht}6KcDM7}eNpm;HLEZEJgno9`KSi96$P*vu)(qZmm248#Jg!XLE4Kv3yA z&Ml1Tt<$>^Th5rgxvm3>%gQzyo3fMwXNRw4d9KblzGBvWm^A#{R#USV47s@+Po}-S zU9WLIA9nD3fOo-dMCPLJz@eo|QzP{tO^_GZEBeFp5t$71BhrXW)cbBZ7#xS%G9hKD z?J*+49YLvE;))Optf_TZS&VD7&f9&BchiOZKP8H3E-lUb@5aN?-EA@hHGET&5SU zBJ*+$=?^A}ohGC%%y}5{PCCyr4appWE#uj3Tf=-dm`GusTbXQ(I8g%Ir8XYhQIuF& za#Y~qoj^Lkq&LvVX9{81ib`k{EI_j&ZL*drLM(I8Z;K~0{dX%ZJ+w?RnwNO#8M&G3 z+b^**muJo(BwNUk2F}ch4z|+vF_BQk!xmpF=ho;hVN9sKeRKqzF;?s)XO2!aoTO{~ z2e??G^6U!%`k$pmC_<%DgIRcg5}%9OY9;#oHr6CFNujqUIzR=BADQ-LvioDKELY3r z3kWCs>vuV}#<4D7sPc!Vyf5PNE%2(kunZTM=4tw!3}_9Fcoyo?*7=S-HpwY-PSVmg z_|uoP8A&{%Ab4!u37uxd#;xbpvHOp!@-@U~kd@FKABWGmN} zM6S))*;r26JBk1c23zXJg)tT*@*Er4+A9X~zc61GX!kUY^p7Yr2?~Fs5WAq`8kk}@ z?i(H8$c7UI_{(SBW;O&*QDZTXS*P(sc2+AnIDWK$$Cwo%m+ z+w-9GEZBk0l)ZEXpWM~^hqMR^dsOXd6I}1IVwC6ZHMc1ZH}*_Y&ahmKWp|oKMG&{; zylRutd1g6I+mTV5Hdo1@X0#h+1@rC37`!9|SG1DuduR`NVs4M*uoTM4)d^v>jG5S9 z0>MnY$PI-D_w3eS^7g}kOwE^fnreha8k*i$TdwN-e$K>TN?<4D<8A)^uw1Z5 zA6+Tf(eK8E#C1tbP0>K|35mPY?P;q*>0vjxU-T$R9nr@x zUfEjVMZ^pPPTDQcokK?Lng(s4=yFGC9&;(~Bgo=NW;NF|{H@wCEe98olqepWk>28l z-*{81wk>RpPM!P|YCY-h;|zVaR;j-b^;Fy!wc@1>rRDm-#dd2u$H;ac!c!t#Sgd8LGN|RR(N&g1DQ8TAnXN}gVx#G@2}H7#k#V_QbxH^_4es4xgf7Xl z8*5u$$xHV4ayceQP;;MPCiKUKAISi3%#Q46)XQ>{wA3;hxQGYK@C;9YM|bzClphQ+ z7gT=YWrA>&!xL*H#-79lS-@J|-ytdil6#neI1FyjK3XFV054?(<*8IQHXr0&=TMan$954kZ|Fj|A(@746Za< zw}rbqR>xMywr!*1tT-#SZQHhO+qP}n=p-F|*=OHf-#O>jIkj)qv#M6T|JGcy#+>gn z#xq8V?z*y%6XK+w!*50$_+=$6H0s){A5L_6X#p#Sy_nbp0ssI7&Bc&a)MP_LB3e^^ zn$^(hRHs8#)|F$-In)Q2tT{x?fbmS|@k}5yFBI}`$?2@(M-cXrP1%4z{H|!dB@tec zskU2+zf?xQ?Y`2JhG+bJGH}J{^pX2oT*z^AS>TMw<#+tn^b9OQ70`}XYD@6|kH9*td_KTD!NwEKm;pQ*K1Wr& zm49Zd2gW5H*cFgGFb}Pob6*%gc5wa~BVMkS(n;gR(1aSkaNFe>f zkezgNRlk6h7sa#S5!L`x-XK+yN0MKlrBM;Y2~@aS0U7ama_4 znCz)SZJ?)8-xgYDakX9+=I&#li8lU#`3D`H12e~~^fmr#jqsnZp8s8{@b3(;N`Bou z{}Idi|Em@L4MIa0_0cB&JMHI!sH5!@N ziQ|b>OCvR1B3-E<4O1&e3&y~noJ(tzsAra{r;~|ykeVxCDF5Vm>U4!=6c)dKy1(Ci z->A>FpS~Gze!~Ce1C_TLHh)=zYkX6@5XM*QAI60It#%^n5YRhce^CQsyjG%W+E2+n z8dmQrH|fveG-E^iWaeU(1!r!{i?8039sg246XXc69u{dy36`>0&=|8He+Kwxx{bR6 z!K^t3gNpYguPXPz(7jdeHHo~_Tuz$yu`G^|%`p>#`OaNhvYK69=JkjwJR-ug`6}Ny zBAY>5&=0gj5UuO?z_+?%jahGvnXpp!ZYv&@RQlJ}>YFx$zOzYzK84DxKYY=fdmp@3{Fz$34K#ixVA9pR>)t z+Z{bDq~fvglj@d%iq|T5{3aCC11VcC#5-iT*!2*T>SOk&>OQjcTRrR($JV{ak1ikY zz3FfjkI|nR5?~>1$1eTjDjtJB*>*3v?-{4xR>P`EdssapjZJRaP`7LL(jk|OoXHP< zf+CXAR+~OFqqKHpEmkd7<*`)hnrO{jQ$e?Z;H7bI;*yu$wRFlj9=Tu%>doLowx-L5 zeGApObb2ZCG=GDPkAj*CP_n`y^s$}i;r(5LLO|1Olxgl?K5~A?g0AeM)w|PB8;-aD z?H!K|l#3ibuCg>&yZpJ(uHtS=S~#?Qa!2cgD2|04Z)Q>%T$AP@t#mY_93cX~N6he; zt^qZ(qdoGg;He|_4`y=_Zl|l8HpON0qHCIGm7Io8lfgq?)Dyk$@Kcey>w>fv`OYoN zcqXgh0&2xAs1Rf+!=GOVgB^wNHWHEFo2d?H^>gkuDDk>uXpQcK*?arg-UvL* ze42p{5BZQCWF11aU<);R=>%@0+gTIxnDDUfa5&zZ=Pz(W55ANyBeq;;L$xfsn3jbs zdaASJ8(arP(tG7B#}B?9lJKC8w4@|>z`bUutA=yUEyLM~>#)a8RoY5X5oI>0TA4XC z2XTAp%!FAJn8aBc_SW(DG^SFsyJ1Xu78)GZO|yVck@6#^MAF{E5sX++iQ4dEfBIzX#Q=wXG@|B!z zP1lAmrz-UCT(}L@iK^FOEYo zgTQ(N3we%)GzK1e-u4ykDh)Y8qnY>7B9VjP@TZkRMedS?5zD|LjizBxD=^1W&V>jE zUF+g>qnxIV?Cc_7L6c>V1auZKZ?Yv?|7>MpP%@BLz%0}?fA@_ctsATf(R{=Z8QPXc zLKqIsz>_n3>oSsoMJICOFTMM#1!`D;A;R13?v~UYsePG-K{NE=qkZ+{E^)|g+cC1Z zLv?gu6D!1sqR$dbcGs$!6DlaML4&mK$}WJ6JXnA?mehMn2RJ zNnDLQ5So@UmW{+9gFG)0#2!n+2C`k$!6P~*CLrwQpWztfcrc6I6nnkS8Xm=_^OHNt?e!9l{&(JqKw?;?SM;4e1N0P6&^>Gtg@ zL{dg6G`>QwiL^{DAJlUIhd~vYr6Qx6KJ@;kMtQ+ZuM41yN@lK?TSCO8>$Fs_Lhbik z90e&A$Ia%T;Mf~BwBy0d-sfp)t0K8+ofiKSMdq7FKlR3-i>L{vac zx|jd0i*zGJ0-XJucU36MJ15ei#j0j#RwxKvr2NqOwR50XvNk%lcZH(cK}45$a{RE4 z5)Yr`b)u#hDtYDG5Qk{jIupxj>UGq`>-)${FX5SuUuRln@kWLD$3qHO{tAJ$FCyk> z#|ZH#z1Be|>k|=Elrm{1{f^MV?+5kD2CO`DY5d16?d#)G2FR;vi6r?Ato^3zT}S1o zc4y(0{vMaHxF6JzGax4RiF`AA&~PRE_`bc$;J<6;hW~6Z*Dw}A z`OOaq;OXf1Z0`LDEc2A9Thp~H!O~{cTg23EWE~6LUU3@wEo!k`-r58&Mjs3d|r^F$Lt>tQ~8$l%kn`wL=6dpUU$arB4=0K`|2S)b?~`Y^My z)-X|r_N{u(e?QOm0NrLLZeR?1q*3ofr!Ojtu!0d`GQ&L*m?NH_Jex(N2GnW*EuB_7 z?Nz_T#&9z;6&2;AMLKnWnphN#X#_ zY6qU>>nw{I33VI_<}@oGSV~b>DYPqn6$>;mNtjs18+dZGyJ%`03{}=D$J^)%Jy$S} ziH$>4H}YL*U5Cpq`sQe#Ik87Ci*7c1Ah+LgUe4R;FHZ^LsIv-k7?q}mAXc%GsJFhI z5M^ZI4W@i2n%jUS(bnay@V`=%fC!Qx=ut{nN`(;c*fBBXk@Q0^fKqSUd(x5 z$tMmn;^UF0xO+k$kgI{iH??BhMr12Sm3(yIW%5jq<{%%DI3bV1<+Ils`=)qulih-N zsjM*%rF|`fV~H-OA(dIb0+VIZ^*{BtbIOgium`h6GrjwbzCszD0?B4pjvT=zus*1r z#legEz8`81H1LD|5WvSu43~;^7fg>t$3i^2u#ZJaI)9^${vA!n5Sdycp}VYp%|`hN zRh}<4Di*B%E=KqvP`I@n45uU}`NOC;+IsHnSK@^Zq7X^plu1YV$u8lX0)idEd9Gccp3kkXIk^CD`voM z4X)F-K{mNxkyLu$7Pcrf62q+)I8ER2TF^n?(nKE{6y?mP$A=-lxAR{V#r|k_k*z}U zfrIuno`1}&f$#$P<^FZp0($Y1lG!K^?W&&oVuvt>%kp}rUSz4C|J&bzdk z`gKrWi(krk%rh}BlX%u-C&{_gZO6zb1gOE(rTg)}G_Mi9> z%vn1S_Z0y|^ZHBHmqbJ9g8k0xgBH2gp=QRJaiAY%#7~bsYfUi4j4%}p>gE?Wu`{Z~ zg3lj3c=&!I`G{F#FJrvcaPgX%6%Jg%V13%Z=KXRvf}JF-%Q*IlBikeKVC!@z#UmXQh6*O2-c{8P))Ijm`A@Sq^ zq`gB0SEHGjm0cTtgp(dHzB(lL4kp#1kuh~Gd9SfE3Nk^f5#Xp5J;h5JSY zRA%MiLFi(Nm8EIx(YT;k$eLp?Iw31eBobWaTsf(8^{&cJ5LVKKUjM=-yrc~+CQ2n~ z@+hv%i6Onnq)+%Avt%EyW#PQCPQdHx3IT|lCYPNNE513Y(3?bTMn%d{5fj7+qOl#q zZ-JW2T;j3O#IRcPE z2-w}p&z z(evOMa3n_)gN{9P;FbijO{q#2>!Z)r@<>RY_74T7G$g8iUP$MMlO?lr^{B;-x}ZoE zt;7`XWu!v9xCG5(1|c7OQNEZYsocq<_GELI#-nmSBwJ)ySd$XiGpEFWDg9lj86EVN zRN_d*!N4HUxdR70L9Y5z2dW5z0Ixa-qciH?OoqS6)^>3-=ctXB@W|H%5HjHfT)6}s zcp(pgB{2w!E{;jH>ZTPcLAhb7w@lhRqkv4yim9JMjhddZs>c^TxgDIzs}kk*{c`&4 zqE*4Jo>{fp<`v69K(D?=yZ7Xdt{wp2Du9mz7AC$b{v6w-bE>6ttEH0{HvHgBK_$0T zdVkLe7ZmH44L-F%Ogbq?XHq9LiBcg&*ZzeT&A5Yhs=L#_#lOR+<=ftCV|1f z+K00cJfZt%NL4crTv>7ac6ppE3ZgYbdRE}mlQ>MR(JgoZjM8F#92YxQa<@nw(A9;S zrLvuBn-bpx)yE<2YPo3gTNdN786c|iK8)__jAO+3kiq3Keh1kD$w{KrYzQL!!pYbF zVoLi-Q5?6y9?1!+iWzI#u)KVj{{mf}D?K+Y#H}Jm(}7`|J28^9vdU$*p(4pyC+BL9 zWUO4L09%pRdY65M0Q;cZv1;h)WQX*MlwFC;*M&b4B9ry)WXJ6TeAi-!__OQLf`1O= ztMb|2lXQVh-vK`K5S;{y-EzCY()kVFB0UpngV7;2PVYJ1;8^(|+mgLOUHhq$r@k^> z1ux(J>hS&Dr|}Hi5oz7){*3qr)*bjnLGDQmy{n_g=s{h!i_Cz}iwd*5orlSbOmov} z68IScvjcN$&rVGnOgCtGlh^{&h4$3Pwuktv!VR?@TD%+Lf-dj|C;x^Vn3t2cBB#t8 zp$eWagXs@7#=ejM#V*c)7@r7@Q;`wyvk+}Qk#j;WNxx_=Kq&DsrLaM-sqTBU;#BYM z7#dElW*AW-m2E;D?l8GCu&WLRCV`e(DXZ6Z3U<%yMY9uGwd84!;tY>l+4HArDP5k_I|lY*|B8Xcu+cc=0|45V$N0Mo zD~YFTfyUcSDA_4le|Z89S*!<&OQc>ma&vm;`3dlWv*UZ}zvDv^DgcPVOjXDmJ9rxO_)Lt-=056F;)Hxo2U3Nv>}FvI2of&R9tWORX;+9R6r!x z&oIjyHucE?;{oLx=QM0d%`B?kY)GR++pPD z$Wqe~M^ryzE>rA;pE84JkMA2^cFx%`$8}5d0GPW%t4LfaIw13;4jje-t?Z3)IvZwO?Jkvzn-^M zxnX(KK@@WCV=RDk>WY*ll#&56y#GRv+RRU({f%i9-|@KbkQDVFWkjnf`*98R!k#td z{X=Mltk>Y99c?c#?ACF;d!sx&f|TLFibu)q$Tp+ZSDuM}J+w0JoC&u3|nD=R;`^k%OQwGxdFt z65)c3v-Gq4yU3iwSVyBoOGT1_dyqy0EeYWdzeaN_VQ6^);_`ot+a(uHXp$YQZOa(X zJUIOCGO&FYXm-kqZmFxZ(_ZE?FpE7TGgzHMuywq%4)0S z3ryk4S@tE!hS1pxdba8zFv)1c9D7zipuuHTX|vyjaBSH|1r#X`>4$u^aK--Y(<&Mi z9#njDjscfbh;kO>4(vDR2$nw7wgYPqS>mCG;@TD7kTSy#lDzP9O(3VqvuQ=ak7<}D zwWt?wRTPh*yrqxUL`7F8jkQrUjY{n3JrMLS$dsaiVUVE|V6>eBk_&Je$&G97eCyFn zX~L(~Amx|=OP=1BwcPd9b2|dypar+V)j{JXg_78UO|dWed)~l&mudpk?2ojAi75x) z5Qq;117UduiFu?U@fjN(U@Kt>1O_Ce!g4q#5dee{LS#mwsPzx2xy;D7vD%#m{%XR) zO%ekT3voYs%k&ZCi;#CC;_s*_Ywc*=!Ma<21-JVqQ1#m+;*dQRJ@BIxx*7!Xb4U~N ziX?padYsG?cNmWZ^TO2Ma-@XQ#q4DHDc+LI7e@taVj@-!1c#F1tE74W4DWKQ(DBc@ zg5mpb*z?70h#Dt?CE6IDh(B5&Z(rVYiRa)2HqdkfLg za1wTy>p@y4l=`-@h#nA~CrA&JcQW64#!W*IXTwX-;`3vE@JJ%#l8&K%RS{?y1%y{Y zFsKQ**l37pp(Lj*uCQ7yjpn&+n3*P6Y@0 zox_lKg{9f4cN;U9S$Pa*mit_!Dbm7ZOhmiCSe1-N>ykUtZ3`r&9UXxh3 z{XzN^ay#8H45;}*aubC7&^v}1YCB-&2wUf<$=oXPjc}Z*|LXpjd4OBBL}&7+WQvs# zbu2jho!<5JlNm9$?*MWitfM5YB>H4&9J26Z&?9npxu9(AO0stm#Jv}8~JN? zcz)Olzx)?`VF>qt7|co`p_xw#hCfu1DYBH=8@pB!`=nFzs+Gt){s%%{Y)R;CJ>Qs% zvAPB!1@@zf^QSCsGcM0B=J*LU(AAhg7WEMa&?Xd!bRKo$t*EPbFzzkmW=kWF7bk#9*mN}cm|)4);GUOJX8Q^ik>thFac#KrBB} zwn1whWuuh8*ko}9v@R=9ppk)>GfMA2ebJ{#mdG9jBNZ6J?F&)+-%gER%@oYcUL%Rr zb00dJLfZ#`0>8x6i6_G4P&-cr=ao4gwFd)Y_w)ghy{^BFup1;fhPV4U7}gFLY#%I=I+c2Hze@ ztWk57cD+Vuc8?$UJs@-)_Xg;P1>(wKY-P{nVe{=#h9RN0w>g&_JUp8`##0d=&-cq> z-=+wfZg7g+7$U>bXm{&;o#8r+3BoCmk7*2Ux&oOxJA=unZqWKt(5dA>87dqK zSKq8_W-3l~2P$43|H7KHzfx8QP+Lw$d&#o={2<>?x`7Xst)UGx-$Z`|^L+~zCOZq{qo$NgF*6^xhWER=~hr+wK1 ziE_%g-88C+hhiAc+G8$a`5#Pk>3t_#JW}~wmVo8%$}^RVK!Noh%RRf5&@#87cqZ=m zg!I|V_)Ug}-plpPZnFa2_;(?X1<^pD)L*P9Bw* z6{3sGLu2|W2wXPci0a6x9rnaqKQB6r<6Uy~W^W;o%$wlIkaA4;dn_zc+MQuWzS)zv zEX_v$3Rsf3Q^1hR6AE12L>(M;16dz$Ba~9Cl+%Om59C?X?jx7IZ9SIRUH1-2dJ5Y{ z5791GZdhe{%4Ll^MSp2D@#XDWXVu;tk@de})Xr5_vh_uj&bgu=DzLWSbAE{Y^b^uJ zSxtF{OD)|HGEluDVlzC56d=l8_j~!)sZo;@`U<+P^%k+yujL_Z<;$+_Q#$KWaIvqGuOm5Lq-qeQ0y`Ovh4TdeShG#YD)2%s&Iv34>pV#tORXcg~DiX_W+izUW0YJ&9BeC&k! zGp@ek1$pXT+^*sgO{@u&?Wqd2kZwh9Q&8MqN0pfsvFC;IEL$Kb zbL@`FIn8;gVqBM~_1m$i+X>9h@$&pRm%pv4mM+E>1t-R#w$yVG3$BfFgNfkB_+(Gw zR+jS0Rz_MY`PZ#!qv5Q{ab@PFGSC*?Y2V`?{*toAK`wH$1JWt@hkCON`Dx z5gI#N9j9tuF<+96_awlt?fEe-lTqKlfigzEccy9VsabKi#ZK@Sho??rRvn=$}s?nH`pZW8{XOqx6ZTWF@r?!7B93U8lk!4T8#PsaqInS zyEOt#T{M@~yrPY=Th(bslM+^H^~CN>>O02Nsk!PFN@@=loH_$yjHn|oY(<&ICPqS$ z6~xmN(1d(`RJI2+kl3z+hA2oynVV$LI;|<>1fr!Wkjv%J6gCv{i>DV{J71-8<6 zS>c;^Xm{LVvf(4D+Iu7ShbW#-;; zFokhHR)f8v@&wq~c61Jpt--`UoW5=Mc87{@CoXo6S8vDTfAj}mzuthTeau9Eeiak7}rV@M{2oH#4|NY>t`mJf9Z)ZGpbC4$UHRMpQ=-7>MaK9 z3%%6%X5qPEQ9{KHtQB;wv=D0ir zG8|}HoXzHYik{4AtBv%W<>||)Fb8w4?WigS%`_1ka}RHoj+2AVVF)afFsV>H;!Yr| z{O82gg+c1{nGiL*W-@6!bc8sXXSsx@jXsRjBU`27lF6{v3W~?eKkMU7c@V>ghQ)~D zVYNSnmB`pZo@YM8HPverCT&N6iwhns#*N)Yaf(r`RC=bkDImAvoR;I;NznsiXve)# z?_|Y!gEv;wXSCQDX5qMrf?fyg;S~u5;?%KQ=`^WezKIYQ9EhR6#V+r@3|pP5L);7J zAqt*liY=BC*LWR%36>f#KB3}pq2ac_`b?IYLqYMNgfqbv>YAGRBTqH=9hv*(It>%9 z!LY_!(dgU39X~N7DLU2N0raR*Gl^YS8XD?uO_KDGJrpNqq%#Z!2TzFiR#3%(`^v{A zUR;mHaZYno7FvFZ3Z%mBR?D&stpWs9-~9+;r)tRMNkZEJZuA6B*s3dbG)SjAi@VI6 zxY6r@5uMJG=PkrU9P?pf{S*}}0+>=x2IpS4niIJc3BuR<>|7ARPq15TXqjUJaZrS+ zC_n0mH_dT49pEfWO4!5l+=upJU$2dejx1*veR0?{W250%t4Wrpu5T*9i^f&a?M~pv z7ZeH?IWfj@u*Xmr6=XVC+~$bQ?C*Q}tdulM`8hcULC1+rDOh@7+qm2mfWyj*UkYI3sv+c z`Ve^+D1~Vv#`W?4Xt*H%QE$QJ%a_Ye2mTo(E#8~mAl5I%wuuhx_hZjhc~#0Uv{Evs z-Uti{jCUDPFuw&&---L%1o?(gTr6_zDz#aV2KxCOhA%keH;aZDF0a9^L`JPr3e{qs zI?WsR*4V`Oi+Re87zq|7bpA-6f8DZMjx8KfeQmp~*uFnnRv*++n2@=(wFkZTG}a3& zdo~*0Fi!;+cj=l^`)@~p8IP<+nPQ`c8Aw*mf@sxE!W!|>yH6mze_^essbVXJv4XJs zfuX^j#uLr#mgaZ+KkY`E`h+&udXRp6C6WB5L4jW+1Z z(_VY0Vdzw{c#9t^7MjQ#jZs7Uv&@J&ztuKdRJI>kzVN;k|w+Cnlc$ z1)4Hes(u#-LPp%_3+F5SublbyjqV?*1@SnD}}x>LeraZO(_1?K+7MlbvXh)KWZFO2F z*P=MT)o0x#B4gaYXx*gImEIEko;I!jcIF>WmBa1v{p^M#fg56(qs5q6TpC89@0c_J z$P{I7xVmo3w&ww}P~f{JLB5I&*^B~l>W9D1EMD0;>oX$hpoB#W+yRHvG*zifB8=%w zD5it2Tkxe`JgO&%2ftHo9UgSnc*fxdE>m~xQf^bf0a>I>q ziYEf<`i#oqI;o9kDASN&jp0Gmj@l%_?WU5Iqi)L_LZ~9W^Dw$fptqcU zE{;=_k&iyTVKJ0HAp7BGY+_Nzq74s;P%8wSEx_KOk}t@i<2tj3KP8j zkP6eNcOR)q2gbP-(#u`f)dOtPB!*2&xhh(hU8ZugC~t>*48c#qnCV%n;~xkLl`U9; z&*6_iHAic{?{kl&z%sB`6@x6#OyC-+3I&@Fc)pVJ9wen>Lthh-zRm0(aJ+Nszz;RaA2p^p*ouDQi@PIfl4Dx zN&bs=)AyZs*v?@Lz36%d46pVlVkm3yb##FH`)oef^XWJ6r0 z-s{uR_cXoU5Qo<-1*li-(T`zz@V1+#@tkm``r~RAza+GS96*+_E$2jqC>zZOiUMnO zpCZB|LeW=nc|*0HQK+5=JMx@^^A~ZSao?(F-LCBlc#H}X!|GPiEbD>lQs0|2`xsqK z=k&u32Ez|N)EaIw_t(yBEFD|A(ra65j@<2SoF+d7XVX6Mia9Nq;+4ofQi?a7ZQIDH zxpfX+rCjL=AdWi2dn3?&Ul_M_D4_3oAxMolXVh)wMQna*Xm!HnEkVdz_N`50cnOy> zReO^S_xxE`P3@+u)%J`;^9Y@NbsY917E$#{sMfX14P4iIedLtn;R7E5CWm)| zRPQAri6Ab}ztj8a>V!k$+b01$cHen|HKuc&8zR#l8|$>KjBn5R{Qu6vthlDITpu;r zW4Ls!(;RR<-7__0W*cf5X}eaFsS|ZJZ^aTz8~P-_oKsmi^A!QT{J^0bBq^>u5(ht6 zMl~%INv2j5Mwz_%O|{+{6GZN!8-m+7OnCDnS1rS`vonm?rIJl5vslzSSD(8y8+Ki` zx#lR>P#z2q1^8X%i#%KfCX$GS0fIbUjDM6Sx zmN3oahn&#_bo)hZ>oh~<_VaFzRt(#)z$C@j#)dR1V-nN=jX(qiG-~B2NoC(dGfXUH znx!%`=29#R`Egt-7Wt9rS=KqxW=`LxMM&*Yt}(RzV zi(BV5xAE+9!oM$GR^G1>HSRM;JEe+g9@T0YO^*ZHCh|`E!K%#j1|}UgIVCs4C>NvL z8nbBELu$^1%h!DHWNGsTwSz2Ci*anDg71>dj$Kv*Eu1AaA2~Vya3)={Bqb(F+tPNr z0pNSohSyrAPf^-Nyv)z}%;!3~55Zuwhm49IvBlPD^#eEF)F&IG8O*nz*VJkCTz)n? zwGS#GHMSe~-6M~vxKeqPg`Zgo1)dE(mIceN1^;Zs)hf$==|EmzoRn=)$8kS6JJK74 zwu5Ca$XvZ9U;C=*@4GP)Ef=WMFTs8F7>Gbo7=8PgT8;+s!}o&LSx>C&UF#psWYr8WZ+I zyg;(>YRD)~_8@}DJz~K_k*y*I@Bs2xUilh>EqC&VFZvUM{ZuRbboKT!-}ejM`YAK@DujxSyV=-br2~WKx&pF+kO!wZj+SsMkCc zuo_obh(PF4N+&E!`r=n;ggA=75RXbN`&mYo1L59irs)3SdGn8_Ebw^nMmsI4U(Bfj~Q4${pvYM%* z0TSC%Lp?>Ynh<6pmYIvpO6yZMNk}_8vIi9-&n6kp_Lh8w8$mSfMjCztS%*L@e(Njr zFE&_>Xr|t*m1Jzyobijli0fmM1V<}NcP(MAf5J2Pj1q{vfwP3})wh2(QK9+Rskidn zF+K0UUhlOYKw)0q6_coRO%(<I&Yz%3jo}q=PsfEM8`a*%xwa|U^2tl9oO|xw+&p*R-ZJeAb*&XcL695W& z8gt|)`5e#RcoR|x^V0iq@%fy$ZKIDbf9ght_K53J#~|rhX}A+i9H|W&CncRL9Brkx zZBYLSV78X6n$gf_0jAZ?vDPeGEk+|JiP$GtMCuLR^<-AJ6(walkp`$<9!yIjcvxR3 z6~g?E`2>A|*p3U}#|Xd*(jg}l4sjPm`ulAU>>mrjla+j#_x1CRzCQmm%k{H+nDbVfjX2QzzXD>{2aJJYX+ZiaSr|FHn}#KML~Kt~IQ|7$rim8Sne)_xSV zUnbQ-qxELb5$dJ5&R^Yq1xRdc*K^sPytrc@{Mw4dwTtH74$r1vD5I#NC|hIo@4~!* z3@U9p4oB|<5eukpA(BwEfS^rY=YCjlEm+w1jAle_9-zG*ZJER+$aZH$Bk*6n^F*|g z#1jdd6kUh=X+g^q%(by~D8CW;V>=4;yX18z_1DG%3;V3YT<Pwx`UO1(`LCl(v_-6!-+YVeIm} zeV8HjJa-DsW>iB9$_74DR;Fs~`jijAp_jg)Kk#H@FK92z?koppMXH3AJwlYDyU%%* z{VLISLkSqLxY{_!1S>_DzxBZT!{rxz#Vf=zNk{TE5aUtXo-aQ#Zy^T~n=8VT>pNP) zN*pKuRCL1i^?GNJ8|$I+32u~`qtpz}7xMx=Id`U$W4g41(YA(5v@Z8&XeP^?++Ef@ z;)0{jTXv^JpJ_YicGoKP(HxDZlGFHXz_ifPgX zilxY3tg2}7r?|Qk{G7WiT@|Qv4ACPZ*muabKN5(%0`gFX&-6>#NE!KU0@VvWlvX*Z za%OXsq)ni22@{;I8wCrP8-QM{B((V24!UO7m zdq@8h;3H!vCHwgihCk=w^Gz4m${x=NLmGH6KoQ@1{80rU-AYgf=1Hv_$60-em2crZ zuz65XJig&ee(A#UI2_=a+UuFRU#>4+hsUvfWGYfd^tbpIg~4IK(cq{N$HeN0{&Lm@ z5M!?^I5XfLZ; zP?ONM8W+QU9BN%JiV4Bt_jkNi#yP{57u2+*cYIzMHNAQ5NYWZ?2Igi(wiJZeN+URl zy7#Sp#t!)y_Wd>aCU`1#k~*JgC0tS*NodJwSwT3ggIi5ao;0;|5I>l;a*Pc!!(`1! zUV|&;r;M_S77Ud#fbuFPo&TWRF*x%);G_tN zIYH|5Qxu70>zIA}4fG%Q#EfjZ?C=H9t6%@<|BO%nPVZjY)c*e>-Wye4?KPEgKQkux zjhufwv6-?R`GJ{%Sfv$6;e)RxslZCCGRsh!#`99!)VE4lwXAMlZC%0$fUZ%Jhp3Pg z`ly(qph}xILn*7{is207UqmoPG5v*L-+vB|Vw%c%=5Tfv!mE@>Wk}6<<=MXX?4BC6 z{<#0c^=)bIn3s9KUi)I$UzQW5#k%*VJDGyVz zrC_ZHMR_e6WTb?o+$Kuh&Wxjk8CPKj2q)$-W4jQX=&}%v<{>-kBAv-oW#G{T{oCZ( zkJC#ble=)&6d%h*+A^yAFd%sxoyB7`Sk%yqC~NknB8Uz~No}-3pBTBQCsQkQ0kBY0 z`CY#!|`4XuZ)8;ay2;sFRvnv9nRTe2!gwVnfE{55w3YUf;W>g-Gw^!Had8E9TOKfLC)Xv^G>RXl;=;Jwo=7pcpozODQyxR>{cWC6O@B`k$ znHVA9(&fl-Wmbk}^MA0^kE~k|r7OqPDgD}cw!S)@~p8g?OPVn4s)6&pJF&ph%y)VT1}5 z0G)JzGwyUA=AfRJ5at7Iaa{qZ&``1@xUtWZXKOwy`O0q|KQ`8#KbtJjVVy4cv9#>P z4lKf@N}MozhTdhjP`b^xGq8tyJy0hF0%^!Rf?5 zbIO`M2Mw^@(uAVl`VFwl&fd17iF;ttLAm_7OlFTvCgJsOC(-ULN7`25F22PLWdcy$ zYI*$bH%BsNAh`8>WC*qYLBpnWG#1!QJhks9Om(H;q+q2@ zgU&GMKx)ql({bb)Rg4tR(c~W2E{C}jqQ*bZQzwNt{tk||~+qTUW+jdrL+qP}z7u)8F zZ6_!Hb6@t^RrlOobzi!wtKYijte#`^_d)}nxH5)kq!RvYF@I8 z@n$`)Je;GdJZKJvTtu-lx@j&u&FiOrs1$`^;syi{?97x6Gyq#Z74oN`YUz;hR(y$|mA z_H%1OICED`f;>zdbw_lQ{`A`c&LR;KfAeU}G|!9H^nukh2>g|AyI?(wAVN)_XcZb{ zYFK2+4n4;C>8!P@RErS8PCiCu)I+wlvMHpwM0BLi0~CQflG%Z_o+@6~OBt)6S*dct3S4j5?TOVK;C3Vk zN=rmcLjiudh9}abqXfK0-vkeT!f5Gt4nfBrjTTA+ zVeG~=RJr~_M27;Nn}V@A9)4-H=+JLZ=Sv=ailMFpurxK?3Xu>4Rg0N*8Q=QN zyRK@M(2+K@CD0eAWYahT!#}Y<$5ix%Qe(dmfviiAi2q&-a&T zBUUFv*sH_hi>@EQTWt||A3)qU=smYz5qclEoj3AQ@93@vJ5B2PwKw}|5Qe!BdxDCw zp(4n5Xw?iuVlZKBY5Tq~;d)VF-597~c!=Qok%Jh>@n84?c#OX@rL`%O3mcIcivS@gVVmU7|MR z^j_@u$-%_K2cCqbw%~Uwfyi1ioo*OfwlU3>Xxx(=D#y^&i&1^EVK&(l~aColyN&WU`!iGlA9ZIPRe!j{j7fq2%!XitEh4S?AA=o9lUFm z&bNGf?uM~K+5K<*lMy-Ua=&tu6FM*T>~nliuGwLe5qt4Pdb(_767PqB6WdjL*pgko zq$~xamC)9>OD%Wv)93#V>=`E|G>`oxaD@I3D9nF9_|gAQ4t{pFX8#38*!Miw_ELJ*< zyd{OVR6;OPrLt2y^!sNQl$DdM8%B_-a%kY$A)m{4%)OK4Gfg|5^Hr^sPBO^S_R3-$uc|G~JuzzGwy7rBYly)Pkplu@iBZf7 zrIINxC*;9R+4Dg($qMC|eC<^x+1QlCa8zA4_=iWhq?GD%htGx@ z%?{p@N7z`WL2bSLJH<#5t+z80yGtbZ;)#xA;+3jQ!Sv_BI|wuo%1 zEc&HUSrLO0<84*@P$kAXs*KUC67M^?5&&s;Z2)&$2~jL1>dGyhf13JP125mOF6#B3 z59(AK;Q1Ps9EfNu#Z(>Y`=3;O^?zXb5m7yx?-xPOQHj}N8BB&Z|~`prds|z{sf%E ziot5{TZ}4;Sb9};{gmRXF6EmUN86oh!)kdOLYYQKWXaHTu{6~jEgO{&`(;Yb6qxMh zr0eQF9`YVv*Q)J2Qs}o(*d%az$sdIj7sb|QI}yMXex0mLPRA>+VZB1LGxk#btdGi82okioGIQ88$a;t)7B++iFqEVvgj`nM zg#fgi0si#fU-&1MQ$RdPIhdvZw0`6o-W#aNmo@%VqAsIXj_LWw8W2vA{m=!1UY`9R z2Eu3Vb~Op?+!&ju-cY>I&4o9DcTT{cTo`~5yn?JMLd_5SP=P!J8R)NEDIi4pG_H29_w#bxzq(Y98#_r#T$BM{Yw_SQteWZ&yykq zd4)dR2QP0V9LlJ87U>|p!qz;ej2>Sc#Rj4iYr=|{1k!M8mH7p^hOY#g1FMT?iWe6dSWEo<9a{!1N=Sw&E_**`!64FH>6_DzprKJR!tD2RcN6iilWOtE(=1?9=A4Y?jKuW@qjk zBhx_Q$NwZ|zJ5OX?79Bj_Ue7!HeJbw&HNQ*K+dHQeh8GW#g{X0G1R2 zhZS^|5Ns*c0{uOk^=NICjBeZO?aMeyL_vmhibNwTmn3vOSyTGi=n$ZWMwlT$iA|Zp zO!mYE#>%0BnlhGCJZZUftKpGGv{7vp0-06UrK}PuhmU_7!YqT%31p?j2NYK1DyeHP z$oehmxb$e@s0dF1njf8-Lteg*MVd

    LW^9MVsoAH}%BP*@PwimKJUYJCJ;P^dc}X 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 Mp;QTWZfil1y&h?# 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�#EVF;OsTja(GCJ+4Z?T{aK|^YU~{F2iSzN> zP9DdfQz0O%^P@?{W=`q<(o42x3{P{BirGagR|v9c0LImfAxW;+3tm%EU!@mBdDHpl z`K6iZ7#qjefTRM3M()r_jl|ug`#Rm@ra5@(_!Tx zu{mt%z?nXSo4_>Zg+tqrDnMXWl&STY0lyP(K(c%-l0@*BMv?14GTzdek^z1KAe2>& z-G4JT`6s@hb9A(;Q4`E54lwlBp%`%;)5cK}DpKr?wkwK(sex{~S!BOIBtRi#@^;4e z!TT#h+AARuh9$KX&GQV>%B>EZ%&!{IEC7QXoC2f|abz+uIt3tvzzU4MRRM4zo&&~q zm61)tvyl0N-sv~ke7X3@xXXv4eran$ z-P`Y=n5kN63m`BSMKV4DdDxj3u`^A}Pe(93|6Tp21`nA@pg2*@u=FMZzL1L?w%qzJ zE#Jsm|0XHEVBWGn55q&zWIRS!`9Zrw=XIGHGk4T%1qm1Az;gDIT!(LK7p~HHXA*^s z*#==ocA|=7T?>jI5+r`Hq7GI3-c)vB3`;k}Izk%QLc+u!9oIIz?QzvHeAGjb94MJ# zNYkq^9C}!tFn39tI7u?lCxTy@67;7DNPN|VpQ%1ni{HkqNe0B$k#^H6<_>Xd5d-xf zS2jPS?5%crSf@>yYA+YRm4Y{5Q#QYeQoh*4VASnkjqbIw8Iq0BOyNqav_%8l+0_!7 zbTeftW5K1N1)@<+vCw$;_bUE-2^J|HLhT}F=$wB?D#eJ4k^u`mMo$l1YlRh)_T4#V z`>dHOm{gw#_WLYSL5^Oa75YIcn>El~y&(K$|8HhieW`Qn>^&}jE5)j8Rr0_%i-fyl zYl$H7F*sjPV=6mr?zp4xHoQ(NLAtn*Zed>^#w!sXrMm+S)%odJO9JDl{{4NnY~%Tw zv3=Dopz($DGb%HHSL|20^Sqe8#VY_uQ12tuF_BF#$EWiDLo@9H00>Y}|+^Gky zsu5|mt`Rx_5r~4!1O;!XjeIf7ABNHOFFEIF_I&k+U^$kAWz)#a&-cnp^uG`Gdfkdd zA%-1CnALcWmI5$qvw;gk-mK0}Uky-0u ziRA}&YP|tO^IQa0gV)pb-!!ki`yJ&wJ+L>v_4+fnpWCItaz5nwpXi-pZn?a~#jE*{JY+7VT}0-jK>2M`S@dS&Tz z7_PzHD+od~YM5Vf%k?HgbR#Ht;$~<#gVcix;n#_zNpobXElzfhLIFFy z29*`k*xxi*9YtL6cb>-@VysJX>{Y7E{Z6`D3#JJ%8@VlVFJ9vP-sq;3M(YfOu1wv>Me+?agDK4sLYSnK#qxEouEw=4iozE+ST%D?&NP-M^u<}#}G*!1eI2G zX@-(rv|Q%5+K_MiRr0gEBf^NT9d0T0YIe%GDE<7W$Bkugs+8C50HC!}UZRGIR|e&y zHG5>D=fjg{%N0Y6=sLR)A3M|EejaRmQkA}Ze0~q7J3a4z9$sD??0I{85LsJ~S^u)u z4j&(w-oL&dKxB!1qCXKb>uB4fPpd5=QLkaiZUrX8cfOD%s%vXWtRs#=M(@nt?rN#Z z{T!@&-G8|ByzPIKUJiQ``*iepKNB8xefj*D`1~?{E?mBUAAHRCPTQfgx_i1q4t9Gw zx>N4-bb5O_x?VTd=PJ4|_4gsSu&F#c1(x#llyTi*qRnMgFAtr*FHnC)?dZ!+@o7C7 zc%v?|!;yB_2iRYuJ!F?VS2S^NgwoTtdQ7t4+B0Ky-_@eJAs|am?wGYNVZ+{^CS?GN zDe%^j`Ji%Lw8cWu%U7pbXR>hyl0q9_=Brl91Qst}bV&%lS}c&yco)fj{G^{EFtMLK zC8Xm!kiRpIX%v}t!kq$UOBOzi}~=)uxwTr?GV<7#2eWb--uiyCSPsT&jN)Z z9+lfFnyvBqXk859R%2m>VI_cl>)X=WBw)NWxX*FrSP#Aug@xpWy_E~E@rn$#q8>Dq z81Ywxxk-iUo(SmxjeRoPf15wyK$GWU-3t$B)JETbE8FDDi2iKN0{2@Y6GH998Yg*I ze+jqr^kcx;&*GG^aC_e zDDl2iFp)<$Yg}d3j_s~LX|ubDBXLXVwFzS3Aa_}@_ecDTCd0!YAmt&fV(+47O>M^hvbth+!u`#bck9$2GKB;_%D%Nl+QhXuV1uL zc5i{QC~TR_YK%olANi`b8TZpBGR>#fqN*l2%X-(N?zDM*qR>wNz9(3XV}t&==JAq{ z_puc7HMDmbeuChA&22A&&~=v5Lyk0Jq zjWSI(fyyJX`71huGv2YfldXV=U$Dps7y!8M@@*0H>Cb^@`4p;4FtQ?P@_zGXab@%i z@L%aYcam1u3--?+ihuG~IY~euq(5N)?*BKvBmQT4myuQam*4*@yc@^!%O29f1>cH& z;^ug42p0p;l-WTPcM3%+l#@rYaf}mTlQ&0S!+qSQw*mXJq>iPZvhI3{%lKyPAwe3x z#{93^z5|}>@BjZ24SN;JURl|MBs-gID!RBfmwU}N8I=`^lm;1@B@rUop@fi?k+hIh z+T(xTMBcc==llD=KacxRpWNs3oYy+9^E&5!PQT~<`oqe*?kZK4s`dF~>xS)W{p2s# zoc1YLq~o&Nr*eUaoBZh(<{uOdGr#U`Eov`KxitDp@I2e@1iS6+4(Njuog95+pDx#h z?%e!t{U?h!>I2cu6CRDamZ8D5a$<^o8Z1hj2KuaLU!NPeiE+CpoLaLr@Nfxt&p01z zI5LxG=3%Ma8ydGON{*2zThYg%KR*s$d-vdw{J}T9I`1&FDDr%h3`Bt2aUbJ+-ehv= zG}@RokIB4XPFABYRLx9H{x3U_1IP#hu&TXXtDiUHY10WNWJwH4I;yxZEP7*BO-H=BHa zI`vguDx(h5AsY0AJ+|@g)H~&ln8EFu?s#aQKd*X! z1a3Z;@@!b+-~ogBdJhp)5Jxz9A9C|m2L8Ql5|_iO_8;3YM7Fg#vP20@_9kz0ncG}baavbuKt;e1W z=vUP|^7}PLT7AF`;AvFeF=)Ejn#%R=OdETAax{&ztoTySQk?sGZU4;4_h-HY`TgoT z!NYI0zM+ycDysDUz>lUpr}OqPe51P#%5F8W@6oM%?6S_fEXLep<70=gY=p5i&z&ws z1e02%T4}64Ysk*v=Wm||u5PYKzYurSFfLKk7X9#j2CNZ{&XNyD0Y7jSOr149ytMZjE-=uiqposORSUz0I&c zT;kM$5851&=q~ELk+gdS&gIpdR4YpV8Bw{0L!L&KJWV#OcUWcjE^yzK+70Em`n#pV z9_x^n^|am!!M@9QNroQb=uh*^Zc2^rwho+mlQj0UtHTbV`9RBml2nM1Tfy40oQy5$ zIMOI1n(G9qsnByh^!^QMNcmsXThC{HyA)7q6ZDy@OS#*`xjeS&hn)3WNr~D7OO;JE zDGp@6Dzmm}r$1_XpZ4rI=KQSymKJ0FI+J)d?2yN6?1kPZA9`Hh%bnkGTTasY33Ze3 zploHq^nshxM^Da_vwCth-;q#y*35Q9Y|=?2=TK|b!y$>Il=Q*|?(F3++t_~9vW2mX zOEMaY29YzO!cOE%g-`9QFiSQ~{AqXGIv|#0Li0GoUW-Ol@mjB7SJROF+9hwBxca$0 z>vy+Gq|3tR+ zyjvdP*oof$r7?9tO+c~@(L12J&t`LO1!ktAW2$KA80C>`J$jA@uZTwI_tHn_XfWP) zz$7{JIx{mjUrxS3DR;l4OyT9*_DKd_rNLq4*b#6*u8?6DuWr-9Q*V;^t|G(lGG=}0 z{iMxMyuMUEF+>jBQ?YZyOYt-Jt=7^EZGH68o8jhb>>It9>w>IFHI|HWwo&!tn?_G% zd&pmVAIVSt*2C<=EWe3!MQOdQDZQ9S$b;;>90^Ur$~ zHns(cH|#D?J-FWU>=;$0jiST1>qGCK4^jB+J4ezOUql@jSu0d5;PCMe8R;RJca`$J z`J4Nn)b81QqR>_T$8VO#y_av6?6Sh3gPfLIN=s`Ub^(iX4v?KC^9;K40 zN5V(!3Ip-F-tijOQ}z7T_1}W_&5q+rX$;aXpp~xR^KbA;4|!$? z{>Q?z4*Us(d~r9&MFY*!Ut;+8OZFaU2X_Y-r0e1lZRzhrBidikMZfQW_VUFb9enW+ zaf2_eAXPUFt5S&NgRmcwE{K8T|cFM?(OC>VNyC1OE1R zW0L7!Gy~X6w^mTkr+AxfpWC^Exhi4#HjD|IIr${xjNR0p)HU`#E2NqTdq~spTjWS; zw7_q~v9r?;L;BWBe!qzo!?p(8+xhC@ovABTq&@Xdc*KUC=ipse*26mRK&pLe^O<8}yxDdVjv`&W;rpaNlh>N;)k>45*q=&Mw&hG#XUt9xHXr`z zoqjKUjRdH6c#6|px;Is-Ize5*krX#tA7?S}#88?hBKT`tO5cs9zH9pYrH|j|b-erd zWdO_)CwzUJ0{}aU7;ZrFvZ>X>6e3ki7q(QSS1Aq}1tS zmE5YNGe?A zQL-IUOhN49=_nl&r*Kjg%kai%CjZgdT;JeC*cS$n=f7ODIIt|WIa&NRXNEy~VVzKz zhg}7AqzB`86_ZX*#1B8dp6$~WxTncb`?^Tx{qvWkW=aqABym_4sXZv# zk)QFXk|Cw=JNJeHnw=TCf>Q?WZht<#xbDVgtR=lKd!j2r*GXHltevxSMUlcyqeq(0l7maj8HB%^VbzSNg~O$?FMQGqdHS$kJT)s_TQBBFyHEJE zZ?^4^2C5^s9>?sLn_=5XmrKrdB-8fliRT7Y2YDJ_Z=b1OmlU|Q8u`|O+g+*^6BlGa z-xwc~&n(19>X{rB%AV20q^_>}u_{uhy^~RNqTbl!Z1`FR2DzOw#p-L!#x50xB`YuOYbf8Y7v#v~VYWD4S&UQie}aI@CxKe(=#xh1D-grTI7BZ%#!(`SP> z*3wyN%L5%;3~Nq?0H+NTIwiEokEIpF!?lZ1^-BsW@3T97Q3a?gqG>HK*Uyx?c(Vem^6I_7Cc)})ZHLPrHs%bzy) zY4886EtBt>LqEyHvR+o|C`TP?U)5G5&ZMHo|VQ=YO3)Zzzy`GCU3Sn`^LI+^Q+8=RzIIBsn@JXOF@5q;TdsaUcGZ zb|X(!_toEJ=oZ!L&vhSF{i((E%}h1v%pD06*&_!J^SBvkZ@K>a51sYVQq6k4lYQU_ zA7*5f{-)>h@w9ao>jhq?R`N0UOjbwv({5-OPg6T8G8&*-5wS&epe`l!E3cP6ZQ{*x zhqg9Nmb~T?#?#fL=s>b9`ul~j->bct+%4pOl)Ck43a3h1{JH9Nr*{)AO`%DUwfgN_ z9#s!FT@uNq*_`YASv#)D_QT+K)|N2V#|e~;wrp!mO_T z-Mc?061M0)D3PCeJ*jJP#494yuP{x!MOxR%hMgthrd-LyabB$ic}}U?ozKsV?6FI> zkm}u7*0gn6!t<03U9&}B^Yl$wsm^2vYr8zfa?P0Sjk*e)>sw9#cs@$<-Yi(Tjwi&Z zDSh|3J^adB}$ zDxL78+uKm|^8$7~(v|jHP?>*F%OUTFwL-z6xz#hu1GTLUbxKNNx666o?a%XTtdgs1vCqCNA3p(5w7jw&*uCT(GY(Be&pRAm7_r>UfQHl2bEg9@B?S9})4}aM) zy3ZO)0mHF@n+DLlZX~9~Y{8jIGWRz1K7IbNnC$R26upsqQ2OE2vYKAD913&ueKo(e zgUns_x}(xD9LP;g26?+8sGq-)+;B|eg+R_;$7w+ZmeP>Mq^b{NcIPh9=vcn1+LBmX zP=p?1_!$^SM!B{)LurEY?%Bk)X5WaGT9O^lLvjwJ>vla% zzaIAF;R~jZoiQ|S?`rLC#_p3^JI$@A^X<(2E7PReh{>NDu5g)a8Qgu(lZ|=XA0uYM z9rx@odt7rDeYV%#810!e7@M=#1)1G4W-K&=@=m999dfbP>>6l1c(&>FxpwD2Wg3^J zBetK?ol3RV`m;ap&(?uGxu4X;azB-S8!{EFB3X+($7%Fc>JiBfj<$hc1_8sKHuAK| zl|jWiG6AU^1)GL%-2QaCFs^UI(RC#6ZXX!19~YM~Awk$qYUPaFSl{hRK7L}9<1I_< zlMh3$1aHTL{`%_ZC0MCbrFqCsv>t6V#`yHY2kEAb{-=^1Z^R!{7m0l1_q2T%nGMRh z=uY#NIA$?!rnp?~D!IVE7U4gQo*pb-Q4g?zx4O1W%kvJ_d1^%PURLNV`JQ-}Zu-%v z(C6G;&#S_sBgcAUC`4#wU-K&;5p5;mk$Ujp3wDCfYTvrjgLLAB=VLx7Yc=0Trqs2_ zhZ&71S(0BijXHG3K~(jqWTN<{GnG~yX!ubX1F{bf~I?v839kF!REK8V1L`c>E6<; zOmcNu+1xZBI_|MyjS5{uRanOdOA^g7lBl#(m4R)6JX*BZ+fPp4^8ha^+->sbp6*im zicmi5!)4CM)n{`Y@|9mGIU5j*;!)3 zxtDe0j^AtciW$UyKXmCwwFbqwRGXN@u9(_05$d+V6*e4VN0dzB%y`V#Z%Yu~@S)CP zk6v$h(ShyS7stN|Py5N3+&lXtyRxq9l)L@7U4c%WTo}e>+tD(nL6Up36Wgy_o`;)) znmHxjJQ}Qq;G2U&74rEU`tPL8xL>z^h9G%bYUZ%BELy^q#;_E zqFNf+aCrEV+-OUeVL)+xTe;;?`zO0c>h=YVVZyD_vrQFH#mNWl7dj(_1$MM(~nZ^wX7B1Q+Qf)6NgIi6d*yDu@ zB~$(!ioTqmsC}BhK3?XN@E6B>PbwW;XeMfO{BosDyuRqXd(!2qQ|tXTiCTN~^}3z_ zo9`Xs$7ru*$1B?(SZ{pUM!SK|q*%+GS4G1}e@~Y7`tGYPFSXa-iHWxJxft577I}fB zud8yuD$nLA#1!N+_D?rTYy}#Sf~{IC^%)8L8dx%W{_8Tv)j$b!N34Mo-13L(Y3XiX zEeoVmI+vDp+P?ab+>YD5PK-^Nn#Uf^>YzxIUg%^nH`;cvBDv{DmQJ_r%S-mUed*fgY4__273QhjQA(q>yxJ{p>^#K)RXW^PeNqV*CDA zn7CxVAKS0Nv{Piq9*ywklk-Xq{J$~svPFtzhbO70=cW50hjQX*UrZ>cAf zqK_J_Wl8keou|x@dspgR{d-9Z`>$ly$YNm&_dNrRS-gM9cCper=C$;knLeXBV&GL~ z-H-WZnl$3ndNa3ARY%0aW3;X3sezvK>$Y}k%a*l~#WYE%aF?*8=7FHAPrtAh%&hT_ zaVyB*aKgOk;dqVfrx@4dcl*Q7Y!;UYE%HAlt^Yzl5-ppf`A(@La${d|b8on<(CZkX z-|H?S1BUXX(_4A&w#=ABzCT!Ok$S$6=a~JDfoqS?SVVLSpEvZv1PqByzK*dS6AL)G zJKgE&Glbufz|Mi-!Or5-UgwI7v)0}y%k&IN)hZqBp{dokqtrd2zM0i4m;F`HQ_1`f zm?^`GfJoJDJ^qNN<2;X##HdI7JUKFe#F_`p$fkK=r1tlW^S0k0nM9_d4r=^<^`XFv z&Fih~RArO4#J)aHs{-pW@*=N}!PBVT0TmnT|w%<;2N8bI)w@zT%RgA zuvt+=p`Vf6{X3nqOHanZnH=9s!aLF1*-i{?*Q9Utwe0aDnc-w_%eS|#7PU2%2&0t3 zP{ha~tSUWc1UKj+hJWXYGi*3fg6FXbIixzz=p2cH?kDc@=tC5*6tcQjC`;cI;& zcuMZ7(M3MR<1hC}w6n|DrXSnHcy}H%!PH>jATOAj$uzW8Tw0_{^ixJ!Dk{i!AD{PpU(y_NX{F$*zMUlSUmEJJ? zio+)#7s+F!3Q_r;dJofWLyy&I2;cS%kqoz^S8!_N5Lb0>uB9V;DPh!P&0`W`Q`6{W zs`ung$nI^_=PVc|?KDy*)U-R^vGmwk#TWLZDH$c`8lAq(qF|e~J9l)g!FHk3H%1~< z)ScE-?+G8G-*GvdCsU03qlR9Fq#<`ayPA|IcXG)Y{k;zc{?L8kFmSElJp0_<__WFE ztb*-Fu3e+aI35V5xH=C2#5nx6)~{MCJP=b@tBCBtn3PEDfs2wvw@Fs2)1L$XQeypK+zV@$Hj&0fVb<2+l{#fSZ*E-BqJpz|2k zrSiyC4bvC;W6fCMO%{98Ry;MYxhG?ojnp6nUd3W`*m6ks4kpBT+Ye6{C1{jZ&_JUELG(3XTr@L z0WU^=x}0<>F!&_$sJvByM}RVKl)C6+>11ZdUQZL1wqjoT3j6gMch2TDR~{c;lgi6& zaludLi>>Av^1R_UZZXm00s4vZ0RlOR$b({+dJ9;tz2Iwj_I;qTOlsi@9LQc$h#((-f>kex6dT!T2LNfz%howo4%71o;#j8MK zx(0vOfV@Su^;@;gXP1IZCAy`%q+bf_Z4+*N__#>6QyNjjWyxvTc)+sYQ`*lC(#K5w zFMjT;%wwudPx<*`;zd;5L#2YcwD^a&>s~P2bhOo>Ka;&T<^0|=2{sSOXLDu!h*1@1 z&}4V;G1em?Wm+@02O(?8G7#wV--iw{sS5pZ!RP0`Hn%{M3BJa1f>-?#_=N`W0duB> zCp~y8`18Wo3{(wuv@}i4#0<0+6W1@=pxfL$>#*)ByAf+5KOZ-BJ1OhSK=98mzz75wW#06N6a}OlQU&J9gp#$-Dee*o#tSr?) zs8~^!e!i|AFr1}(AED*zxd&?8L4dOmrGUx#yE@D+0z)d8i*k@xpmN$8$$=;3fDcss znSauQb8xj|k<;s%8X2l%P)J`iW^P_Pr{OtxCNrS{&V6 z0Noj=}9ppxsP>09sC*f6{|v))NPAY@}Hi(dF zLB1#plmkwY$E;Ooy#fG|LDUt7HJKk62u@ga4!3%3I4-Xz(9bc5^$_=eQz5!DL08;=U9}KXG9}l2D(jN79 zU&B&ON$$to+Xf8H5p-V^hS&}ihf|~mC|?(}qlGKh6{oTUlB5O^kp97#4Q*1Kf6{}k zz+VX<yHOf zGtdF$4P{v?xATG9tMR*Z2!sXbIk51BCp|be5D%)6y&DK4%ORnLo|m5VG69W@1nSIxhc+JZFyqz9Wt5hBq* z``LS-jJ)wPY{G81cniQv1DV5P)_5!-1}#?)u#tOZ@$6Y=bZ|Xrxf5tPv>9vuNe`Ym zLmV#tcFRQ11V4a+4G_QFJUIB79=!i7A$%P#Up16(01D-WpX21QKRi8vgAH)NNB&bu zL~!U3fbaRb%RvN)=m~&_EBF2dBH)2>5@Pr?#K#LIp0+><@D3PUCWe84?R4e8KNb&i z@TVZQ!FBvRl@L4>r66B0o}G%UY(phClbdWoS}_PBG`#tpRfO;jkiHHs_|==O#8Y<~ zsJ8)7z)dKwjv&0Bhp(%Smm?|=KS$j*BOWLvPyspyQd)S@gO4>5#Q|PYfOd=q;ipk| zp4m?dXeNQOp|>^WpY-6f&4g$S(Y}U$9v=7!`VLg>_zgnD3qSy3=)#j8{N*7*0)psM z(sT*N0QowwQ+W1Z`j`;95fIPH*)mNx<-A znU5896JjtydO4%;3!bfjQjZb9^Dl$H&_@v7!_}Pt{At#2@r6K}vOu?R$x{syg2&(R zJQYSBDqxb31H&zbd59n~s3YJZ&P)Ig*+I8d2w%W-aK#A^q%vIdG6>QI6_Ftb8u}RM3qCB%fhe^iuhkUi9FCyL`A0iOv9i}vtGnIW<6 zE0b-B%DJlt2LFf0mk!Ro3acbrP5?=adHS+VJ{aI~!FwvZVZ8~%;wOOBZB^~Dvu|Z+ zfRlhV78P_?CLMR{)w~GY={XB1qQOYBz-z4d)C4DmCYSoISYK!kJX;CDPYr3Wgf8ba zCkXuKsh3h$My!U~)L=1}7I+~AjS1qzY3~sAtwD#IS@H;kR~(p=!+LEQ{XbK$Ea;%= z9bcXRDhFV%x-d$ghSgB|`Jw|{F(}8mn6|j*EA!shcB!cXoUOnQwPCy!jjQ1OD^6lq zApv`EHr6$Pe4lC4Qd^#GS_SLhP(Xx1K@OC`^F78FkdA=j2s|8!cdUX`)6373uv}$z z%t@{RdG>=3oQ$q-HDrOnSwV^l6%mkNqQ6{;kT@l41tf|AkpNKSPM8w8`u`&tu0rM%*ty;=pEE;toH4Tba~Y?6(! z13c2e&2vH75+2odu#*xW%OOHy{2c0ImFxlI9-uoTkmxDF`Z&V98cIiZd1$;+2Q^uT z<(2|5u`*j#_<+v+0G(5TG4aZ-h6yTI5EiA}Rn7HQpkKToe*+cTg(p3jRB;t-21swh zT(ruiujE1UbpwopstZg|7So`=3NAxGPkR&wKON)*^eubdyahCEzzN`Vo~EmyBi2GL zwP#%S13}q_eyN2tn5~9xwk(YFz+oX!$Kq0{oezVK#e>fdm>e_qt%7N`l=U|vuWX7o z2DxJ&fGN^bEgjrW?_UMc-{?U^?1Jond&HYlIlxNxgTYM=*1Ku@Rgjwcco3Hu@=s}w zJqLWLfKMOBN9nd2K3}ARJ9x*@0j23NTOr49pioaA7MCA-1H8OrBLblTV|Mmg1+$q8 z1|0wmse~C*+-;POfK0R)B*O5qyap^_5S;{@xq1>HgUl2gWR2Je1d9ffP9a$L@`CY` zX@T`;zm-;8AlNd^KDTl(50V0-sR#^~1sahe5LO_@h{4)C zz6n3@Z0y22^V#^+NYPCYXwqRRb|Nbg*wAarV8_hzxCja4pu<&--hYJ)~w|e zko5ng$*Vw1byt8n!h67OLIi~qSOdhj64+x`bnO)AK?Uf6;zIkOEG5*O2zYOAl$Rr< zUwqwwB*kb+FA)S35ddN_TvC2kMDRd$2z(Tfq&hdwTyX&1cme_sd??+sp9l(5gMS1> zRT~6(whnFusg}=`rK00=_-}m6EdUbTO|M5B)F9QG2B%fQEubi!2p(Uwr>g^w{0f5q z#lr9rtm7c`fFHs~NzObX;NgXfe=^fO^ zjsQ=gUgqoTDhXplb1}RjmWG{^0(zD08gN7@n5T^1CkEaLjR7Sz+-vgLrL98BzbM|NN67o01Cdxv~get31 zATGg+V;4UWLovH9GB=&Y7nPvM(LlKtT>+@902L@7FFasd(+ts6vx|QC9NhWr_6HHb zxszCzX52qM6J{Y$N9kODfgdv4&A@Eo>oP-Y$X3o;u?v}p_}p$Jd}4ya2iy7nfiYlK z6ToocGx3e<33EX8S7oPJflM zL)i?(6*O3}gbyDt1qq|$AD$rb_j_-?xf2|FW&koBxTjx`AdEj>v;C*&l{Ju`mBj(w zq6lq&gYPTasZRt8m`2Vn7ZaknB(>SU0vK>T5SS{=h<_UrN2Bj*58?_^3ytwa`VykE z5;Wns4``%--@rqRkSTF=^9(Cb2qEh_enYK?8c41QSeFW{O9p1E=a}bPX%vI3fu-18 z?JCGd#|4(gnFkiDV_S&<>Q6|9+x^=>UbR3?@O`MwPOD`ARp;gA26bcS<)q0pAgq_* z1D_y_x)3Ir-8YVJ+-eoPDvJU-f!-m2PY_;X6HnhM?CB=scg9FrP6KrJxZ8G!As@W{0PGGX+&91&km4fTLLFf@lHnhe$qQ4r3(N0qH?VR)0PpBaa70>J27n@FlQ_ z8$@tmTs>WVUHwtB;=>x;oozC%;-R$;4T+dObplD=2~2_31T?>Xl8#gV2}X} z@c0^ELOg>p{+YQ<>ru8NAo!Uro3Q19y6B4Q2-ttQwFwFw1Bvo-z_$t-g+6yP2Shw* zvpL+kBP$3q%&7ry@#3pHwviDKq=Ih1<&;=OECJZ|2^C3j=eA)x&~BmJ2*igyOLJSA znpKeCt3`+T^B7}*zGJ}$KJT0vT?GX`lS;}|lR^Vcp9UE^Jb7ydm1IKNUT}#yij^}R z$Z{jze%fOQCTn(JID%{B>eMP|FgRC_pb<%iA0^=r%DR*OOT}gSbrmG|HUwtYdIo+4 zmgNr0Vk$r@^G|xPs5CiYak)ZA^Fni5;&M>xhEJ3*pBn1x_T1DV2AKnWBd#IUpz8#Hmj|9zv{VeTDmEpYjP zF1Y*vm(xR5>}6ua(hY{Ic;2NRc~Fl4%iMe0^CY-8EkQIjDp$w7z{qO^Y|CcejKR@B`{BcjY~HkCD{GX4OzMGZJfrmgFw|k!7!o) z>w7JV0OjAe-{*C$?d$9P_ofvB-IU7C-EIJkxRieBzK@NV|D982<&KI6zD3x9jz)o$ z6~6BFG;npKkoQ=)q5@Xtc_EnNN(&50hSx!_U@s!X#ET-V(d|m8Lq}N;^juFhtyg?A3H`&>6yK?WShg*H)z-Vz7xT6}ZcYG;CaY1J|m$LZ9_c!*beoB4SR?@V8?Jxx99#h9&pkCo_Fy2LW`$! zfCW1MjleUivjzW+&lH8@b(Ddd>03mA2*m-F>VoQ_0XF;As;MA#;qO`TUh5MgK$1hi zXH;Nx>UUO6r-ur{&-Q{hi}Vd(O95dIzBn>a_Fvd=N->d?+8H{~6P)h9#6ZNrV7+1r zjN8~}Lk|9qVc3fHT?BlQz#!orYpeQid^nD0_;#8q1kD28!~rf0uNHLHtd?kboPe_7 zSUxSQ7$~ZN?!c>18U1(}Obup_7tu#U*R`z_At3agW7}@C0MniVLoIxNSKKq=(N}Ky zUA_sja$s4TXqU!K@>c|~&B3udI3!MuY2xAms7O#(6o7dMxH}t0f7)q)L$9!f*Z~150}lYv(9~Q z0#ZmW;4@ocuqj|ODju=S!LHoaiTvI`4FF1~va|-TE{zX#etB$VEkc7^PX1$wUqA{w zKrDf4al{xOGS~nKO2A+o12rf|DAD+LRPNGu9$Bs-j!y#kcrb0>29t=Y89oY-5kbl2 zoQp4)%WUf}(JO+a88HD;0C@N~wHF^W*s=^xvDQa}>a04_!DWR67BW9gW4Y78`Uu3i zoTV1xj>L-&#DT}hC6tb)Lu-*#%N$3&03WQmnU*}*Q3Q7SVE9b^Fc`EmDAKGf7piEQ zD;mIQ-hv5~2u$RNLLw=a14D;{Exs}pgp`E`oZ?cx_TS-P`rwjOL(|!NQWskTgs}MD zPO!GI@T3Rt1+R`T94}_LaM9{gfW^0L!Yi{Z4;KMo=g%i|BXrp(@dUZ6C73JI;Uj=+ zNBI#kJ(w?={C&F^R7SxAxx<1m!5_e|^!I^|ZfjZ$Jb$ew?xXXz%zt=lh(!E*s_tT7NMMU^dV_Cn$OY$9EEpr6 zrb58p3%AtG;m;{#>G`K%RR8-x3c+^H`QhyCasTAE^h=>= zX8=Al@&aKmlG{9>xH_)e=oXs`#IX3r3;1A3)`OP;yqAOH?y;p5i?3*amxnKmtcqfJ z{Dyk4`2GR-Sgb#a7an>81XS(7=Khrq_=2DpAHEMCi(6mdgL|@`X zU)=DOa}?;@?!`wK! - 4.0.0 - - com.jd.blockchain - project-to-test - 1.0-SNAPSHOT - jar - Test MyMojo - - - - - contract-maven-plugin - - - - - contract - - - - - \ No newline at end of file diff --git a/core/contract/pom.xml b/core/contract/pom.xml deleted file mode 100644 index 79c0c1f1..00000000 --- a/core/contract/pom.xml +++ /dev/null @@ -1,17 +0,0 @@ - - 4.0.0 - - com.jd.blockchain - jdchain-core - 1.2.0-SNAPSHOT - - contract-core - pom - - - contract-jvm - contract-maven-plugin - - - \ No newline at end of file diff --git a/core/crypto/crypto-adv/pom.xml b/core/crypto/crypto-adv/pom.xml deleted file mode 100644 index 16168b79..00000000 --- a/core/crypto/crypto-adv/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - 4.0.0 - - com.jd.blockchain - crypto-core - 1.2.0-SNAPSHOT - - crypto-adv - - - - - - com.jd.blockchain - crypto-sm - ${project.version} - - - org.bouncycastle - bcprov-jdk15on - - - - org.bouncycastle - bcpkix-jdk15on - 1.61 - - - - com.jd.blockchain - binary-proto - ${project.version} - - - - net.i2p.crypto - eddsa - 0.1.0 - - - net.java.dev.jna - jna - 5.1.0 - - - - com.jd.blockchain - crypto-framework - ${project.version} - compile - - - - \ No newline at end of file diff --git a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/ecvrf/VRF.java b/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/ecvrf/VRF.java deleted file mode 100644 index 45e05083..00000000 --- a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/ecvrf/VRF.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.jd.blockchain.crypto.ecvrf; - - -import com.jd.blockchain.crypto.CryptoException; -import com.sun.jna.Library; -import com.sun.jna.Native; - -import java.security.SecureRandom; -import java.util.Objects; - - -public class VRF { - - public static String getLib() throws IllegalArgumentException{ - - String lib; - String path; - String osName = System.getProperty("os.name").toLowerCase(); - - // Mac OS - if (osName.startsWith("mac")){ - lib = "libsodium.23.dylib"; - } - - // Linux OS - else if (osName.contains("linux")){ - lib = "libsodium.so.23.1.0"; - } - - // unsupported OS - else { - throw new CryptoException("The VRF implementation is not supported in this Operation System!"); - } - - path = Objects.requireNonNull(VRF.class.getClassLoader().getResource(lib)).getPath(); - return path; - } - - public interface CLibrary extends Library { - - CLibrary INSTANCE = (CLibrary) - Native.load((getLib()), CLibrary.class); - - int crypto_vrf_is_valid_key(byte[] pk); - int crypto_vrf_keypair_from_seed(byte[] pk, byte[] sk, byte[] seed); - int crypto_vrf_prove(byte[] proof, byte[] sk, byte[] m, long mlen); - int crypto_vrf_verify(byte[] output, byte[] pk, byte[] proof, byte[] m, long mlen); - int crypto_vrf_proof_to_hash(byte[] hash, byte[] proof); - void crypto_vrf_ietfdraft03_sk_to_pk(byte[] pk, byte[] sk); - } - - public static byte[] genSecretKey(){ - byte [] seed = new byte[32]; - byte [] sk = new byte[64]; - byte [] pk = new byte[32]; - try{ - SecureRandom.getInstanceStrong().nextBytes(seed); - CLibrary.INSTANCE.crypto_vrf_keypair_from_seed(pk, sk, seed); - }catch (Exception e){ - e.printStackTrace(); - } - return sk; - } - - public static byte[] sk2pk(byte[] sk){ - if (sk.length != 64){ - return null; - } - byte [] pk = new byte[32]; - CLibrary.INSTANCE.crypto_vrf_ietfdraft03_sk_to_pk(pk, sk); - return pk; - } - - public static boolean IsValidPk(byte[] pk){ - if (pk.length != 32){ - return false; - } - return CLibrary.INSTANCE.crypto_vrf_is_valid_key(pk) == 1; - } - - public static byte[] prove(byte[] sk, byte[] msg){ - byte[] proof = new byte[80]; - if (CLibrary.INSTANCE.crypto_vrf_prove(proof, sk, msg, msg.length)==0){ - return proof; - } - return null; - } - - public static byte[] proof2hash(byte[] proof){ - byte[] hash = new byte[64]; - if (proof.length != 80){ - return null; - } - CLibrary.INSTANCE.crypto_vrf_proof_to_hash(hash, proof); - return hash; - } - - public static boolean verify(byte[] pk, byte[] proof, byte[]msg){ - byte[] output = new byte[64]; - if (proof.length != 80 || pk.length != 32){ - return false; - } - return CLibrary.INSTANCE.crypto_vrf_verify(output, pk, proof, msg, msg.length) == 0; - } -} diff --git a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/elgamal/ElGamalUtils.java b/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/elgamal/ElGamalUtils.java deleted file mode 100644 index d5d31efa..00000000 --- a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/elgamal/ElGamalUtils.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.jd.blockchain.crypto.elgamal; - -import org.bouncycastle.crypto.AsymmetricCipherKeyPair; -import org.bouncycastle.crypto.engines.ElGamalEngine; -import org.bouncycastle.crypto.generators.ElGamalKeyPairGenerator; -import org.bouncycastle.crypto.params.*; - -import java.math.BigInteger; -import java.security.SecureRandom; - -public class ElGamalUtils { - - private static final BigInteger g512 = new BigInteger("153d5d6172adb43045b68ae8e1de1070b6137005686d29d3d73a7749199681ee5b212c9b96bfdcfa5b20cd5e3fd2044895d609cf9b410b7a0f12ca1cb9a428cc", 16); - private static final BigInteger p512 = new BigInteger("9494fec095f3b85ee286542b3836fc81a5dd0a0349b4c239dd38744d488cf8e31db8bcb7d33b41abb9e5a33cca9144b1cef332c94bf0573bf047a3aca98cdf3b", 16); - - private static final ElGamalParameters dhParams = new ElGamalParameters(p512, g512, 0); - - - - //-----------------Key Pair Generation Algorithm----------------- - - /** - * key generation - * - * @return key pair - */ - public static AsymmetricCipherKeyPair generateKeyPair(){ - - SecureRandom random = new SecureRandom(); - return generateKeyPair(random); - } - - public static AsymmetricCipherKeyPair generateKeyPair(SecureRandom random){ - - ElGamalKeyGenerationParameters params = new ElGamalKeyGenerationParameters(random, dhParams); - ElGamalKeyPairGenerator kpGen = new ElGamalKeyPairGenerator(); - - // To generate the key pair - kpGen.init(params); - return kpGen.generateKeyPair(); - } - - public static byte[] retrievePublicKey(byte[] privateKey) - { - BigInteger g = dhParams.getG(); - BigInteger p = dhParams.getP(); - - - BigInteger pubKey = g.modPow(new BigInteger(1,privateKey), p); - byte[] pubKey2Bytes = pubKey.toByteArray(); - - int pubKeySize = (p.bitLength() + 7)/8; - byte[] result = new byte[pubKeySize]; - - if (pubKey2Bytes.length > result.length) - { - System.arraycopy(pubKey2Bytes, 1, result, result.length - (pubKey2Bytes.length - 1), pubKey2Bytes.length - 1); - } - else - { - System.arraycopy(pubKey2Bytes, 0, result, result.length - pubKey2Bytes.length, pubKey2Bytes.length); - } - - return result; - } - - //-----------------Public Key Encryption Algorithm----------------- - - /** - * encryption - * - * @param plainBytes plaintext - * @param publicKey public key - * @return ciphertext - */ - public static byte[] encrypt(byte[] plainBytes, byte[] publicKey){ - - SecureRandom random = new SecureRandom(); - return encrypt(plainBytes,publicKey,random); - } - - public static byte[] encrypt(byte[] plainBytes, byte[] publicKey, SecureRandom random){ - - BigInteger pubKey = new BigInteger(1,publicKey); - - ElGamalPublicKeyParameters pubKeyParams = new ElGamalPublicKeyParameters(pubKey,dhParams); - return encrypt(plainBytes, pubKeyParams, random); - } - - public static byte[] encrypt(byte[] plainBytes, ElGamalPublicKeyParameters pubKeyParams){ - - SecureRandom random = new SecureRandom(); - return encrypt(plainBytes, pubKeyParams, random); - } - - public static byte[] encrypt(byte[] plainBytes, ElGamalPublicKeyParameters pubKeyParams, SecureRandom random){ - - ParametersWithRandom params = new ParametersWithRandom(pubKeyParams, random); - - ElGamalEngine encryptor = new ElGamalEngine(); - encryptor.init(true, params); - return encryptor.processBlock(plainBytes,0,plainBytes.length); - } - - - public static byte[] decrypt(byte[] cipherBytes, byte[] privateKey){ - BigInteger privKey = new BigInteger(1,privateKey); - - ElGamalPrivateKeyParameters privKeyParams = new ElGamalPrivateKeyParameters(privKey,dhParams); - - ElGamalEngine decryptor = new ElGamalEngine(); - decryptor.init(false,privKeyParams); - return decryptor.processBlock(cipherBytes,0,cipherBytes.length); - } - - public static ElGamalParameters getElGamalParameters(){return dhParams;} - -} diff --git a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/EqualVerify.java b/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/EqualVerify.java deleted file mode 100644 index 68393c8c..00000000 --- a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/EqualVerify.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.jd.blockchain.crypto.mpc; - -import com.jd.blockchain.crypto.CryptoException; -import com.jd.blockchain.crypto.elgamal.ElGamalUtils; -import com.jd.blockchain.utils.io.BytesUtils; -import org.bouncycastle.crypto.AsymmetricCipherKeyPair; -import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters; -import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters; - -import java.math.BigInteger; -import java.util.Arrays; - -public class EqualVerify { - - private static final int ELEMENTLENGTH = 64; - - private static BigInteger p; - - private static byte[] sponsorEPubKeyBytes; - private static byte[] sponsorEPrivKeyBytes; - - private static byte[] responderEPubKeyBytes; - private static byte[] responderEPrivKeyBytes; - - public static void generateParams(){ - p = ElGamalUtils.getElGamalParameters().getP(); - } - - public static void generateSponsorKeyPair(){ - - AsymmetricCipherKeyPair keyPair = ElGamalUtils.generateKeyPair(); - ElGamalPublicKeyParameters pubKeyParams = (ElGamalPublicKeyParameters) keyPair.getPublic(); - ElGamalPrivateKeyParameters privKeyParams = (ElGamalPrivateKeyParameters) keyPair.getPrivate(); - - sponsorEPubKeyBytes = bigIntegerTo64Bytes(pubKeyParams.getY()); - sponsorEPrivKeyBytes = bigIntegerTo64Bytes(privKeyParams.getX()); - } - - public static void generateResponderKeyPair(){ - - AsymmetricCipherKeyPair keyPair = ElGamalUtils.generateKeyPair(); - ElGamalPublicKeyParameters pubKeyParams = (ElGamalPublicKeyParameters) keyPair.getPublic(); - ElGamalPrivateKeyParameters privKeyParams = (ElGamalPrivateKeyParameters) keyPair.getPrivate(); - - responderEPubKeyBytes = bigIntegerTo64Bytes(pubKeyParams.getY()); - responderEPrivKeyBytes = bigIntegerTo64Bytes(privKeyParams.getX()); - } - - public static byte[] sponsor(int sponsorInput, byte[] sponsorEPubKeyBytes){ - - BigInteger sponsorBigInt = BigInteger.valueOf(sponsorInput); - BigInteger sponsorEPubKey = new BigInteger(1, sponsorEPubKeyBytes); - BigInteger result = sponsorBigInt.multiply(sponsorEPubKey).mod(p); - return bigIntegerTo64Bytes(result); - } - - public static byte[] responder(int responderInput, byte[] sponsorOutput, byte[] responderEPubKeyBytes, - byte[] responderEPrivKeyBytes) { - - if (sponsorOutput.length != ELEMENTLENGTH) { - throw new CryptoException("The sponsorOutput' length is not 64!"); - } - - BigInteger responderBigInt = BigInteger.valueOf(responderInput); - BigInteger responderEPubKey = new BigInteger(1,responderEPubKeyBytes); - BigInteger responderCipher = responderBigInt.multiply(responderEPubKey).mod(p); - - BigInteger responderInputInverse = BigInteger.valueOf(responderInput).modInverse(p); - BigInteger tmp = new BigInteger(1, sponsorOutput).multiply(responderInputInverse).mod(p); - BigInteger dhValue = tmp.modPow(new BigInteger(1,responderEPrivKeyBytes), p); - - return BytesUtils.concat(bigIntegerTo64Bytes(responderCipher), bigIntegerTo64Bytes(dhValue)); - } - - public static boolean sponsorCheck(int sponsorInput, byte[] responderOutput, byte[] sponsorEPrivKeyBytes){ - - if (responderOutput.length != 2 * ELEMENTLENGTH) { - throw new CryptoException("The responderOutput's length is not 128!"); - } - - byte[] responderCipherBytes = new byte[ELEMENTLENGTH]; - byte[] dhValueBytes = new byte[ELEMENTLENGTH]; - System.arraycopy(responderOutput, 0, responderCipherBytes, 0, responderCipherBytes.length); - System.arraycopy(responderOutput, responderCipherBytes.length, dhValueBytes, 0,dhValueBytes.length); - - BigInteger sponsorInputInverse = BigInteger.valueOf(sponsorInput).modInverse(p); - BigInteger tmp = new BigInteger(1, responderCipherBytes).multiply(sponsorInputInverse); - BigInteger dhVerifier = tmp.modPow(new BigInteger(1,sponsorEPrivKeyBytes), p); - - return Arrays.equals(dhValueBytes, bigIntegerTo64Bytes(dhVerifier)); - } - - public static byte[] getSponsorEPubKeyBytes(){return sponsorEPubKeyBytes;} - - public static byte[] getSponsorEPrivKeyBytes(){return sponsorEPrivKeyBytes;} - - public static byte[] getResponderEPubKeyBytes(){return responderEPubKeyBytes;} - - public static byte[] getResponderEPrivKeyBytes(){return responderEPrivKeyBytes;} - - // To convert BigInteger to byte[] whose length is 64 - private static byte[] bigIntegerTo64Bytes(BigInteger b){ - byte[] tmp = b.toByteArray(); - byte[] result = new byte[64]; - if (tmp.length > result.length) { - System.arraycopy(tmp, tmp.length - result.length, result, 0, result.length); - } - else { - System.arraycopy(tmp,0,result,result.length-tmp.length,tmp.length); - } - return result; - } -} diff --git a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/IntCompare.java b/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/IntCompare.java deleted file mode 100644 index f6ff71c6..00000000 --- a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/IntCompare.java +++ /dev/null @@ -1,284 +0,0 @@ -package com.jd.blockchain.crypto.mpc; - -import com.jd.blockchain.crypto.CryptoException; -import com.jd.blockchain.crypto.elgamal.ElGamalUtils; -import com.jd.blockchain.utils.io.BytesUtils; -import org.bouncycastle.crypto.AsymmetricCipherKeyPair; -import org.bouncycastle.crypto.params.ElGamalParameters; -import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters; -import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters; - -import java.math.BigInteger; -import java.security.SecureRandom; -import java.util.Random; - -public class IntCompare { - - private static final int INTLENGTH = 32; - private static final int ELEMENTLENGTH = 64; - private static final int CIPHERLENGTH = 128; - - private static BigInteger p; - - private static byte[] pubKeyBytes; - private static byte[] privKeyBytes; - - public static void generateKeyPair(){ - - ElGamalParameters dhParams = ElGamalUtils.getElGamalParameters(); - - p = dhParams.getP(); - - AsymmetricCipherKeyPair keyPair = ElGamalUtils.generateKeyPair(); - ElGamalPublicKeyParameters pubKeyParams = (ElGamalPublicKeyParameters) keyPair.getPublic(); - ElGamalPrivateKeyParameters privKeyParams = (ElGamalPrivateKeyParameters) keyPair.getPrivate(); - - pubKeyBytes = bigIntegerTo64Bytes(pubKeyParams.getY()); - privKeyBytes = bigIntegerTo64Bytes(privKeyParams.getX()); - } - - public static byte[][] sponsor(int sponsorInput, byte[] pubKeyBytes){ - - String sponsorBinaryStr = to32BinaryString(sponsorInput); - - - byte[][] cipherArray = new byte[INTLENGTH * 2][CIPHERLENGTH]; - - byte[] unitMsg = bigIntegerTo64Bytes(BigInteger.ONE); - byte[] randMsg = new byte[ELEMENTLENGTH - 1]; - - int i; - for (i = 0; i < INTLENGTH; i++){ - - SecureRandom random = new SecureRandom(); - random.nextBytes(randMsg); - - if (sponsorBinaryStr.charAt(i) == '1'){ - cipherArray[i] = ElGamalUtils.encrypt(unitMsg, pubKeyBytes); - cipherArray[i + INTLENGTH] = ElGamalUtils.encrypt(randMsg, pubKeyBytes); - } - else { - cipherArray[i] = ElGamalUtils.encrypt(randMsg, pubKeyBytes); - cipherArray[i + INTLENGTH] = ElGamalUtils.encrypt(unitMsg, pubKeyBytes); - } - } - - return cipherArray; - } - - public static byte[][] responder(int responderInt, byte[][] cipherArray, byte[] pubKeyBytes){ - - if (cipherArray.length != 2 * INTLENGTH) { - throw new CryptoException("The cipherArray has wrong format!"); - } - - int i,j; - for (i = 0; i < cipherArray.length; i++){ - if(cipherArray[i].length != CIPHERLENGTH) { - throw new CryptoException("The cipherArray has wrong format!"); - } - } - - String[] responderStrSet = encoding(responderInt, false); - - BigInteger tmpLeftBigInteger; - BigInteger tmpRightBigInteger; - BigInteger leftBigInteger; - BigInteger rightBigInteger; - byte[] tmpCipherArray = new byte[CIPHERLENGTH]; - - byte[] randMsg = new byte[ELEMENTLENGTH -1 ]; - - byte[][] aggregatedCipherArray = new byte[INTLENGTH][CIPHERLENGTH]; - - for (i = 0; i < aggregatedCipherArray.length; i++){ - - if (responderStrSet[i] != null){ - - tmpLeftBigInteger = BigInteger.ONE; - tmpRightBigInteger = BigInteger.ONE; - - for (j = 0; j < responderStrSet[i].length(); j++){ - if (responderStrSet[i].charAt(j) == '1'){ - System.arraycopy(cipherArray[j], 0, tmpCipherArray, 0, tmpCipherArray.length); - } - else{ - System.arraycopy(cipherArray[j + INTLENGTH], 0,tmpCipherArray, 0, tmpCipherArray.length); - } - - leftBigInteger = getLeftBigIntegerFrom128Bytes(tmpCipherArray); - tmpLeftBigInteger = tmpLeftBigInteger.multiply(leftBigInteger).mod(p); - rightBigInteger = getRightBigIntegerFrom128Bytes(tmpCipherArray); - tmpRightBigInteger = tmpRightBigInteger.multiply(rightBigInteger).mod(p); - } - - aggregatedCipherArray[i] = BytesUtils.concat(bigIntegerTo64Bytes(tmpLeftBigInteger),bigIntegerTo64Bytes(tmpRightBigInteger)); - } - else { - SecureRandom random = new SecureRandom(); - random.nextBytes(randMsg); - aggregatedCipherArray[i] = ElGamalUtils.encrypt(randMsg, pubKeyBytes); - } - } - - int[] permutation = randPermute(INTLENGTH); - - for (i = 0; i < INTLENGTH; i++){ - System.arraycopy(aggregatedCipherArray[i], 0, tmpCipherArray, 0, CIPHERLENGTH); - System.arraycopy(aggregatedCipherArray[permutation[i]-1], 0, aggregatedCipherArray[i], 0, CIPHERLENGTH); - System.arraycopy(tmpCipherArray, 0, aggregatedCipherArray[permutation[i]-1], 0, CIPHERLENGTH); - } - - return aggregatedCipherArray; - } - - public static int sponsorOutput(byte[][] aggregatedCipherArray, byte[] privKeyBytes){ - - if (aggregatedCipherArray.length != INTLENGTH) { - throw new CryptoException("The aggregatedCipherArray has wrong format!"); - } - - int i; - byte[] plaintext; - - for (i = 0; i < aggregatedCipherArray.length; i++){ - - if(aggregatedCipherArray[i].length != CIPHERLENGTH) { - throw new CryptoException("The aggregatedCipherArray has wrong format!"); - } - - plaintext = ElGamalUtils.decrypt(aggregatedCipherArray[i], privKeyBytes); - - if ((plaintext.length ==1) && (BigInteger.ONE.equals(BigInteger.valueOf((int) plaintext[0])))){ - return 1; - } - } - - return 0; - } - - public static byte[] getPubKeyBytes(){return pubKeyBytes;} - - public static byte[] getPrivKeyBytes(){return privKeyBytes;} - - - - private static String[] encoding(int integer, boolean encodingOpts){ - String str = to32BinaryString(integer); - String[] strArray = new String[INTLENGTH]; - int i; - - // 1-encoding - if (encodingOpts){ - for (i = 0; i < INTLENGTH; i++){ - if (str.charAt(i) == '1'){ - strArray[i] = str.substring(0, i + 1); - } - } - } - // 0-encoding - else { - for (i = 0; i < INTLENGTH; i++) { - if (str.charAt(i) == '0') { - strArray[i] = str.substring(0, i) + "1"; - } - } - } - - return strArray; - } - - - private static String to32BinaryString(int integer) { - - if (integer < 0) { - throw new CryptoException("integer must be non-negative!"); - } - - int i; - String str = Integer.toBinaryString(integer); - StringBuilder result = new StringBuilder(); - for (i = 0; i < INTLENGTH - str.length(); i++) { - result.append("0"); - } - return result.append(str).toString(); - } - - /** - * @param min the lower bound (inclusive). Must be non-negative. - * @param max the upper bound (inclusive). Must be positive. - * @return the next pseudorandom, uniformly distributed {@code int} - * value between min (inclusive) and max (inclusive) - * from this random number generator's sequence - * @throws CryptoException if min is not non-negative, - * max is not positive, or min is bigger than max - */ - private static int randInt(int min, int max) { - if (min < 0) { - throw new CryptoException("min must be non-negative!"); - } - if (max <= 0) { - throw new CryptoException("max must be positive!"); - } - if (min > max) { - throw new CryptoException("min must not be greater than max"); - } - - Random random = new Random(); - return random.nextInt(max) % (max - min + 1) + min; - } - - private static int[] randPermute(int num) { - - int[] array = new int[num]; - int i; - int rand; - int tmp; - - for (i = 0; i < num; i++) { - array[i] = i + 1; - } - - for (i = 0; i < num; i++) { - rand = randInt(1, num); - tmp = array[i]; - array[i] = array[rand - 1]; - array[rand - 1] = tmp; - } - - return array; - } - - // To convert BigInteger to byte[] whose length is 64 - private static byte[] bigIntegerTo64Bytes(BigInteger b){ - byte[] tmp = b.toByteArray(); - byte[] result = new byte[64]; - if (tmp.length > result.length) { - System.arraycopy(tmp, tmp.length - result.length, result, 0, result.length); - } - else { - System.arraycopy(tmp,0,result,result.length-tmp.length,tmp.length); - } - return result; - } - - private static BigInteger getLeftBigIntegerFrom128Bytes(byte[] byteArray){ - if (byteArray.length != 128) { - throw new CryptoException("The byteArray's length must be 128!"); - } - byte[] tmp = new byte[64]; - System.arraycopy(byteArray, 0, tmp, 0, tmp.length); - return new BigInteger(1, tmp); - } - - private static BigInteger getRightBigIntegerFrom128Bytes(byte[] byteArray){ - if (byteArray.length != 128) { - throw new CryptoException("The byteArray's length must be 128!"); - } - byte[] tmp = new byte[64]; - System.arraycopy(byteArray, 64, tmp, 0, tmp.length); - return new BigInteger(1, tmp); - } -} - - diff --git a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/MultiSum.java b/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/MultiSum.java deleted file mode 100644 index 45392f29..00000000 --- a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/mpc/MultiSum.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.jd.blockchain.crypto.mpc; - -import java.math.BigInteger; - -import com.jd.blockchain.crypto.paillier.PaillierPublicKeyParameters; -import com.jd.blockchain.crypto.paillier.PaillierUtils; -import org.bouncycastle.crypto.AsymmetricCipherKeyPair; -import org.bouncycastle.crypto.agreement.ECDHBasicAgreement; -import org.bouncycastle.crypto.params.ECDomainParameters; -import org.bouncycastle.crypto.params.ECPrivateKeyParameters; -import org.bouncycastle.crypto.params.ECPublicKeyParameters; -import org.bouncycastle.math.ec.ECCurve; -import org.bouncycastle.math.ec.ECPoint; - -import com.jd.blockchain.crypto.utils.sm.SM2Utils; -import com.jd.blockchain.crypto.utils.sm.SM3Utils; -import com.jd.blockchain.utils.io.BytesUtils; - -public class MultiSum { - - private static byte[] ePrivKey; - private static byte[] ePubKey; - private static ECCurve curve; - private static ECDomainParameters domainParams; - - public static void generateEphemeralKeyPair(){ - AsymmetricCipherKeyPair eKeyPair = SM2Utils.generateKeyPair(); - ECPrivateKeyParameters ecPrivKey = (ECPrivateKeyParameters) eKeyPair.getPrivate(); - ECPublicKeyParameters ecPubKey= (ECPublicKeyParameters) eKeyPair.getPublic(); - ePrivKey = bigIntegerToBytes(ecPrivKey.getD()); - ePubKey = ecPubKey.getQ().getEncoded(false); - curve = SM2Utils.getCurve(); - domainParams = SM2Utils.getDomainParams(); - } - - public static byte[] calculateAgreement(byte[] otherEPubKey, byte[] ePrivKey){ - ECDHBasicAgreement basicAgreement = new ECDHBasicAgreement(); - ECPoint ePubKeyPoint = resolvePubKeyBytes(otherEPubKey); - ECPublicKeyParameters pubKey = new ECPublicKeyParameters(ePubKeyPoint, domainParams); - ECPrivateKeyParameters privateKey = new ECPrivateKeyParameters(new BigInteger(1,ePrivKey), domainParams); - - basicAgreement.init(privateKey); - BigInteger agreement = basicAgreement.calculateAgreement(pubKey); - return bigIntegerToBytes(agreement); - } - - public static byte[] deriveShares(byte[] frontID, byte[] rearID, byte[] agreementBytes){ - byte[] inputBytes = BytesUtils.concat(frontID,rearID,agreementBytes); - return SM3Utils.hash(inputBytes); - } - - public static byte[] encryptBlindedMsg(byte[] paillierPubKey, int input, byte[] frontShare, byte[] rearShare){ - BigInteger integer = BigInteger.valueOf(input); - BigInteger frontInteger = new BigInteger(1,frontShare); - BigInteger rearInteger = new BigInteger(1,rearShare); - PaillierPublicKeyParameters encKey = PaillierUtils.bytes2PubKey(paillierPubKey); - BigInteger modulus = encKey.getModulus(); - BigInteger plaintext = integer.add(frontInteger).subtract(rearInteger).mod(modulus); - return PaillierUtils.encrypt(plaintext.toByteArray(),encKey); - } - - public static byte[] aggregateCiphertexts(byte[] paillierPubKey, byte[]... ciphertexts){ - return PaillierUtils.add(paillierPubKey,ciphertexts); - } - - public static byte[] decrypt(byte[] paillierPrivKey, byte[] ciphertext){ - return PaillierUtils.decrypt(ciphertext,paillierPrivKey); - } - - public static byte[] getEPubKey(){return ePubKey;} - - public static byte[] getEPrivKey(){return ePrivKey;} - - -// public byte[] getEPubKeyBytes(){ -// byte[] ePubKeyBytes = new byte[65]; -// byte[] ePubKeyBytesX = ePubKey.getQ().getAffineXCoord().getEncoded(); -// byte[] ePubKeyBytesY = ePubKey.getQ().getAffineYCoord().getEncoded(); -// System.arraycopy(Hex.decode("04"),0,ePubKeyBytes,0,1); -// System.arraycopy(ePubKeyBytesX,0,ePubKeyBytes,1,32); -// System.arraycopy(ePubKeyBytesY,0,ePubKeyBytes,1+32,32); -// return ePubKeyBytes; -// } -// -// public byte[] getEPrivKeyBytes(){ -// return bigIntegerToBytes(ePrivKey.getD()); -// } - - public ECPublicKeyParameters resolveEPubKey(byte[] ePubKeyBytes){ - byte[] ePubKeyX = new byte[32]; - byte[] ePubKeyY = new byte[32]; - System.arraycopy(ePubKeyBytes,1,ePubKeyX,0,32); - System.arraycopy(ePubKeyBytes,1+32,ePubKeyY,0,32); - ECPoint ePubKeyPoint = curve.createPoint(new BigInteger(1,ePubKeyX), new BigInteger(1,ePubKeyY)); - return new ECPublicKeyParameters(ePubKeyPoint,domainParams); - } - - public ECPrivateKeyParameters resolveEPrivKey(byte[] ePrivKeyBytes){ - return new ECPrivateKeyParameters(new BigInteger(1,ePrivKeyBytes),domainParams); - } - - // To convert BigInteger to byte[] whose length is l - private static byte[] bigIntegerToBytes(BigInteger b){ - byte[] tmp = b.toByteArray(); - byte[] result = new byte[32]; - if (tmp.length > result.length) { - System.arraycopy(tmp, tmp.length - result.length, result, 0, result.length); - } - else { - System.arraycopy(tmp,0,result,result.length-tmp.length,tmp.length); - } - return result; - } - - // To retrieve the public key point from publicKey in byte array mode - private static ECPoint resolvePubKeyBytes(byte[] publicKey){ - return curve.decodePoint(publicKey); - } - -} diff --git a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierKeyPairGenerator.java b/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierKeyPairGenerator.java deleted file mode 100644 index abb72987..00000000 --- a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierKeyPairGenerator.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.jd.blockchain.crypto.paillier; - -import org.bouncycastle.crypto.AsymmetricCipherKeyPair; -import org.bouncycastle.math.Primes; -import org.bouncycastle.util.BigIntegers; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * @author zhanglin33 - * @title: PaillierKeyPairGenerator - * @description: generator of paillier key pair - * @date 2019-04-30, 14:48 - */ -public class PaillierKeyPairGenerator { - - private static final int STRENGTH = 2048; - - public AsymmetricCipherKeyPair generateKeyPair() { - - int pLength = (STRENGTH + 1) / 2; - int qLength = STRENGTH - pLength; - - BigInteger p; - BigInteger q; - BigInteger n; - - do { - do { - SecureRandom pRandom = new SecureRandom(); - p = BigIntegers.createRandomPrime(pLength, 1, pRandom); - } while (!isProbablePrime(p)); - do { - SecureRandom qRandom = new SecureRandom(); - q = BigIntegers.createRandomPrime(qLength, 1, qRandom); - } while (q.equals(p) || !isProbablePrime(p)); - n = q.multiply(p); - } while (n.bitLength() != STRENGTH); - - return new AsymmetricCipherKeyPair(new PaillierPublicKeyParameters(n), new PaillierPrivateKeyParameters(p,q)); - } - - // Primes class for FIPS 186-4 C.3 primality checking - private boolean isProbablePrime(BigInteger x) - { - int iterations = 3; - SecureRandom random = new SecureRandom(); - return !Primes.hasAnySmallFactors(x) && Primes.isMRProbablePrime(x, random, iterations); - } -} diff --git a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierPrivateKeyParameters.java b/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierPrivateKeyParameters.java deleted file mode 100644 index 5dcb2f0f..00000000 --- a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierPrivateKeyParameters.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.jd.blockchain.crypto.paillier; - -import org.bouncycastle.crypto.params.AsymmetricKeyParameter; - -import java.math.BigInteger; - -import static org.bouncycastle.util.BigIntegers.ONE; - -/** - * @author zhanglin33 - * @title: PaillierPrivateKeyParameters - * @description: parameters about Paillier private key - * @date 2019-04-30, 14:39 - */ -public class PaillierPrivateKeyParameters extends AsymmetricKeyParameter { - - private BigInteger p; - - private BigInteger q; - - private BigInteger pSquared; - - private BigInteger qSquared; - - private BigInteger pInverse; - - private BigInteger muP; - - private BigInteger muQ; - - public PaillierPrivateKeyParameters(BigInteger p, BigInteger q) { - super(true); - BigInteger generator = p.multiply(q).add(ONE); - this.p = p; - this.pSquared = p.multiply(p); - this.q = q; - this.qSquared = q.multiply(q); - this.pInverse = p.modInverse(q); - this.muP = hFunction(generator, p, pSquared); - this.muQ = hFunction(generator, q, qSquared); - } - - public PaillierPrivateKeyParameters(BigInteger p, BigInteger pSquared, BigInteger q, BigInteger qSquared, - BigInteger pInverse, BigInteger muP, BigInteger muQ){ - super(true); - this.p = p; - this.pSquared = pSquared; - this.q = q; - this.qSquared = qSquared; - this.pInverse = pInverse; - this.muP = muP; - this.muQ = muQ; - } - - - // mu = h(x) = (L(g^(x-1) mod x^2))^(-1) mod n - private BigInteger hFunction(BigInteger generator, BigInteger x, BigInteger xSquared) { - BigInteger phiX = lFunction(generator.modPow(x.subtract(ONE),xSquared),x); - return phiX.modInverse(x); - } - - // L(x) = (x-1) / n - public BigInteger lFunction(BigInteger x, BigInteger n) { - return x.subtract(ONE).divide(n); - } - - public BigInteger getP() - { - return p; - } - - public BigInteger getPSquared() - { - return pSquared; - } - - public BigInteger getQ() - { - return q; - } - - public BigInteger getQSquared() - { - return qSquared; - } - - public BigInteger getPInverse() - { - return pInverse; - } - - public BigInteger getMuP() - { - return muP; - } - - public BigInteger getMuQ() - { - return muQ; - } -} diff --git a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierPublicKeyParameters.java b/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierPublicKeyParameters.java deleted file mode 100644 index 3706b6b2..00000000 --- a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierPublicKeyParameters.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.jd.blockchain.crypto.paillier; - -import org.bouncycastle.crypto.params.AsymmetricKeyParameter; - -import java.math.BigInteger; - -import static org.bouncycastle.util.BigIntegers.ONE; - -/** - * @author zhanglin33 - * @title: PaillierPublicKeyParameters - * @description: parameters about Paillier public key - * @date 2019-04-30, 14:41 - */ -public class PaillierPublicKeyParameters extends AsymmetricKeyParameter { - - private BigInteger modulus; - private BigInteger modulusSquared; - private BigInteger generator; - - public PaillierPublicKeyParameters(BigInteger modulus) { - super(false); - this.modulus = validate(modulus); - this.modulusSquared = modulus.multiply(modulus); - this.generator = modulus.add(ONE); - } - - public BigInteger getModulus() { - return modulus; - } - - public BigInteger getModulusSquared() { - return modulusSquared; - } - - public BigInteger getGenerator() { - return generator; - } - - private BigInteger validate(BigInteger modulus) - { - if ((modulus.intValue() & 1) == 0) - { - throw new IllegalArgumentException("The modulus is even!"); - } - - // the value is the product of the 132 smallest primes from 3 to 751 - if (!modulus.gcd(new BigInteger("145188775577763990151158743208307020242261438098488931355057091965" + - "931517706595657435907891265414916764399268423699130577757433083166" + - "651158914570105971074227669275788291575622090199821297575654322355" + - "049043101306108213104080801056529374892690144291505781966373045481" + - "8359472391642885328171302299245556663073719855")).equals(ONE)) - { - throw new IllegalArgumentException("The modulus has a small prime factor!"); - } - - return modulus; - } -} diff --git a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierUtils.java b/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierUtils.java deleted file mode 100644 index 3d765df3..00000000 --- a/core/crypto/crypto-adv/src/main/java/com/jd/blockchain/crypto/paillier/PaillierUtils.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.jd.blockchain.crypto.paillier; - -import com.jd.blockchain.utils.io.BytesUtils; -import org.bouncycastle.crypto.AsymmetricCipherKeyPair; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import static org.bouncycastle.util.BigIntegers.ONE; - -/** - * @author zhanglin33 - * @title: PaillierUtils - * @description: encryption, decryption, homomorphic addition and scalar multiplication in Paillier algorithm - * @date 2019-04-30, 14:49 - */ -public class PaillierUtils { - - private static final int MODULUS_LENGTH = 256; - private static final int MODULUSSQUARED_LENGTH = 512; - - private static final int P_LENGTH = 128; - private static final int PSQUARED_LENGTH = 256; - private static final int Q_LENGTH = 128; - private static final int QSQUARED_LENGTH = 256; - private static final int PINVERSE_LENGTH = 128; - private static final int MUP_LENGTH = 128; - private static final int MUQ_LENGTH = 128; - - private static final int PRIVKEY_LENGTH = P_LENGTH + PSQUARED_LENGTH + Q_LENGTH + QSQUARED_LENGTH - + PINVERSE_LENGTH + MUP_LENGTH + MUQ_LENGTH; - - public static AsymmetricCipherKeyPair generateKeyPair(){ - PaillierKeyPairGenerator generator = new PaillierKeyPairGenerator(); - return generator.generateKeyPair(); - } - - public static byte[] encrypt(byte[] plainBytes, byte[] publicKey) { - PaillierPublicKeyParameters pubKeyParams = bytes2PubKey(publicKey); - return encrypt(plainBytes, pubKeyParams); - } - - public static byte[] encrypt(byte[] plainBytes, PaillierPublicKeyParameters pubKeyParams) { - SecureRandom random = new SecureRandom(); - return encrypt(plainBytes, pubKeyParams, random); - } - - // c = g^m * r^n mod n^2 = (1+n)^m * r^n mod n^2 = (1 + n*m mod n^2) * r^n mod n^2 - public static byte[] encrypt(byte[] plainBytes, PaillierPublicKeyParameters pubKeyParams, SecureRandom random){ - - BigInteger n = pubKeyParams.getModulus(); - BigInteger nSquared = pubKeyParams.getModulusSquared(); - - BigInteger m = new BigInteger(1,plainBytes); - BigInteger r = new BigInteger(n.bitLength(), random); - - BigInteger rawCiphertext = n.multiply(m).add(ONE).mod(nSquared); - BigInteger c = r.modPow(n, nSquared).multiply(rawCiphertext).mod(nSquared); - - return bigIntegerToBytes(c, MODULUSSQUARED_LENGTH); - } - - - public static byte[] decrypt(byte[] cipherBytes, byte[] privateKey) { - PaillierPrivateKeyParameters privKeyParams = bytes2PrivKey(privateKey); - return decrypt(cipherBytes,privKeyParams); - } - // m mod p = L(c^(p-1) mod p^2) * muP mod p - // m mod q = L(c^(q-1) mod q^2) * muQ mod q - // m = (m mod p) * (1/q mod p) * q + (m mod q) * (1/p mod q) * p - // = ((m mod q)-(m mod p)) * (1/p mod q) mod q * p + (m mod p) - public static byte[] decrypt(byte[] cipherBytes, PaillierPrivateKeyParameters privKeyParams){ - - BigInteger cihphertext = new BigInteger(1, cipherBytes); - - BigInteger p = privKeyParams.getP(); - BigInteger pSquared = privKeyParams.getPSquared(); - BigInteger q = privKeyParams.getQ(); - BigInteger qSquared = privKeyParams.getQSquared(); - BigInteger pInverse = privKeyParams.getPInverse(); - BigInteger muP = privKeyParams.getMuP(); - BigInteger muQ = privKeyParams.getMuQ(); - - BigInteger mModP = - privKeyParams.lFunction(cihphertext.modPow(p.subtract(ONE),pSquared),p).multiply(muP).mod(p); - BigInteger mModQ = - privKeyParams.lFunction(cihphertext.modPow(q.subtract(ONE),qSquared),q).multiply(muQ).mod(q); - - BigInteger midValue = mModQ.subtract(mModP).multiply(pInverse).mod(q); - BigInteger m = midValue.multiply(p).add(mModP); - - return m.toByteArray(); - } - - - public static byte[] pubKey2Bytes(PaillierPublicKeyParameters pubKeyParams) { - BigInteger n = pubKeyParams.getModulus(); - return bigIntegerToBytes(n, MODULUS_LENGTH); - } - - public static PaillierPublicKeyParameters bytes2PubKey(byte[] publicKey) { - - if (publicKey.length != MODULUS_LENGTH) { - throw new IllegalArgumentException("publicKey's length does not meet algorithm's requirement!"); - } - - BigInteger n = new BigInteger(1, publicKey); - return new PaillierPublicKeyParameters(n); - } - - - public static byte[] privKey2Bytes(PaillierPrivateKeyParameters privKeyParams) { - - BigInteger p = privKeyParams.getP(); - BigInteger pSquared = privKeyParams.getPSquared(); - BigInteger q = privKeyParams.getQ(); - BigInteger qSquared = privKeyParams.getQSquared(); - BigInteger pInverse = privKeyParams.getPInverse(); - BigInteger muP = privKeyParams.getMuP(); - BigInteger muQ = privKeyParams.getMuQ(); - - byte[] pBytes = bigIntegerToBytes(p, P_LENGTH); - byte[] pSquaredBytes = bigIntegerToBytes(pSquared, PSQUARED_LENGTH); - byte[] qBytes = bigIntegerToBytes(q, Q_LENGTH); - byte[] qSquaredBytes = bigIntegerToBytes(qSquared, QSQUARED_LENGTH); - byte[] pInverseBytes = bigIntegerToBytes(pInverse, PINVERSE_LENGTH); - byte[] muPBytes = bigIntegerToBytes(muP, MUP_LENGTH); - byte[] muQBytes = bigIntegerToBytes(muQ, MUQ_LENGTH); - - return BytesUtils.concat(pBytes,pSquaredBytes,qBytes,qSquaredBytes,pInverseBytes,muPBytes,muQBytes); - } - - public static PaillierPrivateKeyParameters bytes2PrivKey(byte[] privateKey) { - - if (privateKey.length != PRIVKEY_LENGTH) { - throw new IllegalArgumentException("privateKey's length does not meet algorithm's requirement!"); - } - - byte[] pBytes = new byte[P_LENGTH]; - byte[] pSquaredBytes = new byte[PSQUARED_LENGTH]; - byte[] qBytes = new byte[Q_LENGTH]; - byte[] qSquaredBytes = new byte[QSQUARED_LENGTH]; - byte[] pInverseBytes = new byte[PINVERSE_LENGTH]; - byte[] muPBytes = new byte[MUP_LENGTH]; - byte[] muQBytes = new byte[MUQ_LENGTH]; - - split(privateKey,pBytes,pSquaredBytes,qBytes,qSquaredBytes,pInverseBytes,muPBytes,muQBytes); - - BigInteger p = new BigInteger(1, pBytes); - BigInteger pSquared = new BigInteger(1, pSquaredBytes); - BigInteger q = new BigInteger(1, qBytes); - BigInteger qSquared = new BigInteger(1, qSquaredBytes); - BigInteger pInverse = new BigInteger(1, pInverseBytes); - BigInteger muP = new BigInteger(1, muPBytes); - BigInteger muQ = new BigInteger(1, muQBytes); - - return new PaillierPrivateKeyParameters(p,pSquared,q,qSquared,pInverse,muP,muQ); - } - - public static byte[] add(byte[] publicKey, byte[]... ciphertexts) { - PaillierPublicKeyParameters pubKeyParams = bytes2PubKey(publicKey); - return add(pubKeyParams,ciphertexts); - } - - public static byte[] add(PaillierPublicKeyParameters pubKeyParams, byte[]... ciphertexts) { - - BigInteger result = ONE; - BigInteger multiplier; - BigInteger nSquared = pubKeyParams.getModulusSquared(); - for (byte[] each: ciphertexts) { - multiplier = new BigInteger(1, each); - result = result.multiply(multiplier).mod(nSquared); - } - - return bigIntegerToBytes(result, MODULUSSQUARED_LENGTH); - } - - public static byte[] scalarMultiply(byte[] publicKey, byte[] cipherBytes, long scalar) { - PaillierPublicKeyParameters pubKeyParams = bytes2PubKey(publicKey); - return scalarMultiply(pubKeyParams,cipherBytes,scalar); - } - - public static byte[] scalarMultiply(PaillierPublicKeyParameters pubKeyParams, byte[] cipherBytes, long scalar) { - - BigInteger nSquared = pubKeyParams.getModulusSquared(); - BigInteger cihertext = new BigInteger(1, cipherBytes); - BigInteger exponent = BigInteger.valueOf(scalar); - - BigInteger result = cihertext.modPow(exponent,nSquared); - - return bigIntegerToBytes(result, MODULUSSQUARED_LENGTH); - } - - // To convert BigInteger to byte array in specified size - private static byte[] bigIntegerToBytes(BigInteger b, int bytesSize){ - byte[] tmp = b.toByteArray(); - byte[] result = new byte[bytesSize]; - if (tmp.length > result.length) { - System.arraycopy(tmp, tmp.length - result.length, result, 0, result.length); - } - else { - System.arraycopy(tmp,0,result,result.length-tmp.length,tmp.length); - } - return result; - } - - private static void split(byte[] src, byte[]... bytesList) { - - int srcPos = 0; - for (byte[] each: bytesList){ - System.arraycopy(src,srcPos,each,0,each.length); - srcPos += each.length; - if (srcPos >= src.length){ - break; - } - } - } -} diff --git a/core/crypto/crypto-adv/src/main/resources/libsodium.23.dylib b/core/crypto/crypto-adv/src/main/resources/libsodium.23.dylib deleted file mode 100755 index bce89d3f3e89fab6c359c366c75adc93449cdbae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730552 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%0D4|}|VX-nMPViNVk$fG#sF&1j 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 Por5Yw;m0t4o?V{5( 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%0Amo=bss6?8``t_v;qTYVyWY zsVMwpS!trWdfwjT%*GzxZUt^enAeP?D*Jg^i%}Zwsj~JAsH4AEa}~AU3PC5Tr>53% z>DfRL2WinOWwX_Z4^?9^rrw{sK5d`bC<=S2Y`ML>wQyIj;9m_W5Mc7Ad3zHN-BHLe z0;0IuzopkB6gBvTTw8Us%Avw_b`F|3Qv=tPomM~iXc-RVJMuwZpSb7yh14@5AaymAXT?(1&=>}z2zH~j7 z>nrP~%Yx2#Qy)D=aWrAm)qrp4Ep;`QmC>`Q#69DMIYUzQO^uyG>iuQ2{}#C1M3b|O zp44Wz*(wHgT!Xr^0tU7oQct%-(4BWBFF}XZ%{}V?<;}9?hLh2Sd&eXmnp+4x(V6e4 zGxzi+s_#f`^#~cX?5wZ^ie}7$*5%|(9-6nL*9 zI)7{8?mGhSC8{02$sc?kb!c*GAeVGt{fJ$Rf##%0!7c`ZKF46^R@}Rbw-5k$(?YV=I}wlDl3EiHy%kG zm@6y`qKd@oOM$KzprM3gW2x1HIv2*dJF#kRU>7tNK2630$vuOKkvyvrt&SFxmwI-I zx1JGiy|avJAt?=z=0=TQpG4~lH)_-~TBjDqfpk`?3mWK3{?yAQ!sY!dWpOZ{xTm4; z9WXgf6zDL?byo!vP2hk?J|7CW!MsV(@APx#iAH)Jz;`8AGG#`B?Lq|i>`2`6)54?x z>rFf~t#EN!05FOgUc-ii%z$c+zMCs*0IM7Z zuqm?;x8D4{9^DJ?})wL!dG4U~U21!K*&L><5$m0Y8i+DN?=noFfW7?x-02m~;W1^&sf|fw|K)K7XtjYp zzpx=4*hdGxcULl*>PxiO_ME3JQm3kC&P!+zhrO5p;ZB_q`@1^Prv z1}wjahxXUG#HxnCIkh#d3~JQ?Kt4())0>hT`?brn$v>HgB14S;jU|$6KlaWFdsYv?6du|Ib|0DKb~NEa)`HakE5=qPizjt zG4hkACCjry6lsC_7v2O96~v^wB1moy(@7GqPOPF=EAjFTt)vC~S|xOLu9AvRsbo1H<+5BsC0%|cSJRUCRaP?FujFc4QgtbBRA2Wor`Id zMc0&LVhpX9M2l-Q=GwftM$8qws75gcfkicvL=0JYoSHID0%HV~cp-m6vHQzztdG@{ zm2@BZ-^kSVWLd<8GuolYRtl?cT*hs}rx$dv`C%$5hQ5>V+=uadk$X3qltr=977qZBn>dPV&A8K2m z_MGZIN6Cg6tAU+&`@0V+X)p%P6R0R5^u>0DS{Hy#q7?P54uPX`LKM|hd>nk{cGeyJ z5Jjr0wZ81Oo?G+qui!+Mzdtk)`Di@7>UYQFPY6mxd4KzmM6UB)Orp^5c`=DFT+{<* ziTe6Ri$?Sp1j<4FT=$DZfk02$fc;8W5s&CenzbNkA%=|dh(&b6(qZBcJqaOQN%Wy{ z{n3ZM=%NpO<&mXB;tw6Vs`x_|dq_cu{+{CxIYbW%K*TWbexC3`Lhbzw1q(ssW8Vuu z^jj8wsDFR=F!6^<^WzUCFA{*LD|zvO#dnG@lNTrE-!P1@(2bk|Gg^G-Y`w=elXt^= zcZ9o(LGdvI7W+2*(zv+YWcDHL4(180SH>;37Z`w($1}&! zGmc}JOYyq};k7QYYGFVV&7Y6!Qno{xGp1c^OYK6u?ZxEt=D5=91s%KIB<05i^i-Q! zV-qWsv}|%^st;x9cw*Je07j)uyL%(UAJaG5cMy?zP!nA)jhTddEf7{Z5K#A=4UZ{s zPe*cYCh4*qO6?&FaHP*t0@_Sgm*J|Wgl%`JWr_BgJ>7#P??Kasjw8Wp?>%p_7+q{w zI4=oF!-43qG%RF>nBjoB96q9cFQyYT%Pas~j%T{8~#M~ijXNp9;o;WP%mb|fU#p#zD?qXKMOChPyq~nRZn*;4sgPnv1sv3=8b-n8|3$5e_Op2<4GcC%tUZs?y++$3>ci=_#GO zuAiSLFW$CzjMN*k>@ig$R9LomL(HBo5%8GV$^g$EGutRR>fK~r%$_PgX3w8n%pRwG zNN_*%12%qzT8rN61_so`uRAr7s6B0Scl3wsk-8~aH1a!vfb>mI%`8Q0;^Y75eT3+hZKw8J&$O#a2 zxf38;68jqioqYV}sO9>2k2eT5!lm34{a2&9^x{&a?~UYB1Wk$SX~vC3m17nN#-K%?O}G<94&kjvc6M)zJoyk!z(3zk(!o{9Fxp3TWwnN2PW zJW{qMq-MI0A}||dbs1RuR7M1~Q-+&-C)yi&PKy0uZaXm7n?xS>Cf$kL8d2X1{h%J# z6x0XRFf|;M4plkeKv6$%hMr;Jx*S%rQ9AHUdL!-1O<6NXt>+G#C)_)<_9(RIkmjf=O#4RK2N zjGI?1atV~{__LD_qFfiJ#1XG(RJJzQ_$6bI8>#8hpfz5_AsIH!qdIC(NnRgA@C zGY*!nVoheN8#5h7Ur<}BlSgRut#nG=+XW0;O_}8M_zK@!21}|JWF2?tTejlfJ_x#O)W#3+$LV!&!35R1G|LELGfmOKlJw8pG5xUV-J`9PAFFUTIlU5 zcg*?eg1M#til-IHizNk!gxa?WeX~PAD)dd4#hy9nLf@!{hpB<+H?IwdezOuJ+15-& zzX^PQQ1lz*$7SGYydrq=z}ao!090|THV>$Gzc~z0x8(!%uf8`3DBCcdix1l$pQcfu z=EuVc{Z&88X1yKytA3QtVp-`)hcjZ|)^^95k11wNuSLem5EC!l`0Rx&6zg4E|k8acTiQ9FJmg|%0-;lOureX!V!8yhY zcB4Cj-2lRUZ7*G`-@4dY^1k9cSIirQ{>N&I(+h8T^^#lv*Rs6v1TDx{xmRzN(M)B= z)4<)}wW3$e6sW?vA&)B%dp|b=>4y;3lUk<}|E7!hH(x4G?7Q&TYT*BV9L4#%Z>3a! zs^~}hJu{~>dFIi0^7xz%xshBzj652beCyspz?<^oynr_-^EzaB^z; zVxl^V=9Q>^%C6J0QnygG+Q&DY9g}Fku4((YMD=w&%&lv)Ob)CsVpQOBKk@4Qd8%+WHW2RuVzmqUrs0eoLz4uZ_Yjl^slDZFyHD-F3Vm_7NNOa3g7yrt)j}J05h~G zpiRrhK@KQVYm#bB?cKzDOgoYway-PR&?~+o$$_ z$vX17WJ8wXZccY6=FALa64ke6_tKiP$=BI>pWN8A{U&5$&;I0bm8_QhWANvNk;i zKbI)jQP=4@H@lN>m|nfybb1Wf-Ac#J?Kwy@vT%>0^bQcpjPa>R&l}0{S!~G3CF%Hp zUf2L4p^)UItWDTl1KQFD_>gI17N@)9+$^TqWLvt6CS=AW_YglIxu*x>&U&l+ccACY zxg#+C`OP%G8Rx6nv>|(nM(RVRry$_eD0SgYbRpD{?L#+u4{9C%eLhLt-55Ztzcss= zFEGK;;&f`jCubAY3$r`u(ezeL`Z0_}$CV|EAfJ^it{f*mLGnz~=9};c<5l)~*N8*u zor$~W2KH0UHi$Yaw<_lGxvpsLIkRYW;i8WTCUJo9G|4^L#g45cX;+nzOQSGv`8b&!g*-+vXifZfnG6VBUq~rN;JT8yN!1AnzgZ9(*OT+iAj_ z_n8np%4|OCv7+PI7ac2Vm;;U;m45{*o7J~AZb>ej_kQwB@ZYV9mPs@Z`km znRvHx{U7YT2UHbHw=OzY1{Fbqh!GWY0!2kd1xX9VfS46U%oqrYiU|}^5i#eS6?4ug zX%Q3y2uKhGBSBaoiUP8DUv)2Z@BN>1&$;7&W1M@(dyGL>b?~d)Z)aa+hJ`k4azof_A8E$Mu0ESVW2~?nLV1gy>1~v|Be*Hg7V8mjpJwbahv*W! zPX-1&4B#>=mFprH=PLg?_#bJ7!!_20VwL~)+8&Bgc${^B^c-uC^d4)DbPd-!93y#@ zwPK6JoQD0VdWsXQSu!oFP>sU0V1tvxT7`0gUhSTXv5thsd;(qhQjt9m>;3bA%FKI* zL5+gY@JsS&$GU>9OJ(B5X>GPRi=HsyRo_7W%w6gz>sx_2@1~gVu0WrFYTT6=gKMm1}#Se_%4EwicaOy0ok@vNKit%>kwz;|5=Wt^j#f@@w^NHL#@&ufu>j zu8w61`$7$9+Uwg?{Phbp{HO93cEm^e**9sl14m&20_ZsR#hL{80r`Wl$mJOPk~s%x z?~@ke?l-O*I}C?o;5Tlp20Owrc<0y1K}Ycu4gjmi3TMGXKw%@Uklhnb$IXJPfI?%g zFhX7EV4|pi-8rg0^@q>kH_ib*gCFNJ_>Eg)`TM(gQI4zMvDfN{hHhjR8Xo#UkEPZR zaR8&=6n?OgZa6`P-)Vu&PF{xn)O+br0%gW#Qw1_^d`n8-RL{X(aa;y)8Mp}%EaQh~ev~U=yRguf`3inu zG=jCRzzrYey77!cpSdW&?g`|2zIx2Cp8&KZ#Wsj(FpN(X+n!L#4i(U`70PTy60RI#Y@5@aa(e5T~{;RdiP25^`5#15jXsx-x2WhQ!t zIjUrbeX2r55{zghd=5ndTnnz2w+OYtqg;|QJD(F;4 zWns)aXX+Wude6trvWkCt&n+y%;3g;%lo@{+f=E>vYgw(>R?BWoq&4`kR^_un$Y%U% z^=3U*_%r7y0X?vsm7-Mn7WY`odv4(~l*2cO6u{vKR+jyRZSWEkIR`^hT6+x)NrJ*# z^@LqIgUx`{cqW}w*`u5T&MUax)A=y0`OL7EGQ;X!Sc!pEJ;pQquV=?pRT8`8;}~~u z0_yDtx2!_>1q{1^Q3j)>Oo$H8j90R|J7yqlUAy#Zkmbzy`@*XR~P+-i@QQoJ< zlm7updaKBHS3xGz6uI+$C~~pqwsc;lq7>#BW2TRBUgodIo)GL9%e&xctyFJj#rY0) zV=Cp<8;qeX4_bcQunVMr@8K_ zid>IuMZ&xSMFQM|(s^az2hY%1ImtwaF);AkuQVCOsd4CCm9x+sKY zAm3{Bu@9^rRyK_n)1^*4tpK;h~cZt#C^cdj;ACmoYqknWr}XVMHrEr?3|qX5m#3 zaQ76|zTv+L`KZ5qzZCNevqSm)FXEp7S3438cqt1fpqurfn-dhJs#HaVSHTWc239`@ zSbZei^$M@#VJN}FWUH=`zlFcF@Htu(L0c!I=UU5eXXPLSMnxgBrzW+!guC zSA5S2s!Ei69R@a7&p^oksFl*fh1#+U0rnLq60NB(HPoc z8Xnp*e{FUE=z!xCV|HW%!+pOkLV)-@kbS=`&g#$i+paSpp+oHxVCcpwHktl1ym(gz zV~nrBVOZP5M01mX4Raa(D>2NG?DtMEzWM**_~OR?G71rpDzx>=XXBf|v{WMQrxYa# zY$XU zU)D3mx0HoA>Yfv7zt>hfzJO%CRq@~_8CS@H8iu?vd1Ctb1)tf;@Aa*KYgB@gnD>7A z5!793y+Oo%z|HIq3h5pOkcUV9_&?gWus{uB_ofZ4H#F4?j;e`}_eolk$F}pZat<0} zI9aqU_i48WPchTgAg2f*rw*3Ja%#WrhI-t>SYfZsy!(zo7S?(;K<=%QU3c|-T(6a>_F}{GBqC9I+1@cf5ij)8*nO( z@Eo<*{6b8?@H-iU?`DbFaS7ahAb}hnI7^3>OyTfAPYw_CZ_21sOigp{9*Pg{a7^Hz>lzz^_=FJ6hw7hG|*5-&~o0%*h5bVk!7n=up zgq8luAi}Zj$+yu0uEn*{1FVELU2qFeac5W`EN2(c1HFpfK?W<<#oE*-R$L#M_rMDH z+5iPPP!!|N-LD;PimP43cT%5Sgdt-;0CE9qWME+t@J3_+6Rw0F2lmCdPv)7N&o~(h zH<~MEZv}BTHJ{;$d}S@gF1}PxF<+UFae2n-Y5^AH>atSyhGb{>xCV$eK+^@r#?k77 z76}^X-$^h;9P!j2A^;oMJ(S8Y2wW4ueaecM$Qc+it~m5haRRWJ6h)}dS51YMQjL57 zAT-3;S3qnp6}uS8K&g&?ITB-COQpnM`+Ua~8m%l~*;KgV$SUTuu*1OTt5%G4GbKE{ zE7!2ZoBk{U-eO2u|dGP53FangO?c|8JM*5uydh50IZesAPDoL z6+vhez#6q-ts$qZHm1Z353KsCZm9JTdzp)`#Ae`1e@Hk$W_JkTP>(X))x2yR=6_Vo zm{*Kf5AZT)Pm40V)!5Vi382CLcqtM``xxZASbRjji+w5wVHI)^R?vx?f{mF{DTlSX1J9Vkiq={XoU1QYmAgbVUVt2 zO_6SAEm3(*1WQ9Pif$~Eiu>nkFpXx+N^Zj8V`|KpDc&Fz5LNdwfP&FLTCoGp;iDLbzv6+gM;uPbZj!0S-ELfFsPfiPF7pQr9L&H#cQX?-*Rh z!GAG8{_@SW{to}aahBnKIEzx$ZZuxMO&^WJi*xWu^J*As_Y=8DoHBot-H@MGK3C3S zg2>TaId`KKUQspNSpchrGe(2uXIZ{EyIqDGMswAy*iBb>Rk15Y^DT{0^q+%+H#l%m zQL!r7n)?Vb4-g*YCmq8Dxj9s!Hv4e>ADCQW^O1pwNBPVqldUXM0a5@mg^kqsnL6-O zhk+qujf0cb?gH>YoxkIO2&w*p2M)T8{{D^!#sd%30Ur3~a}TE|6w7k6H{*La5Ke z2?UCKNRh8BiHS5)Mf1g_Fi2daQL2o`cx+N5IgVIQLo-caQCu@a#T?emn{TFxU`}0} zj}{O(FRqVk{Y0e3 zaj2^}_NNq=@`N&AO`>@AS!B$yKL@cBi}?AwZcuyI>L7|ipukjPBKz_19%6=8g7eZ_dVPpkR5G6aZRT_cpf2Xd6o07hMmRuSu=KFEc@uihxGGXDqI3wJpq zTn^U7Nc9|*;49>#LqzM0X`pE1;VU2<*TfA*@x>L)$C;{%VNs+OAG78}5_>Xgv^b0>%P=rp zOJI-eDLVs1=C65d7&&^vIkGBE&CTzBGO$^bb1c`$5mWtyR%d!w;0D;ErG#_hN`B=lsn3o4o zD?)J>>tc83!+CL5GG}d>eUQbj& zwHR|Oj)(8%hd_jr6=3QxM66~7TXIXPg(WKhOICpG48W2ZFwC{EWCaX!#rzn?)pQ<~ zoCcKUzk($hp7sJ4;aFuE4hG~jQ>p5=X5#l~usO>#Aw&Ooh0G?$N0by{F!R*_U?RpU z1>j`v-@(c8{~kD50S&=4KbsPfxFQ6M^ZB@S1C-OX}g+35Ti0Hk_JPCL-&Um-^e4s!h4&r1vooz&23Xz-8U`ze>fk}qSHd|9m}2O#F> zufRXn1vtDh@vre?60ZxeNT7Vq3uGyi0Ym{n1vQ~P${~W#HJqyOD%k-A#{pVetg;>~ zb`pcFK0r0HRteC32shAz=`vOd;bgB%B&hHleZDaT7{QhS0GS~atl&#EQJTz3nM%W~ z@WQL``M69H(_h?Wl9a_vGJ7vCCv&0|H3Q*hMfhy9^|g zFV#e85i2$1t_QbU`HH>t41)vNx-TAS}<_6Vij&}6^!;Otd04tdflU84|~%d zlZ|bA%+#?CHnheLCF|fR#&*HLa^CwjWS_wCYxtNuvV8}B4POg-*z5NgBknQT9BoX{ zK;JretQd{V(a3~rB;*=#$CpB`k+6q-`yOK&^_Z-IMiyw)9*r8Ikp>!BaE(M@ysf*7tT#wG#M_kn$r5fm z0bB9^y`NP3)>?DciFJ2z59e*bv8_Wuj-AI|~c+fm3~4*ri{KgPR3i`ebF%iB<&-8?Rfoi0wnpPYgV@_bp*-v=N#z4q;6 z+u+jQuOD02#MZulY}ZHif7AQN@y-6z_m2l6+;{h`mV5RbdQP3|ABbFGqpklRegF8g zS+e{GekAq<-k+9ZE4Ezw@(+3Br#f=MGi(h;QeqqYhARlwH?s>$STvTKP?(+a;8@3C z{K9NBHdnEAuqJr5j2qkjW?{9X{Q2yE{4(;1y8p7?=3c6jdy;!;wH%JWHA{h%)TU+} zRW5KZ{VvBc{2-3}C+*IYg=(^mnp~Uq;K?F2*;Y-iP0e|-SWUK5lWWtSJXxY9+pEd7 zX)m5ERg)dmtiskMuPvti8w(c*HloY#rr^>%YGB#6++?~Va zDG}~Tsq&OOcW;IKTa0^YwmhY#wp<}k`RQJoDpw}Emn!7Sa`)0Axlfd_d+AfTPpq-K z_ec4+C{~t|RomjDJSE-T`=$Xu$Qt$wufr=!pwk@yPMv3KkYY`q{?OTfz0RPD2A_B0v1^ao_^2*ESD7EZO zLXV}8cVCFJXh;jE2ZnIzDDhBt zmz#2%Oj|BNKQ5=_HZRk;vjo2GB=K;r?sTy;NBx4jsDyr9cFAo%qAt#|(wPi=OJQ;g zIcMAyaYZQ*We9Ald(u<+w>&oeAqtFV^bSc+$yOI770H#a-IJiq3R#IyH0Efk+(&`r zqWoK#dlDK}GNDU>R=_oIgw$8NJEIRsGD>P#2|GSz^6m`%5m77dN#Syz2uM9RyL1kY`96 zp3JjQ?#aADf(iW3x@xZg67@Am-s=f>Oyz1qx>y597weVD6HA@M&g|uS?I2yqJuCUU zU#61#!{36e+M2-q;;6jNv1RTVsJ3Qs*El--FOJUNm#qm>j$Ydy4j4!09Wq-Jq#RwO zZVwNPqw`wJ)&wa>7pv)T!8kgvw`@(2a&(EB4j+u8^FEoa2~v(ORnslhblxe$m#5Tp zIBgvN@WQzEjx2>&ij-@wp{BzPV@KllQR|M5Kt7WT6+7BT-ubvKCl+oR-; z6|m($^%)PIwo>)XlObh1vy|P7kW2k-#ay|kn0u5;F`gJ|u>_UG-2Czvi{*iN0rLLr zs=i@&*y;(3&-wmk(0#a$lMK2W=_pwhmrj!XV$KXFLr9`vqaYwJc{zdi$?8s$RdeY) z@Wc$+cTkaJ^VE4V6-Tv{amG6i#8kPB62xrzx1Wr^6gYjnS%8cAnW^A!xcJ9f1A-fa z%KpLXGba%Wx`=lYf2&ET|8HO)rhs!tnQ4K!c*P8b+VDiwUIC_qqcW2N!vmvH%~>4I zl0i*^Cr~(^oKY7pFnG%0%t&;t8R5&pQ^~*b^vCdkC*GNc3FBLUrx%>zQPdh9z8v?C zaexW?8&3n-<$R)f!^12N3{MskrZoR%coO~?o`08n<62Yh{qJ($i0A(Q;1T6Vjalt~ z9Z`O?i{Nf%!>h-PWeJQDCwQEoKme<_mXV-16rdt`$_WanoS@)aAGO|Qgai^AGznJcPJjqV0_LTsq}e`oPRj*3&i~}(^{ZMI zzj5hw8T>Ak&y)S+_$%Ytd9_%wc9wBOr~y_7-MWOzZHiG9XCKnp#P|kh z5_7+tW2T%dLZrw<{*8MQqRmn!SP*9J(SQtD`=l;PLRj|EJqgl+8)fkr<}4p{mY$M- z`{nM8hLBWVpWqrb?%o$`gU(t>biT+1osfSn&}CYMd5dtCZgR1wH#kh?WE9~m>Lzne zZKk_3q$0_^6z(E=;>(LTodcer!@v^;o$&-Mz<7fDiJO6|4W8g;@-4s_h7_79tv2Z7 z%9)Oc;&jsAc!K-Mc;dAHCZvlx_QbS--|2$qr4Bk-+yoj6I{#hne~;+D&Hew`BMKXZ zXsE1+o4_pQN`@e?gqQSDGESuMwVQA5U#sQ4Qr(kr%-|X@_yz4C1`sm;dAzWpCWH-7 z27V`#q;$BSsPxaeyoMMBf%^Jg-YbPWzTs*@xc<^B6DQWYzUgKArHj;7K92_y2!Ag&PJE$3w_9gr|0 zpA6y(LF8Oar2`U1MA&9(F;(&w^`D74R2qN#JIPkZiP6ly>Aab6i(g6u;$tQzq z-A&G|R5~DGL_QhB6{02QQz{*hFe0A}s&zCuhf?W)gc12gKAw& z&XrU;AYnv48N?Ohn)SIy;(&w^`D74R2qF+bJTC_%jL0X0wBi1R9Q^G?GWYNAUxkT+ z4cPj(KhA#)mAu={emO?{eHNDy^3eVZj}p}w%0otI$b*u#gQmj2L#ZoQ8fZa_^h268 zJw=qa4_)?&UQ{Pfh@Y^@3+1cz;v0u9#RqJ+nlisMRIbCV%;a^-sjdl%&<^Uw*R03a zjI+|nfl&(VAAORD78z*AmEvm3Ba8<#d1rZuT%%BOmsLS=I#(#S#zAkoS zXSi7Z2Rtn>!c^WTYM~=a&Z%oVY4k8l-l~0TQiE!g?&L~MC+X<05*0EHSf&OUUF};< z8z9xgXW`)FRvP<0F6@9NQ@JMEI<^|7+B$L_?XmINI#$No4UpAw(y(IZ4dlkCXu)3* zJj>&3HRQMQ zW1?#`YV_O12BPP1F46Ksa?co$Qr=?>(BHpD@_T&{UngGuWh?qY^F8VdpsVGk{A1b8 zhBnRyD_TSwC4Em2t;IuXhliB68YFx!S02j!lCoKO-USq}M|hq+!Z|_gceJbqX_I_f z=s0BMf=FD#{P!h-L)h)*y~OkgmV7*pCV}@^32CqOL!Om`SKg;!d z{nV`7EFv!u7YvRLtg2aL8vNENxIC{p$APb&_U)iixMUkDA?i=Ym^oH>jinevQK*AY z+SuZ{(KrdT5HAutV)PtCEKTqcX5X;93n-2w%w39;tT=@6#$Vn*EmaM-gliUoZZ4uq zaAaVD;2|>ju3qrl;KzA;Sz)tbXpuJuS=(TXSV`UEM1nlF>nB*EfxK-<&n~E79jL0& zUb_x$adRf@8itO+aoB&Lb03@%&!27Z52s+2JUBD&7TU{$BK#WW=^)2gexE1ha;+C- z6b=Guk%prnPTnEf_c1zr2|0&+21e*Oc0i{!#=b338qSr*5e6177sjyXUHh_Bbe>y1 ztT2c6cfmMg^5}Aj)(j-~dZIojyIX7L3v@tmnIkw0?LUX>lgWHT+mQb4j-l#F)VJ;v z2dS@zKJ)gl53hyxx8hm)Bk}ylqVgp@k@-4~!I_Sc1&tho zvm7G}u|}LJk1W6{F;>Qk@v-I%d1OAOU4Qn?q#8rhaXPl9Rt;=T<+`?}BlK)d$LX7n zFt9T9YG^7q4D7%0D0*L{%`1*uTnnZ+Apcxmu9mXU4V~1`^bHh})jU`$JIJ?JS+q{`*_9vcZV79$u3I5Eoa1kwzxrY{z2e6X&3=(=YT9Tb-8!2M zLH;KU%xvsdp#0Y?*P7*$S*|cmOILFOwRImvm7Qg zi=0?YkiIi`VT<7dVx-=5_fvYaK$wPCsL zEXS-@etVX)Wx3`o=ge~YEa%R0by&`a<=FF|y_)69vD0eyW|sTHa$zj@j^$!mE}i94 zSne6i<+5B1%ayR)J(go%d3jSo= zlx8U|i$Cq(srEnq+UD)r5_PTJ6}#wf!C#eoOX3VYy!sDKAAZlW?qV&SS=wK?_J0mV zf3jSz_#fvdmX6nZJXA#C3k>?TKP#XP5dyd4pCxqP^60eKKH%%tyJx+OnO^7rt{kmD zxLp$|9cr}Y*Qrz@w|e0RCo5%i*eT%jt{@pT`z4ll=iXN3>yIzJ)^_IsDJ{$HxOl_} z5seHGMc6(U(GowaxJ?VCR5M?3XucIjT>Tf+Z`1eK9b)>?CVI8^TcX=e1M1fOj`v%g zP6qAhE}tG4BOu$TJh;yyY>TwWZpO`C%K1!R&VK0kvv>X zv(GJCFVPi{U+Ru=yZpp-bk+gWnOYJm{`gRpIn6%H{&7FQsMl+Isoy=z=w-YlPHg-S^O9UlAEE(0@K@r;zTYIh>4MBcQL!ULU7- z5RwaxYO!X!fF^BTdbqSgNH?zz_ndyCVdoZ`~ooVxWK$0=J)jI8{tn zTXsLUzq5>n{#azYWR{SE0nNF0@uHW}zB_cBWn4DUaCZOZj?+D`Oi^z2Hj+8Sw zL@TutpWS{Vpw8LG!@^vMDvriptqPM-w`pfjZ=5Bi8Q0S{^e&K)-=KYIX-$Om{)5r@ z&lhC$>Y~NV!$U+gJ>ZaNRZA(&U)4k7YBz>!p+1RYFfERE@gS8{>Pf?~9~I zBARqaxcBBp0p$m~RVzA+NOEB3q!De!l)S9ohDIJ@%1qqQsMSd^y>;m{a>i>B&G)C{ zt)hsEmt-BdJw`;&bXCpsnu}?rrYtr<@G}=72^S}=S=yFp>4~ljjgAq`>$v$|X+J6Lf4ent=MgE%e;rtoWG1FP zM>9R|?ZG@Rc&;Z(l+wPFp=eV{N06U z&G8uL0bTY8T8e4tB^}+g27mNKtvvrTg}(h?{{2(GrM|r&c^TWI&s7WIhWRePB>&WR z9gSToJNHS99Tr!;WcvltvVZEof2ceEf9k`3(*LO+|4A=;`F&F3X}aUm4*od)rs55= zwSWE7k|5N(zmAB=NU!TQfd+nCW`nix6H(pt%={OmcbRX){#ZX4c>no>4 zY?aX2)Ek4`P6@~*>99c}ep5w!$@1KrI}%F2*+?7*q(XNBai zp&WnxyofGKvSQAD7n5Yr3)$Jb5*ksUH}Nv&_y3fhJ)-$*^Ic~V)t8((`Dlxjn(R5W z%dw-Fst?;Y{9Q2}!eNaZG-dhz1Smx_9nnqK`}OIqPDp>xLD@MVAa@rnq8=SS+g7ectm^6d zahQRCwl3_t)^(7W3_moEnI0k{?;!=kS>45S)6}iEIh@Ua=n7ql5>ag%=dWRT>uFxQI#@{+KOpI zm!iwgxs{QIt|7Z6^n7Y~>Ip}pPvy-gj)2F$V4V57S2HE_qT7Vnpg|HcUi353 zeX@jXw_crkcdnTF7<)_1F>m_$nNPVlTtMa;kq3|98_}_?HZIkJ9h=za>w+OQ5_%*n zpRoChkfOhwdf?kfL@7Ul<}|dI(f-eMs1KG*mQ_smb6P8*{u3*54G|S62A+M^K`x*> zU%ZEPt1BbR>AyDXx0li4iTgwYe2HewI)81-BMH6gY4;#{3Q^Rq>^*Cjizu(=Mw+96 zlq{02b~$b+q{CObN}t~)8u#O)_rYo*Wxu&R^3rvpJs*r_o;f6-&7+e?Nh_t4Vm&$8 zXpM}VV|^DbUMQliGfecK>>`?d;dDnlesY#S2rPwM*h=d(9d0irndU;t_(xL8xR_*B zy-x`LLcIUYR|$=8ns~1`LPm8u{JeTBQA}H|Mvp0|641tp*14riW%MmlxoF%EDftVH ztmbSK($Lp)!+Lj;P|wq|p0{j6^kH(hCC0PF)GBR!Swwd!jeK{aljb!c1+;CjqK&(h z(pDVl?+atPbL62qb&F-x?y*y06_BMv(+2cyu~tS?Y@gFS+zB$8;?cvYN^E0;02j4^A|Jof>1wZ`K%DE4HC8YW3S&+dAG1Zv%5$5+M(yiL< zdD{{G!==-g#N|RNY`tU0>)ujw2o)c=SS_L-6T~T3&Jqcmm*{-?MPxV3B<4`EkRCcj zHd(%1N_{jgm-V1)odDYBqOY|`A%~g)4$4MwSQF*DSy_oKOU5~{U0oit` z-wGc`BxlP;XBux6Q_0W9n?~IhP{Y-|TsC1m^7~tSp5BCL%ZhPVsx$?Z)b{rJJ59uN zY1_;dADlT5Ug6i09CF-E{Aw`Z5ZO^~&)EpAYSA7TK;OYIb(|satD= zG`F?y&wwH^ji_hW>|vFZvVQ4q@+lNkaPWg6`)&%zP3m-Z`4Ac1x%9MjDg5htrD<2B z-G$^j`ztLh7EvSL=4%~bNBr|LH!Or7ncrm3%ZvJADy`owa6}^@UsatwR;0-2cG}9r zA4bFfKb$(P#*3sLO?lbC7bnM2&roQ=g^KLMU-5z zXtD&rot}nSxrLP!@!899&ml+ieLw79*-b`+e`(KY?k%H+S`&L7Un8L#w}SGXza}au zNV%t4Dx`KL=6>bd#gx*1^y(LHWTZQ@vGY{OrLDo65nbW8XQdV%>sBM8nSFL_YB5_# zJsa+5DOrp7Zk_4i(nV6*Di7OmFdXqtezzAxb;NYXLo-V{Oh6`AJ_R3aDWI(5>r&3+ zI>x))wqHa1_gE>PFtH&~$3Z3yCO;C=m`h`3=_5Wg&0D`eW3Yg#1FpV|NFbW^^G2|kDi7QUXsRWnHul?Au1du?f1J_MCqhKS zbBrwRew5IUvn##`--t-Ly|8Z=0E+f~>!r5Bk68^14%%_HE8@Gd(T@(pUw*Rt07--M%^8CtHO3lsKnrLz~&Z2bGm=AOwyOptj8~s23Qe|R190+vx|s2+${|imkFr# z0mFW;NJMp4p7^-@6XJwG(@~4UCDhUHvq4M5?RQM?-oHCmOl`Xxg}B1c8k5p|%dm!G z@|U*0y7In+qMWX^-<2e!vTmk#W?m4J^Tq0nc=(0wdQY5mJyJ?_EMx&^5dS=Me;hmO z8{)@E*N&}YV0W+RMKl{Nqo@6@G^jU+sQ#AJ)32>y4{Vl-$8JI#dvam>5$OUtnDS;- z^XW43{_d1o^hH2dqQ;CI7$Kx#&z_Hz6$99*YPdSvO-h9|+Iq8`B{XSQ(494iX9}i; zO-aV0%*vB4%Y7TksAV_pkX$1viN8dCcv~f*?f09Mx-t z2gW!4X-Blfx@Gv;AMhJ`=$;(fOh(6JKE>qj5Yls1<~Mtc|A`-ODz_kx7e6Sge%f3> zZHiP|@}m$x_Ho$XvW|hwWXZ8}1yVY%a8hyggWo3@OA)B zU=?xXZ8-e6)z<*L{t!^%#)8+22Mft6F5>OARuYou2ACV=$>^@N&C!g3B6?uFan`hW z5!q~Xz9#!5A^qpOPc;ROA<++5k!e75Q)i3k0ZSr7s~xT8m=lft(8sJyAf!f(-p=DstKfU;>Xl(H9Ho46M=<5;d_Ko>*LP~>HoR~7 zG|Ao9cOdYEYiZBx!~Sjw&Fwk6pM<>kwG2LHhWN$D_fX$%0(>OfC7-llx4U^Zcq@|9 zhMb(mQT;`!oUQwAIdbv_YFOFKbv_U-8ChE>G)dsvlR$@KPMi>4{+b)gYJHpOhJ?+0t zkLdNPCEG8pmXh=9pNdDVgtRr(@I=Rvu;anQ)@NA*KWehJDxiy$_EfejSug-_dXL?Q zEsx4b`BAg=!v$ipaGW~Fr5n+D$?=OHVfTdldw=)t#LwN3qM(N_2|1P3*e`1I9gr`Kd)tL&qpOvrd!L@>3$3azX3#nDtU> z`(@*DU+B^BfGOYlV?0mqKC)@xQYk$>y!4E@P)H-ME%m;o1wXug=gbq(pD(?dM%ZnY z(RiIU2FqawRL@;n&weVSvTqk=yFHaq;-Y20_RB>^E#gfGX$6cIjc!=^wXnU1g@{QQcDx-9#C z=}s%6i*53kNU`Fz%ZxFYwk$tp;LDD`2`{}y3pOd-ANHWS!J8$1Ha$@%x#I{r-*b0 z`d5rSD}`U@KPKXrm>LgTbGRP#Nab3ujh$_TG&}69<&WiJn$^DT;%%@m&vXKYzs-}- zn}!7|4B>B8-@IwJKSMxY_L&Ty)mlP&Z5y?%{7JNTlX&mKEx>^cQiiuZBBI>onyT}I zMbx8j8__S|NM*OTsp1X@so~(YAEsgfYf7|_uKOe@9enpW%MfwS_niyZEVPqQ_K5P+ z#WN)27#F%|gfaZ84fYGWcnc_dhuO2A!SGL47~U}fe*4tQT&r>+{P@Eu^@M%Er_p)Z z+f7Ipsu%3fJ_7yLzJ1uvSQ+&l@}c-C{MP76*JRx%NNCe|i=mAT#q{Lo;Qgo17B%odZ5%TSJCaj`=6pBp)_MMrp~1bk9VGX^j<{k z?=0TwXD22mKRs|L#Cwd8KPe0ddUh~9s zchyP%Mh`^f?=x-wOARr(yPYooSqXdg=4_YX`$GEkF0Ld6_fz##e|%YY5!H)YS6~3U zeDd$USr8 zCFJYkyEj9CC!C+QyWPbnV)7kneEQfe5j~&(Vq3dB*mKLU$3Fdq^zGd2^S4VRWH;?z zN}D%$o-JM-HQ6el#yV3P%$On|jXnCaw&siJ@~J0D=|%#Q8LOUE0k7S;HL6VEigLf3 z#v|=Sv{Bl8S|sdc%LDbNMa&ga=+pT|Pbuof$A+I|U z-DWjfE2gPETxN{1k&)m|uW7TPU(IaF?MK0m)-#fywHz-ZLvh>rod+R4zi%ktsw<@L zqwc&hLj1il(=8_jIC#BgY4yXQC(rC(J9&R2;7HfTx43^nO7*6>I4H{zcXa94!5;or z+VN1+y$gZ&n|Rf6s*kw()$$XUGjaXk0k7x6&-|46<#i4Gf#~g{c1HO?4pS!Ev=0TI z)qbDRa4Gbd&G(1ev*9O&rUqu8L%qDhW#cjL9-2N)vx|eBSo(JK68OU>{CD)2y+lBx z8`(B=wvx~T$tK4j;8)Y8J<=YDINBp~(W89C&vP0WYXqvqWb>xo)E^54bal>Cm$urt z-`u)KHaruMrp$S#hbQ!DL-LV-mC?56xk=5jZqed|S4`J=G772}dCnpMah+3pwD>=M-SB$QnKUs`<9O-WMi%PVvOg1E9j!nN61INtIlT( zZ%QdK;HuZl=R}RaCAIPEEurHYZezv_6VYMSlZ;^-0hn9VW^u}q;lD#V6NcFU$bCR*1;yrWrp6?>s*XP!%ad<`7D0chJxcAW8 zwvu_Vnm++XhHIzhn&L>^w}ov*@=4%&3hFs&crmkBFBcl|7-H$x3;e8L2z z9lLPaw0FRlt}WftB#r1wuSk3jm?*W*^x&r0ShAtvBNBiVbx} zRKQP8Xt6T#`4<^A4_qT_{}}V{)zy_f?m$28vQW;)I)}rmbD7mUuzs^XueW7_kSYTe z?Hk*O$S*x4(-HQgY2-4ivo{bwmlW=+IxVHx)*o)&gddfbUHW!JbIfnwVci$^m(gbH zU8Ce1Bs976x3Fs9U4^4H#@t67B)_P)O1FiKzD(FEz8))~xC0wD&&7IRu-V{kixFog zg-cFceJiF8Emlivu8XK^hGl#AA}QsL{92p z2R|vfNzJ)-7oq>3FO*le6q5BcgTBL!g*5%-3@dBMZQ%2we)TNHWPEyo*DA~lle?bd z&p~c>>~V^Bg};9|%E~lvrI&j0l(6@O<{R1~)JP)3lG;_0%GPHIY z#6hp@YI>~i6s*6_S^NIg-sKWndoj^78~E9{t-p2$%@)v+siG7Q%tNKmlC$ICXPtbw zaOwiAcaQbxJn#qPVXgU!UkkhtPxSiIXX#$}ss7J*wSZsp;KPH>zL((FW!}CxUM!>g zN2i#E4@X>h%r|jw9WnLrtGP>UB#x}<+0r}YMo9G64 z9k+jy_j@xbZSi@oe4Y@T3e4+Ek!dF)#N;uqZrk;EZod+B zqZ6=hF!5;AfFbY;oDD2XjvtcJ^3zl84f_ho;%o5n2hi)Dd-{ft?k%O;7fSauLR@u6 zw)}Qy%;)cOmh{(H3mo=Y7l-!1?MALx=-eCYlr9=c9S0x|I^XMJ>}x$CrG=+jy*mv* zM)mX8@F?J359Cb~(}}{2ZY+2y6w}C~`kTt1$*50K)WkMe&+uqumhu_+Z^Mgc(!11? zk>0AJJ1chs2OZh%MezgyJ=pnT+b(^`g;%8btB;giJXY(i>xA{CFP=w6>=e+23uceg z+e@hO?wy76fhS+D$l3P<{+hf`uh_~Q%;Tr>4-bF9E^BA%Xy=M4-}wC9d02;fF|T0w zFYtY`XPm)y_^0Mi=eEDw1N#ULX5G8~SW1=QZ&z6ilTn8DMunaY^q-0Qn6oWJ)UoLG ztIs=$HaFP3uoCMtor`Hw4`~_E=>YK- z+jnBxRg#tS)E4p6zK&+sh5+B3^z(a1d@5n!hObUX+=%oZAG^5#`ZOs~dE7PxdR2Ag zax(C!=vi;N8x|4pzYcSv@k4ealE2E!2EZ;JJ2u$?W^F^Rciwy0%eT$lyB|ZG-LL0m zCzDQM+L#mNB%Ldzm*Mq<#^BE^$lLEJ;>U}()-P26kLfi2Rg16ZCA4gvi*5?+q_bH& z@45jZn!5U`dC_zM^>22d%Vi%KO&k_tyDkNKq)}-0IIO>fSdN%=WUYXNJLW2LT0`zX zbu)6xkdpSCU&iY>RpHU!1vF4L_1Do*_>+C>%`OeVx?RdIOV<-Z z`k5W~6tEweTv!^gp%`)bT(cqPMqysWcKX=fRY0qrIE$Ls7ty8`R~L1wBO=k8SM_uc ziRkK>YsId>vG1&CYZQvTRuxq@!(IcoeRr($q$~FY)MM9XUjxL6nYTUaOf?sf!S|#k zpJxc^RG;Qf-!bp(+m77Tq(n&b-yF(HuZCUSb8pl7QBqP}DG!a?ETUE(Cmvq16p+W1 zVIN})C3L5L|E=QoBGS5cJgXaU$zz`;NhBXIuH8@d94wU3p|6>vww4PhHDsAqGw}W7 z@HJN-;EzF`k^}Xyef^x(3&jjgkg z^2YQIioPPGbsan2eu8*)x2|f06V{EiqLq5tSg$Gm7!VyBA)vGFRqvZ&{i#f2TiO=v z4~Y-ETF`Ab_9vXUyX83i;=M~kmGHBK5 zk97oOmf51@{xV#D_@}#PFkey%G+K5=oVdf+MO$mRfV!?th?wRMeb&cr)td8==T|ma zTF@)4Z}|0nggEm+^4pyTdJMySe)`{Od`InO}GGmXWYuLf8iQ_gQUPpQwL; zX!43k?@L$*nj#N+)29YFhC&%#JU~L#U4{8aDupy^wO;2q;GjQSgg5s^{QBI%vEMYT zGuP44b#yS3(AXCdKb~HeP*Ld8CZ7@SY^c|7iu3P|a1zOgR!?~g^Ur42HnCsYwe z7lun{{^id_3$ZY_y25o>u24u$HwQcr7C^uD+;GizgNU;8`#NvxfQ7P#M;rBm{A!x_ zwwaFkdAU`;5xd?<=Izz+_NY?=?;;JMGE*u74$kLl4nXUK^xD_@<^yCkET zmp5BmcnN4(iv_phZi{JehBD~bLp+DkI^GW|fzPRWEj>~tpwnG^?Z2(T{xhfU#xF5X zWA`p?5RCmyb*+zX9}55DjAE&F2IRVZ=7X4H7$3Vi;dA7xfw#M!+!lRXM%K4_UTC;b zLLQp=&E8vMea@`T^{~_MQ^hSjU&KMa`_}#Gl_jI4`{M@;ej=rneO6!010FNovuXG^ zg^c>!?|x}wfc4|Xhi&JM1KwFQcn5)bpMt;N{7Z|*LMQmM{tKMjVSiDY&6zqfD;Whg$bK??u7GR`yDuLy5c`LE zt~qty2!8&>*N=7q2RyjnwQ(2l)ooBvUE}?*%h}%N9*q{!xusJImeeKcvgYt{zZo+6 zYJOv+-c8_9ZJWMW-d#Y);@$eaGROL#&Cau#IoMBl{Mry_?CUq|7~!~Tvy^V-d7AGU zD<=D%TjrSt6P0i1Hup$6;+mX?1@v_2fnE*A5IJ~WSa<%5n6A;QAc_@H!7r`c0f;*mGx!K$`z%Nz~o-=DS_P@0Hc=g9OiH!D+dC(>o`%fM&FK=vrKuo*)cJ?;Feg&<1 zXo~@vtm=^Zc3jW-q)4CV(;V&uh z0klNu>o2nf=cjMRK1I*7cfyYgsl%KubNiWNy&-?oIWh3ne4FU_!7HV-WbCrx_vcDz zOY0TxrrWVj_^PvR)U$!hufxu1nK@qW0sA3t+Hf`Y9ppVUADp{HLY-a>4S)DdN=Ld6 z`VeU)qJd#aH4d#slykpxo8ZB~6|QUV45Mg`*bGTTcxw*fbbzq%|m0Q(KEn2w$`=Zuto>>bv=3U<4!M<cUnT}YIcj6;0kc%k$C`_{m>o%XHi z{z*i;@;>UXItn{;a!Jh7aafP}AXII@y20G{-)^643IAiCeZnTlS>@pLOF!xWkFL<# z`$QLZqC;_dDE8&Lj@?xL7C5M*vOL)p>n(aOw?*H>KFp63%MApW#|cAwwd`yHJ>zzI z`o!B(3W^X4Eb(?n_@%jKjj;|C5?Pk9AGmbk{vH+$VF&u19Y3R=mxOfFBtws2pFn5n z<2R01Wc17H&f8VMAKPDDl2$xN0{rdD>)x6oYErQDpa?i<-*(Nvg(7Yaw6*QI47lXJ z<;l0Jr%LHV%d}>T5&s2G6`ERhm(hq04-)%pN@<8_t=mKRQOiT?{180HI^V3=QH^iF z-i*G#ZwPP%hg*B=HF}Tu$tx!)XupV5)7pMs(GdGs2W5TH?=Pi0UKOufLT@fxv-W87 zl~|{_(*D@zTd<3+z72e@!S9glh*}#2yJ78_xg6`V%QLd~^l1>zFtM_H2_?dz|EJ@SKo9+Y}K z0C<+)?7#1relgT_DSZMrQIsLDIlrC_^ZQ}0{W(9n(5pZKk3+XOsAW(#I*IJ zj&OS_aGu>u4=;WUeI}pnA7=r(zP#bYPm`q-HsX#^CUD{o(`U?Bhk4?(-*bGQ^D=sL z^yKzp=wU(n$vSoq;1AdBx8(FU>}P#Yzitx~DH-f&HvAxP&+lvAe?CSSw{DF#ZVdol zfA6+l2N(G9LD5T}zZOy0`N`SB04WW8s_Q+hznBz#D+*>|y~C`|xW^aVfQNsLO`QV& z{QQ?F1OKKn`rzF5)Rz(1H!%B?+u}ax|LgWKXP^(1Gv}>3d=2YlnGeRD?j)nedX<_@ zfg>KQH_+})W2}cQT_`Jl3;ZtS%#SY(q*OjVeBP>QScg-zoL77W`q8zdT5A$;5r^l8 z#=sA{zjsl)Nt3WIBHA@$1LEBhIy?L;B-w&_2FaNGeaSjLtK#e)%c;;__-KH7qmj;LsK8)r&j6>{*U^N^dTFc>-K7 ztiZZ~wTN~;DI3(hsgR^9D)|ilhHI?ev&mRO$tJIl&7KZF*Gf@m=_BCAF0Y=gLOj}c zVN_mnn1nw5$P#5r;Qw5@y>A_GqJ+6SuC?w6{r$<~R5<3NRZersPHiHWJ(p$ocR=q} zrhK{e8FsbG&0sm~)$J*X=CeAWUUr-6|A)Bu4#zrv`^Mi~m+KNKD>I6WqHIMXBn=^} zA+sSQD@4Oc2t~GpY{@7@gNUq<%t{(cc9K;z^t^oU`}zHj=l=Kk<8d5qab2I!`99C{ zHO}+ncOG?0uIt%42YwdL_so^a@G<^# zHF=|MfxN}Pevt23JKYT@t!L$ikrrRz}iF`fQuFP{_A-&x7swdIE!@ zv6}GRi*IVHIu(TaL6Ob%S7acMXL9}7HK>HDcyXifQRL4>;PBeN=e&!d5Z8QGgd2cef;3p{+O)drs*cVwmu=Ve{qj#_UU@T`JjF$y0T$<`+c zHh8;4FHf5}PKZu;-!u+#oPrKu*isb^TxhwPMUUwj{2MiaXVuaFG_Fr+rS3xFoGwlr zgzqEuv`6AbN>)!%$4YC=rUu1nBwoSYWeI<@O)@bg7BG>`->i6Sp||$D)Bm&+ zeWqDfm2^J%R0(3)2EWV)sP!*mDmIuzN_~=)PeqBVvI%Nm?dVNRVMH^f{p`$miOoBff z?PA(4a~}P{z4x5S#|SAs_u@L0k47%&CR~b|p^$U_aDvXi9Tb?16Q-_f^mus!KK}BCx zwAlU{xaPY;d*I>-g>37X9J#g+J`#~3+6Ck@M{d8!ErEF7okeZNJHY!LO$xPv9uS-1 z%JgUzg-nU(F@FN@wd}bG=Z{JB2dtBZ-L33fZ9lma`Mo4;g0(c}-fx0hr`0!rosj&h-yWbrz zU_ri4j(YsQ8};SJfwHL4H+16ExNVobAbfxFL-O$yI(c97dxr?lNm^XSkz@}lp;_zw z()GdXG&0Yx7lZ!RmEx^<0Qs*^W%@1hK#5vPjZ+tRUD4OBI*6O1JU&sXL~vJW5V-8aEV z7S?-~vLU}IMQ{9D*~&<2-%vL12d{jkm~G9AaT@X9xTrS{{9|(R8!S7)Ct5JySOeeOEJJ z&s456l}KJ@aS*4YzxMe)x-}O(V1unr^n2vrH~WjsX$)jxur75%96lm@8(Jsy0sHf+ zuF?sZYg*_!q?$%2WdEV>GSOWBP6_yY?FGAA*BhZ%m#s+&6rd5Wie_-P@O?=LE(k&vx>q8(E=)5&rBM6Tc4QHQvGK9mN(G?_5%J&{Z$lR|cq zt`6ugP5T0A+6<)KytT#!ykUx6R8JG;!W5lu>-*egAYEdo-;DM{w-DmFABcEL=tvP0 zegfa;fwg=stnk~(U2!W0KQNTw5b!r1y7B(%s$=LA45ewQoY0T{avsr=7zDoa{1>*}=<)D_-XWE)emMN%ch@3GL=x>jph9)OF{99K4^e&r>Y+pQ4cv?>~KX z4up=vw(-0&V-@($?xsWE-qA?3t=6$^Dna$9k3 z$}$yv&-ePNg(3J}w*J_kl}RBNIgcvNqi>ikzI0a==Oh2(w2Z7uMCW%;=Yrw=?Y7034~j>+#At^ez1#E=YQTm+5a_=gNioL5cAj%FqM0NgIi{ zgLfYlW8T_g!bq|*wzod?hYwrMa9w2>=B+3-75*8R@3eH-d^-_7!7yX3yY0YJk`f_W z@WpG!m2-`t->BHOy7oBq`r95a`u6n0&*%}e@)hvya+cC@AX@Shy7FOe3$ zh(5=dJzE9*XY$kc){`C36W%@=AFD#%C`e=NI)s7ZqO!4Q;Q3C2d#6@YDI})H{-ii~ zd&BeEhcAPVWS}4OQbFDx9AoPC-i>p_{7&F~GW3m42YMHf*A{C|6b_Zrh-K;n_hp!? zylc5{-8FUaP?`a+DyR(P*p%NZYv}9J%I#x`n72r}n`QkxkPsIMhChA3z-!)HnK4ae zBqt}P?B)N0kJ#%y%my5OmRjQ7qDLW@L}Z*ZvS8PVcCEi!g*n1|<8tb#H;nuZ*#!qF z#7yi}y=xin8=r7$3H%9Bk{60s9t2Jhd&p{*hrV;20LwIV+;2D6y%s~htK;!}whcNx zU%${oy%rQnXuqpVw zxnn9VG6vxBgcJ-<=o7N{*U`ZIwZL<|FLv#~^*najx-b!Wev!2$d}XXR3fp467RQNUq|I*aS&R-k`z zG;BUE!AN$LXxDz@r;`;LqTI*wp#NAGTQl-O2U&CrJar9ySnto>I^fU!wY?YZP}k+( zzo^?U2>tqB7PF2dA@7y?iY~$DW2w^i{3Ucu;Uif$D%R6T<ZS(t+y(tK&#as1>sB53wh?i4SzPS1c^jP!bej}gbpoH~-E5z^O(7BE zR5l0bQ%~LWI$oe2XcgSl@qxZ-xLZUw8GZ4!Q>&&O*lFZ0yV^mCaa`ZL=bFRtg{?1G zaqx#X6WOAgtT?ShBO9IK9_(_ak#@5+iwcO-V@EBmv@I|X^yr;Z5qRBO1*-%cE>OvG zO-tu~rDu+gcj%-`^bc#ye4E}ys44fs&b)Kc60I%OP zia80ml7DXncXuD|W8c&sX5h2$&30M!8z|)FxS^>S_>G$klWR?W5OU^c=QEErOL&C& z+C$(3BQ2(v-b1+F9x{^ho2jJ3qF}GpYFw}Wzs<$Cuh+NAIW~fayZLXMgF!Qe{0%D?fhAV1SWEFv0iO~osg1(69Id^(TNO8 zGP4-;lrz-fCTlwMymdnPmoxt zpKW0v2W=0Io-u(h_efLBEc8AuEw9U+b?_$?(5e>~@ddRmo%;>m=EUFOT@m*g$S)!N zdV>Di-u&j_LjjnN>d~t7{EIwknYZRoFC*c2ykc7NEqomOax#zLdzrV;4G#d{^l;ff zq3hZd@*=Ro^6(m*^H@51aCMSijQ4`>WGAW)WuV|#_imF$a1dX&E+U#-}y6BEqN_%$1 z00-Z((#hxs-{dkJ=GsmtpBkT)??PSg?aj*Y^1>XSOoq^Q;LuZNGF1I1;LF&yuiy75 zBk364m2-Uzex@6W?stI;G9n5Ks*wlj;p`Wqpx3T^pX0>419O!^8zWcsfS(;dl&VvP zey&P={HP}*8D{0Z|2m41e7gPdWOE1nYl+jg{C%<#-dNkyKs&SSw`;*%CJP@cd<5@0%~LoB*#SdaAGUc`&2#FB&%J*K}7m9MFM&J?*oYzaf%|{CKg#t@=3p1)-8b^~|U@iuFTd zz>AL3BO-z-z>Ps#?lCw|_8P<2@?X-3$dm52N$}=XZ2Om??2?Z`g<{@&^PhXweV?f!~7vo&2%KMa1+1=cVnFG41Did!CyLf@_`w(Ply z{z3ldE`v|#XIDt>vdYA~;YV*%Q5Wd+FQc@&?I@&h?ZMxX(5cUUOc(J(f4h_R_}>aM z@UD4@nvUS13Ghsp#%1uZOD3td^)B?@48Wg{Mee*B8oi6!$>h>K_L9* zxWzw(e*5|Nx{UmVAyMRwYWBL+@KiesS-CCY>0>PRH@@q!3es zqF62XG83*${AEEu?6&`+EvFLpal|XH?CJsDblYOQEM#Ol$S&{-qGrwz7&V=oh=c zrwVPlh(3NjU&0>nYx#{|PKKdx9k{D!T8X|iY|vVs0deYi{@}F`@T86!+v$AZvlqqK zw8yrBPyRO>PLL0U1IuP!Q;i`&`mV`C?vUj+Gz;++$6ckP8)pbBa@Mf<6oG_YTiRvXTdw%VTy}T z0Io=?6S{l}aYkP!6dL~({tlVxf5&DRiE7bj)m+pqiHa*@a}re2DEUIyX|c*KpGDnhQ#(^}Z=6o{Fs)^Bgx=t=_VbsCAHXj;Q!IIi zPnI_&N5sH`{&k*N`*V>DM?N z^*OEEqD2Jx$R#yeE_j=S8q3UVtmzjf<>5(B?=pdsF4XCNcl`J(*gDfo}L z#qN!Ccw#OjS2BhE2RwXz@N%7SDhXC=PL4)imi@Tz%QX0llAQA#3YTeQTaol~UMPy>LK`f!se+#}b^+K>p7rgPT-#othj#Unj(dm z2$)<{z#PRb!5&+S5(eUVy;M|J53m0gOY17|&>zc_A90}nP}w%hoty)mzCO!8bOiia zkhojq0{D?!Q$ro-61DZe}O{+^!+JPZExad4gW$vddyUa2xP_%jZqt}NRJoF2_^ zytYFge2bq`iuzMRYS`^oy}ZbD{mH*8 zLK-lqAwC(__7HXA!wC_VF?aZ7+chSA0%%0IVDagr&(Keg39@eZ2A*!KzuVErG*Yts z=cI`b>U;f)B2oCL#3W_%)X_)qJrP~rtPOnJL%ke^{y#p>G$k0Qik9BME8@U(9`Cueipw4-;({PYWb_rz>ABPytR@{WX)WpbQt>clA|C9 zq5JuN^zK^U3VeMvepU;92e#9FryS^1^81f$iCZV~u)LqVwLa$JntM;04&vYEg5^)( zz)o!%`g#TZrrVy&n@^+9Oz}0Xt1O}t_HxrRsn>urYfiIz!oTsnfI;}mQ3jIDAT)Ct z{gF`8yObwqprf%TDLyN*I z;qw&dTNi@<*XHoCfbnGLpp7wJGtfWA_|-aAgGV%>97#QT7rM#Fm9#1FR5G`}CI4B$ zK=d+Yw*`lyUwd;qJ!b~>$A!nm2>DK+>EP+PW0-SS(Nz(J?{h!P-KjN-*iYbWOrbGj zp4wmCQWbo~pAS{)Yae0nQ|5u8tMHd?m zbAo115;dN$wu# zRLeSqm$wdqpB;HSA#@D$yq(QcEV|HLPqe2*-G`5%hVP;S_=K#CitA1AV>D|s#q`5Z z7sNXA*DM|SXGr&8Ljwabf2YUwNe_CTi-PN6P539o&V)tpfo@Vm`#T4H?e7j@#^QV$ zN#l6^t5SiHZ1JORtH}o6mbQMI0s0IXfp5oh6%fx>PyXqFXN=zUI7b=vaU^9_$f^vy zHrvSsi2>*-dDct^4lt5$LCdcxqK|!YM&O1BcrDjMky=A)&}~u+B5Hu= zYp>l%?cc{lyzj}}?v?}Is!np+iFhq!V_&s46g=%>oaQIs@8iqPy^1SD9%&)I8hwO_ z?_T&M2fk>T<|)Ux4l3y{o8PnuK6)sMBWnOYiL(q-Cb{s796Pq`v&J9bj+3V!ZAN}9 zK16r?%8q>N`Mnr;76sk@9zOWVwWF_xqpqKP z`k{>TG=*e56jMtQhd#;5J6nc+Xx#GCho{IhJ3VGj3}GI{Uy`GKM+fry&Q(59IRE6?@ zJ04=6+~O6X)GX9b{kB~d;lQummmd#*XCQZKEeCeIqZ7Ua4M_{UZ^Q7CkI$vS$M^Nj z&tiTglF=z41ovbArZ)kNHXy?Et>9nQl&M;5OQG~%Qo);JVEC1?NWx(*}|(t7A5 zgFEVW?*Kio9{j1A%Bic*(Wkv@wGs#HCx??nRZb*eKKI$ey2PLGQHIRfe_w;Ss276# zEKf22ow_#J1#wq(r`1~68*%zno_cdHjf`-WWvU{-+p!DItxLc>X)pEVtTuSwn`!3D zF#o6Tt-hrnID&t}#Utsjz>{R_?#~s#{<*GNVb3TUsS`PwuLAx$@KZs1t{dhPbv~^% zR;H2w)%8-FKM`UYul(i$_=M|h#phm(g6HD(dU>+}evZc>O?NiYiOpNfg4qXzWF=BJ zzC}H?Vc@%S5`K$ZXYR(zXG`-#Bh>NN;HA@CgvYX}#Kvid#WCF9@Q&`=vk^GIQVO|w zbC^Tc>CGJPW*~#_W>&2PA1Us=d4;P0{MPFE(W23)zauN`AK^aKH)zQ&C)i`*cIM+P z5kiJ9a{9S*!>9Fd-9<^%fpgq40-s}{53vot4+?|Mq`pV#XAN+eeem(V^YB4NL{cvT z7o5tfa(a!%T~yp#m>0Ng&4srTr{QOMl+-9FgnruI=+@4)@cVSBKXrKM0v)+``Bx`1 z_zI04P?E;cFSSIy?|^QyE9}1iLHNVY8ryGIEP`&ntXwgHAG+BIi3_WM=bNWu<~4WG z$mJiunX{mqv;BOiB8+}gtcllJ8F=eRfRf1wd<&6ZI^X9b9}MnXQ#B@xzWasJCJoes z#k;+}tt+w5(Pi}BRWU00>~6%dS{{249I97$L;u}x$o_{Ne!~QXZ+~zCjgzE2m$_GSl`pW7{A+|Fq?**FAzc=K;U4_xgw*{syhqHbxSq zUvTsUe7(I-atpF2;ky-?DS8ThB;C(Yz8dkhepOg%M-+HD>rk#=@asfnkG+pbfp6;F z=3nP|;XCW|`Bf=M$S1qa<9cr>gen>!6penrO+iil@_Xp+Z$e^h(QgF)K9Z>83;wHB zqCvp`bs%6yRx2L;f|$UoC0=32H6O>mwI4@Y`xfZyGCu*9(;S zT*-reMdP6ygF5^%ciSIJ#bIBYV3)y+?k` z=T}DHN9J8`JR?jb(;_F}$W7=4-jVOt7GUoU!(3iy93$C#%CVFE4V4@&iD&Caott4g z{CxB$l`P&cR#rzIRQ+at@#0Mi`KlzFWE4#!-Y>=WXnvuQz1(}h%EZF&BNuS6Qjbpd zeGRBkmd9MvZd<{V$cr0Zw{q*^{;CW`7sl{o580k|Mf}LuWrm%*Qou9(aJqLz=R5lJ zz3!=Z5QoW=+$K3`&_{e$Z+n3}G2|2SKsTI;OrNVNNZO2f4i7nxd&_WNKa{J!GXoBm zT=?k+eyTjXf%{i2_Q1BE?t20sGjoSeO~DV$tL_RGaYmgkKXR@1f+&2tUUSu>5%8~u zt`RG_%1GQ#ZWA_zKOuv~jh-ojJ~7avQ3L+kmR~*YOh0KP;Gd|$j1_z$9NdPnOYzp0 z6I+40mavy{%gPe^PGwL6O#*&I!=OfkT}-5TcP3*d_@WhAjb49%BV=|Txgm7}eU}uW zH)766i?==YSPT>4ofKG~^&5UxmJ)~S&@ayRHI`k)Tm}1Wsl*}F5kUcg`M6XH`R#Ok zCU%&KsCtFTsqaFb5p_MPh3g~U?hr19^DpUmf~T?t{nyFQul_wk{N!$BuLYmalzNCF z;RF5kaCBndZbrhqsc_p8?mhGP=Y9q@;Ku&HYCjpF@2@s0>qk8~&<*?yUx>fRcn355 z%D;+ku53kIk7Zf9KS3Nf>^$g~|A>%dLY?#9o1xo|F=thQ_ux4l8q){-`!w6CGXZ$7 z;E)ab`D;wX;Tvn`{0r=-VL0(%9}D)yUbvvBV2?SaoRpfc55Qagx{zyxI#^cjb zvp131nYA3e=Fq?QR7>pTskUvHK%d0sVBxTB3vkIxHsdDvhaSax=-mYl78lKk*bDu7 z2d~X*^L5|>JVWVhE%5g(H_?!f#(u_Zv8W2*wCT4vDIx~<27%N{CAUJb$hc{96C8GU5R zx9|xne%1Z`Cc7Vf0b7gfZUbDOgC|ZG@5cX|iB~>r3!Q(frKGh!=F{|z*a9lSr>1ea zpD9ei9t8HT!4Es>r^~%8aT*>urPr&;qkMQ*FExE=G{FGcIxo8Z54J1lwM2Ju}}sM`>9{O=5XJ4u7y`AM2D1^l*;gYSV}=&Gm1leAYlVXiAmqyyac)O^EU zb@2b)1;!S+z{l)tqW(HK$0nQ$t9IQ(U;22c&c7CVv6pRWW+8C0ng!>eEb36fUi~*5 z4CKRw?3XO)FLxCEC|LgldmyeKh|I_PnC{`@EH0pvzWeLe_M#vtdfq!V}P$*iq z74viV%^wPnVBb>FwyXm5SsurXUo**qUny*`t44qO==_^6=Q{~ex^KBo(g}EcQ_c!! z8O-;NIJfURi9Us7h+Ckp`(D}TGui{cNM*jhJL(f*w)egO{QZ7N>HWvMm|H7S4mSl~ zrZn&>T@Q7ZRc;_x0y<9p?>|LPF;^6LB5+OmH%4+fjU*y`=B4o7@8t?4=Z z61Z*GhgWGh$9fN3G`7O8)?;|Zn#%+}1;MK}Q;+03RGJK5c|bt_+#3_@`H|_XPz(Zoh~(}OH<~tfG?dhgCi^CGy@4_GU)jXp4`KFd+BTF71h31wtqmreV}UlL~N2q zaH4HavirV#YQuYQgQ78(FY z&B`05cw#Sz&+MLnEtsD$lpavK1wXCQs>Mr(5Z5l-VmIJ?tU6-q?h1aSe)x6UDN*oz zp%eSK(BE5Yw(Xb)ZhRH!<7o;0=0&TL_M9jqx!)J2zSkT3;H9sAt8#|Ubu{wG;uRWs zs<3PC?pNSdHkmZ+eMBcKgG@sN!522!a)0ba9&l3_4v9a5&l6bQl+ublpz2UNJ%g0B}+FSACSxey&HlL=iy=JuR@4*U!6 zy3_Mlf%oxxTlUO^AN<+5E=5uBI8Tbb{7*b*B>&juh61v&w`%i9$UJ_1v?C|23%YM- z%<|)JRui&uEF8jcNFwK z<1xK}^8(Pbb(~M!v;&X-DQAMV9dp+7Ly}60z>`mtclIa37j?m@&Vf5Vt zB{%FiH(-8B-6n$rytc@`#<^Pfhnem9rTCHeMi^Z0xuHL_9@3R#;l+JS&C(Un#5`-A zt=W4P>|IR#FmXR0zB+z^Th+nHKR)wT*O)@?z@AT!gRnPpG>hR?CH5Dt z@S*%3!yb_$&y`mGzyU15hg(tCCt2@37(`#>89C`0-wU6d={}`_z1aIi-Mys-y5&;^ zZBMOsDxo_B%iR}2|CRh(GXi?o#x&1{0_1^jJF+Vtg<`L)$$FW?`4qDC&5Qg?`p_{4 z+-o8l(H|^45Ha2a-QwKOtrFc#^Xf4JWy5RiFN1~HA~0t5m;Neb_7T zz`|@TEA~K&xb39>!MSmizS)_E{$}uftM_rtpS>4k(g*G`IA2HQ@Izm}k;AN>3;XaM zEKrP0=!97$NoYb7d+KY|6h*}eIi5C~xMKj=kCHjBi{~cXW;w9h9rF|X zC#%%GK)F5 z2fQ&&=Fmk#|E^WTpb3wI0`oM1k0bMlc`|seLc>XqB=9oT#@x2u;KL`EjZwei&zDDu zWJ?SDIgjV+cC5yJOOMoFKTd;(KJfBOTr&E^WesY_t1#C%(koR1o!5G~YV)C7CKCJ3 zRwz7*kmQc#68pQbkLdmugM9RzuenXnjIDuB^q3!`N-p#~G2LEvNz`)>a_6o&BN5CT zTfe3ges*gz=H|sf9%$%^6~Q;t`sv?6*}c%8&M=>mtHhqEWQN&;;0wjF*T^s%z<0x` zoO9IyxTaU#O4b#4rrvdL(rWM>f4uKxZ^jzNc_S9&?Wu zrf%us`Ze10%lUz?YHwmQy&T9yijwQz?SS4S{cx66po_gzXHwq~_*6N=+*b=LQ^pwt%hErW4+E~;bS)FpY+$fy9*v|qPX>?m@bXfl)L-q!?()fa#Ea*bMP&~pq&r8 z=jop8Z`*!SFgLr?KZpVQjy5&-4<5$esBk&{2k>2&DG0Ldbzvf#Hv3n8L%wggX28-> zjq9@cWTb0sp>g=u2(; zUhIW6mVVfC61>Yr^@p>F(`)s8`}}C&V|^Un8bde9J9|gEMFxHC`trM*;lt4^iCw$x zF8o@`ej9>-=LcT-AK282J!A*yJzU`5)TLM18vDTSwe8pAKIj5HSH$b(3xOByk85qU z#&wBLin@iq;jO%az-Hv%hYSYfvN4U=2#uZQ{gGL?cYAxuh!JQwVoOykrKh zucwC2Z<`q!_8+fx{{p^{Z~0XAH2fcH1Fx0(eZzBS>aE%q(3c%4wf!9A#zgX5SD2c9 zrjYpoie^9=bf2etSP#EbY5Zq-B!U>-rh}Q6p-WUgSELEi z$j38(<}24@Pg>kR+K2lTlFjj0GK&R1jni+dUh<5_tRyn&SFjcX5nQOLx(%YRRdV&2u*|C`ke-3Es!!%&mwb_)!$!GTQz`pAg>cFLi+f^I*#?%k2b^FAHqA10F+{kdSxO z1pnl9(VdT<4SG++9@eoz__(+gXyuuNbl$qU%9_SROmAo}|Lp+3{I{>Y6G_l@_=3iH zZcvCyy@eSs?vr8Ipz4}L^n)%#r?WqTmpM#dhPIx>?hR^r(}jMZ*mZOk@3W?5!dM4> zm>8CIhdpsl*JOr&SiKRrz}%yII*XBnWprz&09U*)cMW_BT(6nnS$|0qe!lCy35wg9 z$SVDjM%6qD=~wj?tpmR}9h05jt3V^UmzPg){6!u(C^=CIUb&$ra&T#{Xg-f_6MF}A zy}Ro_=AysMX`w${b&5h>FAAiF;ashWwAq-P4Sq17CE~p_aG&qx-G(K2-q@I+QB^nm zLPt`2vGIy97(~T8pdS0b^lSSLJRe}X%j2aX{ML6~dglwFZ#A`Y78!s~xBQIir9IHI zu6((?=MZ$M-`a9X0O-vp6TJ8JV-NGgm+J*jV&0(sQ-&}2ZY?dH$veo8IUkSLJVE`s z$Xh#-{093HH}XB^d;$NGS5i$F`k`L;){x!OcJdQ!Enb7K zm(8lxgMPF#;6D3{Mx1Nq-D3|_Fjwq+o1H@){e`Y|xw96HtZlPim$MrAx8g?FpJ%vF zQI8rt!2is<$lnk_y&j#(n=-Y8KV9-kdp-2P!k*5DmvP@x>%Jz1tp&_h&;x=;JQawLJy)ZxiuSFjq{#18qv|V9rrcy@Woj0l-K#Qq!x9d z3-J5+@8f~(?(zBGtv4`lmfN6q;0*RdC378P9)-U?t(Sfu^~}LAx>+oOi5xgST%n7) ze*7WB1BqD%`0>)Cnv`io_CrM1xFdMJqW8a=PSZ&6mNc!4$iKe7N{dgSk7rmNrL_;d zdmt*fkCqw>1KK87$91CFtAJ8{(gxV~FeN_t9n|Jsj&s85T&%-&4 zR-f5F0^WV@$D7Vsr4z(?`THa-)tW8j6Rup)TJ z9R3e=t6pGF+AY51&r;ZT)9>M>ol7A#9=?XM+^Bn7ugb^Z{R|6B7YG8sZC8oT*bAQI zB?H@@DUr z(tUqt1Y!u$4f<~{I3{?7FuH^JB8rSR8Kghq6Y1^BM960&yOrzgiA ze&OIjiGMM`xrt2ni(;5RE5Go?^9be?T6?nZSwTlni7s7cjJ+nOnp$q+`!hU?D!1vu zzP+}AKab}yZ|cv@a{%x2O0lbLIPmc$_Vxj@JJ9{OcyDN5#2&@(=h9w|QHYN7ecgQY z)gPU*)V611&VTT;b~yTPLmm3^A)Kc>LK!=*6u~F6iZx0Ez9C<&oHzjm=y18Wsn<0a zh+l{r|8s)pft_Uw6GZ%GM3nkP`(Q4rzt6{u4bN@37OH6j-mR}qHgG2j#~J74elL`< zFK%Gu<8Q>u$TBgr`maacQcXr6PqYfA*dU>W1g;uUS6x&R&we*crc;R>7O~!y;pM3L;eCs zZOY>balzb&oTuQO7tpOF$_`b*?`3>x@YPN9F?%MH9Iv6yq`QbbIEj35>CrQjf52Po zh!2O&gH_){!`FPWXtc>SU}fr@kuOM5B*ZzoU=0$xagsy zhu*ad@cD}{ZV!cjj{RU!X}lS5o0yR=4|JLBpDIRF&cku7!#w1we!yK1d+crzitPkHr@ z;l2_HC&eGS@DC+jtiR?AAB15QZx#F%db0CZqoD(GxUkrm$-tjKKAG%`y0JRJDSs#Y zsH4NjoY$MsNa4D$2e$0kd$F^u;0ExK-2~k=3OeTd43qck1>q+g3$Y$KPa#@Xw>t-b z7jvAR{|c!Bf5W`Ec5^#k&%Mj}7QcbdgD#!bFj~?@#N|~EQi-~#b6FGj!9p~+ajnMyEzcu5Pz#KujakcA4=!fptc2+Au$0~~-jz|5< zOmRv1DFdCgx$0y-1Nf)$?Y<88;E$JOwbTQ?+HZQ8eUxDDx*L-l6Y!1AN)u7n?~K5Q zS>KhGc<0QcANPI-zAF#EKhe)bC{KT9?R^GZR$yUZfcjpdr8K*x6+CZI+w&>(w_nW* z3sxh)9&~bRzlu7n%^!P)3w1qy%KfKqCU|LuMhkQ3lN@`+deXrAaD`}{yvKvSa>DHD zMf5uq74~HR2FyV?zWvN;1YP2>I*a;d=mWDk;m`Te$2(_Imi9DWnEdgG1H9AZn2ga( z0RwT6a!^gg>!mXVDrGo;=cCY;M~A~VaeQ^kB>0qy6(8pUZ@|Br7#Au&hC26x5^}5! zeRxo)HxGDw*Nmi>ZKdFWo}5v8?25Ud;7>n2!8cY)hdvh+2mWaNcQfCBk?^W;eVFy6 z5uwtzYP~<;d+V;wE||eQP{Qif#?a4REJ(KbBOi8cyu!M3CHz#Ecu!H_E36Ojx)-+z zep06Bh1J*bypyk1&i2=_FO0|a;|+D3kEeqo&#dsA3(eUr16$$e-n2a+g1}d@JVI7d z6MJB+21idnMLu&l{ZAA9;4i-|%dQB558BsZaTIg=9lSE)cX^z0NtDj86^=pm<$ zemVEowQabwOm3Net38RBY$ zPps7WoFMYas)&mYZBm$zxhJ*Zp&cVhwy;av44iaT+}DM#}*By3%iOk59n| z$3L+DyA5FZGy`MAk z-9h6ON%`E+-^2Y5EInuH(l%|W^Y_t*)}0%C4Zb!c@}#*Qbkt#bTEVYOQpV!&5! z;ycr~FpuXEeR@2mT!K9+W*b7Pp;Pn>C$N9TIsO(F%d8)adCMQyc5LYcPIO&k6NJw* zc|G*F(h@qBgc3(NzHgZS>5SLF%hOebwWav_#(rN@FF?mUUH)nO5qPbT>8KYv@Jj|# z&K!-I#&gq>cN+QprIX=3n~e7D2ftdc<~tFB^xU|Ip%^-^r-w@9F7%BWVJCYNV$g4S zJwFg|0e&daP&55;@DnvPL(3ZR{=V6TINrte=}q^!6NWw1vNwC8Wx=B+6U~jD*w26T z->5x&gbULTS$d%34-TFe%YTSHK3__PN_xSwawYA`{sn$K^2`&i7Ah%}tI=aY{}dM- zb1q#HJn4YaF9|8|jIF{l9q@-_j{DBfOu@fUzG~3(DxUi!OgDCbuajmPuYDSL;?}K1 znym-UBg-~r;Uqk_@=1Kp3wQ96JXbynL04H7VE9S`I^f&Pyf=md*w-j=UG>RkI(##~ z9@}^#f6KP!zvDyy6a2C*3jL|gRlPj79q?nVU0tlZ3iC>(N-_I4VGh`}Xd^px%AK=< zJ#6^;B8hip?a=r93XwM7z)2+yV=97QJ>;ddTwaKHMA4{ErZIb&-;PLXQO3R zV_snX@>Hzj@-65a{+bJI13ps}UvuRhbQfB^*YRoaj0xNxo%9aqMt_~3)B!K0ALDrK zgZJfF`e&kd9(#>dtKW?bq3@mvQ!-2dE=-;>a38|+a=0odv;C=LjcA+pmwnJbCYM1M4vMzNF8W9h<`b<8A?^yN-CyliVBS z_(WWX7UGq04*se6RZk~`sbp`^q~x`i@S(=&9vT4epS!H|p!Z%pKTy9Ts0{t?Cy~;D z_AgYTSt=>~LQfPX-48Z(rLt^lTISd@Hwhr&)oI{n`5ZB3A(Pjid*U zm-IHroKPJRDeT9SR!o-t0l$s4+N)6Lh4I_J`YeFgzWvC3)yOzrhl8!9pCDfUu}p?v zs7L!9W3H}{hK};0{E!-aB>ob^U2lA$FG}6&+meR;)1Afqrl@28)MG`HQME|&u8(jpxpt*R4d-E^&QZH3Kda?)|lsh_Z_b_-;$xA9@CU{;((@U`n z=}d%WwumnSyhJR+c@648=u@MUW`e+bzdh0#&I8A`nhmV}GKP7VpW8c>>uE^-O}}=- zx96xl(%=DJB%_Z`^DZQ$T%+7~EBxQVSML-IL<2u7hiQx|!B_K~@h^Kg^l0IS1+~Dp zK5A`=SK-qt*ss6H3m;Cd$duO{^ayG9Klc`(D>SWVyBX^O{c)1latP-oF@Api?F!6s z{GbXi?fco8KCRV+{@+dIQh_i0paO@Sp54BU_n)WD?P&(wqq=zA4t%$HrMWB@;&pwG zf>9s`=H|lgN9av6kq1A1QhN?#&yii{k74lbp=T(QHZ~Lz%qjHs3UJ)Lh+V67La-;) zRMBy49e8Hb@lx+V=tHrQxp%tZ)6Df8VNAn3S@B7(An@4(^h2A91+WKq(}31>_&Ven zmr2u(z$f@%*pBx(<`q@a%~s-^hDB`@j?YA%-@a}}2X*!MQ^wR=4LCRU5`%+|n1>DT zdRqgYMC(cKSQ~hWw2Gnmel;plGqC;hF_K35)sEx~jUpe)iahTwM!!+Kz3mkAefHYd zGb^6sdA=b5X>;+IS68jQIuD(pZ{A5RxdlGB{YTim;&9F+8UK#s&rBR&r7k^$&$Uvb z^Ciw@mD`?QC9A-EIwoL5! zwG93~slUgrqCVOF{kY*pJ)R?VclY>H@CO$jEJVdbLT_IFGL>;9oiu)<}UNt^?U9{WB)0|{G$c@wKf(1 za#cjI2ToVF<7YZ_6rHdsOF`fe?I!K^>+n&&iMZ;Fn(1%9a1ETL@-d%{F zV*&a*T0J}iV(F*3rJn$d{_B^&OTWx4{X}2-iQq*3_n(28{_6v1A0Pku`9Gfs^ZS4P z=09KUKcD~KUy`i+|Ns6!|M;IT`Tu>L|NP_si=PlJM0!4U(S62w+tg+u>#cK!*{7ap z{m$o^UweD z>;2FF|3AMzh0gk4SLeSkz&}Pj@tKAnEcmfv>FLi5_`!r9%kYEk-_rM9`o2rAdFk~o zy|$&-we*^oUT>mon0A!T7PptbpO$6!m5m;$J)kctJV35cj#{zjs$X6 z1<8v&ySUuU!?MbKvG{|3F74e-kExqAH4Znw1n;VvY)GkD*_ysw%w^-~raPBC_P)!z zXYuyRf|s$8M&juP`P)sBlzWYShpT5;`x|ye<@OjIYo?vtuz@>><$Syp*ZsdV{j)xCG#7#KDuADMBHvHx}{(!=Fgwl}wT(`9DH#;d>n zRb3x<+Mo3^bD?V5+pWR>|1yy1|Hs|H(O9|{OCSHa7fZicx))0yZ2$Gkzkk&K{>}3L z{TGz~{tfH@{)?r1y7aMhPyh3=bWfK)mi_y`jUUmX^{z3}jteXDUrF&o5 z7aFj1|5eI%&n(3Ne>+q8QXJegQc-Mh#RUb#Z6hy)$pa* zIgwm&b}4>58Kn;|#Zcgv9OtDt>i(_uWGR-)OgI9U;wk^5-M6KfVpq7oX(_I@i~LSp zimfjzCaad>t2Xks`cjOE=d#2s#hJ?`O8-)g{!eS}zCZy`j zmtyZ@XT4zdYy}0L`972MNtecsE8Vui@0H2Q4t-*eT}<<=-@6c{65b)&y${x zk6Yv#O1bN80R=Dknzcj5`pJV|qS#RbDZqa~{T6D5kzHsi-*FSmo#7*z$ z^3$@ixd(RJdgL}+4DNK=)-%p7+wr?I-rD7|iskXY-}dalhn79lW7B2xhaTA_a?KMb z_ZhL|pkXVPz5L{nyZy8Fmuq%CXZ#oIU)}Gv#uZgP$BjIE_ErZ^`M*8h{x1(#m0xq# zKlUHK^o}i$`*8ib>z+8J>Y6Jax*;*U;x6~DvDcjY72erwe4*EXjV=E2-`wP)HP;Nh z>(`kR!dq62TB`i@l^uNI6XUj-GxPNwD&KLh>vsGX=0N|W^qjSSw8v~e=gW5X`(qzn zck&@M0|yTtuy3@XF)B|dHcpvR*Id`w(Clw-?X*;NLrrwhz&$6N*-{%lwJdaG-Gt`G zn!2g=2Om2U|F0)1upi&!1>An9H;}=891pf0_AYvE?b6Tb{eb;w`)apg!(wj#LS8TB z_1(OFg4fG6f4CcV}PfB zxcKu(+|n+8yZ!BKZ-0B`x3|B&^4r_rUip*jt0y*3t{yyK;K0E{)WoSxr`PJU^|a>d zDb3XbW2wd|XAT$?8>}WwsXn!K-~=_X>C9A1W7WyE4Yf^m6DLVYz201xqAnh|m#Q_dqJ=D~uC`@TO;h!x zme?R=ULdO`)HMv8P~BWRWG~**e_~@z?Zjqu$%G+$Rizr6sh8;~x<{mmO?53*wGAz` zO|4Q>EtDyZ6Hl$Ji5_r3G^VP!hWhF$*en^Rw$x3b!mFk>q?#IAYA3eT)>NfhnyMx> zHP%;6ZLV!1+C`r1N@e-7ssa6C{RRwC{rblS3>>uA;30eOv+wYOMjU*|p(76)b@&lS z9#wgC;+SJcj~RR1@#DsyP(5K{P3@$UC)b^F>XiD1#?)y|%`H<;KV#aNXQ_(4D^&BD z%}sds&{(hf*VLZgf2s}qyt#T(ZB0nuHi)-|+Xs7%4mKy!Py+u2Sr#I`iYdw9 zMIee>vmAU)9mAijPeV&|#I{YbZBrFWbyg)V{^pC@1>0~>Sge~W&304a7@s@1sK5K1$`WcD6;nZBfT|N+q|$dIzQAJE&53 z2Q+I(RhHTj`*&2KNMD67c2sG8XBA3@L#5epC=@LZsaS_lDEnJUNpwR=D28i>vAau4 z-Fr(z-h24oBVQVdUWog^G zlUiR^l3I^`#`lzXl`F}saA_XjnL8!nP`WH!nko;6k{!b(UdM1K(J5RS?~LE+cL|5$ zn}@^cE%3L-x?}sWaB1|waLA2g-|%oKIs*4pj0lHfhk{3jLk_-Ubw`Cmkt4AE$Z#lC z8CI!8xHOILy1ipi{`uju{P}o(K{%9|jl8q5o`dzAa7pyyaLB_w8mV-+)J=y=BA0~A za+koF8&=7y!uVsl@U9Jqlk>5EemI=UVBbQ-yAbu z8LXWz!zH;dQKpCMzFs&K$93=AH*j!&M&{daxmR9Zn(R~_igzt9j~rKCnmMk##67OO zERO5{iQ~&dQT#3~F%IkT_}#^LOr#UArav~0`;AinQyxm6gzM8Mm6t^RRvyk)m6y3y z_&efN<)O&r^3v4g^0M4yT(8DDR#zTMor-(2rj&=WrAbA<)KUlUmzPCu zKp8h7o?Ll}mqUBrDKE*qgKc@l_90^YxV+T)th_AqS-FaQULH=aM*OSc;_u(6waD+4 zm!*D2*}s;D^7svRvQLMQgL^hoqdJs2hj%DT9?>D3!aabwb2@}#7hr$7LuvYw4rS>} zJA@NA;bQf|4rQ5z9m4U4I)vi5r#by9oYy;q({FYt&Ao*`g7d#vqSu@383(apN$rYx zRAlLe?~Z8Mf!BNRdI+!Mygr=QV|e{HUQgzA6R-cl>zTYx^ZIID-^lAbc)gU@kMa6B zUcbugJg-;t`deQA#_Nu2O#GYkdK+Hv#OoNZ_v7`!ysqT+I9^ZSbi($UwFWC` zZ@=_=`d_A;DDI8c%VxapYSs>~)4Z1PiQt|NTCzBg(30bF@>1S|W_yO$v4@y>eb{tU z@6ER@8mJ5SlSvNuXwZ_xcYw4+aPJ~5@h#0-Ly<(@f6FfU{36@&r^ebW!m`FonqFkR z6SMfjvOef7vq#qWT&g!%YyFmAKCiyHVS}D9zwzf-tlKd1Vd@WIr{W|IDl_Nf!-T6zsGi94VDKp!2jgmBlr zQm4gqiPg=xxZP6K)Y72RxR+9In{ZZbQzKzqV{KDYV-w+F8tZH8C#KG%AZS}cZ)=Tf zQgz)F+CC23t0y!zwGbo$6U_y8&}5=1jm@>RD+QP|v7tpv(+HYs^$sUQfPz~pMpYht z@FDmr0NH2J){|>nQuzJ?m}YFLtFLXGR8xH>ZJbLR`T9OEqY*(*){VGDFr_nR8S5KQ z*VQg%Zm!jl=UTCQAwMpxS1J5TiN7^dyI9xZ)eQ&pw<`EGyxO!{HBV@qroP)` zVq;Tnm3lT}eYd5ScBij_)RJDOs(X4jHq_F{RZnf1tj^swb%x$`f3#WsxZCOK+yhk! zb%vTAqWxb{<&&%Nul2jUD*W~0X}{Y@-zQb6`^u_ooAFiP$rJ0V)bit1huQ`myE?bT zWSC!qZUR7M|Eii=9D$Q- zYt-c>>Z+1bmFcZYm51*e%BA=>3&o~Oso2|4Y_61x{h;)B#eRzK5n78~Q=&W+>-Ish zZWP~IwCgpVe6iBndi)~fd|cf2bOrqoN9(TZ!sh4Hx2m3p<^?NTVb}NtTk_UQ~g?uM(cZ4}45d-CRyVFD_3t z)z#Ov)ZuLLX!+^*=6KSXYDGDJ`K(?kN6Sez&O_xCf{TrLD%PXK8H^-NNoFuI(wEgA zmg8G%{6LB7#1(1$2)Kjs7j>XI@9aQlK{FH86CLz-WY2e)nySG@wW@>p()aZa9Lxu} z9G#_-O%acDpb(zH#vIk@Qj({{qa-(!w&~;mJWC&_+wI}64t10m?&wG{+|$vD;pvV# zhL<{W46k)GF}&T8WB3Apx5*h^h~e>$6vIkvObV)XCu?>W+2D=pCUW zS>I8u*+e2)x(P+{@FrFyFKwbDd3zI%k*wT=B6$rPy`xa8 zQ;8%^NrsXvB{_{p(=&YihY|U06ZLs#)fp$)k2g)Jt2<3lk9N}EO_~l~+lgK+&GWB2 z)vI4RA<9&BU6Z<_GrrTVZEC1jOFQe+{KK6Kr;l$s*H$;5sV?eb-Ke0}cTuG{wK$z7 z;=59mVhVkz6K+L#tBVZi6`iW2f?GQydb~dmXWYYqB`PEzz|ozy)LawNEv*K^)t&vP#p_@=qmeI7NrsXvB{@o5 zO7f$1KR(r2ec4%+N}qhx+8H-@(Vg*V7gR=qGX_a|3|W%<+%9Ssc4uf$w#}YvyQu52 z#~n-Jakg_`7xfT1$CHEG<6295v5R_@oN?rgr`;!%m{(%2i|O?5u-iKkd)&W4^xr~q z{bs*=(NXy$XtLb4nfk7)+60qj!)7u}cXpki?(Hfqd8@0Q3;C`%A=#rgBVtXe%Ob7g zGdEJNu8&~!YSa~7+susfv9&N67Iig|Z@}ML$^Q+JdsT>BhWz=i_K;s2LANABMwkOg zSKHm=b;bXRg&ft?Gn9A}=vfVt93?I#c}hG=oLVI5T9hEOBp30|k|(J~%9lmH(#h)M zh}>eZXmh?Hq)K^}szf?g{Zh!WsvEvhUc5Qpf6VNr%5Y0eYHEuK{lRW^4F!0#Tj2;; z-VN_snmN--=(+6XxS`6`XKfF-9(aqk7{A-h>Y8&pb#?t_t~}j?PW_h~ z@1-7Uwej91?<075ZFo9$9@A~mX-216o#u4v>NKxY4=J_qhAq{lxTu$DV78ZT&gUqlr*6)7TOzEVx5UJMT!*653{p8) z|EDK4=V#?l<1;J>lJhKeL??Zfvgh^YvKRC=Wz&Di zkbYS=Qm0w-{1w{bI^C&;3%a8fHTWQs>piVXE!hU;tDkzeHs0GBhYvpH@mXrlHZ*50 z-v%Gm@!rzhcSc(lZKF!eoUc-Iwx)vs3LeG8J%V?q9)+jn!XM4&%$ribJ&6g>NKzSnwoChh9+Yc zIXu13nWM`>s_-E}y-#h^Z;6)lnK-2mx9C+h;{^hD&C{z_vwEmcNaFRc)j~6W=!5wo6=eIEh}PkMgvsbA@+Ovxb>x>)i`u^Ke%z<NJm(=HcvZ@k?}NzZ-sjTT|uB+ad_{=C=IK^ZRY})cIvwo;uUFGgD{Q zb}2One-GNz#XA3?Vod?7x20aZ4g1pAicoZ#)oD(ru1@nvRY@W0o3@iXTkoP`brxr? z9)P*saXx==J0+hDe%emQv|&4r>EBTk(}htJ!6i{@!hfRH5pa7Hy`f8Ub?TXtuhPAQ zRD!=bO2OZQ+&R6^)oEVms8Wwb>7!wJwffrBgn7Ge=af2smu9tem&R1{6#7h6rDpAl zi%b0c*ge`pA>3~7%h3$3xDD{=?Q@Ema1}>qf zwc9tVfA7#*_#->C7XGgtF^w1YK=hd2?{AOk{pt2N9IypFDBFLc?HjP&xtX@7k>V}R z6h2`8vqMXhx^@Q)6K&_S+dVs^a5r$>GSQxP1O_i$H&Ka zY_4r+HXkM5+EJAvlJ9mvjX&>zTV0#zv)v06r7j`QB`ny{F5wxgg!fGe_w9%h9^O$( zcm*YRx&-GI-3Fazbeh#^PN%L;^E&lz=@F_?3o0;@i+W)G{Jf(o;W>RpMMG_EO*3vg z)mLifAy4LZDmRamMrTolTC}q&Z&qJcSR+(}A$p*%3{kFcVTfMu+d4eccWND;Cw5XL z=v}98p|`!hs;o*~Z3rLW3jTC|Dk-o6~|lASRCSqd+QR1fuYebGHH^+mVp z?RnY$5p7?M?VjH5+@(89rx~4Qk*ZR>5#PxkfSEhD4&nTr^$;%I2_-GtNe19j#E{b^ zxLm?VZAzGJm2jgeVLg@L>?|eBMG1Lbf~QjlZ+I{nb(+y>R;M|gx;o99?f2@O_fgyB z7VVdI#%;&dQ}I?{4f+k^^4`ugIv=AF7a38NPCYGQM*g}pf;o2=90N;rVMtLJA7PnY z3MZkjchmj5co$^98`(2DdzP}776viD3kLO*UGzmae*3=<-T}~O{x^ow_>B>(tY!^MLLwo#r2)gNUw);fTN$F`k^C z?AB(|enAl$>p@-1LzHG8MzmpEIj?T2r!l*EcU-Z=h3Qp$OvaUUeGEP^u;JJr;o)jP^B2-TJ_8B z`c3yN{OaDtMobQ!dOCHM(H7_SEz!F9d*EdNf4Ru6VI{UvA&>5%3t5groIAFp4%BHD zDI{Dc{$USu!*|v1ujH!7V$>dIPxaq^YEyb`dS_4TQ}Q=^wthm?)1SH@>{qw~v!b8A=3(=_fZ|U_E+V)sUP*H{#xDN>MtkO+Cej8ZTf3=tX^FjqhnAHiypG|{i!n^ z!q)Tydf;@L)oBiCYiDF*{?1qe%hfsaI`t^OzJ7Pz0D2Enm71#lJD{nSVq7@@uxfzy zren25lR|9JCz|>THmvQ$% z(~hMB&AX{(1JQP!J+D(wr_OU!VU=1rP+c*I-@dDF22uz7G_ZA|UOb3@DWet)LIhee zZ90DtwQwG`X0R1=O{Y1Xx;h_zTyw{uX-F50p_=X+q+TB+GyAzgsL2%c5{k%c&C{u~ z(nR*@AobZ`Tw}Z|3t@Y~s`oa1= zr!$1#bIu&1dkOEPhv5DG;vsmYFI?PSy;rUJelIleCEY-z`m)#T!EHVOJUdt#wP0}J zjsM$&F?qGn_U-)>gA1=wuOf@9OU~=m)2Xvc54BD+I?d`dr&Cv_d7XMXbzY{Z5D>jX z%M9Vu`NAO>EbKw-dcXedm3n^28TghK-$LP6!{%366RKM#PF64CGG=NrE<6pXQWx&6 zUfmZTlUjS>-+P-L+gEyQU+J-ZG3r!&M>9U}?%k|D+B>Cg*ynd+v}zw2qr3O@kH{1I z>QQ@k-@>T5C^)C%u2o;}eQFhc7N_3WNB8}#ecJT>N^CWiU%OAC?-xUNwcfVxm+zyC zvR-MHB4-{saTMy*c?GS(w^5i0-|mw-RjuF0%DfDj)5w6>bn5BUdDZTJZk$?3d9eqF z?rXYuoo3#k=jpff_D}WmHI!y_>UnzmIx4S9eY~%FW2ovN=T>$1espNwHPkwPE+6{4 zeqK4W_0U~4beei^s9e`P?*Jl{gwW{%iGT?YUcjGD{A)s^u46IbpL7iwte0H z($CKRblBfE6j6Uo@n&_JLrUe(+h5HZs>&$TXZE+sfA9C@f2<3hGgJzGLl=A#3U+mo zd7XMXb-vNX*G*Kv?2o^whq|!=bx3cr9q3SyFu>sxuoz9|D7pc_q=um3FzYahl z=k=rp=rpHOSEqTTsuZpMxzKyFhZP25#c`M|I-fHO`OxU}0V;ohY4oxKtVX|l!0$Ts z%>$@6zrt9US^N9}6wJ(F2p5GRB%Nk;nw!8` z=rn(RPrTS(IZTyN`A-a^0eEYe70bF|zl-IEVW!X*hAH}wbG-|wxb$pllL>CkFbeKh z?8{uFdrGG{ow`VIK+^Y(xbk~o6D}-$bD%244-RiSaL_^OJr_4;mVY0l&!4T|aD5uDtubM*MRw;>9Sc%b(x}cI zE?>9e8^e;uN$O%$sJ_8-W865L&Q|)Z@P^^&I4x&&n$xL!DMm{Fj8mUxofHFOqJYlpY~2DM6EcMyWsvU8b^MW-30_!{|Cb=g6>q^poCtM}w+4}CqXUliXs zs9Ak|5WXoKQD;~2?g;Lvk4D(NdF{bCelBYh;uk15cLh~u`pX$ntGp4q>Nz8H)t8Sz zfLBszng38e+^uuhh_>h6)ez88505~XJ&x?|HI%W?SFevS-S;0_3GV2=y#hR9b#??I`2?i2UIs7(t?OS)ID(`C<$OUKeYd>hU7n+=6q!&xfF;iz#E~ zcAZ_PE>hKHg8KE)$+go4PQYi*8%Nfumq*sC^&^|r-G?> zLA1JPr1?qoqLHcuwW|3e`8U!}kHm@O4jtURdKhps3O>2k=wC-aHd2T8JmpzRc|4tF z-l3cg>cf%ERrIkyU41xeX;I&f#JJO_sm$SM^2f+kUe}CYKC8ut)z+(TM(Nv<9yy$E zL3;9Vb6?kr!}-Q1ysLrdeM+U*wp7(?7v0cMGX-~{tvZbEVAJ)@qHLcbTezXN5vRSw znw!pbL z2H@@i%v@x^#MG&$Q)ewHr{hAvsM_X+I{XDx^uXGlB?HwfqwvMTB=r_HWRM9{K&LsK zx;o7xRV6ym>4(!TQgaZl^Ce}@=rsM67ClOH>nL@!nA^S?tRrC&+il-yT_bqd5I2{h@jOQS=V7N!-}<9)j|h7FdA(1k z8JC`Cb(+(utJ6Hv)=$KbRr)^>KaFxcozuY=S?Ku}x8i#aKB_crUyU5@DqZ?3C<{j& zze1%Nak&fsv2Hcy)`LekPsJT5N1H!Pz^BmVN1GB>9?d6JgRAJG8j3==uTtu~PO19_ zrJhcmH+6H>2S=+*k5%RPBz$#3ySRRyNffTrE=@EmH_>{n_JU(tuhl+w4BGNJ6@zo& z;sjm)OJK`7sw9I{Z-0WeKa1^Iy*;P57p@C_kid1p&#>2}?R+Wyw*+4SoNVhN`>pU^@Ot?C3jfftZLaM-hUne(l+*o{Qg425 zFkCmfUj2aULwQ|BdJ)QKz2@|uDdS`8&tVTb>JD9>PFjxl@;~(+pA^X6nr`>Ko*jlg`>P`jhET$emfDbKgg)^B|?} zGU~ST$C|g?_l_75axA^Wevh_3t4m&?Ytd;&r`Z)$ z%U4{>wZ~B{Hymfxa{qC^tK|`VLUCVct>vEMsFo*b>uXegUZ&beh#^&J>TgE&n}UJ%}v1Hz-T) zO`X1lx;H7D*B6bGdsegKU=?4(mKuP^y!&9V9Sr^;g51)$@F$hl1^#LDNSZelM!oi zOOsyPEws}uk2s-R$O{qVJ6I5jBr_pbZ>N2&OC}V{gd#|@p%7X z>zM73-Pzs74P{G7p@KZ!fVKs?p?pa^k}GMuRg>9OWJe+rO@}1ROtss^2_d9dYtC$G z%q@*2Txm%p8PA5C@=S-;Eaq9JNJM&1EQVf5Wibo9PU(Z+t z5J@VP?qYUOid~UdI+Q7d7)hpiI<;okmd4}poT)mR37s+%1OHCA?f!#+>ST__ykD1g2swZ>GMTqEMw5P-i=fjy$G7(Lf zDcRbdh*Rp8;Zf>zcgoywI!vLOaWI*j4k-`2QM;bMvc^sa9Y7N)>Xdk)c(%+Pl63b; zX2MiTKCCAja%IqAk$hP!SDxJx4e97??QD}Cl&1s4}$={*QNBZ-f7nhSon`U9Q(BR^tCyRjtc|K3)Z$ zR2otbT-5bM%0+)9p&t_ZdquRIc(hU#7GDUSVRq?sxsS=muLo3uo?xLB{@Z~zOy#FG z)4SE@T)r^nCqHR+7krz^ciHcnF!2eC@6Z!0w4(ZLCO;9;yVVHxg(*MPpEA1(zRl$4 z*l%E8SbV#_V)e&yuN^JdvM(%tQtxez-)5>m!~Wy!3yYtnCs=4j_1jE-0{7O?@&o(A zls`!SXW8H37}Nj4;zxApt@YbX_2<~HWM4R_@3Q}Q_JxD`dG>E%UpT1mvHueL!a;q7 zZ^3CPKi2f0a8N(OevEzLpnjD7c`kWhkfCoew_WA*%uD#C)j_Eec_;flKr3A z7Z$&(8J@!NBOJxA4R$KS`Go&25aq9-gqNMMzeWJ-^L(5E)A{y6-}yGh@$5dv%m?8l zc!pJ;#OHFIw4&qNW;(v&xVA&fd@fIz@&`G-GweUhzOeWnJ;6dNs^4a+KaCH>v}|Bs znDPgy-(!FGv8F$S#kbEVRKLwszrsfZTE?+29Mq4nKa+jopnjD7d)XHb>c`lBkA2~w zew_X8$C>^U7GLHwG4-GDfyhtuJN*aq`%vt!(LHODi+nr}O!NC8-~3K+JSE4Qc!Ya^ zXISM)eD-)28{Z_C*PqK14(g}aKZJeZpuWTYiR=pp_0#Ovu`e9d&#-?s`@-VOcoN&= zOKhL7E`e{4=Z8N24ou_uux~uGT>q)#%yA=JJH4J?+g0m;F`j3kUV{ z?0?U`a8Tc4zsGn!UonfH(0^^L^?YeFov-5f8=SNZWM5eP_S&Cd{}}d##dmb+t@YbX z^}FmhvM(%t&ga`qej0x}l$P_@7Z(2mv%BzmVY59S7s9vam-*(S6Ezh$ z*iWBVgz=T#pPG+pE^j%PCoJu0Z#**Wf5yIWP(RClC;U$c)E?oWevbX!*cTQ*@0*V{ z(|BeolwL-%FD!n0?a#75N#bV~-!a7(=7Y^tf2^;`FoS(z@pC@kX7X`Iw_dJcUs!y5 z{#9b5&GvkJ5WYPhBlwhTb6+r>A0P3}$NWyF{sq`i<0t$Wc!t@fQ;Da&{`9!KbzGis zP+#qAD(!KSiAOl7A7Oug_JxD`QT9(_UpS~AWB+XSg@gKW_OD}KSo|c92{FwFn`u5} z*w3*qEPlr4+f05Oe>Z`ax1@e%@t-og3&(@a_I&&mzCHg&;0MGuC%`lxbH4c)!JlZL z<-gcZ^HF#O_|MG8D3|vkmnSUkX>UHq*#C`v;h=t;{jKmbWNMFaP(Q)`AohiW`bqW= zXJ0s|pJG4BzHm_AVITKz==KW-_0#OnVP80?pJD$t_JxD`S@s`gUpT0rWB*O|g@gJo z`(Lsz9MsRVUz#-iFC5hO*zd`{a8O_2Z=cW-OPczHgZdHnhq5m${-#to7GgRd+Ptyz z(NW2^=c6hxosS;%osXhi|1;Q6$FJ}w;6HOdig9_R)uudQioXJn3?8%)Q+qN5ScvKT z?6Tjh+W5k>pZpjev=EbTGx_>I@4;$7wef{%SCINM^q>D=If#8>@!LC};zv1psbODO z{EXRMh~H+4KY{;)o|b>IFD$;@-eT={*uRE-VexM;#TV+gd1LeGZj@KUF0Gyb(|mf& zH=knkpDkhOH^KD3@PXhNW|vMSo;W?hLMv*I&D0;MetNe$k;@aN{4}07kKP#X7+`H`dRkhVqaMNoUeYH zss7XelcA*6^q+80KQ_?#{n!^4-)?UuHrh<}$Jwu9UpT0rVE+pCg@gJ@_E)ek9Mn&- zuO@N-F$eV>&X4;t&HJVQrJv^f6WJFIT7QQ9|FAC{)X%cNoPA;O`Rm%k`AB#J^3(O) z+#g)e-RtDG=a=(+d=;3^w`C{NC*RiB%N)lOnQZz~ct`LIGgWme@g;d1G0jh#X?{ir znGA<P+zX7RmJ zvtN9h$@eZY`(I#RSbY0>AhpkC^5d5n|84e##mA40^g>L&&E&^!G5fz_Us!yF?`dce z-)8Oq!u#vYc*lgXnffo`tKVkwoz1CarFLXrSn5ycy{+}zOuozh-s}sDpYr)OlONxL zaw>HM`@-T!%S6q;>O~5*uwM-{bt3u`eusQpXo?@Tib6l`I(=M{}lVe z;@j<|`fVmZ|C{k&W?xwR$m4D6x0!tJ(Gs2EGig7w_zu5+CZ_srCO@^-_@PtG{4X%_ zQ~Oi=22OmNb^JdXe@piB%#@#eZ*wGA#J8Dzx09J5yR$DWe#+sF!0mPL^Y$iXk%=pK%FD$;U7_Rs>YyT1B*Ne|Ae#Uf9!MB-w?@{B=WM5ePc%QcM z+f058{}&l8SF$fGex6@2i7S!VOnzjo@fWf$EWX{}~pKh^jd&-i;YJL?P|E&G{I zVs@F&5Uw*P2#VMKd~*@@*O;d3^j#l+1*Z2OoB7^Oq^nlN8z);GpzEYf8xIW zv6=ceKG&4DfXfpWKf+}a)A-sK0h&w-^mxh&GvZg z0^c5wvweIin8u^4Z#*2XZ?gtdzi*4{attd!5PfHT%Ni zM|}0$On#32ElxA-5f19R>so9)Q zy7|t}S+3u~emb8B&j-)2%9D87>(3mQ_Y{{W9MpH&|A>9zpnjhH-`E!p>U->O*JAoZ zIH<1{nBzIlzHm@K!v0C@3kUV1?Ejs8;h=tu{j1p*4(i9*zk_|@pnih= zz`k%$KgIqp>`(^)K}M=^GOZ+!a@BA`xmk=EWSN|H#VQ|fM3INpH>~GwdL)=G@rZs=Ck~N zyVqks%|GF#;2BnV5>MwH%|>F1$7cKZ^2hU~FP>jGo*uqJpD`)kMMkOv3PPE zqr_u#KWy~4ycJxYFy*hn!@hn=?Xj7BwcNzBmVIII6Z8ZNt;n~T{KV77?{k)Ek1*w@ z`m^)|3$4hvS=axp@kg+)n8nYNj79vsCd1_CIseJ*3ybg36D;D}OuqY^sec~(!s4fW zzRlz(pEv$8_Jzfd`FxwnPrqRN57`$M-!tL2#&0qCj%)la|8DwUSo~2|{z_~VJ`(xq zdQjw4b3JApG2Yxc{QpRkzp?p#3i8)**|c)Nbo_1Uo9`~iSMm=NpYXQe8I~{c#(5ht z#cMOQH}axs?`SShIH;ds|7`Y!#ZUU`x0&kCvOk}F;h=uxB@_QjiJw{g_FfO8oZn+# zSbV#`iuGTT{msud;~^~mroQ&uY|n?o;M?PWv5&6>(|qXZn-3|jzwDo;e&L?rV)LQB z{&2Xw0bHK2w5L5k&Hgakpgl{um42?vERMd>5GdqnEEgGF<<5=a~Kw-WU95 z`XkHboxtS@OMC3kZ!|w_w%c5LY4*UhSCkv%}}-UjO3j@66i@Pbq#qeMjuCF-7b2G#{S>rt$0T8^6eE z6YpB=uL$9M%iLjl@$qZ#_=>W>3w$b17*F;41AG2a`)#)8<4E{+d*=H1Rxq_^8(({3 zTz{W)P5r_{z%#7=k$6(PjhN!GnZ`52<(Ct+k6z5#;=cW{PG;{gV;~=NB9je{uLI9zrFeBae3>xJmH|eDmVSt>)$3G;h=tm z{e9UN4(dnQKaPE2@n`$S&u060ItzYHq4#i}^zlkCjmNgW@yK%h1817{3m*plGvkrt z@{(Mhu(YSW@pRcgoqge;exCi=>#eRK$XZ|m^*nEil=BLeceoC^xg3A+@_QZU?&E%)q zf0un>@pJS93#}@V*i3$66EhyavM)^eEAVjX2^LzBZ!`JPPR8G67WW4;c`nnurD0cPq1IhzHm@K$-cwBu=w`-XX-zj?eo(W@a_5dp^twA(|nBj=3|QM zuRq`Pzwm5uvH95EcsN|%yTO{71QbVez$S`8Lz>qPiM?jrh#sJ63(vUpABP zaQ-bWHtiD@zrFdEX8!>8g@gJT_9w9~T<}Xw1Bfa9h{Y6twwr1H8SD#-pQk5SXhpuw zRH4iVvIhLQL`5Ozn$oY06u{NJ`@-T! zeeJiI{N#4VA13iLi=Ut;SZGD{+f05oYW&057pD9)o(Vi?Dfk98ldrZn{;BK>i$BWB zPxTAWLw-6xF8zb^qkq2Miv0HceGp9ZwZb=F6C6+fOU-x+4+9sQucQ)e-8V?l%Luk!Gjj@Z6-g# z{(Om_S^Ta>FZecZY(CzJ^6dGz3{3NJXWx8Ga((@;F!M+F0Pqa1TjHnoeB?Vn+q|)O zs!^UDPZOBp+0_?MVzlYck2xOUO|L8-kKLa%J~mVTCb_&Ad^$darGM@G#rzce$FMIP z)OXl#VqZ9@pJxAZ_JxD`8TOa3FC5g*vi}?he54(h8hW)*#ZS@`EVQEYkIm#~jx+x2 z>aJphf(+Cd1_C*UYp2WHSJl8MW;p#v4dXnJs`oX8y6Jcpjd;OVY zKf%6mP(Q_f6Z^tJeTV%k*cT4!r`cc1zHm@K!~UD>3kUVH?ElQZa8N(TexG?}{Dg!0 zF8c?uFC5g*vwt%C!a;qH{n_jb2ldr>b3ER~zHm@K!v4GL3kUV1?034x^uKUWKgRxG z_JxD`arUd&7Y^zt*uQ{%;h=t!{r|ErEWZ8vLFYr8_4)J!GkzHjhQ=j;npemWly!-E#_ZMM(Hov&?s{vGS%S}>iDclVu-U9R87emZ{&uLaLARTt`~ zc-lLk=DEC1xDkcQ6PEV0=X>n$%D!+=U!7?B^I-OcgZdHnPhwv3p7Ke>nTX;t%y#e)`N@}mS;h{=z#Kc0PI+E0Fa=c5?= zXR|LH)Q_`&GyB5g?}->_A*T3+-$Q=-e$M@a@8`b4{u*tXWdDV2xe`p{Gr%`KDURn6 z?5F+|eiJ;yDo^5TuYVja?>8<_IH;dyf9sn~JinxvNZjp5XF?u}hyXVtkAclW#Nm9{X>x zFD$-y)J`hS-CnZ@tttKVk3KYQNVw*Ojud2ZC17McDOj)RN! zXTlec&D5UwHKsl1aCySg9@ppFOn&5A(h~!a?ItvVQ^l!a@BM`^(rD7T-Resr@$F^YJtI z_VGMwaa%qGO!ILs-+Xkq{@<{lj&I>TZZAF`?fx$|9%(MG89tRKEbU2J<43;DG@c&& zH?l7*e%$BVOnz*>na{7VFD!o6=i5wvp8b+LO#H&)t5Q<{F~x7Q_7|A?`-#sie#Yn9 zOuloI@lRl1Sp0VTpZ(eFr3`v%zRUht_JxD` zdG=?qFC5hO*k8)Na8O?@G~@p{`@-UP^37l2-k8Yr`6GQ=N1cQ6+vkVvvEM#F)ce>0 z)A?br@B9$qc-CP*9nZp>-1XvW%yxa7j@I3GguA5d8kKKQCzOtG6 zGsWdS$K?r&FY}9-e4Fj|tb=d2=ZJgSaxIwJv$wB34%fd1`)NK1ceuBBdoC|Ajg)w7 zw&RJzx8pg_$5((Uo_&1rL~k|6-!Irt@d$VSZ}E8S{w&tNF)ptkd@4_v;;+D?JwML= zaQ20R`U&>Ou`e9dPqN>_zHm@K#eSN7;h?_5{vGTK2ldnJKgqsuP(Q=|d+ZAb^|S1M z%f4_>KgWJ(iJ3nI4mf{Y_P1bPIB5NO_IG7pIH>Qje<=IHL4CEz9FODJ7Y^!2*q_3_ za8N(W{!I3T#oyGNj`aDKj(?l&^HB!AeLnii$G?H;e6+9cd=%sQ8}8%t2Xh)cgX^Z1 z#MAEig#CNCyf|}EKf(E*XJ0s|pJab6`@%u}6#Lzln*IO1TYW?wj{pJxAm*cTQ* z=9>>T)9Y=H{lBv>9Mt#Nzlwcf@!K1Jb(=Y!{>#2_P(Q-{D)xoNPx;z!GqvAg{|EMk z#h>K!ZMKi6t?zGpJf(bm7MPBw{d~uh$MvtletJC??(#tK<0d*as z{TaE})Zg_%(|+N>;9}<|hXTVwt4bs`>;Cw!DepKgFU>6NiDwob5@BY|tpPw%AaRyB1r(yo{ z(}QL{^n8@hPs}@li=CewWfqE;`qyUapA7p)!PoCEm??h+9%(#iAtv8u@?#H~cqTk* zd|}E@ehLp-h{?BE*U$b`_A|^u{m8?n{!7>w7XRXMU45Z`;aibEYIf|JY3ZlV$&TE>Ae9pJV?s z_JxD`F8duHH|-G)>gU0F+0P(Q~0T=s>7`f>Ji>p)! zruc=cke}`cQqzlnf6|EkH6-%#sE=2HX?_j&&96MiGwLbR9^q>63@Hq2i7(CDBtDyI zd{R$_b&dXb7C-5m4>nW$DfTa7Us(LK&$pR; z^|XoqI*FfI{11J;&GvZS1>YXeAADT)j2X`nzVY<9zB=ru_Y=Z1z<*{u)ib6&*Km2l z(w_FlGs6CT>Ff&!^|S0>!@h7(Kga%E>11 zhHoFw{_DfNSD54ZVBhiVa{aTgpN?nYTfoJRXU`Xp&2)asJ!_8VXSh6JX;0SY+pN!z zD~$gQ`zdDeV?N(z@-v*j`*Wr}!s1u>e497cpL?S`yMKp+>Gkdqe}8iQcXItM^NZkO z{TcDaV>7iU&;Hk3p0Knh?(=OXKl+^M&+aQte+Y}8_xU!HuT~oW5cY+|cYVIiBvvlQ}cX1^?c^{|KR$nfBw%wetW#G1k-pO>Km`b^QL_z&-3|{ISMW| zUfoMgz!ZNa5}P+RfBf&44n+AB&q!Z9sTWN=i#Z+xg1=L@EPTxRk4zoRbrHgBvyhM+uqe1?LlKMwQthx@XLf1%XR zyb@e&eC*?g#>ZxAPoDkNT%NGB$If5O_t@`-iB9KB;h?^H#k6M-`@%u}2>ZveFD!m1 zYy2pFo9*#93%=d|kNWrpaIx`-a{WVIH0>8Y4*X}vBgW;WxIAHLPt?~Qn`t}~>|esZ zu=sJGZ!`I6_HSojSbV!a>Q9@=&$9n0`@%tem;F`j3yYsrW+A5fZKnETubTPv8T-QG z$BkY%K5ZsH#r{w13yUA~`8JcEVZYZ)Wb3Kl{SsM}5A{z&%=qlF%Jh%$ zP;jy1CF*;9v6F?ak8@EVQabVl(-Xw~c?I#KTPaEAU9-L5uiFO|7p7 zDb9Ze`@-VKHaCL!HdFnXFHQXyurDnBZ@%{1ys`1P7UkLFb0fIecx1jd^>2{+nLEE+ zd^}vM{nVc}Q+rb1nDTnVr`H2vX-~rE+f06r{XN+i7C+|mZ6@DiKhD0e_>RxFS;zma ziT`McpIQ8KeZKH1$WPY~JM#6zX~Z~wX7Ta!Z|2#|7cr*;9$)j3-yY9fz%-sm_>M32 zor%Bv71RI1yMT)wUvX*}7Ftyzv6=cK{=F%0UoKCW^3(AV!Gjj@Z6-g#{;})}2lbQe zpUS>)P(Q`~4EBYC`VRZ^*%uD#r`cc1zHm@K!@kSDa8N(X{^#rq2laF8hhH`GNjRwQ zvL9t%IH;dze?Rtx#qVsUUt#_Uk41hu{^kZezG{%)KE9@a>G(R*cYJvq&(j=_@OR*1 z$CrIP(D7w69Utlkb9|M(#>XqOv@hywpUvb)Ie&Ndg~d<$e4EL4*x!kLVe##Fi^ZR2 z|5)~g#ZUX{w^_&kqiKJ&#Lp~#d-caS{~Y#(#kcFD_-&^8bL`J&UpT0r_{qe72m8X} zN9YL_TIv3?nCefiH-3(NVai75*E}Ayh@aPFnEd$9#($1|Veu1IeyZPQ^3&|+*%uZ+ z;`41LKg0f)>EPj@rU=iPDsz15G)W0YD!s5rZ-Rj#+eun*#>Ws&(8~(^8wG-w<5oNzP<-c=j)?<=j&9+ zw6EJ6JU^Is0soovwZs0tT%NGB*FHWfvC(GguQdC|vo9Rf&#*t0ePQvgVAu94|Ig`z8Oseg4(pV&jqV%^#boykv

    11eVTtDypKr76fAj}F>wnmuXSx0j>k#y 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 QRFD#-q;q%bO7!#p0l*rbga7~l diff --git a/core/crypto/crypto-adv/src/main/resources/libsodium.so.23.1.0 b/core/crypto/crypto-adv/src/main/resources/libsodium.so.23.1.0 deleted file mode 100755 index 44c1ef1a897ae22d1842be0d9646308709016c47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2018224 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

    jzX1}4nhS~2A`}ma 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